Repository: incubator-trafficcontrol
Updated Branches:
  refs/heads/master b55605b26 -> 9b0b3acb3


adds deliveryservice_regex crud


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/6f01ad02
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/6f01ad02
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/6f01ad02

Branch: refs/heads/master
Commit: 6f01ad0235fdb1ef8e937736bb071ae7b004055a
Parents: f2fe62a
Author: Jeremy Mitchell <mitchell...@gmail.com>
Authored: Fri Jan 13 10:53:10 2017 -0700
Committer: Jeremy Mitchell <mitchell...@gmail.com>
Committed: Mon Jan 23 16:17:33 2017 -0700

----------------------------------------------------------------------
 docs/source/development/traffic_ops.rst         |   3 +-
 .../v12/deliveryservice_regex.rst               | 374 +++++++++++++++++++
 .../app/lib/API/DeliveryServiceRegexes.pm       | 235 +++++++++++-
 .../app/lib/Fixtures/DeliveryserviceRegex.pm    |   2 +-
 traffic_ops/app/lib/TrafficOpsRoutes.pm         |   7 +-
 .../app/t/api/1.2/deliveryservice_regex.t       |  66 +++-
 6 files changed, 681 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/6f01ad02/docs/source/development/traffic_ops.rst
----------------------------------------------------------------------
diff --git a/docs/source/development/traffic_ops.rst 
b/docs/source/development/traffic_ops.rst
index 9e30148..57ea3ef 100644
--- a/docs/source/development/traffic_ops.rst
+++ b/docs/source/development/traffic_ops.rst
@@ -597,7 +597,7 @@ API 1.1 Reference
   traffic_ops_api/v11/type
   traffic_ops_api/v11/user
 
-API 1.2 Reference 
+API 1.2 Reference
 -----------------
 
 .. toctree:: 
@@ -609,6 +609,7 @@ API 1.2 Reference
   traffic_ops_api/v12/cdn
   traffic_ops_api/v12/changelog
   traffic_ops_api/v12/deliveryservice
+  traffic_ops_api/v12/deliveryservice_regex
   traffic_ops_api/v12/deliveryservice_stats
   traffic_ops_api/v12/division
   traffic_ops_api/v12/federation

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/6f01ad02/docs/source/development/traffic_ops_api/v12/deliveryservice_regex.rst
----------------------------------------------------------------------
diff --git 
a/docs/source/development/traffic_ops_api/v12/deliveryservice_regex.rst 
b/docs/source/development/traffic_ops_api/v12/deliveryservice_regex.rst
new file mode 100644
index 0000000..16697ec
--- /dev/null
+++ b/docs/source/development/traffic_ops_api/v12/deliveryservice_regex.rst
@@ -0,0 +1,374 @@
+..
+..
+.. Licensed under the Apache License, Version 2.0 (the "License");
+.. you may not use this file except in compliance with the License.
+.. You may obtain a copy of the License at
+..
+..     http://www.apache.org/licenses/LICENSE-2.0
+..
+.. Unless required by applicable law or agreed to in writing, software
+.. distributed under the License is distributed on an "AS IS" BASIS,
+.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+.. See the License for the specific language governing permissions and
+.. limitations under the License.
+..
+
+
+.. _to-api-v12-ds-regexes:
+
+Delivery Service Regexes
+========================
+
+.. _to-api-v12-ds-regexes-route:
+
+
+**GET /api/1.2/deliveryservices_regexes**
+
+  Retrieves regexes for all delivery services.
+
+  Authentication Required: Yes
+
+  Role(s) Required: Admin or Oper
+
+  **Response Properties**
+
+  
+------------------+--------+-------------------------------------------------------------------------+
+  |    Parameter     |  Type  |                               Description      
                         |
