You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by el...@apache.org on 2018/06/14 17:31:30 UTC

[trafficcontrol] 03/05: Augment Steering API to allow CRUD of geo-targets

This is an automated email from the ASF dual-hosted git repository.

elsloo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git

commit 291f3567dd800b552dd70df60225b592bd29d70e
Author: Rawlin Peters <ra...@comcast.com>
AuthorDate: Tue Apr 3 16:37:32 2018 -0600

    Augment Steering API to allow CRUD of geo-targets
    
    Add two new steering_target types:
    - STEERING_GEO_ORDER
    - STEERING_GEO_WEIGHT
---
 traffic_ops/app/db/seeds.sql                       |  2 ++
 .../app/lib/API/DeliveryService/Steering.pm        | 35 +++++++++++++++-------
 traffic_ops/app/lib/UI/Steering.pm                 |  9 ++++--
 3 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/traffic_ops/app/db/seeds.sql b/traffic_ops/app/db/seeds.sql
index 6c11adb..5928970 100644
--- a/traffic_ops/app/db/seeds.sql
+++ b/traffic_ops/app/db/seeds.sql
@@ -400,6 +400,8 @@ insert into type (name, description, use_in_table) values ('TXT_RECORD', 'Static
 --steering_target types
 insert into type (name, description, use_in_table) values ('STEERING_WEIGHT', 'Weighted steering target', 'steering_target') ON CONFLICT (name) DO NOTHING;
 insert into type (name, description, use_in_table) values ('STEERING_ORDER', 'Ordered steering target', 'steering_target') ON CONFLICT (name) DO NOTHING;
+insert into type (name, description, use_in_table) values ('STEERING_GEO_ORDER', 'Geo-ordered steering target', 'steering_target') ON CONFLICT (name) DO NOTHING;
+insert into type (name, description, use_in_table) values ('STEERING_GEO_WEIGHT', 'Geo-weighted steering target', 'steering_target') ON CONFLICT (name) DO NOTHING;
 
 -- users
 insert into tm_user (username, role, full_name, token) values ('extension', (select id from role where name = 'operations'), 'Extension User, DO NOT DELETE', '91504CE6-8E4A-46B2-9F9F-FE7C15228498') ON CONFLICT DO NOTHING;
diff --git a/traffic_ops/app/lib/API/DeliveryService/Steering.pm b/traffic_ops/app/lib/API/DeliveryService/Steering.pm
index 6ce009a..002a95a 100644
--- a/traffic_ops/app/lib/API/DeliveryService/Steering.pm
+++ b/traffic_ops/app/lib/API/DeliveryService/Steering.pm
@@ -43,12 +43,10 @@ sub find_steering {
 
     my %steering;
 
-    my $rs_data = $self->db->resultset('SteeringView')->search({}, {order_by => ['steering_xml_id', 'target_xml_id']});
+    my %criteria = length $steering_xml_id ? (steering_xml_id => $steering_xml_id) : ();
+    my $rs_data = $self->db->resultset('SteeringView')->search(\%criteria, {order_by => ['steering_xml_id', 'target_xml_id']});
 
     while ( my $row = $rs_data->next ) {
-        if ($steering_xml_id && $row->steering_xml_id ne $steering_xml_id) { # TODO: can this be optimized into the SQL query?
-            next;
-        }
 
         if (!&is_admin($self)) {
             my $name = $self->current_user()->{username};
@@ -92,9 +90,6 @@ sub find_steering {
 
         my $targets = $steering_entry->{"targets"};
 
-        # TODO: add new STEERING_GEO_WEIGHT and STEERING_GEO_ORDER types, handle them here
-        # verify if STEERING_ORDER and STEERING_WEIGHT should omit latitude, longitude, and geoOrder
-        # if GEO, get the target DS's lat/long, add it to result (add it to SteeringView?)
         if ( $row->type eq "STEERING_ORDER" ) {
             push(@{$targets},{
             'deliveryService' => $row->target_xml_id,
@@ -102,10 +97,30 @@ sub find_steering {
             'weight'  => 0
             });
         }
-        else {
+        elsif ( $row->type eq "STEERING_WEIGHT" ) {
+            push(@{$targets},{
+            'deliveryService' => $row->target_xml_id,
+            'order' => 0,
+            'weight'  => $row->value
+            });
+        }
+        elsif ( $row->type eq "STEERING_GEO_ORDER" ) {
+            push(@{$targets},{
+            'deliveryService' => $row->target_xml_id,
+            'order' => 0,
+            'geoOrder' => $row->value,
+            'latitude' => 0, # TODO: fill these in w/ the DeliveryService Origin lat/lon
+            'longitude' => 0,
+            'weight'  => 0
+            });
+        }
+        elsif ( $row->type eq "STEERING_GEO_WEIGHT" ) {
             push(@{$targets},{
             'deliveryService' => $row->target_xml_id,
             'order' => 0,
+            'geoOrder' => 0,
+            'latitude' => 0, # TODO: fill these in w/ the DeliveryService Origin lat/lon
+            'longitude' => 0,
             'weight'  => $row->value
             });
         }
@@ -151,6 +166,8 @@ sub get_type {
     return $type;
 }
 
+# NOTE: STEERING_GEO* types are deliberately ignored in the following endpoint b/c it's soon to be deprecated (use
+# the non-internal PUT endpoint instead)
 sub update() {
     my $self = shift;
 
@@ -194,7 +211,6 @@ sub update() {
     my $req_targets = $self->req->json->{'targets'};
 
     foreach my $req_target (@{$req_targets}) {
-        # TODO: update this validation to handle new GEO types
         if (!$req_target->{'deliveryService'} && ( !$req_target->{'weight'} || !$req_target->{'order'} ) || ( $req_target->{'weight'} && $req_target->{'order'} ) ) {
            return $self->render(json => {"message" => "please provide a valid json for targets"}, status => 400);
         }
@@ -222,7 +238,6 @@ sub update() {
     foreach my $req_target (@{$req_targets}) {
         my $target_id = $valid_targets->{$req_target->{'deliveryService'}};
 
-        # TODO: update this to handle GEO-type targets
         if ($req_target->{'weight'}) {
             my $steering_target_row = $self->db->resultset('SteeringTarget')->find({ deliveryservice => $steering_id, target => $target_id});
             $steering_target_row->value($req_target->{weight});
diff --git a/traffic_ops/app/lib/UI/Steering.pm b/traffic_ops/app/lib/UI/Steering.pm
index 1e7f98b..a69b375 100644
--- a/traffic_ops/app/lib/UI/Steering.pm
+++ b/traffic_ops/app/lib/UI/Steering.pm
@@ -83,6 +83,7 @@ sub get_target_data {
 	my @weight_steering;
 	my @pos_order_steering;
 	my @neg_order_steering;
+	my @geo_steering;
 
 	my $target_rs = $self->db->resultset('SteeringTarget')->search( { deliveryservice => $ds_id } );
 
@@ -101,6 +102,9 @@ sub get_target_data {
 			elsif ( $row->type->name eq "STEERING_ORDER" && $row->value >= 0 ) {
 				push (@pos_order_steering, $t);
 			}
+			elsif ( $row->type->name =~ m/^STEERING_GEO/ ) {
+				push (@geo_steering, $t);
+			}
 			else { push (@weight_steering, $t); }
 			$i++;
 		}
@@ -108,9 +112,10 @@ sub get_target_data {
 		@weight_steering = sort { $b->{target_value} <=> $a->{target_value} } @weight_steering;
 		@neg_order_steering = sort { $a->{target_value} <=> $b->{target_value} } @neg_order_steering;
 		@pos_order_steering = sort { $a->{target_value} <=> $b->{target_value} } @pos_order_steering;
+		# TODO: group geo_steering targets by Origin lat/lon
 
-		#push everything into an a single array - negative order values first, weights second, positive order last.
-		push (@steering, @neg_order_steering, @weight_steering, @pos_order_steering);
+		#push everything into an a single array - negative order values 1st, geo 2nd, weights 3rd, positive order last.
+		push (@steering, @neg_order_steering, @geo_steering, @weight_steering, @pos_order_steering);
 	}
 	return @steering;
 }

-- 
To stop receiving notification emails like this one, please contact
elsloo@apache.org.