From 601f50c6421f135b52f737a3b59baa32e6a8f1fd Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Mon, 27 Mar 2017 11:22:43 +0200 Subject: [PATCH] Add endpoint that returns a list of deployments that happened within last 8.hours add index created_at --- .../projects/deployments_controller.rb | 16 ++++++ config/routes/project.rb | 2 + ...750_add_created_at_index_to_deployments.rb | 11 ++++ db/schema.rb | 3 +- .../projects/deployments_controller_spec.rb | 50 +++++++++++++++++++ 5 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 app/controllers/projects/deployments_controller.rb create mode 100644 db/migrate/20170327091750_add_created_at_index_to_deployments.rb create mode 100644 spec/controllers/projects/deployments_controller_spec.rb diff --git a/app/controllers/projects/deployments_controller.rb b/app/controllers/projects/deployments_controller.rb new file mode 100644 index 00000000000..4606ddd62cc --- /dev/null +++ b/app/controllers/projects/deployments_controller.rb @@ -0,0 +1,16 @@ +class Projects::DeploymentsController < Projects::ApplicationController + before_action :authorize_read_deployment! + + def index + deployments = environment.deployments.where('created_at > ?', 8.hours.ago) + .map { |d| d.slice(:id, :iid, :created_at, :sha, :ref, :tag) } + + render json: { deployments: deployments } + end + + private + + def environment + @environment ||= project.environments.find(params[:environment_id]) + end +end diff --git a/config/routes/project.rb b/config/routes/project.rb index 823e0614aeb..39144b74629 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -168,6 +168,8 @@ constraints(ProjectUrlConstrainer.new) do collection do get :folder, path: 'folders/:id' end + + resources :deployments, only: [:index] end resource :cycle_analytics, only: [:show] diff --git a/db/migrate/20170327091750_add_created_at_index_to_deployments.rb b/db/migrate/20170327091750_add_created_at_index_to_deployments.rb new file mode 100644 index 00000000000..cc615208c41 --- /dev/null +++ b/db/migrate/20170327091750_add_created_at_index_to_deployments.rb @@ -0,0 +1,11 @@ +class AddCreatedAtIndexToDeployments < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def change + add_concurrent_index :deployments, :created_at + end +end diff --git a/db/schema.rb b/db/schema.rb index f476637ceb2..fe4c5c3f356 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170317203554) do +ActiveRecord::Schema.define(version: 20170327091750) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -346,6 +346,7 @@ ActiveRecord::Schema.define(version: 20170317203554) do t.string "on_stop" end + add_index "deployments", ["created_at"], name: "index_deployments_on_created_at", using: :btree add_index "deployments", ["project_id", "environment_id", "iid"], name: "index_deployments_on_project_id_and_environment_id_and_iid", using: :btree add_index "deployments", ["project_id", "iid"], name: "index_deployments_on_project_id_and_iid", unique: true, using: :btree diff --git a/spec/controllers/projects/deployments_controller_spec.rb b/spec/controllers/projects/deployments_controller_spec.rb new file mode 100644 index 00000000000..97a9fb8ae61 --- /dev/null +++ b/spec/controllers/projects/deployments_controller_spec.rb @@ -0,0 +1,50 @@ +require 'spec_helper' + +describe Projects::DeploymentsController do + include ApiHelpers + + let(:user) { create(:user) } + let(:project) { create(:empty_project) } + let(:environment) { create(:environment, name: 'production', project: project) } + let(:deployment) { create(:deployment, project: project, environment: environment) } + + before do + project.team << [user, :master] + + sign_in(user) + end + + describe 'GET #index' do + it 'returns list of deployments withing last 8 hours' do + create(:deployment, environment: environment, created_at: 9.hours.ago) + create(:deployment, environment: environment, created_at: 7.hours.ago) + create(:deployment, environment: environment) + + get :index, environment_params + + expect(response).to be_ok + + expect(json_response['deployments'].count).to eq(2) + end + + it 'returns a list with deployments information' do + deployment = create(:deployment, environment: environment) + + get :index, environment_params + expect(response).to be_ok + + deployments = json_response['deployments'] + deployment_info = deployments.first.with_indifferent_access + created_at = deployment_info.delete(:created_at).to_time.utc + + expect(deployments.count).to eq(1) + expect(deployment_info).to include(:id, :iid, :sha, :ref, :tag) + expect(deployment).to have_attributes(deployment_info) + expect(deployment.created_at).to be_within(1.second).of(created_at) + end + end + + def environment_params(opts={}) + opts.reverse_merge(namespace_id: project.namespace, project_id: project, environment_id: environment.id) + end +end -- GitLab