Skip to content

Commit a004661

Browse files
committed
Move VirtualMachineTemplate handling to OpenShift
1 parent f98a71e commit a004661

File tree

8 files changed

+141
-0
lines changed

8 files changed

+141
-0
lines changed

app/models/manageiq/providers/openshift/infra_manager/refresh_worker/runner.rb

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,60 @@ def partial_refresh_parser_class
1818
def persister_class
1919
ManageIQ::Providers::Openshift::Inventory::Persister::InfraManager
2020
end
21+
22+
#
23+
# Performs a full refresh.
24+
#
25+
def full_refresh
26+
# Create and populate the collector, persister and parser
27+
# and parse inventories
28+
inventory = provider_class::Inventory.build(manager, nil)
29+
collector = inventory.collector
30+
persister = inventory.parse
31+
32+
# execute persist:
33+
persister&.persist!
34+
35+
# Update the memory:
36+
memory.add_list_version(:nodes, collector.nodes.resourceVersion)
37+
memory.add_list_version(:vms, collector.vms.resourceVersion)
38+
memory.add_list_version(:vm_instances, collector.vm_instances.resourceVersion)
39+
memory.add_list_version(:templates, collector.templates.resourceVersion)
40+
memory.add_list_version(:instance_types, collector.instance_types.resourceVersion)
41+
42+
manager.update(:last_refresh_error => nil, :last_refresh_date => Time.now.utc)
43+
rescue StandardError => error
44+
_log.error('Full refresh failed.')
45+
_log.log_backtrace(error)
46+
manager.update(:last_refresh_error => error.to_s, :last_refresh_date => Time.now.utc)
47+
end
48+
49+
#
50+
# Start watches
51+
#
52+
def start_watches
53+
# This flag will be used to tell the threads to get out of their loops:
54+
@finish = Concurrent::AtomicBoolean.new(false)
55+
56+
# Create the watches:
57+
@watches = []
58+
@watches << @manager.kubeclient.watch_nodes(:resource_version => memory.get_list_version(:nodes))
59+
@watches << @manager.kubeclient("kubevirt.io/v1").watch_virtual_machines(:resource_version => memory.get_list_version(:vms))
60+
@watches << @manager.kubeclient("kubevirt.io/v1").watch_virtual_machine_instances(:resource_version => memory.get_list_version(:vm_instances))
61+
@watches << @manager.kubeclient("template.openshift.io/v1").watch_templates(:resource_version => memory.get_list_version(:templates))
62+
@watches << @manager.kubeclient("instancetype.kubevirt.io/v1beta1").watch_virtual_machine_cluster_instancetypes(:resource_version => memory.get_list_version(:instance_types))
63+
64+
# Create the threads that run the watches and put the notices in the queue:
65+
@watchers = []
66+
@watches.each do |watch|
67+
thread = Thread.new do
68+
until @finish.value
69+
watch.each do |notice|
70+
@queue.push(notice)
71+
end
72+
end
73+
end
74+
@watchers << thread
75+
end
76+
end
2177
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module ManageIQ::Providers::Openshift::Inventory::Collector::InfraManager::CollectorMixin
2+
extend ActiveSupport::Concern
3+
4+
attr_reader :templates
5+
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
class ManageIQ::Providers::Openshift::Inventory::Collector::InfraManager::FullRefresh < ManageIQ::Providers::Kubevirt::Inventory::Collector::FullRefresh
2+
include ManageIQ::Providers::Openshift::Inventory::Collector::InfraManager::CollectorMixin
3+
4+
def initialize(manager, refresh_target)
5+
super
6+
7+
@templates = @manager.kubeclient("template.openshift.io/v1").get_templates
8+
end
29
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
class ManageIQ::Providers::Openshift::Inventory::Collector::InfraManager::PartialRefresh < ManageIQ::Providers::Kubevirt::Inventory::Collector::PartialRefresh
2+
include ManageIQ::Providers::Openshift::Inventory::Collector::InfraManager::CollectorMixin
3+
4+
def initialize(manager, notices)
5+
super
6+
7+
@templates = notices_of_kind(notices, 'VirtualMachineTemplate')
8+
end
29
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
11
class ManageIQ::Providers::Openshift::Inventory::Parser::InfraManager::FullRefresh < ManageIQ::Providers::Kubevirt::Inventory::Parser::FullRefresh
2+
include ManageIQ::Providers::Openshift::Inventory::Parser::InfraManager::ParserMixin
3+
4+
def parse
5+
super
6+
7+
templates = collector.templates
8+
@template_collection = persister.template_collection
9+
process_templates(templates)
10+
end
211
end
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
module ManageIQ::Providers::Openshift::Inventory::Parser::InfraManager::ParserMixin
2+
extend ActiveSupport::Concern
3+
4+
attr_reader :template_collection
5+
6+
def process_templates(objects)
7+
objects.each do |object|
8+
process_template(object)
9+
end
10+
end
11+
12+
def process_template(object)
13+
# Get the basic information:
14+
uid = object.metadata.uid
15+
vm = vm_from_objects(object.objects)
16+
return if vm.nil?
17+
18+
# Add the inventory object for the template:
19+
template_object = template_collection.find_or_build(uid)
20+
template_object.connection_state = 'connected'
21+
template_object.ems_ref = uid
22+
template_object.name = object.metadata.name
23+
template_object.raw_power_state = 'never'
24+
template_object.template = true
25+
template_object.uid_ems = uid
26+
template_object.location = object.metadata.namespace
27+
28+
# Add the inventory object for the hardware:
29+
process_hardware(template_object, object.parameters, object.metadata.labels, vm.dig(:spec, :template, :spec, :domain))
30+
31+
# Add the inventory object for the OperatingSystem
32+
process_os(template_object, object.metadata.labels, object.metadata.annotations)
33+
end
34+
end
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,11 @@
11
class ManageIQ::Providers::Openshift::Inventory::Parser::InfraManager::PartialRefresh < ManageIQ::Providers::Kubevirt::Inventory::Parser::PartialRefresh
2+
include ManageIQ::Providers::Openshift::Inventory::Parser::InfraManager::ParserMixin
3+
4+
def parse
5+
templates = collector.templates
6+
template_ids = get_object_ids(templates.map(&:object))
7+
discard_deleted_notices(templates)
8+
@template_collection = persister.template_collection(:targeted => true, :ids => template_ids)
9+
process_templates(templates.map(&:object))
10+
end
211
end
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,16 @@
11
class ManageIQ::Providers::Openshift::Inventory::Persister::InfraManager < ManageIQ::Providers::Kubevirt::Inventory::Persister
2+
def template_collection(targeted: false, ids: [])
3+
add_collection(infra, :miq_templates) do |builder|
4+
builder.add_properties(
5+
:targeted => targeted,
6+
:manager_uuids => ids,
7+
:parent_inventory_collections => %i(vms)
8+
)
9+
10+
builder.add_default_values(
11+
:type => "#{manager.class}::Template",
12+
:vendor => manager.class.vendor
13+
)
14+
end
15+
end
216
end

0 commit comments

Comments
 (0)