Skip to content

Commit ea94dcb

Browse files
authored
Merge pull request #118 from dberg1/reconfig
add vm reconfiguration for cpu, memory and network
2 parents e437b2e + caf4b5b commit ea94dcb

File tree

5 files changed

+160
-35
lines changed

5 files changed

+160
-35
lines changed

app/models/manageiq/providers/ibm_power_hmc/infra_manager/lpar.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ class ManageIQ::Providers::IbmPowerHmc::InfraManager::Lpar < ManageIQ::Providers
33
unsupported_reason_add(:provisioning, _('Not connected to ems')) if ext_management_system.nil?
44
end
55

6+
supports :reconfigure_network_adapters
7+
68
def provider_object(connection = nil)
79
connection ||= ext_management_system.connect
810
connection.lpar(ems_ref)

app/models/manageiq/providers/ibm_power_hmc/infra_manager/vm.rb

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
class ManageIQ::Providers::IbmPowerHmc::InfraManager::Vm < ManageIQ::Providers::InfraManager::Vm
22
include ManageIQ::Providers::IbmPowerHmc::InfraManager::MetricsCaptureMixin
33

4+
include_concern "Reconfigure"
5+
46
virtual_delegate :hmc_managed, :to => :host, :prefix => true, :allow_nil => true, :type => :boolean
57

68
supports :control do
@@ -52,11 +54,15 @@ def raw_suspend
5254
end
5355

5456
def raw_rename(new_name)
55-
modify_attrs(:name => new_name)
57+
ext_management_system.with_provider_connection do |connection|
58+
modify_attrs(connection, :name => new_name)
59+
end
5660
end
5761

5862
def raw_set_description(new_description)
59-
modify_attrs(:description => new_description)
63+
ext_management_system.with_provider_connection do |connection|
64+
modify_attrs(connection, :description => new_description)
65+
end
6066
end
6167

6268
# See LogicalPartitionState.Enum (/rest/api/web/schema/inc/Enumerations.xsd)
@@ -116,18 +122,16 @@ def self.display_name(number = 1)
116122

117123
private
118124

