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}; } );