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/04/12 14:58:37 UTC
[1/2] incubator-trafficcontrol git commit: adds routes to fetch jobs
Repository: incubator-trafficcontrol
Updated Branches:
refs/heads/master 51b038af2 -> b05a51144
adds routes to fetch jobs
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/b05a5114
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/b05a5114
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/b05a5114
Branch: refs/heads/master
Commit: b05a511444b9414cab10edb98f954f5e85512482
Parents: 5db8985
Author: Jeremy Mitchell <mi...@gmail.com>
Authored: Tue Apr 11 10:00:57 2017 -0600
Committer: Dewayne Richardson <de...@apache.org>
Committed: Wed Apr 12 08:58:31 2017 -0600
----------------------------------------------------------------------
docs/source/development/traffic_ops.rst | 1 +
.../development/traffic_ops_api/v12/job.rst | 136 +++++++++++++++++++
traffic_ops/app/lib/API/Job.pm | 88 ++++++++++--
traffic_ops/app/lib/Fixtures/Job.pm | 45 +++++-
traffic_ops/app/lib/TrafficOpsRoutes.pm | 8 +-
traffic_ops/app/t/api/1.2/job.t | 58 ++++++++
6 files changed, 314 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/b05a5114/docs/source/development/traffic_ops.rst
----------------------------------------------------------------------
diff --git a/docs/source/development/traffic_ops.rst b/docs/source/development/traffic_ops.rst
index 41ad9cd..18b73a8 100644
--- a/docs/source/development/traffic_ops.rst
+++ b/docs/source/development/traffic_ops.rst
@@ -614,6 +614,7 @@ API 1.2 Reference
traffic_ops_api/v12/division
traffic_ops_api/v12/federation
traffic_ops_api/v12/hwinfo
+ traffic_ops_api/v12/job
traffic_ops_api/v12/parameter
traffic_ops_api/v12/phys_location
traffic_ops_api/v12/profile
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/b05a5114/docs/source/development/traffic_ops_api/v12/job.rst
----------------------------------------------------------------------
diff --git a/docs/source/development/traffic_ops_api/v12/job.rst b/docs/source/development/traffic_ops_api/v12/job.rst
new file mode 100644
index 0000000..be27309
--- /dev/null
+++ b/docs/source/development/traffic_ops_api/v12/job.rst
@@ -0,0 +1,136 @@
+..
+..
+.. 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-job:
+
+Jobs
+====
+
+.. _to-api-v12-job-route:
+
+/api/1.2/jobs
+++++++++++++++++++
+
+**GET /api/1.2/jobs**
+
+ Get all jobs (currently limited to invalidate content (PURGE) jobs) sorted by start time (descending).
+
+ Authentication Required: Yes
+
+ Role(s) Required: Operations or Admin
+
+ **Request Query Parameters**
+
+ +-----------------+----------+---------------------------------------------------+
+ | Name | Required | Description |
+ +=================+==========+===================================================+
+ | ``dsId`` | no | Filter jobs by Delivery Service ID. |
+ +-----------------+----------+---------------------------------------------------+
+ | ``userId`` | no | Filter jobs by User ID. |
+ +-----------------+----------+---------------------------------------------------+
+
+ **Response Properties**
+
+ +----------------------+--------+-------------------------------------------------+
+ | Parameter | Type | Description |
+ +======================+========+=================================================+
+ |``id`` | int | Job id |
+ +----------------------+--------+-------------------------------------------------+
+ |``assetUrl`` | string | URL of the asset to invalidate. |
+ +----------------------+--------+-------------------------------------------------+
+ |``deliveryService`` | string | Unique identifier of the job's DS. |
+ +----------------------+--------+-------------------------------------------------+
+ |``keyword`` | string | Job keyword (PURGE) |
+ +----------------------+--------+-------------------------------------------------+
+ |``parameters`` | string | Parameters associated with the job. |
+ +----------------------+--------+-------------------------------------------------+
+ |``startTime`` | string | Start time of the job. |
+ +----------------------+--------+-------------------------------------------------+
+ |``createdBy`` | string | Username that initiated the job. |
+ +----------------------+--------+-------------------------------------------------+
+
+ **Response Example** ::
+
+ {
+ "response": [
+ {
+ "id": 1
+ "assetUrl": "http:\/\/foo-bar.domain.net\/taco.html",
+ "deliveryService": "foo-bar",
+ "keyword": "PURGE",
+ "parameters": "TTL:48h",
+ "startTime": "2015-05-14 08:56:36-06",
+ "createdBy": "jdog24"
+ },
+ {
+ "id": 2
+ "assetUrl": "http:\/\/foo-bar.domain.net\/bell.html",
+ "deliveryService": "foo-bar",
+ "keyword": "PURGE",
+ "parameters": "TTL:72h",
+ "startTime": "2015-05-16 08:56:36-06",
+ "createdBy": "jdog24"
+ }
+ ]
+ }
+
+|
+
+
+**GET /api/1.2/jobs/:id**
+
+ Get a job by ID (currently limited to invalidate content (PURGE) jobs).
+
+ Authentication Required: Yes
+
+ Role(s) Required: Operations or Admin
+
+ **Response Properties**
+
+ +----------------------+--------+-------------------------------------------------+
+ | Parameter | Type | Description |
+ +======================+========+=================================================+
+ |``id`` | int | Job id |
+ +----------------------+--------+-------------------------------------------------+
+ |``assetUrl`` | string | URL of the asset to invalidate. |
+ +----------------------+--------+-------------------------------------------------+
+ |``deliveryService`` | string | Unique identifier of the job's DS. |
+ +----------------------+--------+-------------------------------------------------+
+ |``keyword`` | string | Job keyword (PURGE) |
+ +----------------------+--------+-------------------------------------------------+
+ |``parameters`` | string | Parameters associated with the job. |
+ +----------------------+--------+-------------------------------------------------+
+ |``startTime`` | string | Start time of the job. |
+ +----------------------+--------+-------------------------------------------------+
+ |``createdBy`` | string | Username that initiated the job. |
+ +----------------------+--------+-------------------------------------------------+
+
+ **Response Example** ::
+
+ {
+ "response": [
+ {
+ "id": 1
+ "assetUrl": "http:\/\/foo-bar.domain.net\/taco.html",
+ "deliveryService": "foo-bar",
+ "keyword": "PURGE",
+ "parameters": "TTL:48h",
+ "startTime": "2015-05-14 08:56:36-06",
+ "createdBy": "jdog24"
+ }
+ ]
+ }
+
+|
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/b05a5114/traffic_ops/app/lib/API/Job.pm
----------------------------------------------------------------------
diff --git a/traffic_ops/app/lib/API/Job.pm b/traffic_ops/app/lib/API/Job.pm
index 49891e5..0b2d804 100644
--- a/traffic_ops/app/lib/API/Job.pm
+++ b/traffic_ops/app/lib/API/Job.pm
@@ -38,6 +38,67 @@ use UI::Tools;
use Data::Dumper;
sub index {
+ my $self = shift;
+ my $ds_id = $self->param('dsId');
+ my $user_id = $self->param('userId');
+
+ if ( !&is_oper($self) ) {
+ return $self->forbidden();
+ }
+
+ my %criteria;
+ if ( defined $ds_id ) {
+ $criteria{'job_deliveryservice'} = $ds_id;
+ }
+ if ( defined $user_id ) {
+ $criteria{'job_user'} = $user_id;
+ }
+
+ my @data;
+ my $jobs = $self->db->resultset("Job")->search( \%criteria, { prefetch => [ 'job_deliveryservice', 'job_user' ], order_by => 'me.start_time DESC' } );
+ while ( my $job = $jobs->next ) {
+ push(
+ @data, {
+ "id" => $job->id,
+ "assetUrl" => $job->asset_url,
+ "deliveryService" => $job->job_deliveryservice->xml_id,
+ "keyword" => $job->keyword,
+ "parameters" => $job->parameters,
+ "startTime" => $job->start_time,
+ "createdBy" => $job->job_user->username,
+ }
+ );
+ }
+ $self->success( \@data );
+}
+
+sub show {
+ my $self = shift;
+ my $id = $self->param('id');
+
+ if ( !&is_oper($self) ) {
+ return $self->forbidden();
+ }
+
+ my $jobs = $self->db->resultset("Job")->search( { 'me.id' => $id }, { prefetch => [ 'job_deliveryservice', 'job_user' ] } );
+ my @data = ();
+ while ( my $job = $jobs->next ) {
+ push(
+ @data, {
+ "id" => $job->id,
+ "keyword" => $job->keyword,
+ "assetUrl" => $job->asset_url,
+ "parameters" => $job->parameters,
+ "startTime" => $job->start_time,
+ "deliveryService" => $job->job_deliveryservice->xml_id,
+ "createdBy" => $job->job_user->username,
+ }
+ );
+ }
+ $self->success( \@data );
+}
+
+sub get_current_user_jobs {
my $self = shift;
my $response = [];
@@ -45,26 +106,26 @@ sub index {
my $ds_id = $self->param('dsId');
my $keyword = $self->param('keyword') || 'PURGE';
- my $dbh;
+ my $jobs;
if ( defined($ds_id) ) {
- $dbh = $self->db->resultset('Job')->search(
+ $jobs = $self->db->resultset('Job')->search(
{ keyword => $keyword, 'job_user.username' => $username, 'job_deliveryservice.id' => $ds_id },
{ prefetch => [ { 'job_deliveryservice' => undef } ], join => 'job_user' }
);
- my $row_count = $dbh->count();
- if ( defined($dbh) && ( $row_count > 0 ) ) {
- my @data = $self->job_ds_data($dbh);
+ my $job_count = $jobs->count();
+ if ( defined($jobs) && ( $job_count > 0 ) ) {
+ my @data = $self->job_ds_data($jobs);
my $rh = new Utils::Helper::ResponseHelper();
$response = $rh->camelcase_response_keys(@data);
}
}
else {
- $dbh =
+ $jobs =
$self->db->resultset('Job')
->search( { keyword => $keyword, 'job_user.username' => $username }, { prefetch => [ { 'job_user' => undef } ], join => 'job_user' } );
- my $row_count = $dbh->count();
- if ( defined($dbh) && ( $row_count > 0 ) ) {
- my @data = $self->job_data($dbh);
+ my $job_count = $jobs->count();
+ if ( defined($jobs) && ( $job_count > 0 ) ) {
+ my @data = $self->job_data($jobs);
my $rh = new Utils::Helper::ResponseHelper();
$response = $rh->camelcase_response_keys(@data);
}
@@ -75,7 +136,7 @@ sub index {
# Creates a purge job based upon the Deliveryservice (ds_id) instead
# of the ds_xml_id like the UI does.
-sub create {
+sub create_current_user_job {
my $self = shift;
my $ds_id = $self->req->json->{dsId};
@@ -195,11 +256,12 @@ sub is_valid_date_format {
}
sub is_ttl_in_range {
- my $self = shift;
- my $value = shift;
+ my $self = shift;
+ my $value = shift;
my $min_hours = 1;
my $max_days =
- $self->db->resultset('Parameter')->search( { name => "maxRevalDurationDays" }, { config_file => "regex_revalidate.config" } )->get_column('value')->first;
+ $self->db->resultset('Parameter')->search( { name => "maxRevalDurationDays" }, { config_file => "regex_revalidate.config" } )->get_column('value')
+ ->first;
my $max_hours = $max_days * 24;
if ( !defined $value or $value eq '' ) {
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/b05a5114/traffic_ops/app/lib/Fixtures/Job.pm
----------------------------------------------------------------------
diff --git a/traffic_ops/app/lib/Fixtures/Job.pm b/traffic_ops/app/lib/Fixtures/Job.pm
index ad01cce..6cb35b7 100644
--- a/traffic_ops/app/lib/Fixtures/Job.pm
+++ b/traffic_ops/app/lib/Fixtures/Job.pm
@@ -18,21 +18,53 @@ extends 'DBIx::Class::EasyFixture';
use namespace::autoclean;
use POSIX qw(strftime);
-my $now = strftime( "%Y-%m-%d %H:%M:%S", gmtime() );
my %definition_for = (
- admin_job1 => {
+ job1 => {
new => 'Job',
using => {
+ id => 100,
agent => 1,
keyword => 'PURGE',
parameters => 'TTL:48h',
- asset_url => 'http://cdn2.edge/foo1/.*',
+ asset_url => 'http://cdn2.edge/job1/.*',
asset_type => 'file',
status => 1,
- start_time => $now,
+ start_time => strftime( "%Y-%m-%d %H:%M:%S", gmtime( time() - 1000 ) ),
job_user => 100,
job_deliveryservice => 100,
- entered_time => $now
+ entered_time => strftime( "%Y-%m-%d %H:%M:%S", gmtime( time() - 1000 ) ),
+ },
+ },
+ job2 => {
+ new => 'Job',
+ using => {
+ id => 200,
+ agent => 1,
+ keyword => 'PURGE',
+ parameters => 'TTL:48h',
+ asset_url => 'http://cdn2.edge/job2/.*',
+ asset_type => 'file',
+ status => 1,
+ start_time => strftime( "%Y-%m-%d %H:%M:%S", gmtime( time() - 500 ) ),
+ job_user => 100,
+ job_deliveryservice => 200,
+ entered_time => strftime( "%Y-%m-%d %H:%M:%S", gmtime( time() - 500 ) ),
+ },
+ },
+ job3 => {
+ new => 'Job',
+ using => {
+ id => 300,
+ agent => 1,
+ keyword => 'PURGE',
+ parameters => 'TTL:48h',
+ asset_url => 'http://cdn2.edge/job3/.*',
+ asset_type => 'file',
+ status => 1,
+ start_time => strftime( "%Y-%m-%d %H:%M:%S", gmtime( time() - 200 ) ),
+ job_user => 200,
+ job_deliveryservice => 100,
+ entered_time => strftime( "%Y-%m-%d %H:%M:%S", gmtime( time() - 200 ) ),
},
},
);
@@ -43,8 +75,7 @@ sub get_definition {
}
sub all_fixture_names {
- # sort by db name to guarantee insertion order
- return (sort { $definition_for{$a}{using}{id} cmp $definition_for{$b}{using}{id} } keys %definition_for);
+ return keys %definition_for;
}
__PACKAGE__->meta->make_immutable;
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/b05a5114/traffic_ops/app/lib/TrafficOpsRoutes.pm
----------------------------------------------------------------------
diff --git a/traffic_ops/app/lib/TrafficOpsRoutes.pm b/traffic_ops/app/lib/TrafficOpsRoutes.pm
index 083636a..553c967 100644
--- a/traffic_ops/app/lib/TrafficOpsRoutes.pm
+++ b/traffic_ops/app/lib/TrafficOpsRoutes.pm
@@ -585,6 +585,10 @@ sub api_routes {
$r->get("/api/$version/hwinfo/dtdata")->over( authenticated => 1 )->to( 'HwInfo#data', namespace => $namespace );
$r->get("/api/$version/hwinfo")->over( authenticated => 1 )->to( 'HwInfo#index', namespace => $namespace );
+ # -- JOBS
+ $r->get("/api/$version/jobs")->over( authenticated => 1 )->to( 'Job#index', namespace => $namespace );
+ $r->get("/api/$version/jobs/:id")->over( authenticated => 1 )->to( 'Job#show', namespace => $namespace );
+
# -- PARAMETERS
# Supports ?orderby=key
$r->get("/api/$version/parameters")->over( authenticated => 1 )->to( 'Parameter#index', namespace => $namespace );
@@ -744,8 +748,8 @@ sub api_routes {
->to( 'User#get_available_deliveryservices', namespace => $namespace );
# -- USERS: JOBS
- $r->get("/api/$version/user/current/jobs")->over( authenticated => 1 )->to( 'Job#index', namespace => $namespace );
- $r->post("/api/$version/user/current/jobs")->over( authenticated => 1 )->to( 'Job#create', namespace => $namespace );
+ $r->get("/api/$version/user/current/jobs")->over( authenticated => 1 )->to( 'Job#get_current_user_jobs', namespace => $namespace );
+ $r->post("/api/$version/user/current/jobs")->over( authenticated => 1 )->to( 'Job#create_current_user_job', namespace => $namespace );
# -- RIAK
# -- RIAK: KEYS
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/b05a5114/traffic_ops/app/t/api/1.2/job.t
----------------------------------------------------------------------
diff --git a/traffic_ops/app/t/api/1.2/job.t b/traffic_ops/app/t/api/1.2/job.t
new file mode 100644
index 0000000..9b92564
--- /dev/null
+++ b/traffic_ops/app/t/api/1.2/job.t
@@ -0,0 +1,58 @@
+package main;
+#
+#
+# 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.
+#
+use Mojo::Base -strict;
+use Test::More;
+use Test::Mojo;
+use DBI;
+use strict;
+use warnings;
+no warnings 'once';
+use warnings 'all';
+use Test::TestHelper;
+
+#no_transactions=>1 ==> keep fixtures after every execution, beware of duplicate data!
+#no_transactions=>0 ==> delete fixtures after every execution
+
+BEGIN { $ENV{MOJO_MODE} = "test" }
+
+my $schema = Schema->connect_to_database;
+my $t = Test::Mojo->new('TrafficOps');
+
+Test::TestHelper->unload_core_data($schema);
+Test::TestHelper->load_core_data($schema);
+
+ok $t->post_ok( '/login', => form => { u => Test::TestHelper::ADMIN_USER, p => Test::TestHelper::ADMIN_USER_PASSWORD } )->status_is(302)
+ ->or( sub { diag $t->tx->res->content->asset->{content}; } ), 'Should login?';
+
+# get first one sorted by start_time DESC
+$t->get_ok("/api/1.2/jobs")->status_is(200)->json_is( "/response/0/id", 300 )
+ ->json_is( "/response/0/assetUrl", "http://cdn2.edge/job3/.*" )->or( sub { diag $t->tx->res->content->asset->{content}; } );
+
+# get first one sorted by start_time and filtered by DS
+$t->get_ok("/api/1.2/jobs?dsId=200")->status_is(200)->json_is( "/response/0/id", 200 )
+ ->json_is( "/response/0/assetUrl", "http://cdn2.edge/job2/.*" )->or( sub { diag $t->tx->res->content->asset->{content}; } );
+
+# get first one sorted by start_time and filtered by User
+$t->get_ok("/api/1.2/jobs?userId=200")->status_is(200)->json_is( "/response/0/id", 300 )
+ ->json_is( "/response/0/assetUrl", "http://cdn2.edge/job3/.*" )->or( sub { diag $t->tx->res->content->asset->{content}; } );
+
+# get specific job
+$t->get_ok("/api/1.2/jobs/100")->status_is(200)->json_is( "/response/0/id", 100 )
+ ->json_is( "/response/0/keyword", "PURGE" )->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}; } );
+done_testing();
+
[2/2] incubator-trafficcontrol git commit: loads job fixtures
Posted by de...@apache.org.
loads job fixtures
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/5db8985d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/5db8985d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/5db8985d
Branch: refs/heads/master
Commit: 5db8985d9a17b8b4e4621cfa68f9ef1d3c95dcf8
Parents: 51b038a
Author: Jeremy Mitchell <mi...@gmail.com>
Authored: Tue Apr 11 09:55:15 2017 -0600
Committer: Dewayne Richardson <de...@apache.org>
Committed: Wed Apr 12 08:58:31 2017 -0600
----------------------------------------------------------------------
traffic_ops/app/lib/Test/TestHelper.pm | 2 ++
1 file changed, 2 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/5db8985d/traffic_ops/app/lib/Test/TestHelper.pm
----------------------------------------------------------------------
diff --git a/traffic_ops/app/lib/Test/TestHelper.pm b/traffic_ops/app/lib/Test/TestHelper.pm
index 2c57561..3d6c566 100644
--- a/traffic_ops/app/lib/Test/TestHelper.pm
+++ b/traffic_ops/app/lib/Test/TestHelper.pm
@@ -31,6 +31,7 @@ use Fixtures::DeliveryserviceTmuser;
use Fixtures::Asn;
use Fixtures::Cachegroup;
use Fixtures::EdgeCachegroup;
+use Fixtures::Job;
use Fixtures::Profile;
use Fixtures::Parameter;
use Fixtures::ProfileParameter;
@@ -131,6 +132,7 @@ sub load_core_data {
$self->load_all_fixtures( Fixtures::DeliveryserviceRegex->new($schema_values) );
$self->load_all_fixtures( Fixtures::DeliveryserviceTmuser->new($schema_values) );
$self->load_all_fixtures( Fixtures::DeliveryserviceServer->new($schema_values) );
+ $self->load_all_fixtures( Fixtures::Job->new($schema_values) );
}
sub unload_core_data {