Skip to content

Commit 1d39bf8

Browse files
authored
Merge pull request #427 from alizapeikes/placement-groups
Add placement group option to powervs vm provisioning
2 parents 2383e9b + 8ab9e51 commit 1d39bf8

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

app/models/manageiq/providers/ibm_cloud/power_virtual_servers/cloud_manager/provision/cloning.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ def prepare_for_clone
6969
specs['sys_type'] = get_option_last(:sys_type)
7070
end
7171

72+
specs['placement_group'] = get_option(:placement_group) unless get_option(:placement_group).nil?
7273
user_script_text = options[:user_script_text]
7374
user_script_text64 = Base64.encode64(user_script_text) unless user_script_text.nil?
7475
specs['user_data'] = user_script_text64 unless user_script_text64.nil?

app/models/manageiq/providers/ibm_cloud/power_virtual_servers/cloud_manager/provision_workflow.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@ def allowed_cloud_volumes(_options = {})
122122
Hash[cloud_volumes || {}]
123123
end
124124

125+
def allowed_placement_groups(_options = {})
126+
return {} if ar_ems.nil?
127+
128+
ar_ems.placement_groups.to_h { |group| [group.ems_ref, "#{group.policy}: #{group.name}"] }
129+
end
130+
125131
def set_request_values(values)
126132
values[:new_volumes] = parse_new_volumes_fields(values)
127133
super
@@ -176,6 +182,21 @@ def validate_ip_address(_field, _values, _dlg, _fld, value)
176182
return _('IP-address field has to be either blank or a valid IPv4 address') unless valid
177183
end
178184

185+
def validate_placement_group(_filed, _values, _dlg, _fld, value)
186+
return if value.blank?
187+
188+
placement_group = ar_ems.placement_groups.find_by!(:ems_ref => value)
189+
vms_in_placement_group = placement_group.vms
190+
191+
# If policy is affinity, check to make sure the new vm has the same flavor as all the members of the group
192+
valid = if placement_group[:policy] == 'affinity' && vms_in_placement_group.present?
193+
vms_in_placement_group.first.flavor.name == values&.dig(:sys_type, 1)
194+
else
195+
true
196+
end
197+
_('Invalid placement group - incompatible colocation policy') unless valid
198+
end
199+
179200
private
180201

181202
def ar_ems

content/miq_dialogs/miq_provision_ibm_powervs_dialogs_template.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@
2323
:data_type: :string
2424
:min_length: 8
2525
:max_length: 16
26+
:placement_group:
27+
:values_from:
28+
:method: :allowed_placement_groups
29+
:description: Placement Group
30+
:required: false
31+
:validation_method: :validate_placement_group
32+
:display: :edit
33+
:auto_select_single: false
34+
:data_type: :string
2635
:pin_policy:
2736
:values:
2837
1: "none"

0 commit comments

Comments
 (0)