+  
+==================+========+=========================================================================+
+  | ``dsName``       | array  | Delivery service name.                         
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``regexes``      | array  | An array of regexes for the delivery service.  
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``>type``        | string | The regex type.                                
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``>pattern``     | string | The regex pattern.                             
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``>setNumber``   | string | The order in which the regex is evaluated.     
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+
+  **Response Example** ::
+
+    {
+     "response": [
+        {
+                       "dsName": "foo-bar",
+                       "regexes": [
+                               {
+                                       "type": "HOST_REGEXP",
+                                       "pattern": ".*\.foo-bar\..*",
+                                       "setNumber": 0
+                               },
+                               {
+                                       "type": "HOST_REGEXP",
+                                       "pattern": "foo.bar.com",
+                                       "setNumber": 1
+                               }
+                       ]
+               },
+               { ... }
+      ]
+    }
+
+|
+
+**GET /api/1.2/deliveryservices/{:dsId}/regexes**
+
+  Retrieves regexes for a specific delivery service.
+
+  Authentication Required: Yes
+
+  Role(s) Required: None
+
+  **Request Route Parameters**
+
+  +-----------+----------+---------------------------------------------+
+  |   Name    | Required |                Description                  |
+  +===========+==========+=============================================+
+  |  ``dsId`` |   yes    | Delivery service id.                        |
+  +-----------+----------+---------------------------------------------+
+
+  **Response Properties**
+
+  
+------------------+--------+-------------------------------------------------------------------------+
+  |    Parameter     |  Type  |                               Description      
                         |
+  
+==================+========+=========================================================================+
+  | ``id``           | string | Delivery service regex ID.                     
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``type``         | string | Delivery service regex type ID.                
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``typeName``     | string | Delivery service regex type name.              
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``pattern``      | string | Delivery service regex pattern.                
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``setNumber``    | string | The order in which the regex is evaluated for 
the delivery service.     |
+  
+------------------+--------+-------------------------------------------------------------------------+
+
+  **Response Example** ::
+
+    {
+     "response": [
+        {
+                       "id": 852,
+                       "type": 18,
+                       "typeName": "HOST_REGEXP",
+                       "pattern": ".*\.foo-bar\..*",
+                       "setNumber": 0
+               },
+        {
+                       "id": 853,
+                       "type": 18,
+                       "typeName": "HOST_REGEXP",
+                       "pattern": "foo.bar.com",
+                       "setNumber": 1
+               }
+      ]
+    }
+
+|
+
+**GET /api/1.2/deliveryservices/{:dsId}/regexes/{:id}**
+
+  Retrieves a regex for a specific delivery service.
+
+  Authentication Required: Yes
+
+  Role(s) Required: None
+
+  **Request Route Parameters**
+
+  +-----------+----------+---------------------------------------------+
+  |   Name    | Required |                Description                  |
+  +===========+==========+=============================================+
+  | ``dsId``  |   yes    | Delivery service id.                        |
+  +-----------+----------+---------------------------------------------+
+  | ``id``    |   yes    | Delivery service regex id.                  |
+  +-----------+----------+---------------------------------------------+
+
+  **Response Properties**
+
+  
+------------------+--------+-------------------------------------------------------------------------+
+  |    Parameter     |  Type  |                               Description      
                         |
