From da6b70c07b45239d86b6c459061649f0cf4434e1 Mon Sep 17 00:00:00 2001 From: leenasn Date: Wed, 11 Nov 2015 14:37:05 +0530 Subject: [PATCH] Display status in admin console, Change the filters to include relevant fields, scopes for device status --- app/admin/device.rb | 12 ++++++++++++ app/models/device.rb | 23 +++++++++++++++++++++- config/application.rb | 1 + config/environments/development.rb | 4 ++++ config/environments/production.rb | 3 +++ config/environments/test.rb | 4 ++++ spec/models/device_spec.rb | 31 ++++++++++++++++++++++++++++++ 7 files changed, 77 insertions(+), 1 deletion(-) diff --git a/app/admin/device.rb b/app/admin/device.rb index a465318..1b18cc0 100644 --- a/app/admin/device.rb +++ b/app/admin/device.rb @@ -17,10 +17,22 @@ ActiveAdmin.register Device do index do selectable_column id_column + column "Status" do | device | + status = device.status + status_tag status.titleize, STATUS_CLASSES[status.to_sym] + end column "Model Name",:model column :created_at column :updated_at + column :last_heartbeat_recd_time actions end + filter :model + filter :created_at + filter :updated_at + filter :last_heartbeat_recd_time + scope :active + scope :missing + scope :dead end diff --git a/app/models/device.rb b/app/models/device.rb index 757ffc7..d804c37 100644 --- a/app/models/device.rb +++ b/app/models/device.rb @@ -1,10 +1,20 @@ class Device < ActiveRecord::Base + enum status: [:active,:missing,:dead] + + attr_accessor :status + validates :unique_id, :model, presence: true validates :unique_id, uniqueness: true + before_create :generate_access_token after_create :update_last_heartbeats_time + has_many :heartbeats, dependent: :destroy - + + scope :active, -> {where("last_heartbeat_recd_time > '#{Time.now.utc - ACTIVE_TIMEFRAME}'")} + scope :missing, -> {where("last_heartbeat_recd_time < '#{Time.now.utc - ACTIVE_TIMEFRAME}'AND last_heartbeat_recd_time > '#{Time.now.utc - MISSING_TIMEFRAME}'")} + scope :dead, -> {where("last_heartbeat_recd_time < '#{Time.now.utc - MISSING_TIMEFRAME}'")} + def generate_access_token self.access_token = SecureRandom.uuid end @@ -17,4 +27,15 @@ class Device < ActiveRecord::Base def next_heartbeat_time (self.last_heartbeat_recd_time + HEARTBEAT_INTERVAL).to_i end + + def status + time_elapsed = Time.now - self.last_heartbeat_recd_time + if time_elapsed < ACTIVE_TIMEFRAME + self.status = Device.statuses.keys[0] + elsif time_elapsed < MISSING_TIMEFRAME + self.status = Device.statuses.keys[1] + else + self.status = Device.statuses.keys[2] + end + end end diff --git a/config/application.rb b/config/application.rb index f949266..a060909 100644 --- a/config/application.rb +++ b/config/application.rb @@ -35,3 +35,4 @@ module OnemdmServer config.generators.helper = false end end +STATUS_CLASSES ={active: :ok,missing: :warning,dead: :error} diff --git a/config/environments/development.rb b/config/environments/development.rb index b3d5589..daede1e 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -39,4 +39,8 @@ Rails.application.configure do # Raises error for missing translations # config.action_view.raise_on_missing_translations = true HEARTBEAT_INTERVAL = 1.minute + + ACTIVE_TIMEFRAME = 1.hours + MISSING_TIMEFRAME = 2.hours + end diff --git a/config/environments/production.rb b/config/environments/production.rb index e9f6064..92421cd 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -77,4 +77,7 @@ Rails.application.configure do # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false HEARTBEAT_INTERVAL = 1.hour + + ACTIVE_TIMEFRAME = 12.hours + MISSING_TIMEFRAME = 48.hours end diff --git a/config/environments/test.rb b/config/environments/test.rb index 0b9e1d2..768a4a1 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -40,4 +40,8 @@ Rails.application.configure do # Raises error for missing translations # config.action_view.raise_on_missing_translations = true HEARTBEAT_INTERVAL = 1.hour + + ACTIVE_TIMEFRAME = 12.hours + MISSING_TIMEFRAME = 48.hours + end diff --git a/spec/models/device_spec.rb b/spec/models/device_spec.rb index a337574..25a8445 100644 --- a/spec/models/device_spec.rb +++ b/spec/models/device_spec.rb @@ -22,4 +22,35 @@ RSpec.describe Device, type: :model do expect(Device.last.next_heartbeat_time).not_to be_nil end end + + describe "Device status" do + let!(:device){FactoryGirl.create(:device)} + it "Active" do + expect(device.status).to eql Device.statuses.keys[0] + end + it "Missing" do + device.update_attribute(:last_heartbeat_recd_time,Time.now - ACTIVE_TIMEFRAME) + expect(device.status).to eql Device.statuses.keys[1] + end + it "Dead" do + device.update_attribute(:last_heartbeat_recd_time,Time.now - MISSING_TIMEFRAME) + expect(device.status).to eql Device.statuses.keys[2] + end + describe "Scope" do + it "Active" do + expect(Device.active).to eq([device]) + end + it "Missing" do + device.update_attribute(:last_heartbeat_recd_time, + (Time.now - 15.hours)) + expect(Device.missing).to eq([device]) + end + it "Dead" do + device.update_attribute(:last_heartbeat_recd_time, + Time.now - 1.week) + expect(Device.dead).to eq([device]) + end + end + end + end