119-
def modify_attrs(attrs = {})
120-
ext_management_system.with_provider_connection do |connection|
121-
connection.modify_object do
122-
provider_object(connection).tap do |obj|
123-
attrs.each do |key, value|
124-
obj.send("#{key}=", value)
125-
end
125+
def modify_attrs(connection, attrs = {})
126+
connection.modify_object do
127+
provider_object(connection).tap do |obj|
128+
attrs.each do |key, value|
129+
obj.send("#{key}=", value)
126130
end
127131
end
128-
rescue IbmPowerHmc::Connection::HttpError => e
129-
$ibm_power_hmc_log.error("error setting attributes #{attrs} for partition #{ems_ref}: #{e}")
130-
raise
131132
end
133+
rescue IbmPowerHmc::Connection::HttpError => e
134+
$ibm_power_hmc_log.error("error setting attributes #{attrs} for partition #{ems_ref}: #{e}")
135+
raise
132136
end
133137
end
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
module ManageIQ::Providers::IbmPowerHmc::InfraManager::Vm::Reconfigure
2+
def reconfigurable?
3+
host_hmc_managed
4+
end
5+
6+
def max_total_vcpus
7+
# 64 is based on the CEC's CurrentMaximumVirtualProcessorsPerAIXOrLinuxPartition and
8+
# CurrentMaximumVirtualProcessorsPerVirtualIOServerPartition settings.
9+
# This can be further reduced by the partition's MaximumVirtualProcessors setting.
10+
host && try(:processor_share_type) == "dedicated" ? host.cpu_total_cores : 64
11+
end
12+
13+
def max_vcpus
14+
max_total_vcpus
15+
end
16+
17+
def max_cpu_cores_per_socket(_total_vcpus = nil)
18+
1
19+
end
20+
21+
def max_memory_mb
22+
host ? host.hardware.memory_mb : 1_024
23+
end
24+
25+
def build_config_spec(options)
26+
$ibm_power_hmc_log.debug("building spec for #{options}")
27+
28+
lpar = ext_management_system.with_provider_connection { |connection| provider_object(connection) }
29+
30+
# Dynamic Reconfiguration requires RMC to be active.
31+
raise MiqException::MiqVmError, "RMC is not active on target" if lpar.state == "running" && lpar.rmc_state != "active"
32+
33+
# The HMC does not allow changing the VSWITCH or the VLAN of a client network adapter.
34+
# It could be done by deleting and recreating the adapter with the same MAC and options.
35+
raise MiqException::MiqVmError, "Cannot edit existing network adapter" if options.key?(:network_adapter_edit)
36+
37+
spec = {}
38+
build_memory_config_spec(lpar, spec, options) if options.key?(:vm_memory)
39+
build_proc_config_spec(lpar, spec, options) if options.key?(:number_of_cpus)
40+
build_netadap_create_config_spec(spec, options) if options.key?(:network_adapter_add)
41+
build_netadap_delete_config_spec(spec, options) if options.key?(:network_adapter_remove)
42+
43+
spec
44+
end
45+
46+
def build_memory_config_spec(lpar, spec, options)
47+
desired_memory = options[:vm_memory].to_i
48+
49+
raise MiqException::MiqVmError, "Memory cannot be lower than #{lpar.min_memory} MB" if desired_memory < lpar.min_memory.to_i
50+
raise MiqException::MiqVmError, "Memory cannot be greater than #{lpar.max_memory} MB" if desired_memory > lpar.max_memory.to_i
51+
52+
spec[:desired_memory] = desired_memory
53+
end
54+
55+
def build_proc_config_spec(lpar, spec, options)
56+
if lpar.dedicated == "true"
57+
min, max = lpar.minimum_procs, lpar.maximum_procs
58+
attr = :desired_procs
59+
else
60+
min, max = lpar.minimum_vprocs, lpar.maximum_vprocs
61+
attr = :desired_vprocs
62+
end
63+
64+
desired_procs = options[:number_of_cpus].to_i
65+
66+
raise MiqException::MiqVmError, "Processor count cannot be lower than #{min}" if desired_procs < min.to_i
67+
raise MiqException::MiqVmError, "Processor count cannot be greater than #{max}" if desired_procs > max.to_i
68+
69+
spec[attr] = desired_procs
70+
end
71+
72+
def build_netadap_create_config_spec(spec, options)
73+
spec[:netadap_create] = options[:network_adapter_add].map do |adapt|
74+
# Retrieve LAN attributes from DB.
75+
switch_ids = HostSwitch.where(:host_id => host.id).pluck(:switch_id)
76+
lan = Lan.find_by(:name => adapt[:network], :switch_id => switch_ids)
77+
raise MiqException::MiqVmError, "Network [#{adapt[:network]}] is not available on target" if lan.nil?
78+
79+
{
80+
:sys_uuid => host.ems_ref,
81+
:vswitch_uuid => lan.switch.uid_ems,
82+
:attrs => {:vlan_id => lan.tag}
83+
}
84+
end
85+
end
86+
87+
def build_netadap_delete_config_spec(spec, options)
88+
spec[:netadap_delete] = options[:network_adapter_remove].map do |adapt|
89+
nic = nics.find_by(:address => adapt[:network][:mac])
90+
raise MiqException::MiqVmError, "Network adapter [#{adapt[:network][:mac]}] is not available on target" if nic.nil?
91+
92+
nic.uid_ems
93+
end
94+
end
95+
96+
def raw_reconfigure(spec)
97+
$ibm_power_hmc_log.debug("reconfiguring with spec=#{spec}")
98+
99+
ext_management_system.with_provider_connection do |connection|
100+
attrs = spec.slice(:desired_memory, :desired_procs, :desired_vprocs)
101+
modify_attrs(connection, attrs) unless attrs.empty?
102+
103+
spec[:netadap_delete].try(:each) do |uuid|
104+
connection.network_adapter_lpar_delete(ems_ref, uuid)
105+
end
106+
107+
spec[:netadap_create].try(:each) do |netadap|
108+
connection.network_adapter_lpar_create(ems_ref, netadap[:sys_uuid], netadap[:vswitch_uuid], netadap[:attrs])
109+
end
110+
end
111+
end
112+
end