+  
+==================+========+=========================================================================+
+  | ``id``           | string | Delivery service regex ID.                     
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``type``         | string | Delivery service regex type ID.                
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``typeName``     | string | Delivery service regex type name.              
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``pattern``      | string | Delivery service regex pattern.                
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``setNumber``    | string | The order in which the regex is evaluated for 
the delivery service.     |
+  
+------------------+--------+-------------------------------------------------------------------------+
+
+  **Response Example** ::
+
+    {
+     "response": [
+        {
+                       "id": 852,
+                       "type": 18,
+                       "typeName": "HOST_REGEXP"
+                       "pattern": ".*\.foo-bar\..*",
+                       "setNumber": 0
+               }
+      ]
+    }
+
+|
+
+**POST /api/1.2/deliveryservices/{:dsId}/regexes**
+
+  Create a regex for a delivery service.
+
+  Authentication Required: Yes
+
+  Role(s) Required: Admin or Oper
+
+  **Request Route Parameters**
+
+  +-----------+----------+---------------------------------------------+
+  |   Name    | Required |                Description                  |
+  +===========+==========+=============================================+
+  | ``dsId``  |   yes    | Delivery service id.                        |
+  +-----------+----------+---------------------------------------------+
+
+  **Request Properties**
+
+  +---------------+----------+---------------------------------------------+
+  |  Parameter    | Required |                Description                  |
+  +===============+==========+=============================================+
+  | ``pattern``   |   yes    | Regex pattern.                              |
+  +---------------+----------+---------------------------------------------+
+  | ``type``      |   yes    | Regex type ID.                              |
+  +---------------+----------+---------------------------------------------+
+  | ``setNumber`` |   yes    | Regex type ID.                              |
+  +---------------+----------+---------------------------------------------+
+
+  **Request Example** ::
+
+    {
+        "pattern": ".*\.foo-bar\..*"
+        "type": 18
+        "setNumber": 0
+    }
+
+|
+
+  **Response Properties**
+
+  
+------------------+--------+-------------------------------------------------------------------------+
+  |    Parameter     |  Type  |                               Description      
                         |
+  
+==================+========+=========================================================================+
+  | ``id``           | string | Delivery service regex ID.                     
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``type``         | string | Delivery service regex type ID.                
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``typeName``     | string | Delivery service regex type name.              
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``pattern``      | string | Delivery service regex pattern.                
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``setNumber``    | string | The order in which the regex is evaluated for 
the delivery service.     |
+  
+------------------+--------+-------------------------------------------------------------------------+
+
+  **Response Example** ::
+
+    {
+        "response":{
+                       "id": 852,
+                       "type": 18,
+                       "typeName": "HOST_REGEXP"
+                       "pattern": ".*\.foo-bar\..*",
+                       "setNumber": 0
+        },
+        "alerts":[
+            {
+                "level": "success",
+                "text": "Delivery service regex creation was successful."
+            }
+        ]
+    }
+
+|
+
+**PUT /api/1.2/deliveryservices/{:dsId}/regexes/{:id}**
+
+  Update a regex for a delivery service.
+
+  Authentication Required: Yes
+
+  Role(s) Required: Admin or Oper
+
+  **Request Route Parameters**
+
+  +-----------+----------+---------------------------------------------+
+  |   Name    | Required |                Description                  |
+  +===========+==========+=============================================+
+  | ``dsId``  |   yes    | Delivery service id.                        |
+  +-----------+----------+---------------------------------------------+
+  | ``id``    |   yes    | Delivery service regex id.                  |
+  +-----------+----------+---------------------------------------------+
+
+  **Request Properties**
+
+  +---------------+----------+---------------------------------------------+
+  |  Parameter    | Required |                Description                  |
+  +===============+==========+=============================================+
+  | ``pattern``   |   yes    | Regex pattern.                              |
+  +---------------+----------+---------------------------------------------+
+  | ``type``      |   yes    | Regex type ID.                              |
+  +---------------+----------+---------------------------------------------+
+  | ``setNumber`` |   yes    | Regex type ID.                              |
+  +---------------+----------+---------------------------------------------+
+
+  **Request Example** ::
+
+    {
+        "pattern": ".*\.foo-bar\..*"
+        "type": 18
+        "setNumber": 0
+    }
+
+|
+
+  **Response Properties**
+
+  
+------------------+--------+-------------------------------------------------------------------------+
+  |    Parameter     |  Type  |                               Description      
                         |
+  
+==================+========+=========================================================================+
+  | ``id``           | string | Delivery service regex ID.                     
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``type``         | string | Delivery service regex type ID.                
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``typeName``     | string | Delivery service regex type name.              
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``pattern``      | string | Delivery service regex pattern.                
                         |
