You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by de...@apache.org on 2017/01/24 15:59:22 UTC

[1/3] incubator-trafficcontrol git commit: adds deliveryservice_regex crud

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 <mi...@gmail.com>
Authored: Fri Jan 13 10:53:10 2017 -0700
Committer: Jeremy Mitchell <mi...@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}; } );
 


[3/3] incubator-trafficcontrol git commit: This closes #214

Posted by de...@apache.org.
This closes #214


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

Branch: refs/heads/master
Commit: 9b0b3acb3078fdcef25ca2b81637deb969acf573
Parents: 1005b37
Author: Dewayne Richardson <de...@apache.org>
Authored: Tue Jan 24 08:59:12 2017 -0700
Committer: Dewayne Richardson <de...@apache.org>
Committed: Tue Jan 24 08:59:12 2017 -0700

----------------------------------------------------------------------

----------------------------------------------------------------------



[2/3] incubator-trafficcontrol git commit: Merge branch 'regex-crud' of https://github.com/mitchell852/incubator-trafficcontrol

Posted by de...@apache.org.
Merge branch 'regex-crud' of https://github.com/mitchell852/incubator-trafficcontrol


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

Branch: refs/heads/master
Commit: 1005b3792aa8893c9fb367b1b3a6d07578f4def6
Parents: b55605b 6f01ad0
Author: Dewayne Richardson <de...@apache.org>
Authored: Tue Jan 24 08:59:11 2017 -0700
Committer: Dewayne Richardson <de...@apache.org>
Committed: Tue Jan 24 08:59:11 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/1005b379/traffic_ops/app/lib/TrafficOpsRoutes.pm
----------------------------------------------------------------------