From 68d0b1f081a7b6a818b308aaaab69baff492ef2a Mon Sep 17 00:00:00 2001 From: Zahi Akiva Date: Mon, 12 Jun 2017 11:47:06 +0300 Subject: [PATCH] Archive Container Nodes --- app/models/container_node.rb | 13 +++-- app/models/container_node/purging.rb | 20 ++++++++ .../ems_refresh/save_inventory_container.rb | 3 +- .../manageiq/providers/container_manager.rb | 3 +- app/models/miq_schedule_worker/jobs.rb | 1 + spec/models/container_node/purging_spec.rb | 47 +++++++++++++++++++ 6 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 app/models/container_node/purging.rb create mode 100644 spec/models/container_node/purging_spec.rb diff --git a/app/models/container_node.rb b/app/models/container_node.rb index 103e64e48a0..7985e422c9a 100644 --- a/app/models/container_node.rb +++ b/app/models/container_node.rb @@ -5,6 +5,8 @@ class ContainerNode < ApplicationRecord include NewWithTypeStiMixin include TenantIdentityMixin include SupportsFeatureMixin + include ArchivedMixin + include_concern 'Purging' EXTERNAL_LOGGING_PATH = "/#/discover?_g=()&_a=(columns:!(hostname,level,kubernetes.pod_name,message),filters:!((meta:(disabled:!f,index:'%{index}',key:hostname,negate:!f),%{query})),index:'%{index}',interval:auto,query:(query_string:(analyze_wildcard:!t,query:'*')),sort:!(time,desc))".freeze @@ -33,9 +35,6 @@ class ContainerNode < ApplicationRecord virtual_column :system_distribution, :type => :string virtual_column :kernel_version, :type => :string - # Needed for metrics - delegate :my_zone, :to => :ext_management_system - def ready_condition container_conditions.find_by(:name => "Ready") end @@ -115,4 +114,12 @@ def external_logging_path index = ".operations.*" EXTERNAL_LOGGING_PATH % {:index => index, :query => query} end + + def disconnect_inv + return if archived? + _log.info("Disconnecting Node [#{name}] id [#{id}] from EMS [#{ext_management_system.name}]" \ + "id [#{ext_management_system.id}] ") + self.deleted_on = Time.now.utc + save + end end diff --git a/app/models/container_node/purging.rb b/app/models/container_node/purging.rb new file mode 100644 index 00000000000..dd27d9736d1 --- /dev/null +++ b/app/models/container_node/purging.rb @@ -0,0 +1,20 @@ +class ContainerNode < ApplicationRecord + module Purging + extend ActiveSupport::Concern + include PurgingMixin + + module ClassMethods + def purge_date + ::Settings.container_entities.history.keep_archived_entities.to_i_with_method.seconds.ago.utc + end + + def purge_window_size + ::Settings.container_entities.history.purge_window_size + end + + def purge_scope(older_than) + where(arel_table[:deleted_on].lteq(older_than)) + end + end + end +end diff --git a/app/models/ems_refresh/save_inventory_container.rb b/app/models/ems_refresh/save_inventory_container.rb index 42dd3a50f7c..2e3008a6a30 100644 --- a/app/models/ems_refresh/save_inventory_container.rb +++ b/app/models/ems_refresh/save_inventory_container.rb @@ -112,7 +112,8 @@ def save_container_nodes_inventory(ems, hashes) save_inventory_multi(ems.container_nodes, hashes, :use_association, [:ems_ref], [:labels, :tags, :computer_system, :container_conditions, - :additional_attributes], [:namespace]) + :additional_attributes], [:namespace], true) + store_ids_for_new_records(ems.container_nodes, hashes, :ems_ref) end diff --git a/app/models/manageiq/providers/container_manager.rb b/app/models/manageiq/providers/container_manager.rb index fd9c5e97403..1f513f2524a 100644 --- a/app/models/manageiq/providers/container_manager.rb +++ b/app/models/manageiq/providers/container_manager.rb @@ -7,7 +7,7 @@ class ContainerManager < BaseManager include HasMonitoringManagerMixin include SupportsFeatureMixin - has_many :container_nodes, :foreign_key => :ems_id, :dependent => :destroy + has_many :container_nodes, -> { active }, :foreign_key => :ems_id has_many :container_groups, -> { active }, :foreign_key => :ems_id has_many :container_services, :foreign_key => :ems_id, :dependent => :destroy has_many :container_replicators, :foreign_key => :ems_id, :dependent => :destroy @@ -44,6 +44,7 @@ class ContainerManager < BaseManager has_many :all_container_groups, :foreign_key => :ems_id, :dependent => :destroy, :class_name => "ContainerGroup" has_many :all_container_projects, :foreign_key => :ems_id, :dependent => :destroy, :class_name => "ContainerProject" has_many :all_container_images, :foreign_key => :ems_id, :dependent => :destroy, :class_name => "ContainerImage" + has_many :all_container_nodes, :foreign_key => :ems_id, :dependent => :destroy, :class_name => "ContainerNode" virtual_column :port_show, :type => :string diff --git a/app/models/miq_schedule_worker/jobs.rb b/app/models/miq_schedule_worker/jobs.rb index ecf6af3d1f2..4d4652b00fc 100644 --- a/app/models/miq_schedule_worker/jobs.rb +++ b/app/models/miq_schedule_worker/jobs.rb @@ -105,6 +105,7 @@ def miq_report_result_purge_timer def archived_entities_purge_timer queue_work(:class_name => "Container", :method_name => "purge_timer", :zone => nil) + queue_work(:class_name => "ContainerNode", :method_name => "purge_timer", :zone => nil) queue_work(:class_name => "ContainerGroup", :method_name => "purge_timer", :zone => nil) queue_work(:class_name => "ContainerImage", :method_name => "purge_timer", :zone => nil) queue_work(:class_name => "ContainerProject", :method_name => "purge_timer", :zone => nil) diff --git a/spec/models/container_node/purging_spec.rb b/spec/models/container_node/purging_spec.rb new file mode 100644 index 00000000000..f76bc984182 --- /dev/null +++ b/spec/models/container_node/purging_spec.rb @@ -0,0 +1,47 @@ +describe ContainerNode do + context "::Purging" do + context ".purge_queue" do + before do + EvmSpecHelper.create_guid_miq_server_zone + end + let(:purge_time) { (Time.zone.now + 10).round } + + it "submits to the queue" do + expect(described_class).to receive(:purge_date).and_return(purge_time) + described_class.purge_timer + + q = MiqQueue.all + expect(q.length).to eq(1) + expect(q.first).to have_attributes( + :class_name => described_class.name, + :method_name => "purge_by_date", + :args => [purge_time] + ) + end + end + + context ".purge" do + let(:deleted_date) { 6.months.ago } + + before do + @old_container_node = FactoryGirl.create(:container_node, :deleted_on => deleted_date - 1.day) + @purge_date_container_node = FactoryGirl.create(:container_node, :deleted_on => deleted_date) + @new_container_node = FactoryGirl.create(:container_node, :deleted_on => deleted_date + 1.day) + end + + def assert_unpurged_ids(unpurged_ids) + expect(described_class.order(:id).pluck(:id)).to eq(Array(unpurged_ids).sort) + end + + it "purge_date and older" do + described_class.purge(deleted_date) + assert_unpurged_ids(@new_container_node.id) + end + + it "with a window" do + described_class.purge(deleted_date, 1) + assert_unpurged_ids(@new_container_node.id) + end + end + end +end