+  
+------------------+--------+-------------------------------------------------------------------------+
+  | ``setNumber``    | string | The order in which the regex is evaluated for 
the delivery service.     |
+  
+------------------+--------+-------------------------------------------------------------------------+
+
+  **Response Example** ::
+
+    {
+        "response":{
+                       "id": 852,
+                       "type": 18,
+                       "typeName": "HOST_REGEXP"
+                       "pattern": ".*\.foo-bar\..*",
+                       "setNumber": 0
+        },
+        "alerts":[
+            {
+                "level": "success",
+                "text": "Delivery service regex update was successful."
+            }
+        ]
+    }
+
+|
+
+**DELETE /api/1.2/deliveryservices/{:dsId}/regexes/{:id}**
+
+  Delete delivery service regex.
+
+  Authentication Required: Yes
+
+  Role(s) Required: Admin or Oper
+
+  **Request Route Parameters**
+
+  +-----------+----------+---------------------------------------------+
+  |   Name    | Required |                Description                  |
+  +===========+==========+=============================================+
+  | ``dsId``  |   yes    | Delivery service id.                        |
+  +-----------+----------+---------------------------------------------+
+  | ``id``    |   yes    | Delivery service regex id.                  |
+  +-----------+----------+---------------------------------------------+
+
+  **Response Properties**
+
+  +-------------+--------+----------------------------------+
+  |  Parameter  |  Type  |           Description            |
+  +=============+========+==================================+
+  | ``alerts``  | array  | A collection of alert messages.  |
+  +-------------+--------+----------------------------------+
+  | ``>level``  | string | Success, info, warning or error. |
+  +-------------+--------+----------------------------------+
+  | ``>text``   | string | Alert message.                   |
+  +-------------+--------+----------------------------------+
+
+  **Response Example** ::
+
+    {
+          "alerts": [
+                    {
+                            "level": "success",
+                            "text": "Delivery service regex delete was 
successful."
+                    }
+            ],
+    }
+
+|
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/6f01ad02/traffic_ops/app/lib/API/DeliveryServiceRegexes.pm
----------------------------------------------------------------------
diff --git a/traffic_ops/app/lib/API/DeliveryServiceRegexes.pm 
b/traffic_ops/app/lib/API/DeliveryServiceRegexes.pm
index 4688f3a..bb63b08 100644
--- a/traffic_ops/app/lib/API/DeliveryServiceRegexes.pm
+++ b/traffic_ops/app/lib/API/DeliveryServiceRegexes.pm
@@ -22,8 +22,9 @@ use UI::DeliveryService;
 use Mojo::Base 'Mojolicious::Controller';
 use Data::Dumper;
 use Common::ReturnCodes qw(SUCCESS ERROR);
+use Validate::Tiny ':all';
 
