chef-provisioning-oneview 1.1.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -0
- data/lib/chef/provisioning/create_machine.rb +2 -2
- data/lib/chef/provisioning/customize_machine.rb +9 -9
- data/lib/chef/provisioning/icsp/icsp_api.rb +16 -16
- data/lib/chef/provisioning/oneview/oneview_api.rb +21 -21
- data/lib/chef/provisioning/oneview/san_storage.rb +9 -9
- data/lib/chef/provisioning/oneview_driver.rb +10 -10
- data/lib/chef/provisioning/rest.rb +3 -3
- data/lib/chef/provisioning/version.rb +1 -1
- data/spec/support/fake_oneview.rb +25 -25
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fd131178c928b19abb6e06f8136b4d3b9e9a2eb
|
4
|
+
data.tar.gz: 80c192d8030a22b2d78ac8e58328265b83231718
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e901b072f088b01d67943bda4af6aedcfb73e7eb5514388fda9e1d27df911f3c2c738daea6b8f7f7d696fc8145d784a15989a1e007bb03c814dbebae60bd53a
|
7
|
+
data.tar.gz: e5a12ab051c95788e8e6dc4e0c62e7d50caa8c810e16662e37f3fd76e91dd95dc9737181ba8a9330237636a313cef0ff50f2dd6c037c319a735de7c3bac185cf
|
data/README.md
CHANGED
@@ -37,7 +37,7 @@ module CreateMachine
|
|
37
37
|
options['X-API-Version'] = 200 if @current_oneview_api_version >= 200 && template['type'] == 'ServerProfileV5'
|
38
38
|
task = rest_api(:oneview, :post, '/rest/server-profiles', options)
|
39
39
|
task_uri = task['uri']
|
40
|
-
|
40
|
+
raise "Failed to create OneView server profile #{host_name}. Details: " unless task_uri
|
41
41
|
# Wait for profile to be created
|
42
42
|
60.times do # Wait for up to 5 min
|
43
43
|
matching_profiles = rest_api(:oneview, :get, "/rest/server-profiles?filter=name matches '#{host_name}'&sort=name:asc")
|
@@ -46,7 +46,7 @@ module CreateMachine
|
|
46
46
|
sleep 5
|
47
47
|
end
|
48
48
|
task = rest_api(:oneview, :get, task_uri)
|
49
|
-
|
49
|
+
raise "Server profile couldn't be created! #{task['taskStatus']}. #{task['taskErrors'].first['message']}"
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -10,14 +10,14 @@ module CustomizeMachine
|
|
10
10
|
action_handler.perform_action "Wait for #{machine_spec.name} server to start and profile to be applied" do
|
11
11
|
action_handler.report_progress "INFO: Waiting for #{machine_spec.name} server to start and profile to be applied"
|
12
12
|
task = oneview_wait_for(profile['taskUri'], 360) # Wait up to 60 min for profile to be created
|
13
|
-
|
13
|
+
raise 'Timed out waiting for server to start and profile to be applied' if task == false
|
14
14
|
unless task == true
|
15
15
|
server_template = machine_options[:driver_options][:server_template]
|
16
|
-
|
16
|
+
raise "Error creating server profile from template #{server_template}: #{task['taskErrors'].first['message']}"
|
17
17
|
end
|
18
18
|
end
|
19
19
|
profile = get_oneview_profile_by_sn(machine_spec.reference['serial_number']) # Refresh profile
|
20
|
-
|
20
|
+
raise "Server profile state '#{profile['state']}' not 'Normal'" unless profile['state'] == 'Normal'
|
21
21
|
end
|
22
22
|
|
23
23
|
# Configure SAN storage (if applicable)
|
@@ -36,7 +36,7 @@ module CustomizeMachine
|
|
36
36
|
print '.'
|
37
37
|
sleep 10
|
38
38
|
end
|
39
|
-
|
39
|
+
raise "Timeout waiting for server #{machine_spec.name} to register with ICSP" if my_server.nil?
|
40
40
|
end
|
41
41
|
|
42
42
|
icsp_configure_nic_teams(machine_options, profile)
|
@@ -58,16 +58,16 @@ module CustomizeMachine
|
|
58
58
|
action_handler.report_progress "INFO: Performing network flipping on #{machine_spec.name}, connection #{id}"
|
59
59
|
deploy_network = available_networks['ethernetNetworks'].find {|n| n['name'] == data[:deployNet] }
|
60
60
|
new_network = available_networks['ethernetNetworks'].find {|n| n['name'] == data[:net] }
|
61
|
-
|
62
|
-
|
61
|
+
raise "Failed to perform network flipping on #{machine_spec.name}, connection #{id}. '#{data[:net]}' network not found" if new_network.nil?
|
62
|
+
raise "Failed to perform network flipping on #{machine_spec.name}, connection #{id}. '#{data[:deployNet]}' network not found" if deploy_network.nil?
|
63
63
|
profile = get_oneview_profile_by_sn(machine_spec.reference['serial_number'])
|
64
64
|
profile['connections'].find {|c| c['networkUri'] == deploy_network['uri'] }['networkUri'] = new_network['uri']
|
65
65
|
options = { 'body' => profile }
|
66
66
|
task = rest_api(:oneview, :put, profile['uri'], options)
|
67
|
-
|
67
|
+
raise "Failed to perform network flipping on #{machine_spec.name}. Details: #{task['message'] || task}" unless task['uri']
|
68
68
|
task = oneview_wait_for(task['uri']) # Wait up to 10 min
|
69
|
-
|
70
|
-
|
69
|
+
raise "Timed out waiting for network flipping on #{machine_spec.name}" if task == false
|
70
|
+
raise "Error performing network flip on #{machine_spec.name}. Response: #{task}" unless task == true
|
71
71
|
end
|
72
72
|
end
|
73
73
|
machine_spec.reference['network_personalitation_finished'] = true
|
@@ -8,10 +8,10 @@ module ICspAPI
|
|
8
8
|
def get_icsp_api_version
|
9
9
|
begin
|
10
10
|
version = rest_api(:icsp, :get, '/rest/version', { 'Content-Type' => :none, 'X-API-Version' => :none, 'auth' => :none })['currentVersion']
|
11
|
-
|
11
|
+
raise "Couldn't get API version" unless version
|
12
12
|
if version.class != Fixnum
|
13
13
|
version = version.to_i
|
14
|
-
|
14
|
+
raise 'API version type mismatch' if !version > 0
|
15
15
|
end
|
16
16
|
rescue
|
17
17
|
puts 'Failed to get ICSP API version. Setting to default (102)'
|
@@ -31,11 +31,11 @@ module ICspAPI
|
|
31
31
|
}
|
32
32
|
response = rest_api(:icsp, :post, path, options)
|
33
33
|
return response['sessionID'] if response['sessionID']
|
34
|
-
|
34
|
+
raise("\nERROR! Couldn't log into ICSP server at #{@icsp_base_url}. Response:\n#{response}")
|
35
35
|
end
|
36
36
|
|
37
37
|
def get_icsp_server_by_sn(serial_number)
|
38
|
-
|
38
|
+
raise 'Must specify a serialNumber!' if serial_number.nil? || serial_number.empty?
|
39
39
|
search_result = rest_api(:icsp, :get,
|
40
40
|
"/rest/index/resources?category=osdserver&query='osdServerSerialNumber:\"#{serial_number}\"'")['members'] rescue nil
|
41
41
|
if search_result && search_result.size == 1 && search_result.first['attributes']['osdServerSerialNumber'] == serial_number
|
@@ -57,7 +57,7 @@ module ICspAPI
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def icsp_wait_for(task_uri, wait_iterations = 60, sleep_seconds = 10)
|
60
|
-
|
60
|
+
raise 'Must specify a task_uri!' if task_uri.nil? || task_uri.empty?
|
61
61
|
wait_iterations.times do
|
62
62
|
task = rest_api(:icsp, :get, task_uri)
|
63
63
|
if task['taskState']
|
@@ -108,7 +108,7 @@ module ICspAPI
|
|
108
108
|
print '.'
|
109
109
|
sleep 10
|
110
110
|
end
|
111
|
-
|
111
|
+
raise "Timed out waiting for #{machine_spec.name} to go into maintenance mode in ICsp. State: #{my_server['state']}" unless my_server['state'] == 'MAINTENANCE'
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
@@ -122,12 +122,12 @@ module ICspAPI
|
|
122
122
|
uri = "/rest/index/resources?userQuery=\"'#{os_build}'\"&category=osdbuildplan"
|
123
123
|
while uri
|
124
124
|
matching_plans = rest_api(:icsp, :get, uri)
|
125
|
-
|
125
|
+
raise "Search failed for OSBP '#{os_build}'. Response: #{matching_plans}" unless matching_plans['members']
|
126
126
|
build_plan_uri = matching_plans['members'].find {|bp| bp['name'] == os_build}['uri'] rescue nil
|
127
127
|
break unless build_plan_uri.nil?
|
128
128
|
uri = URI.unescape(matching_plans['nextPageUri']) rescue nil
|
129
129
|
end
|
130
|
-
|
130
|
+
raise "OS build plan #{os_build} not found!" if build_plan_uri.nil?
|
131
131
|
build_plan_uris.push build_plan_uri
|
132
132
|
end
|
133
133
|
end
|
@@ -147,9 +147,9 @@ module ICspAPI
|
|
147
147
|
action_handler.report_progress "INFO: Running: #{os_builds} OS Build Plan(s) on #{machine_spec.name}"
|
148
148
|
task = rest_api(:icsp, :post, '/rest/os-deployment-jobs/?force=true', options)
|
149
149
|
task_uri = task['uri']
|
150
|
-
|
150
|
+
raise "Failed to start OS Deployment Job. Details: #{task['details'] || task['message'] || task}" unless task_uri
|
151
151
|
task = icsp_wait_for(task_uri, 720)
|
152
|
-
|
152
|
+
raise "Error running OS build plan(s) #{os_builds}: #{task['jobResult'].first['jobMessage']}\n#{task['jobResult'].first['jobResultErrorDetails']}" unless task == true
|
153
153
|
end
|
154
154
|
end
|
155
155
|
|
@@ -169,9 +169,9 @@ module ICspAPI
|
|
169
169
|
|
170
170
|
task = rest_api(:icsp, :post, '/rest/os-deployment-jobs/?force=true', options)
|
171
171
|
task_uri = task['uri']
|
172
|
-
|
172
|
+
raise "Failed to start network personalization job. Details: #{task['details']}" unless task_uri
|
173
173
|
task = icsp_wait_for(task_uri, 60) # Wait for up to 10 min
|
174
|
-
|
174
|
+
raise "Error running network personalization job: #{task['jobResult'].first['jobMessage']}\n#{task['jobResult'].first['jobResultErrorDetails']}" unless task == true
|
175
175
|
|
176
176
|
# Check if ICsp IP config matches machine options
|
177
177
|
requested_ips = []
|
@@ -246,11 +246,11 @@ module ICspAPI
|
|
246
246
|
task_uri = task['uri']
|
247
247
|
90.times do # Wait for up to 15 minutes
|
248
248
|
task = rest_api(:icsp, :get, task_uri)
|
249
|
-
break if task['taskState'].
|
249
|
+
break if task['taskState'].casecmp('completed') == 0
|
250
250
|
print '.'
|
251
251
|
sleep 10
|
252
252
|
end
|
253
|
-
|
253
|
+
raise "Deleting os deployment server #{machine_spec.name} at icsp failed!" unless task['taskState'].casecmp('completed') == 0
|
254
254
|
end
|
255
255
|
end
|
256
256
|
end
|
@@ -261,7 +261,7 @@ module ICspAPI
|
|
261
261
|
|
262
262
|
machine_options[:driver_options][:connections].each do |id, options|
|
263
263
|
next unless options.is_a?(Hash) && options[:team]
|
264
|
-
|
264
|
+
raise "#{options[:team]}: Team names must not include hyphens" if options[:team].to_s.include?('-')
|
265
265
|
teams[options[:team].to_s] ||= []
|
266
266
|
begin
|
267
267
|
mac = profile['connections'].find {|x| x['id'] == id}['mac']
|
@@ -274,7 +274,7 @@ module ICspAPI
|
|
274
274
|
end
|
275
275
|
team_strings = []
|
276
276
|
teams.each do |name, macs|
|
277
|
-
|
277
|
+
raise "Team '#{name}' must have at least 2 associated connections to form a NIC team" unless macs.size >= 2
|
278
278
|
team_strings.push "#{name}-#{macs.join(',')}"
|
279
279
|
end
|
280
280
|
machine_options[:driver_options][:custom_attributes] ||= {}
|
@@ -10,10 +10,10 @@ module OneViewAPI
|
|
10
10
|
def get_oneview_api_version
|
11
11
|
begin
|
12
12
|
version = rest_api(:oneview, :get, '/rest/version', { 'Content-Type' => :none, 'X-API-Version' => :none, 'auth' => :none })['currentVersion']
|
13
|
-
|
13
|
+
raise "Couldn't get API version" unless version
|
14
14
|
if version.class != Fixnum
|
15
15
|
version = version.to_i
|
16
|
-
|
16
|
+
raise 'API version type mismatch' if !version > 0
|
17
17
|
end
|
18
18
|
rescue
|
19
19
|
puts 'Failed to get OneView API version. Setting to default (120)'
|
@@ -33,13 +33,13 @@ module OneViewAPI
|
|
33
33
|
}
|
34
34
|
response = rest_api(:oneview, :post, path, options)
|
35
35
|
return response['sessionID'] if response['sessionID']
|
36
|
-
|
36
|
+
raise("\nERROR! Couldn't log into OneView server at #{@oneview_base_url}. Response:\n#{response}")
|
37
37
|
end
|
38
38
|
|
39
39
|
def get_oneview_profile_by_sn(serial_number)
|
40
|
-
|
40
|
+
raise 'Must specify a serialNumber!' if serial_number.nil? || serial_number.empty?
|
41
41
|
matching_profiles = rest_api(:oneview, :get, "/rest/server-profiles?filter=serialNumber matches '#{serial_number}'&sort=name:asc")
|
42
|
-
|
42
|
+
raise "Failed to get oneview profile by serialNumber: #{serial_number}. Response: #{matching_profiles}" unless matching_profiles['count']
|
43
43
|
return matching_profiles['members'].first if matching_profiles['count'] > 0
|
44
44
|
nil
|
45
45
|
end
|
@@ -51,7 +51,7 @@ module OneViewAPI
|
|
51
51
|
options = { 'X-API-Version' => 200 }
|
52
52
|
templates = rest_api(:oneview, :get, "/rest/server-profile-templates?filter=\"name matches '#{template_name}'\"&sort=name:asc", options)['members']
|
53
53
|
return rest_api(:oneview, :get, "#{templates.first['uri']}/new-profile", options) if templates && templates.count == 1
|
54
|
-
|
54
|
+
raise "'#{template_name}' matches multiple templates! Please use a unique template name." if templates && templates.count > 1
|
55
55
|
end
|
56
56
|
|
57
57
|
# Look for Server Profile as second option
|
@@ -64,27 +64,27 @@ module OneViewAPI
|
|
64
64
|
end
|
65
65
|
return templates.first
|
66
66
|
end
|
67
|
-
|
67
|
+
raise "'#{template_name}' matches multiple profiles! Please use a unique template name." if templates && templates.count > 1
|
68
68
|
|
69
|
-
|
69
|
+
raise "Template '#{template_name}' not found! Please match the template name with one that exists on OneView."
|
70
70
|
end
|
71
71
|
|
72
72
|
def available_hardware_for_template(template)
|
73
73
|
server_hardware_type_uri = template['serverHardwareTypeUri']
|
74
74
|
enclosure_group_uri = template['enclosureGroupUri']
|
75
|
-
|
76
|
-
|
75
|
+
raise 'Template must specify a valid hardware type uri!' if server_hardware_type_uri.nil? || server_hardware_type_uri.empty?
|
76
|
+
raise 'Template must specify a valid hardware type uri!' if enclosure_group_uri.nil? || enclosure_group_uri.empty?
|
77
77
|
params = "sort=name:asc&filter=serverHardwareTypeUri='#{server_hardware_type_uri}'&filter=serverGroupUri='#{enclosure_group_uri}'"
|
78
78
|
blades = rest_api(:oneview, :get, "/rest/server-hardware?#{params}")
|
79
|
-
|
79
|
+
raise 'Error! No available blades that are compatible with the server template!' unless blades['count'] > 0
|
80
80
|
blades['members'].each do |member|
|
81
81
|
return member if member['state'] == 'NoProfileApplied'
|
82
82
|
end
|
83
|
-
|
83
|
+
raise 'No more blades are available for provisioning!' # Every bay is full and no more machines can be allocated
|
84
84
|
end
|
85
85
|
|
86
86
|
def oneview_wait_for(task_uri, wait_iterations = 60, sleep_seconds = 10) # Default time is 10 min
|
87
|
-
|
87
|
+
raise 'Must specify a task_uri!' if task_uri.nil? || task_uri.empty?
|
88
88
|
wait_iterations.times do
|
89
89
|
task = rest_api(:oneview, :get, task_uri)
|
90
90
|
case task['taskState'].downcase
|
@@ -114,28 +114,28 @@ module OneViewAPI
|
|
114
114
|
state = 'on'
|
115
115
|
when :off, 'off', false
|
116
116
|
state = 'off'
|
117
|
-
else
|
117
|
+
else raise "Invalid power state #{state}"
|
118
118
|
end
|
119
119
|
|
120
120
|
if hardware_uri.nil?
|
121
121
|
profile = get_oneview_profile_by_sn(machine_spec.reference['serial_number'])
|
122
|
-
|
122
|
+
raise "Could not power #{state} #{machine_spec.name}: Profile with serial number '#{machine_spec.reference['serial_number']}' not found!" unless profile
|
123
123
|
hardware_uri = profile['serverHardwareUri']
|
124
124
|
end
|
125
125
|
|
126
126
|
hardware_info = rest_api(:oneview, :get, hardware_uri)
|
127
|
-
unless hardware_info['powerState'].
|
127
|
+
unless hardware_info['powerState'].casecmp(state) == 0
|
128
128
|
action_handler.perform_action "Power #{state} server #{hardware_info['name']} for #{machine_spec.name}" do
|
129
129
|
action_handler.report_progress "INFO: Powering #{state} server #{hardware_info['name']} for #{machine_spec.name}"
|
130
130
|
task = rest_api(:oneview, :put, "#{hardware_uri}/powerState", { 'body' => { 'powerState' => state.capitalize, 'powerControl' => 'MomentaryPress' } })
|
131
131
|
task_uri = task['uri']
|
132
132
|
60.times do # Wait for up to 10 minutes
|
133
133
|
task = rest_api(:oneview, :get, task_uri)
|
134
|
-
break if task['taskState'].
|
134
|
+
break if task['taskState'].casecmp('completed') == 0
|
135
135
|
print '.'
|
136
136
|
sleep 10
|
137
137
|
end
|
138
|
-
|
138
|
+
raise "Powering #{state} machine #{machine_spec.name} failed!" unless task['taskState'].casecmp('completed') == 0
|
139
139
|
end
|
140
140
|
end
|
141
141
|
hardware_uri
|
@@ -150,16 +150,16 @@ module OneViewAPI
|
|
150
150
|
else
|
151
151
|
action_handler.perform_action "Delete server #{machine_spec.name} from oneview" do
|
152
152
|
action_handler.report_progress "INFO: Deleting server profile #{machine_spec.name}"
|
153
|
-
task = rest_api(:oneview, :Delete,
|
153
|
+
task = rest_api(:oneview, :Delete, profile['uri'])
|
154
154
|
task_uri = task['uri']
|
155
155
|
|
156
156
|
60.times do # Wait for up to 10 minutes
|
157
157
|
task = rest_api(:oneview, :get, task_uri)
|
158
|
-
break if task['taskState'].
|
158
|
+
break if task['taskState'].casecmp('completed') == 0
|
159
159
|
print '.'
|
160
160
|
sleep 10
|
161
161
|
end
|
162
|
-
|
162
|
+
raise "Deleting server profile #{machine_spec.name} failed!" unless task['taskState'].casecmp('completed') == 0
|
163
163
|
end
|
164
164
|
end
|
165
165
|
end
|
@@ -20,10 +20,10 @@ module OneViewSanStorage
|
|
20
20
|
boot_vols = []
|
21
21
|
san_storage['volumeAttachments'].each do |v|
|
22
22
|
fill_volume_details(v) unless profile['serverProfileTemplateUri']
|
23
|
-
|
23
|
+
raise "#{machine_spec.name}: Should know if volume is sharable:\n#{v}" unless v.key?('volumeShareable')
|
24
24
|
|
25
25
|
# Match boot disks by name
|
26
|
-
boot_vols.push(v['volumeName']) if v['volumeName']
|
26
|
+
boot_vols.push(v['volumeName']) if v['volumeName'] =~ /^boot/i
|
27
27
|
v['volumeName'] += " #{profile['name']}" unless v['volumeShareable'] # Append profile name to volume name
|
28
28
|
|
29
29
|
unless profile['serverProfileTemplateUri'] # Only needed when coppied from profile
|
@@ -37,11 +37,11 @@ module OneViewSanStorage
|
|
37
37
|
|
38
38
|
# Assumes all cloned volumes are non-permanet. Might want some global config to control this
|
39
39
|
v['permanent'] = false
|
40
|
-
v['lun'] = nil if v['lunType'].
|
40
|
+
v['lun'] = nil if v['lunType'].casecmp('auto') == 0
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
44
|
-
|
44
|
+
raise "#{machine_spec.name}: There should only be 1 SAN boot volume. Boot volumes: #{boot_vols}" if boot_vols.size > 1
|
45
45
|
profile
|
46
46
|
end
|
47
47
|
|
@@ -53,15 +53,15 @@ module OneViewSanStorage
|
|
53
53
|
update_needed = false
|
54
54
|
profile['sanStorage']['volumeAttachments'].each do |v|
|
55
55
|
vol_details = rest_api(:oneview, :get, v['volumeUri'])
|
56
|
-
next unless vol_details['name']
|
56
|
+
next unless vol_details['name'] =~ /^boot/i
|
57
57
|
# Find the enabled path(s), get target wwpn, and then update connection, setting boot targets
|
58
58
|
v['storagePaths'].each do |s|
|
59
59
|
next if !s['isEnabled'] || s['storageTargets'].nil? || s['storageTargets'].empty?
|
60
60
|
connection = profile['connections'].find { |c| c['id'] == s['connectionId'] }
|
61
|
-
|
61
|
+
raise "#{machine_spec.name}: Connection #{s['connectionId']} not found! Check SAN settings" unless connection
|
62
62
|
if connection['boot'].nil? || connection['boot']['priority'] == 'NotBootable'
|
63
63
|
msg = "#{machine_spec.name}: Connection #{s['connectionId']} is labeled for boot, but the connection is not marked as bootable."
|
64
|
-
|
64
|
+
raise "#{msg} Set the connection boot target to Primary or Secondary"
|
65
65
|
end
|
66
66
|
target = {}
|
67
67
|
target['arrayWwpn'] = s['storageTargets'].first.delete(':')
|
@@ -81,8 +81,8 @@ module OneViewSanStorage
|
|
81
81
|
power_off(action_handler, machine_spec, profile['serverHardwareUri'])
|
82
82
|
task = rest_api(:oneview, :put, profile['uri'], { 'body' => profile })
|
83
83
|
task = oneview_wait_for(task['uri'], 90) # Wait for up to 15 min for profile to be updated
|
84
|
-
|
85
|
-
|
84
|
+
raise "Timed out waiting for enabling SAN-bootable connections on #{machine_spec.name}" if task == false
|
85
|
+
raise "Error enabling SAN-bootable connections on #{machine_spec.name}. Response: #{task}" unless task == true
|
86
86
|
end
|
87
87
|
profile = rest_api(:oneview, :get, profile['uri'])
|
88
88
|
end
|
@@ -28,7 +28,7 @@ module Chef::Provisioning
|
|
28
28
|
if oneview_url.nil? || oneview_url == ''
|
29
29
|
oneview_url = config[:knife][:oneview_url]
|
30
30
|
end
|
31
|
-
|
31
|
+
raise 'Must set the knife[:oneview_url] attribute!' if oneview_url.nil? || oneview_url.empty?
|
32
32
|
'oneview:' + oneview_url
|
33
33
|
end
|
34
34
|
|
@@ -40,22 +40,22 @@ module Chef::Provisioning
|
|
40
40
|
super(canonical_url, config)
|
41
41
|
|
42
42
|
@oneview_base_url = config[:knife][:oneview_url]
|
43
|
-
|
43
|
+
raise 'Must set the knife[:oneview_url] attribute!' if @oneview_base_url.nil? || @oneview_base_url.empty?
|
44
44
|
@oneview_username = config[:knife][:oneview_username]
|
45
|
-
|
45
|
+
raise 'Must set the knife[:oneview_username] attribute!' if @oneview_username.nil? || @oneview_username.empty?
|
46
46
|
@oneview_password = config[:knife][:oneview_password]
|
47
|
-
|
47
|
+
raise 'Must set the knife[:oneview_password] attribute!' if @oneview_password.nil? || @oneview_password.empty?
|
48
48
|
@oneview_disable_ssl = config[:knife][:oneview_ignore_ssl]
|
49
49
|
@oneview_api_version = 120 # Use this version for all calls that don't override it
|
50
50
|
@current_oneview_api_version = get_oneview_api_version
|
51
51
|
@oneview_key = login_to_oneview
|
52
52
|
|
53
53
|
@icsp_base_url = config[:knife][:icsp_url]
|
54
|
-
|
54
|
+
raise 'Must set the knife[:icsp_url] attribute!' if @icsp_base_url.nil? || @icsp_base_url.empty?
|
55
55
|
@icsp_username = config[:knife][:icsp_username]
|
56
|
-
|
56
|
+
raise 'Must set the knife[:icsp_username] attribute!' if @icsp_username.nil? || @icsp_username.empty?
|
57
57
|
@icsp_password = config[:knife][:icsp_password]
|
58
|
-
|
58
|
+
raise 'Must set the knife[:icsp_password] attribute!' if @icsp_password.nil? || @icsp_password.empty?
|
59
59
|
@icsp_disable_ssl = config[:knife][:icsp_ignore_ssl]
|
60
60
|
@icsp_api_version = 102 # Use this version for all calls that don't override it
|
61
61
|
@current_icsp_api_version = get_icsp_api_version
|
@@ -96,7 +96,7 @@ module Chef::Provisioning
|
|
96
96
|
|
97
97
|
def ready_machine(action_handler, machine_spec, machine_options)
|
98
98
|
profile = get_oneview_profile_by_sn(machine_spec.reference['serial_number'])
|
99
|
-
|
99
|
+
raise "Failed to retrieve Server Profile for #{machine_spec.name}. Serial Number used to search: #{machine_spec.reference['serial_number']}" unless profile
|
100
100
|
customize_machine(action_handler, machine_spec, machine_options, profile)
|
101
101
|
machine_for(machine_spec, machine_options) # Return the Machine object
|
102
102
|
end
|
@@ -106,7 +106,7 @@ module Chef::Provisioning
|
|
106
106
|
bootstrap_ip_address = machine_options[:driver_options][:ip_address]
|
107
107
|
unless bootstrap_ip_address
|
108
108
|
id, connection = machine_options[:driver_options][:connections].find { |_id, c| c[:bootstrap] == true }
|
109
|
-
|
109
|
+
raise 'Must specify a connection to use to bootstrap!' unless id && connection
|
110
110
|
bootstrap_ip_address = connection[:ip4Address] # For static IPs
|
111
111
|
unless bootstrap_ip_address # Look for dhcp address given to this connection
|
112
112
|
profile = get_oneview_profile_by_sn(machine_spec.reference['serial_number'])
|
@@ -117,7 +117,7 @@ module Chef::Provisioning
|
|
117
117
|
end
|
118
118
|
bootstrap_ip_address ||= my_server['hostName'] # Fall back on hostName
|
119
119
|
end
|
120
|
-
|
120
|
+
raise 'Server IP address not specified and could not be retrieved!' unless bootstrap_ip_address
|
121
121
|
username = machine_options[:transport_options][:user] || 'root' rescue 'root'
|
122
122
|
default_ssh_options = {
|
123
123
|
# auth_methods: ['password', 'publickey'],
|
@@ -14,7 +14,7 @@ module RestAPI
|
|
14
14
|
options['auth'] ||= @oneview_key
|
15
15
|
disable_ssl = true if @oneview_disable_ssl
|
16
16
|
else
|
17
|
-
|
17
|
+
raise "Invalid rest host: #{host}"
|
18
18
|
end
|
19
19
|
|
20
20
|
http = Net::HTTP.new(uri.host, uri.port)
|
@@ -31,14 +31,14 @@ module RestAPI
|
|
31
31
|
when 'delete', :delete
|
32
32
|
request = Net::HTTP::Delete.new(uri.request_uri)
|
33
33
|
else
|
34
|
-
|
34
|
+
raise "Invalid rest call: #{type}"
|
35
35
|
end
|
36
36
|
options['Content-Type'] ||= 'application/json'
|
37
37
|
options.delete('Content-Type') if [:none, 'none', nil].include?(options['Content-Type'])
|
38
38
|
options.delete('X-API-Version') if [:none, 'none', nil].include?(options['X-API-Version'])
|
39
39
|
options.delete('auth') if [:none, 'none', nil].include?(options['auth'])
|
40
40
|
options.each do |key, val|
|
41
|
-
if key.
|
41
|
+
if key.casecmp('body') == 0
|
42
42
|
request.body = val.to_json rescue val
|
43
43
|
else
|
44
44
|
request[key] = val
|
@@ -15,10 +15,10 @@ class FakeOneView < Sinatra::Base
|
|
15
15
|
get '/rest/server-profile-templates' do
|
16
16
|
version = env['HTTP_X_API_VERSION']
|
17
17
|
file_name = 'server-profile-templates_invalid.json'
|
18
|
-
if params['filter'] && params['filter']
|
19
|
-
if params['filter']
|
18
|
+
if params['filter'] && params['filter'] =~ /name matches/
|
19
|
+
if params['filter'] =~ /Web Server Template with SAN/
|
20
20
|
file_name = 'server-profile-templates_WebServerTemplateWithSAN.json'
|
21
|
-
elsif params['filter']
|
21
|
+
elsif params['filter'] =~ /Web Server Template/
|
22
22
|
file_name = 'server-profile-templates_WebServerTemplate.json'
|
23
23
|
end
|
24
24
|
end
|
@@ -40,28 +40,28 @@ class FakeOneView < Sinatra::Base
|
|
40
40
|
version = env['HTTP_X_API_VERSION']
|
41
41
|
file_name = 'server-profiles.json'
|
42
42
|
if params['filter']
|
43
|
-
if params['filter'].match('matches \'\'') || params['filter']
|
43
|
+
if params['filter'].match('matches \'\'') || params['filter'] =~ /INVALIDFILTER/
|
44
44
|
file_name = 'server-profiles_invalid_filter.json'
|
45
|
-
elsif params['filter']
|
46
|
-
if params['filter']
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
elsif params['filter']
|
54
|
-
if params['filter']
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
45
|
+
elsif params['filter'] =~ /serialNumber matches/
|
46
|
+
file_name = if params['filter'] =~ /VCGE9KB041/
|
47
|
+
'server-profiles_sn_VCGE9KB041.json'
|
48
|
+
elsif params['filter'] =~ /VCGE9KB042/
|
49
|
+
'server-profiles_sn_VCGE9KB042.json'
|
50
|
+
else
|
51
|
+
'server-profiles_sn_empty.json'
|
52
|
+
end
|
53
|
+
elsif params['filter'] =~ /name matches/
|
54
|
+
file_name = if params['filter'] =~ /Template - Web Server with SAN/
|
55
|
+
'server-profiles_name_Template-WebServerWithSAN.json'
|
56
|
+
elsif params['filter'] =~ /Template - Web Server/
|
57
|
+
'server-profiles_name_Template-WebServer.json'
|
58
|
+
elsif params['filter'] =~ /chef-web01/
|
59
|
+
'server-profiles_name_chef-web01.json'
|
60
|
+
elsif $server_created == 'chef-web03'
|
61
|
+
'server-profiles_name_chef-web03.json'
|
62
|
+
else
|
63
|
+
'server-profiles_name_empty.json'
|
64
|
+
end
|
65
65
|
end
|
66
66
|
end
|
67
67
|
json_response(200, file_name, version)
|
@@ -80,7 +80,7 @@ class FakeOneView < Sinatra::Base
|
|
80
80
|
get '/rest/server-hardware' do
|
81
81
|
version = env['HTTP_X_API_VERSION']
|
82
82
|
file_name = 'server-hardware.json'
|
83
|
-
if params['filter']
|
83
|
+
if params['filter'] =~ %r{enclosure-groups/3a11ccdd-b352-4046-a568-a8b0faa6cc39}
|
84
84
|
file_name = 'server-hardware_Template-WebServer.json'
|
85
85
|
end
|
86
86
|
json_response(200, file_name, version)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-provisioning-oneview
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hewlett Packard Enterprise
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef
|