From d3b609ab50d1e982d858e89935a31a5823f025e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ondr=CC=8Cej=20Hos=CC=8Ca=CC=81k?= Date: Tue, 24 Jan 2017 18:49:27 +0100 Subject: [PATCH] feat: add status endpoint pro vsphere provider --- lib/lab_manager/app.rb | 5 ++ lib/lab_manager/app/endpoints/status.rb | 22 ++++++++ spec/integration/endpoints/status_spec.rb | 67 +++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 lib/lab_manager/app/endpoints/status.rb create mode 100644 spec/integration/endpoints/status_spec.rb diff --git a/lib/lab_manager/app.rb b/lib/lab_manager/app.rb index b437f62..c60a3f6 100644 --- a/lib/lab_manager/app.rb +++ b/lib/lab_manager/app.rb @@ -6,6 +6,7 @@ require 'lab_manager/app/endpoints/base' require 'lab_manager/app/endpoints/uptime' require 'lab_manager/app/endpoints/computes' +require 'lab_manager/app/endpoints/status' module LabManager # base rest service class @@ -29,6 +30,10 @@ def initialize map '/computes' do run LabManager::App::Endpoints::Compute.new end + + map '/status' do + run LabManager::App::Endpoints::Status.new + end end end diff --git a/lib/lab_manager/app/endpoints/status.rb b/lib/lab_manager/app/endpoints/status.rb new file mode 100644 index 0000000..c11a8bf --- /dev/null +++ b/lib/lab_manager/app/endpoints/status.rb @@ -0,0 +1,22 @@ +require 'lab_manager/app/endpoints/base' +require 'json' + +module LabManager + class App + module Endpoints + # class responsible for provider statuses + class Status < Base + get '/v_sphere' do + provider_name = 'v_sphere' + { + max_running_machines: ::Provider::VSphereConfig.scheduler.max_vm, + running_machines: ::Compute.where(provider_name: provider_name, state: 'running').count, + errored_machines: ::Compute.where(provider_name: provider_name, state: 'errored').count, + created_machines: ::Compute.where(provider_name: provider_name, state: 'created').count, + queued_machines: ::Compute.where(provider_name: provider_name, state: 'queued').count + }.to_json + end + end + end + end +end diff --git a/spec/integration/endpoints/status_spec.rb b/spec/integration/endpoints/status_spec.rb new file mode 100644 index 0000000..81fc86d --- /dev/null +++ b/spec/integration/endpoints/status_spec.rb @@ -0,0 +1,67 @@ +require 'spec_helper' +require 'rack/test' +require 'lab_manager/app' + +describe 'Status' do + include Rack::Test::Methods + + def app + LabManager::App.new + end + + describe 'GET /status/v_sphere' do + before(:each) do + allow(::Provider::VSphereConfig).to receive_message_chain(:scheduler, :max_vm) { 3 } + + create(:compute, provider_name: 'v_sphere', name: 'one').update_column(:state, 'errored') + create(:compute, provider_name: 'v_sphere', name: 'two').update_column(:state, 'errored') + + create(:compute, provider_name: 'v_sphere', name: 'three').update_column(:state, 'created') + create(:compute, provider_name: 'v_sphere', name: 'four').update_column(:state, 'created') + create(:compute, provider_name: 'v_sphere', name: 'five').update_column(:state, 'created') + + create(:compute, provider_name: 'v_sphere', name: 'six').update_column(:state, 'running') + + create(:compute, provider_name: 'v_sphere', name: 'seven').update_column(:state, 'queued') + create(:compute, provider_name: 'v_sphere', name: 'eight').update_column(:state, 'queued') + end + + def perform_request + get '/status/v_sphere' + expect(last_response.status).to eq 200 + MultiJson.load(last_response.body) + end + + it 'reads max_vm machines from vsphere configuration' do + expect(::Provider::VSphereConfig).to receive_message_chain(:scheduler, :max_vm) { 3 } + + response_json = perform_request + + expect(response_json['max_running_machines']).to eq 3 + end + + it 'returns errored machines count' do + response_json = perform_request + + expect(response_json['errored_machines']).to eq 2 + end + + it 'returns running machines count' do + response_json = perform_request + + expect(response_json['running_machines']).to eq 1 + end + + it 'returns created machines count' do + response_json = perform_request + + expect(response_json['created_machines']).to eq 3 + end + + it 'returns queued machines count' do + response_json = perform_request + + expect(response_json['queued_machines']).to eq 2 + end + end +end