-sub index {
+sub all {
        my $self = shift;
 
        my $rs;
@@ -60,4 +61,236 @@ sub index {
 
 }
 
+sub index {
+       my $self  = shift;
+       my $ds_id = $self->param('dsId');
+
+       my $ds = $self->db->resultset('Deliveryservice')->find( { id => $ds_id 
} );
+       if ( !defined($ds) ) {
+               return $self->not_found();
+       }
+
+       my %criteria;
+       $criteria{'deliveryservice'} = $ds_id;
+
+       my $rs_data = $self->db->resultset("DeliveryserviceRegex")->search( 
\%criteria, { order_by => 'me.set_number' } );
+       my @data = ();
+       while ( my $row = $rs_data->next ) {
+               push(
+                       @data, {
+                               "id"        => $row->regex->id,
+                               "pattern"   => $row->regex->pattern,
+                               "type"      => $row->regex->type->id,
+                               "typeName"  => $row->regex->type->name,
+                               "setNumber" => $row->set_number,
+                       }
+               );
+       }
+       $self->success( \@data );
+}
+
+sub show {
+       my $self     = shift;
+       my $ds_id    = $self->param('dsId');
+       my $regex_id = $self->param('id');
+
+       my $ds_regex = $self->db->resultset('DeliveryserviceRegex')->search( { 
deliveryservice => $ds_id, regex => $regex_id } );
+       if ( !defined($ds_regex) ) {
+               return $self->not_found();
+       }
+
+       my %criteria;
+       $criteria{'deliveryservice'} = $ds_id;
+       $criteria{'regex'}           = $regex_id;
+
+       my $rs_data = $self->db->resultset("DeliveryserviceRegex")->search( 
\%criteria );
+       my @data    = ();
+       while ( my $row = $rs_data->next ) {
+               push(
+                       @data, {
+                               "id"        => $row->regex->id,
+                               "pattern"   => $row->regex->pattern,
+                               "type"      => $row->regex->type->id,
+                               "typeName"  => $row->regex->type->name,
+                               "setNumber" => $row->set_number,
+                       }
+               );
+       }
+       $self->success( \@data );
+}
+
+sub create {
+       my $self   = shift;
+       my $ds_id  = $self->param('dsId');
+       my $params = $self->req->json;
+
+       if ( !&is_oper($self) ) {
+               return $self->forbidden();
+       }
+
+       my ( $is_valid, $result ) = $self->is_regex_valid($params);
+
+       if ( !$is_valid ) {
+               return $self->alert($result);
+       }
+
+       my $ds = $self->db->resultset('Deliveryservice')->find( { id => $ds_id 
} );
+       if ( !defined($ds) ) {
+               return $self->not_found();
+       }
+
+       my $values = {
+               pattern => $params->{pattern},
+               type    => $params->{type},
+       };
+
+       my $rs_regex = $self->db->resultset('Regex')->create($values)->insert();
+       if ($rs_regex) {
+
+               # now insert the regex into the deliveryservice_regex table 
along with set number
+               my $rs_ds_regex = $self->db->resultset('DeliveryserviceRegex')
+                       ->create( { deliveryservice => $ds_id, regex => 
$rs_regex->id, set_number => $params->{setNumber} } )->insert();
+
+               my $response;
+               $response->{id}        = $rs_regex->id;
+               $response->{pattern}   = $rs_regex->pattern;
+               $response->{type}      = $rs_regex->type->id;
+               $response->{typeName}  = $rs_regex->type->name;
+               $response->{setNumber} = $rs_ds_regex->set_number;
+
+               &log( $self, "Regex created [ " . $rs_regex->pattern . " ] for 
deliveryservice: " . $ds_id, "APICHANGE" );
+
+               return $self->success( $response, "Delivery service regex 
creation was successful." );
+       }
+       else {
+               return $self->alert("Delivery service regex creation failed.");
+       }
+
+}
+
+sub update {
+       my $self     = shift;
+       my $ds_id    = $self->param('dsId');
+       my $regex_id = $self->param('id');
+       my $params   = $self->req->json;
+
+       if ( !&is_oper($self) ) {
+               return $self->forbidden();
+       }
+
+       my ( $is_valid, $result ) = $self->is_regex_valid($params);
+
+       if ( !$is_valid ) {
+               return $self->alert($result);
+       }
+
+       my $ds_regex = $self->db->resultset('DeliveryserviceRegex')->search( { 
deliveryservice => $ds_id, regex => $regex_id } );
+       if ( !defined($ds_regex) ) {
+               return $self->not_found();
+       }
+
+       my $values = {
+               pattern => $params->{pattern},
+               type    => $params->{type},
+       };
+
+       my $regex = $self->db->resultset('Regex')->find( { id => $regex_id } 
)->update($values);
+       if ($regex) {
+
+               # now update the set_number in the deliveryservice_regex table
+               $ds_regex->update( { set_number => $params->{setNumber} } );
+
+               my $response;
+               $response->{id}        = $regex->id;
+               $response->{pattern}   = $regex->pattern;
+               $response->{type}      = $regex->type->id;
+               $response->{typeName}  = $regex->type->name;
+               $response->{setNumber} = $params->{setNumber};
+
+               &log( $self, "Regex updated [ " . $regex->pattern . " ] for 
deliveryservice: " . $ds_id, "APICHANGE" );
+
+               return $self->success( $response, "Delivery service regex 
update was successful." );
+       }
+       else {
+               return $self->alert("Delivery service regex update failed.");
+       }
+
+}
+
+sub delete {
+       my $self     = shift;
+       my $ds_id    = $self->param('dsId');
+       my $regex_id = $self->param('id');
+
+       if ( !&is_oper($self) ) {
+               return $self->forbidden();
+       }
+
+       my $ds_regex = $self->db->resultset('DeliveryserviceRegex')->search( { 
deliveryservice => $ds_id, regex => $regex_id } );
+       if ( !defined($ds_regex) ) {
+               return $self->not_found();
+       }
+
+       my $count = $self->db->resultset('RegexesForDeliveryService')->search( 
{}, { bind => [$ds_id] } )->count;
+       if ( $count < 2 ) {
+               return $self->alert("A delivery service must have at least one 
regex.");
+       }
+
+       my $regex = $self->db->resultset('Regex')->find( { id => $regex_id } 
)->delete();
+       if ($regex) {
+
+               # now delete the entry in the deliveryservice_regex table
+               $ds_regex->delete();
+
+               &log( $self, "Regex deleted [ " . $regex->pattern . " ] for 
deliveryservice: " . $ds_id, "APICHANGE" );
+
+               return $self->success_message("Delivery service regex delete 
was successful.");
+       }
+       else {
+               return $self->alert("Delivery service regex delete failed.");
+       }
+
+}
+
+sub is_regex_valid {
+       my $self   = shift;
+       my $params = shift;
+
+       if ( !$self->is_valid_regex_type( $params->{type} ) ) {
+               return ( 0, "Invalid regex type" );
+       }
+
+       my $rules = {
+               fields => [qw/pattern type setNumber/],
+
+               # Validation checks to perform
+               checks => [
+                       pattern   => [ is_required("is required") ],
+                       type      => [ is_required("is required") ],
+                       setNumber => [ is_required("is required") ],
+               ]
+       };
+
+       # Validate the input against the rules
+       my $result = validate( $params, $rules );
+
+       if ( $result->{success} ) {
+               return ( 1, $result->{data} );
+       }
+       else {
+               return ( 0, $result->{error} );
+       }
+}
+
+sub is_valid_regex_type {
+       my $self    = shift;
+       my $type_id = shift;
+
+       my $rs = $self->db->resultset("Type")->find( { id => $type_id } );
+       if ( defined($rs) && ( $rs->use_in_table eq "regex" ) ) {
+               return 1;
+       }
+       return 0;
+}
+
 1;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/6f01ad02/traffic_ops/app/lib/Fixtures/DeliveryserviceRegex.pm
----------------------------------------------------------------------
diff --git a/traffic_ops/app/lib/Fixtures/DeliveryserviceRegex.pm 
b/traffic_ops/app/lib/Fixtures/DeliveryserviceRegex.pm
index 1627636..7b25146 100644
--- a/traffic_ops/app/lib/Fixtures/DeliveryserviceRegex.pm
+++ b/traffic_ops/app/lib/Fixtures/DeliveryserviceRegex.pm
@@ -79,7 +79,7 @@ my %definition_for = (
                using => {
                        deliveryservice => 100,
                        regex           => 800,
-                       set_number      => 0,
+                       set_number      => 1,
                },
        },
        steering_2 => {

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/6f01ad02/traffic_ops/app/lib/TrafficOpsRoutes.pm
----------------------------------------------------------------------
diff --git a/traffic_ops/app/lib/TrafficOpsRoutes.pm 
b/traffic_ops/app/lib/TrafficOpsRoutes.pm
index 8b7de9c..b3bd08c 100644
--- a/traffic_ops/app/lib/TrafficOpsRoutes.pm
+++ b/traffic_ops/app/lib/TrafficOpsRoutes.pm
@@ -539,7 +539,12 @@ sub api_routes {
                ->to( 'KeysUrlSig#view_by_xmlid', namespace => 
'API::DeliveryService' );
 
        # -- DELIVERY SERVICE: REGEXES
-       $r->get("/api/$version/deliveryservices_regexes")->over( authenticated 
=> 1 )->to( 'DeliveryServiceRegexes#index', namespace => $namespace );
+       $r->get("/api/$version/deliveryservices_regexes")->over( authenticated 
=> 1 )->to( 'DeliveryServiceRegexes#all', namespace => $namespace );
+       $r->get("/api/$version/deliveryservices/:dsId/regexes")->over( 
authenticated => 1 )->to( 'DeliveryServiceRegexes#index', namespace => 
$namespace );
+       $r->get("/api/$version/deliveryservices/:dsId/regexes/:id")->over( 
authenticated => 1 )->to( 'DeliveryServiceRegexes#show', namespace => 
$namespace );
+       $r->post("/api/$version/deliveryservices/:dsId/regexes")->over( 
authenticated => 1 )->to( 'DeliveryServiceRegexes#create', namespace => 
$namespace );
+       $r->put("/api/$version/deliveryservices/:dsId/regexes/:id")->over( 
authenticated => 1 )->to( 'DeliveryServiceRegexes#update', namespace => 
$namespace );
+       $r->delete("/api/$version/deliveryservices/:dsId/regexes/:id")->over( 
authenticated => 1 )->to( 'DeliveryServiceRegexes#delete', namespace => 
$namespace );
 
        # -- DELIVERY SERVICE: MATCHES
        $r->get("/api/$version/deliveryservice_matches")->over( authenticated 
=> 1 )->to( 'DeliveryServiceMatches#index', namespace => $namespace );

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/6f01ad02/traffic_ops/app/t/api/1.2/deliveryservice_regex.t
----------------------------------------------------------------------
diff --git a/traffic_ops/app/t/api/1.2/deliveryservice_regex.t 
b/traffic_ops/app/t/api/1.2/deliveryservice_regex.t
index 07901aa..f69f203 100644
--- a/traffic_ops/app/t/api/1.2/deliveryservice_regex.t
+++ b/traffic_ops/app/t/api/1.2/deliveryservice_regex.t
@@ -40,11 +40,73 @@ Test::TestHelper->load_core_data($schema);
 ok $t->post_ok( '/api/1.1/user/login', json => { u => 
Test::TestHelper::ADMIN_USER, p => Test::TestHelper::ADMIN_USER_PASSWORD } 
)->status_is(200),
        'Log into the admin user?';
 
-ok $t->get_ok("/api/1.2/deliveryservices_regexes.json")->status_is(200)->or( 
sub { diag $t->tx->res->content->asset->{content}; } )
+ok $t->get_ok("/api/1.2/deliveryservices_regexes")->status_is(200)->or( sub { 
diag $t->tx->res->content->asset->{content}; } )
        ->json_has( '/response', 'has a response' )->json_is( 
'/response/0/dsName', 'steering-ds1' )->json_has( '/response/0/regexes/0/type', 
'has a regex type' )
        ->json_is( '/response/1/dsName', 'steering-ds2' )
        ->json_has( '/response/1/regexes', 'has a second regex' )->json_has( 
'/response/7/regexes/0/type', 'has a second regex type' ), 'Query regexes';
 
+$t->get_ok("/api/1.2/deliveryservices/100/regexes")->status_is(200)->json_is( 
"/response/0/id", 200 )
+       ->json_is( "/response/0/pattern" => '.*\.foo\..*' )
+       ->json_is( "/response/0/type" => 19 )
+       ->json_is( "/response/0/typeName" => 'HOST_REGEXP' )
+       ->or( sub { diag $t->tx->res->content->asset->{content}; } );
+
+$t->get_ok("/api/1.2/deliveryservices/100/regexes")->status_is(200)->json_is( 
"/response/1/id", 800 )
+       ->json_is( "/response/1/pattern" => '.*\.steering-ds1\..*' )
+       ->json_is( "/response/1/type" => 19 )
+       ->json_is( "/response/1/typeName" => 'HOST_REGEXP' )
+       ->or( sub { diag $t->tx->res->content->asset->{content}; } );
+
+$t->get_ok("/api/1.2/deliveryservices/100/regexes/200")->status_is(200)->json_is(
 "/response/0/id", 200 )
+       ->json_is( "/response/0/pattern" => '.*\.foo\..*' )
+       ->json_is( "/response/0/type" => 19 )
+       ->json_is( "/response/0/typeName" => 'HOST_REGEXP' )
+       ->or( sub { diag $t->tx->res->content->asset->{content}; } );
+
+ok $t->put_ok('/api/1.2/deliveryservices/100/regexes/200' => {Accept => 
'application/json'} => json => {
+                       "pattern" => '.*\.foo-bar\..*',
+                       "type" => 20,
+                       "setNumber" => 22,
+               })
+               ->status_is(200)->or( sub { diag 
$t->tx->res->content->asset->{content}; } )
+               ->json_is( "/response/pattern" => '.*\.foo-bar\..*' )
+               ->json_is( "/response/type" => 20 )
+               ->json_is( "/response/typeName" => 'PATH_REGEXP' )
+               ->json_is( "/response/setNumber" => 22 )
+               ->json_is( "/alerts/0/level" => "success" )
+       , 'Did the delivery service regex update?';
+
+ok 
$t->delete_ok('/api/1.2/deliveryservices/100/regexes/200')->status_is(200)->or( 
sub { diag $t->tx->res->content->asset->{content}; } );
+
+ok 
$t->delete_ok('/api/1.2/deliveryservices/100/regexes/800')->status_is(400)->or( 
sub { diag $t->tx->res->content->asset->{content}; } )
+               ->json_is( "/alerts/0/level" => "error" )
+               ->json_is( "/alerts/0/text" => "A delivery service must have at 
least one regex." )
+       , 'Does the delivery service regex delete fail because each ds must 
have at least one regex?';;
+
+ok $t->post_ok('/api/1.2/deliveryservices/100/regexes' => {Accept => 
'application/json'} => json => {
+                       "pattern" => "foo.bar.com",
+                       "type" => 19,
+                       "setNumber" => 2,
+               })
+               ->status_is(200)->or( sub { diag 
$t->tx->res->content->asset->{content}; } )
+               ->json_is( "/response/pattern" => "foo.bar.com" )
+               ->json_is( "/response/type" => 19 )
+               ->json_is( "/response/typeName" => "HOST_REGEXP" )
+               ->json_is( "/response/setNumber" => 2 )
+               ->json_is( "/alerts/0/level" => "success" )
+               ->json_is( "/alerts/0/text" => "Delivery service regex creation 
was successful." )
+       , 'Is the delivery service regex created?';
+
+ok $t->post_ok('/api/1.2/deliveryservices/100/regexes' => {Accept => 
'application/json'} => json => {
+                       "pattern" => "foo2.bar.com",
+                       "type" => 12,
+                       "setNumber" => 2,
+               })
+               ->status_is(400)->or( sub { diag 
$t->tx->res->content->asset->{content}; } )
+               ->json_is( "/alerts/0/level" => "error" )
+               ->json_is( "/alerts/0/text" => "Invalid regex type" )
+       , 'Does the delivery service regex create fail due to bad regex type?';
+
 ok $t->get_ok('/logout')->status_is(302)->or( sub { diag 
$t->tx->res->content->asset->{content}; } );
 
 #NEGATIVE TESTING -- No Privs
@@ -52,7 +114,7 @@ ok $t->post_ok( '/api/1.1/user/login', json => { u => 
Test::TestHelper::PORTAL_U
        'Log into the portal user?';
 
 # Verify Permissions
-ok $t->get_ok("/api/1.2/deliveryservices_regexes.json")->status_is(403)->or( 
sub { diag $t->tx->res->content->asset->{content}; } );
+ok $t->get_ok("/api/1.2/deliveryservices_regexes")->status_is(403)->or( sub { 
diag $t->tx->res->content->asset->{content}; } );
 
 ok $t->get_ok('/logout')->status_is(302)->or( sub { diag 
$t->tx->res->content->asset->{content}; } );
 

Reply via email to