Skip to content

Commit

Permalink
Merge pull request ManageIQ#47 from iv1111/issue_119
Browse files Browse the repository at this point in the history
Added support for Cloud Volume creation in IBM PVS provisioning
  • Loading branch information
agrare authored Oct 6, 2020
2 parents 8d8ba16 + 9b3dee9 commit 217900c
Show file tree
Hide file tree
Showing 6 changed files with 208 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,17 @@ def prepare_for_clone_task
chosen_storage_type = get_option_last(:storage_type)
specs['storageType'] = chosen_storage_type unless chosen_storage_type == 'None'

chosen_volumes = options[:cloud_volumes]
specs['volumeIDs'] = chosen_volumes unless chosen_volumes.compact.empty?

chosen_key_pair = get_option_last(:guest_access_key_pair)
specs['keyPairName'] = chosen_key_pair unless chosen_key_pair == 'None'

user_script_text = options[:user_script_text]
user_script_text64 = Base64.encode64(user_script_text) unless user_script_text.nil?
specs['userData'] = user_script_text64 unless user_script_text64.nil?

attached_volumes = options[:cloud_volumes] || []
attached_volumes.concat(phase_context[:new_volumes]).compact!
specs['volumeIDs'] = attached_volumes unless attached_volumes.empty?

specs
end

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
module ManageIQ::Providers::IbmCloud::PowerVirtualServers::CloudManager::Provision::StateMachine
def create_destination
signal :prepare_volumes
end

def prepare_volumes
new_volumes = options[:new_volumes]
phase_context[:new_volumes] = []

if new_volumes.any?
source.with_provider_object(:service => "PowerIaas") do |power_iaas|
new_volumes.each do |new_volume|
phase_context[:new_volumes] << power_iaas.create_volume(new_volume)['volumeID']
end
end
end

signal :prepare_provision
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ def get_timezones(_options = {})
TIMEZONES
end

def volume_dialog_keys
%i[name size diskType shareable]
end

def allowed_sys_type(_options = {})
ar_sys_types = ar_ems.flavors
sys_types = ar_sys_types&.map&.with_index(1) { |sys_type, i| [i, sys_type['name']] }
Expand Down Expand Up @@ -50,6 +54,29 @@ def allowed_cloud_volumes(_options = {})
Hash[cloud_volumes || {}]
end

def set_request_values(values)
values[:new_volumes] = parse_new_volumes_fields(values)
super
end

def parse_new_volumes_fields(values)
new_volumes = []

values.select { |k, _v| k =~ /(#{volume_dialog_keys.join("|")})_(\d+)/ }.each do |key, value|
field, cnt = key.to_s.split("_")
cnt = Integer(cnt)

new_volumes[cnt] ||= {}
new_volumes[cnt][field.to_sym] = value
end

new_volumes.drop(1).map! do |new_volume|
new_volume[:size] = new_volume[:size].to_i
new_volume[:shareable] = [nil, 'null'].exclude?(new_volume[:shareable])
new_volume
end
end

def validate_entitled_processors(_field, values, _dlg, _fld, value)
dedicated = values[:instance_type][1] == 'dedicated'

Expand Down
33 changes: 33 additions & 0 deletions content/miq_dialogs/miq_provision_ibm_dialogs_template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -174,9 +174,42 @@
:data_type: :string
:display: :show

:volumes:
:description: New Volumes
:fields:
:name:
:description: Name
:required: false
:display: :edit
:data_type: :string
:min_length:
:max_length: 100
:size:
:description: Size (GB)
:required: false
:display: :edit
:data_type: :string
:min_length:
:max_length: 10
:shareable:
:description: Shareable
:required: false
:data_type: :boolean
:default: false
:display: :edit
:diskType:
:description: Disk type
:required: false
:data_type: :string
:min_length:
:max_length: 20
:display: :edit
:display: :show

:dialog_order:
- :service
- :hardware
- :volumes
- :network
- :customize

Expand Down
4 changes: 4 additions & 0 deletions spec/factories/vm.rb → spec/factories/vm_or_template.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,8 @@
end
end
end

factory :template_ibm_cloud_power_virtual_servers, :class => "ManageIQ::Providers::IbmCloud::PowerVirtualServers::CloudManager::Template", :parent => :template_cloud do
vendor { "ibm" }
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
describe ManageIQ::Providers::IbmCloud::PowerVirtualServers::CloudManager::ProvisionWorkflow do
include Spec::Support::WorkflowHelper

let(:admin) { FactoryBot.create(:user_with_group) }
let(:ems) { FactoryBot.create(:ems_ibm_cloud_power_virtual_servers_cloud) }
let(:template) do
FactoryBot.create(
:template_ibm_cloud_power_virtual_servers,
:name => "template",
:ext_management_system => ems
)
end
let(:workflow) do
stub_dialog
allow(User).to receive_messages(:server_timezone => "UTC")
described_class.new({:src_vm_id => template.id}, admin.userid)
end

it "#parse_new_volumes_fields" do
values = {
:name => nil,
:size => nil,
:shareable => false,
:diskType => nil
}
expect(workflow.parse_new_volumes_fields(values))
.to match_array([])
values = {
:name => nil,
:size => nil,
:shareable => false,
:diskType => nil,
:name_1 => "disk_one",
:size_1 => "1",
:diskType_1 => "tier1",
:shareable_1 => "null",
:name_2 => "disk_two",
:size_2 => "2",
:diskType_2 => "standard-legacy",
:name_3 => "disk_three",
:size_3 => "3",
:diskType_3 => "tier3",
:shareable_3 => nil,
:name_4 => "disk_four",
:size_4 => "4",
:diskType_4 => "ssd-legacy",
:shareable_4 => true
}
expect(workflow.parse_new_volumes_fields(values))
.to match_array(
[
{
:name => "disk_one",
:size => 1,
:diskType => "tier1",
:shareable => false
},
{
:name => "disk_two",
:size => 2,
:diskType => "standard-legacy",
:shareable => false
},
{
:name => "disk_three",
:size => 3,
:diskType => "tier3",
:shareable => false
},
{
:name => "disk_four",
:size => 4,
:diskType => "ssd-legacy",
:shareable => true
}
]
)
values = {
:name => nil,
:size => nil,
:shareable => false,
:diskType => nil,
:name_1 => "disk_one",
:diskType_1 => "tier1",
:shareable_1 => "null",
:size_2 => "2",
:diskType_2 => "standard-legacy",
:name_3 => "disk_three",
:size_3 => "3",
:diskType_3 => "tier3",
:name_4 => "disk_four",
:size_4 => "",
:diskType_4 => "ssd-legacy",
:shareable_4 => true
}
expect(workflow.parse_new_volumes_fields(values))
.to match_array(
[
{
:name => "disk_one",
:diskType => "tier1",
:size => 0,
:shareable => false
},
{
:size => 2,
:diskType => "standard-legacy",
:shareable => false
},
{
:name => "disk_three",
:size => 3,
:diskType => "tier3",
:shareable => false
},
{
:name => "disk_four",
:size => 0,
:diskType => "ssd-legacy",
:shareable => true
}
]
)
end
end

0 comments on commit 217900c

Please sign in to comment.