diff --git a/app/controllers/api/connect/v3/systems/systems_controller.rb b/app/controllers/api/connect/v3/systems/systems_controller.rb index 08c60f105..1f6a1eff0 100644 --- a/app/controllers/api/connect/v3/systems/systems_controller.rb +++ b/app/controllers/api/connect/v3/systems/systems_controller.rb @@ -3,6 +3,17 @@ class Api::Connect::V3::Systems::SystemsController < Api::Connect::BaseControlle before_action :authenticate_system def update + if params[:online_at].present? + params[:online_at].each do |online_at| + dthours = online_at.split(':') + @system_uptime = SystemUptime.create!(system_id: @system.id, online_at_day: dthours[0], online_at_hours: dthours[1]) + logger.info(N_("Added uptime information for system '%s'") % @system.id) + rescue ActiveRecord::RecordNotUnique + logger.info(N_("Uptime information existing for system '%s'") % @system.id) + end + SystemUptime.where("online_at_day < '#{90.days.ago.to_date}'").delete_all + end + @system.hostname = params[:hostname] # Since the payload is handled by rails all values are converted to string diff --git a/app/models/system_uptime.rb b/app/models/system_uptime.rb new file mode 100644 index 000000000..f6bf1087b --- /dev/null +++ b/app/models/system_uptime.rb @@ -0,0 +1,7 @@ +class SystemUptime < ApplicationRecord + belongs_to :system + + validates :system_id, presence: true + validates :online_at_day, presence: true + validates :online_at_hours, presence: true +end diff --git a/db/migrate/20240111200053_create_system_uptimes.rb b/db/migrate/20240111200053_create_system_uptimes.rb new file mode 100644 index 000000000..9c7b001f0 --- /dev/null +++ b/db/migrate/20240111200053_create_system_uptimes.rb @@ -0,0 +1,18 @@ +class CreateSystemUptimes < ActiveRecord::Migration[6.1] + def change + safety_assured do + create_table :system_uptimes, id: false do |t| + t.bigint :system_id, null: false + t.date :online_at_day, null: false + t.column :online_at_hours, 'binary(24)', null: false + t.timestamps + end + + commit_db_transaction + + add_index :system_uptimes, %i[system_id online_at_day online_at_hours], unique: true, name: 'id_online_day_hours' + + add_foreign_key :system_uptimes, :systems, column: :system_id, validate: false + end + end +end diff --git a/spec/models/system_uptime_spec.rb b/spec/models/system_uptime_spec.rb new file mode 100644 index 000000000..84d2c2f68 --- /dev/null +++ b/spec/models/system_uptime_spec.rb @@ -0,0 +1,7 @@ +require 'rails_helper' + +RSpec.describe SystemUptime, type: :model do + it { is_expected.to validate_presence_of(:system_id) } + it { is_expected.to validate_presence_of(:online_at_day) } + it { is_expected.to validate_presence_of(:online_at_hours) } +end diff --git a/spec/requests/api/connect/v3/systems/systems_controller_spec.rb b/spec/requests/api/connect/v3/systems/systems_controller_spec.rb index f029c5dff..8e678631d 100644 --- a/spec/requests/api/connect/v3/systems/systems_controller_spec.rb +++ b/spec/requests/api/connect/v3/systems/systems_controller_spec.rb @@ -7,6 +7,7 @@ let(:system) { FactoryBot.create(:system, hostname: 'initial') } let(:url) { '/connect/systems' } let(:headers) { auth_header.merge(version_header) } + let(:systemuptime) { system.system_uptimes.first } let(:hwinfo) do { cpus: 16, @@ -18,9 +19,12 @@ } end let(:payload) { { hostname: 'test', hwinfo: hwinfo } } + let(:payload1) { { hostname: 'test', hwinfo: hwinfo, online_at: ['2023-12-21:111111111111111111111111'] } } describe '#update' do - subject(:update_action) { put url, params: payload, headers: headers } + let(:update_action) { put url, params: payload, headers: headers } + + subject(:update_uptime_action) { put url, params: payload1, headers: headers } context 'when hostname is provided' do it do @@ -45,6 +49,15 @@ expect(information[:cpus]).to eq('16') end end + + context 'when uptime data provided' do + it do + update_uptime_action + expect(systemuptime.system_id).to eq(system.reload.id) + expect(systemuptime.online_at_day.to_date).to eq(Date.parse('2023-12-21')) + expect(systemuptime.online_at_hours.to_s).to eq('111111111111111111111111') + end + end end context 'when hostname is not provided' do