From 7e7371087b61aaf8a128d5f5f5ec6c43c06fd4ca Mon Sep 17 00:00:00 2001 From: cedricnjanga Date: Tue, 6 Feb 2018 21:52:02 -0800 Subject: Refs #5707 Add status to the application to track 'blocked objects' --- app/controllers/statuses_controller.rb | 21 +++++++++++++++++++++ app/models/compliance_check_set.rb | 2 ++ app/models/import.rb | 2 ++ app/models/referential.rb | 1 + config/routes.rb | 2 ++ 5 files changed, 28 insertions(+) create mode 100644 app/controllers/statuses_controller.rb diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb new file mode 100644 index 000000000..81e668ad4 --- /dev/null +++ b/app/controllers/statuses_controller.rb @@ -0,0 +1,21 @@ +class StatusesController < ChouetteController + respond_to :json + + def index + + status = { + status: global_status, + referentials_blocked: Referential.blocked.count, + imports_blocked: Import.blocked.count, + compliance_check_sets_blocked: ComplianceCheckSet.blocked.count + } + render json: status.to_json + end + + private + + def global_status + blocked_items = Referential.blocked.count + Import.blocked.count + ComplianceCheckSet.blocked.count + blocked_items > 0 ? 'ko' : 'ok' + end +end \ No newline at end of file diff --git a/app/models/compliance_check_set.rb b/app/models/compliance_check_set.rb index 3ea832048..289fc134f 100644 --- a/app/models/compliance_check_set.rb +++ b/app/models/compliance_check_set.rb @@ -19,6 +19,8 @@ class ComplianceCheckSet < ActiveRecord::Base where('created_at BETWEEN :begin AND :end', begin: period_range.begin, end: period_range.end) end + scope :blocked, -> { where('created_at < ? AND status = ?', 4.hours.ago, 'running') } + def self.finished_statuses %w(successful failed warning aborted canceled) end diff --git a/app/models/import.rb b/app/models/import.rb index 049a65f40..d8e763bf3 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -13,6 +13,8 @@ class Import < ActiveRecord::Base where('started_at BETWEEN :begin AND :end', begin: period_range.begin, end: period_range.end) end + scope :blocked, -> { where('created_at < ? AND status = ?', 4.hours.ago, 'running') } + extend Enumerize enumerize :status, in: %w(new pending successful warning failed running aborted canceled), scope: true, default: :new diff --git a/app/models/referential.rb b/app/models/referential.rb index f64db4ebf..509e0412f 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -62,6 +62,7 @@ class Referential < ActiveRecord::Base scope :order_by_validity_period, ->(dir) { joins(:metadatas).order("unnest(periodes) #{dir}") } scope :order_by_lines, ->(dir) { joins(:metadatas).group("referentials.id").order("sum(array_length(referential_metadata.line_ids,1)) #{dir}") } scope :not_in_referential_suite, -> { where referential_suite_id: nil } + scope :blocked, -> { where('ready = ? AND created_at < ?', false, 4.hours.ago) } def save_with_table_lock_timeout(options = {}) save_without_table_lock_timeout(options) diff --git a/config/routes.rb b/config/routes.rb index 2715ca428..0b657b028 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -256,4 +256,6 @@ ChouetteIhm::Application.routes.draw do match '/422', to: 'errors#server_error', via: :all, as: 'unprocessable_entity' match '/500', to: 'errors#server_error', via: :all, as: 'server_error' + match '/status', to: 'statuses#index', via: :get + end -- cgit v1.2.3 From 6b9dd49ee49bcd43626ed507549fa0b8a71cc366 Mon Sep 17 00:00:00 2001 From: cedricnjanga Date: Sun, 11 Feb 2018 21:16:07 -0800 Subject: Refs #5707 update the global status method to avoid unacessary db requests --- app/controllers/statuses_controller.rb | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index 81e668ad4..e3a236e81 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -1,6 +1,6 @@ class StatusesController < ChouetteController respond_to :json - + def index status = { @@ -9,13 +9,12 @@ class StatusesController < ChouetteController imports_blocked: Import.blocked.count, compliance_check_sets_blocked: ComplianceCheckSet.blocked.count } - render json: status.to_json + render json: status.to_json end - private + private def global_status - blocked_items = Referential.blocked.count + Import.blocked.count + ComplianceCheckSet.blocked.count - blocked_items > 0 ? 'ko' : 'ok' + blocked_items = Referential.blocked.exists? || Import.blocked.exists? || ComplianceCheckSet.blocked.exists? ? 'ko' : 'ok' end -end \ No newline at end of file +end -- cgit v1.2.3 From 49c4c822d5e7f526ad7be9c0aa21c201653f24ea Mon Sep 17 00:00:00 2001 From: Zog Date: Tue, 13 Feb 2018 09:06:25 +0100 Subject: Refs #5707; Add specs --- app/controllers/statuses_controller.rb | 6 ++-- spec/controllers/statuses_controller_spec.rb | 50 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 spec/controllers/statuses_controller_spec.rb diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index e3a236e81..e38a92982 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -4,17 +4,17 @@ class StatusesController < ChouetteController def index status = { - status: global_status, referentials_blocked: Referential.blocked.count, imports_blocked: Import.blocked.count, compliance_check_sets_blocked: ComplianceCheckSet.blocked.count } + status[:status] = global_status status render json: status.to_json end private - def global_status - blocked_items = Referential.blocked.exists? || Import.blocked.exists? || ComplianceCheckSet.blocked.exists? ? 'ko' : 'ok' + def global_status status + status.values.all?(&:zero?) ? 'ok' : 'ko' end end diff --git a/spec/controllers/statuses_controller_spec.rb b/spec/controllers/statuses_controller_spec.rb new file mode 100644 index 000000000..8a6db8e28 --- /dev/null +++ b/spec/controllers/statuses_controller_spec.rb @@ -0,0 +1,50 @@ +RSpec.describe StatusesController, :type => :controller do + + describe "GET index" do + login_user + render_views + + + let(:request){ get :index} + let(:parsed_response){ JSON.parse response.body } + it "should be ok" do + request + expect(response).to have_http_status 200 + expect(parsed_response["status"]).to eq "ok" + end + context "without blocked object" do + before do + create :referential + create :import + create :compliance_check_set + request + end + + it "should be ok" do + expect(response).to have_http_status 200 + expect(parsed_response["status"]).to eq "ok" + expect(parsed_response["referentials_blocked"]).to eq 0 + expect(parsed_response["imports_blocked"]).to eq 0 + expect(parsed_response["imports_blocked"]).to eq 0 + end + end + + context "with a blocked object" do + before do + create :referential, created_at: 5.hours.ago, ready: false + create :import + create :compliance_check_set + request + end + + it "should be ko" do + expect(Referential.blocked.count).to eq 1 + expect(response).to have_http_status 200 + expect(parsed_response["status"]).to eq "ko" + expect(parsed_response["referentials_blocked"]).to eq 1 + expect(parsed_response["imports_blocked"]).to eq 0 + expect(parsed_response["imports_blocked"]).to eq 0 + end + end + end +end -- cgit v1.2.3