app/models/manageiq/providers/ibm_power_hmc/inventory/parser/infra_manager.rb

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,16 @@ def parse_cecs_unavailable
5252
:build_number => sys["SystemFirmware"]
5353
)
5454
persister.host_hardwares.build(
55-
:host => host,
56-
:cpu_type => "ppc64",
57-
:bitness => 64,
58-
:manufacturer => "IBM",
59-
:model => mtype_model,
60-
:memory_mb => sys["InstalledSystemMemory"],
61-
:cpu_total_cores => sys["InstalledSystemProcessorUnits"],
62-
:serial_number => serial
55+
:host => host,
56+
:cpu_type => "ppc64",
57+
:bitness => 64,
58+
:manufacturer => "IBM",
59+
:model => mtype_model,
60+
:memory_mb => sys["InstalledSystemMemory"],
61+
:cpu_sockets => sys["InstalledSystemProcessorUnits"],
62+
:cpu_total_cores => sys["InstalledSystemProcessorUnits"],
63+
:cpu_cores_per_socket => 1,
64+
:serial_number => serial
6365
)
6466
end
6567
end
@@ -151,15 +153,17 @@ def parse_host_operating_system(host, sys)
151153

152154
def parse_host_hardware(host, sys)
153155
hardware = persister.host_hardwares.build(
154-
:host => host,
155-
:cpu_type => "ppc64",
156-
:bitness => 64,
157-
:manufacturer => "IBM",
158-
:model => "#{sys.mtype}#{sys.model}",
159-
:cpu_speed => collector.cec_cpu_freqs[sys.uuid],
160-
:memory_mb => sys.memory,
161-
:cpu_total_cores => sys.cpus,
162-
:serial_number => sys.serial
156+
:host => host,
157+
:cpu_type => "ppc64",
158+
:bitness => 64,
159+
:manufacturer => "IBM",
160+
:model => "#{sys.mtype}#{sys.model}",
161+
:cpu_speed => collector.cec_cpu_freqs[sys.uuid],
162+
:memory_mb => sys.memory,
163+
:cpu_sockets => sys.cpus,
164+
:cpu_total_cores => sys.cpus,
165+
:cpu_cores_per_socket => 1,
166+
:serial_number => sys.serial
163167
)
164168
parse_host_guest_devices(hardware, sys)
165169
end
@@ -265,12 +269,15 @@ def parse_vm_labels(vm, lpar)
265269

266270
def parse_vm_hardware(vm, lpar)
267271
# Common code for LPARs, VIOSes and templates.
272+
num_cpus = lpar.dedicated.eql?("true") ? lpar.procs.to_i : lpar.vprocs.to_i
268273
persister.hardwares.build(
269-
:vm_or_template => vm,
270-
:memory_mb => lpar.memory,
271-
:cpu_type => "ppc64",
272-
:cpu_speed => lpar.respond_to?(:sys_uuid) ? collector.cec_cpu_freqs[lpar.sys_uuid] : nil,
273-
:cpu_total_cores => lpar.dedicated.eql?("true") ? lpar.procs.to_i : lpar.vprocs.to_i
274+
:vm_or_template => vm,
275+
:memory_mb => lpar.memory,
276+
:cpu_type => "ppc64",
277+
:cpu_speed => lpar.respond_to?(:sys_uuid) ? collector.cec_cpu_freqs[lpar.sys_uuid] : nil,
278+
:cpu_sockets => num_cpus,
279+
:cpu_total_cores => num_cpus,
280+
:cpu_cores_per_socket => 1
274281
)
275282
end
276283

manageiq-providers-ibm_power_hmc.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
1919
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
2020
spec.require_paths = ["lib"]
2121

22-
spec.add_dependency "ibm_power_hmc", "~> 0.20.0"
22+
spec.add_dependency "ibm_power_hmc", "~> 0.21.1"
2323

2424
spec.add_development_dependency "manageiq-style"
2525
spec.add_development_dependency "simplecov", ">= 0.21.2"

0 commit comments

Comments
 (0)