chef-provisioning-oneview 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +119 -65
- data/chef-provisioning-oneview.gemspec +39 -0
- data/lib/chef/provisioning/create_machine.rb +43 -46
- data/lib/chef/provisioning/customize_machine.rb +50 -48
- data/lib/chef/provisioning/helpers.rb +18 -0
- data/lib/chef/provisioning/icsp/api_v104.rb +3 -2
- data/lib/chef/provisioning/icsp/icsp_helper.rb +288 -0
- data/lib/chef/provisioning/icsp/rest.rb +50 -0
- data/lib/chef/provisioning/oneview/oneview_helper.rb +53 -0
- data/lib/chef/provisioning/oneview/san_storage.rb +69 -69
- data/lib/chef/provisioning/oneview_driver.rb +124 -105
- data/lib/chef/provisioning/version.rb +1 -1
- metadata +23 -61
- data/Rakefile +0 -19
- data/lib/chef/provisioning/icsp/icsp_api.rb +0 -284
- data/lib/chef/provisioning/oneview/oneview_api.rb +0 -186
- data/lib/chef/provisioning/oneview/v1.2/api.rb +0 -3
- data/lib/chef/provisioning/oneview/v2.0/api.rb +0 -3
- data/lib/chef/provisioning/rest.rb +0 -52
- data/spec/shared_context.rb +0 -78
- data/spec/spec_helper.rb +0 -23
- data/spec/support/fake_action_handler.rb +0 -6
- data/spec/support/fake_icsp.rb +0 -73
- data/spec/support/fake_machine_spec.rb +0 -18
- data/spec/support/fake_oneview.rb +0 -148
- data/spec/support/fixtures/icsp/v102/error_404.json +0 -14
- data/spec/support/fixtures/icsp/v102/login.json +0 -5
- data/spec/support/fixtures/icsp/v102/os-deployment-build-plans.json +0 -99
- data/spec/support/fixtures/icsp/v102/os-deployment-servers.json +0 -179
- data/spec/support/fixtures/icsp/v102/os-deployment-servers_1670001.json +0 -83
- data/spec/support/fixtures/icsp/v102/os-deployment-servers_fakesn.json +0 -9
- data/spec/support/fixtures/icsp/v102/server_by_sn_VCGE9KB041.json +0 -45
- data/spec/support/fixtures/icsp/v102/server_by_sn_empty.json +0 -16
- data/spec/support/fixtures/icsp/v102/version.json +0 -4
- data/spec/support/fixtures/oneview/v120/error_404.json +0 -14
- data/spec/support/fixtures/oneview/v120/login.json +0 -5
- data/spec/support/fixtures/oneview/v120/server-hardware.json +0 -1476
- data/spec/support/fixtures/oneview/v120/server-hardware_Template-WebServer.json +0 -468
- data/spec/support/fixtures/oneview/v120/server-hardware_specific.json +0 -151
- data/spec/support/fixtures/oneview/v120/server-profiles.json +0 -369
- data/spec/support/fixtures/oneview/v120/server-profiles_invalid_filter.json +0 -14
- data/spec/support/fixtures/oneview/v120/server-profiles_name_Template-WebServer.json +0 -133
- data/spec/support/fixtures/oneview/v120/server-profiles_name_Template-WebServerWithSAN.json +0 -200
- data/spec/support/fixtures/oneview/v120/server-profiles_name_chef-web01.json +0 -133
- data/spec/support/fixtures/oneview/v120/server-profiles_name_chef-web03.json +0 -133
- data/spec/support/fixtures/oneview/v120/server-profiles_name_empty.json +0 -15
- data/spec/support/fixtures/oneview/v120/server-profiles_sn_VCGE9KB041.json +0 -133
- data/spec/support/fixtures/oneview/v120/server-profiles_sn_VCGE9KB042.json +0 -206
- data/spec/support/fixtures/oneview/v120/server-profiles_sn_empty.json +0 -15
- data/spec/support/fixtures/oneview/v120/storage-volumes_1B5D3CA2-6C5B-41C2-8B97-1821F1883F22.json +0 -26
- data/spec/support/fixtures/oneview/v120/tasks_fake_active.json +0 -5
- data/spec/support/fixtures/oneview/v120/tasks_fake_complete.json +0 -5
- data/spec/support/fixtures/oneview/v120/version.json +0 -4
- data/spec/support/fixtures/oneview/v200/server-profile-templates_WebServerTemplate.json +0 -109
- data/spec/support/fixtures/oneview/v200/server-profile-templates_WebServerTemplateWithSAN.json +0 -144
- data/spec/support/fixtures/oneview/v200/server-profile-templates_invalid.json +0 -16
- data/spec/support/fixtures/oneview/v200/server-profile-templates_new-profile_WebServerTemplate.json +0 -125
- data/spec/support/fixtures/oneview/v200/server-profile-templates_new-profile_WebServerTemplateWithSAN.json +0 -178
- data/spec/support/fixtures/oneview/v200/version.json +0 -4
- data/spec/unit/create_machine_spec.rb +0 -78
- data/spec/unit/destroy_spec.rb +0 -26
- data/spec/unit/icsp_nic_teams_spec.rb +0 -38
- data/spec/unit/icsp_search_spec.rb +0 -25
- data/spec/unit/oneview_driver_spec.rb +0 -79
- data/spec/unit/oneview_login_spec.rb +0 -17
- data/spec/unit/oneview_power_spec.rb +0 -51
- data/spec/unit/oneview_san_spec.rb +0 -86
- data/spec/unit/oneview_search_spec.rb +0 -63
- data/spec/unit/rest_api_spec.rb +0 -115
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.
|
4
|
+
version: 1.3.0
|
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: 2017-
|
11
|
+
date: 2017-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '12.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: oneview-sdk
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.1'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: chef-provisioning
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -138,9 +152,8 @@ dependencies:
|
|
138
152
|
version: '0'
|
139
153
|
description: Chef Provisioning driver for creating and managing OneView infrastructure.
|
140
154
|
email:
|
141
|
-
- jared.smartt@
|
142
|
-
- gunjan.kamle@
|
143
|
-
- matthew.frahry@hp.com
|
155
|
+
- jared.smartt@hpe.com
|
156
|
+
- gunjan.kamle@hpe.com
|
144
157
|
executables: []
|
145
158
|
extensions: []
|
146
159
|
extra_rdoc_files:
|
@@ -149,69 +162,18 @@ extra_rdoc_files:
|
|
149
162
|
files:
|
150
163
|
- LICENSE
|
151
164
|
- README.md
|
152
|
-
-
|
165
|
+
- chef-provisioning-oneview.gemspec
|
153
166
|
- lib/chef/provisioning/create_machine.rb
|
154
167
|
- lib/chef/provisioning/customize_machine.rb
|
155
168
|
- lib/chef/provisioning/driver_init/oneview.rb
|
169
|
+
- lib/chef/provisioning/helpers.rb
|
156
170
|
- lib/chef/provisioning/icsp/api_v104.rb
|
157
|
-
- lib/chef/provisioning/icsp/
|
158
|
-
- lib/chef/provisioning/
|
171
|
+
- lib/chef/provisioning/icsp/icsp_helper.rb
|
172
|
+
- lib/chef/provisioning/icsp/rest.rb
|
173
|
+
- lib/chef/provisioning/oneview/oneview_helper.rb
|
159
174
|
- lib/chef/provisioning/oneview/san_storage.rb
|
160
|
-
- lib/chef/provisioning/oneview/v1.2/api.rb
|
161
|
-
- lib/chef/provisioning/oneview/v2.0/api.rb
|
162
175
|
- lib/chef/provisioning/oneview_driver.rb
|
163
|
-
- lib/chef/provisioning/rest.rb
|
164
176
|
- lib/chef/provisioning/version.rb
|
165
|
-
- spec/shared_context.rb
|
166
|
-
- spec/spec_helper.rb
|
167
|
-
- spec/support/fake_action_handler.rb
|
168
|
-
- spec/support/fake_icsp.rb
|
169
|
-
- spec/support/fake_machine_spec.rb
|
170
|
-
- spec/support/fake_oneview.rb
|
171
|
-
- spec/support/fixtures/icsp/v102/error_404.json
|
172
|
-
- spec/support/fixtures/icsp/v102/login.json
|
173
|
-
- spec/support/fixtures/icsp/v102/os-deployment-build-plans.json
|
174
|
-
- spec/support/fixtures/icsp/v102/os-deployment-servers.json
|
175
|
-
- spec/support/fixtures/icsp/v102/os-deployment-servers_1670001.json
|
176
|
-
- spec/support/fixtures/icsp/v102/os-deployment-servers_fakesn.json
|
177
|
-
- spec/support/fixtures/icsp/v102/server_by_sn_VCGE9KB041.json
|
178
|
-
- spec/support/fixtures/icsp/v102/server_by_sn_empty.json
|
179
|
-
- spec/support/fixtures/icsp/v102/version.json
|
180
|
-
- spec/support/fixtures/oneview/v120/error_404.json
|
181
|
-
- spec/support/fixtures/oneview/v120/login.json
|
182
|
-
- spec/support/fixtures/oneview/v120/server-hardware.json
|
183
|
-
- spec/support/fixtures/oneview/v120/server-hardware_Template-WebServer.json
|
184
|
-
- spec/support/fixtures/oneview/v120/server-hardware_specific.json
|
185
|
-
- spec/support/fixtures/oneview/v120/server-profiles.json
|
186
|
-
- spec/support/fixtures/oneview/v120/server-profiles_invalid_filter.json
|
187
|
-
- spec/support/fixtures/oneview/v120/server-profiles_name_Template-WebServer.json
|
188
|
-
- spec/support/fixtures/oneview/v120/server-profiles_name_Template-WebServerWithSAN.json
|
189
|
-
- spec/support/fixtures/oneview/v120/server-profiles_name_chef-web01.json
|
190
|
-
- spec/support/fixtures/oneview/v120/server-profiles_name_chef-web03.json
|
191
|
-
- spec/support/fixtures/oneview/v120/server-profiles_name_empty.json
|
192
|
-
- spec/support/fixtures/oneview/v120/server-profiles_sn_VCGE9KB041.json
|
193
|
-
- spec/support/fixtures/oneview/v120/server-profiles_sn_VCGE9KB042.json
|
194
|
-
- spec/support/fixtures/oneview/v120/server-profiles_sn_empty.json
|
195
|
-
- spec/support/fixtures/oneview/v120/storage-volumes_1B5D3CA2-6C5B-41C2-8B97-1821F1883F22.json
|
196
|
-
- spec/support/fixtures/oneview/v120/tasks_fake_active.json
|
197
|
-
- spec/support/fixtures/oneview/v120/tasks_fake_complete.json
|
198
|
-
- spec/support/fixtures/oneview/v120/version.json
|
199
|
-
- spec/support/fixtures/oneview/v200/server-profile-templates_WebServerTemplate.json
|
200
|
-
- spec/support/fixtures/oneview/v200/server-profile-templates_WebServerTemplateWithSAN.json
|
201
|
-
- spec/support/fixtures/oneview/v200/server-profile-templates_invalid.json
|
202
|
-
- spec/support/fixtures/oneview/v200/server-profile-templates_new-profile_WebServerTemplate.json
|
203
|
-
- spec/support/fixtures/oneview/v200/server-profile-templates_new-profile_WebServerTemplateWithSAN.json
|
204
|
-
- spec/support/fixtures/oneview/v200/version.json
|
205
|
-
- spec/unit/create_machine_spec.rb
|
206
|
-
- spec/unit/destroy_spec.rb
|
207
|
-
- spec/unit/icsp_nic_teams_spec.rb
|
208
|
-
- spec/unit/icsp_search_spec.rb
|
209
|
-
- spec/unit/oneview_driver_spec.rb
|
210
|
-
- spec/unit/oneview_login_spec.rb
|
211
|
-
- spec/unit/oneview_power_spec.rb
|
212
|
-
- spec/unit/oneview_san_spec.rb
|
213
|
-
- spec/unit/oneview_search_spec.rb
|
214
|
-
- spec/unit/rest_api_spec.rb
|
215
177
|
homepage: https://github.com/HewlettPackard/chef-provisioning-oneview
|
216
178
|
licenses:
|
217
179
|
- Apache-2.0
|
data/Rakefile
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'bundler'
|
2
|
-
require 'bundler/gem_tasks'
|
3
|
-
require 'rspec/core/rake_task'
|
4
|
-
require 'rubocop/rake_task'
|
5
|
-
|
6
|
-
task default: :spec
|
7
|
-
|
8
|
-
desc 'Run specs'
|
9
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
10
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
11
|
-
end
|
12
|
-
|
13
|
-
RuboCop::RakeTask.new
|
14
|
-
|
15
|
-
desc 'Runs rubocop and rspec'
|
16
|
-
task :test do
|
17
|
-
Rake::Task[:rubocop].invoke
|
18
|
-
Rake::Task[:spec].invoke
|
19
|
-
end
|
@@ -1,284 +0,0 @@
|
|
1
|
-
Dir[File.dirname(__FILE__) + '/**/*.rb'].each {|file| require file } # Include all helper files in this directory & subdirectories
|
2
|
-
|
3
|
-
module ICspAPI
|
4
|
-
private
|
5
|
-
|
6
|
-
include ICspAPIv104
|
7
|
-
|
8
|
-
def get_icsp_api_version
|
9
|
-
begin
|
10
|
-
version = rest_api(:icsp, :get, '/rest/version', { 'Content-Type' => :none, 'X-API-Version' => :none, 'auth' => :none })['currentVersion']
|
11
|
-
raise "Couldn't get API version" unless version
|
12
|
-
if version.class != Fixnum
|
13
|
-
version = version.to_i
|
14
|
-
raise 'API version type mismatch' if !version > 0
|
15
|
-
end
|
16
|
-
rescue
|
17
|
-
puts 'Failed to get ICSP API version. Setting to default (102)'
|
18
|
-
version = 102
|
19
|
-
end
|
20
|
-
version
|
21
|
-
end
|
22
|
-
|
23
|
-
def login_to_icsp
|
24
|
-
path = '/rest/login-sessions'
|
25
|
-
options = {
|
26
|
-
'body' => {
|
27
|
-
'userName' => @icsp_username,
|
28
|
-
'password' => @icsp_password,
|
29
|
-
'authLoginDomain' => 'LOCAL'
|
30
|
-
}
|
31
|
-
}
|
32
|
-
response = rest_api(:icsp, :post, path, options)
|
33
|
-
return response['sessionID'] if response['sessionID']
|
34
|
-
raise("\nERROR! Couldn't log into ICSP server at #{@icsp_base_url}. Response:\n#{response}")
|
35
|
-
end
|
36
|
-
|
37
|
-
def get_icsp_server_by_sn(serial_number)
|
38
|
-
raise 'Must specify a serialNumber!' if serial_number.nil? || serial_number.empty?
|
39
|
-
search_result = rest_api(:icsp, :get,
|
40
|
-
"/rest/index/resources?category=osdserver&query='osdServerSerialNumber:\"#{serial_number}\"'")['members'] rescue nil
|
41
|
-
if search_result && search_result.size == 1 && search_result.first['attributes']['osdServerSerialNumber'] == serial_number
|
42
|
-
my_server_uri = search_result.first['uri']
|
43
|
-
my_server = rest_api(:icsp, :get, my_server_uri)
|
44
|
-
end
|
45
|
-
unless my_server && my_server['uri']
|
46
|
-
os_deployment_servers = rest_api(:icsp, :get, '/rest/os-deployment-servers')
|
47
|
-
# Pick the relevant os deployment server from icsp
|
48
|
-
my_server = nil
|
49
|
-
os_deployment_servers['members'].each do |server|
|
50
|
-
if server['serialNumber'] == serial_number
|
51
|
-
my_server = server
|
52
|
-
break
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
my_server
|
57
|
-
end
|
58
|
-
|
59
|
-
def icsp_wait_for(task_uri, wait_iterations = 60, sleep_seconds = 10)
|
60
|
-
raise 'Must specify a task_uri!' if task_uri.nil? || task_uri.empty?
|
61
|
-
wait_iterations.times do
|
62
|
-
task = rest_api(:icsp, :get, task_uri)
|
63
|
-
if task['taskState']
|
64
|
-
case task['taskState'].downcase
|
65
|
-
when 'completed'
|
66
|
-
return true
|
67
|
-
when 'error', 'killed', 'terminated'
|
68
|
-
return task
|
69
|
-
end
|
70
|
-
elsif task['running'] == 'false' && task['jobResult']
|
71
|
-
if task['state'] == 'STATUS_SUCCESS'
|
72
|
-
return true
|
73
|
-
else
|
74
|
-
return task
|
75
|
-
end
|
76
|
-
end
|
77
|
-
print '.'
|
78
|
-
sleep sleep_seconds
|
79
|
-
end
|
80
|
-
false
|
81
|
-
end
|
82
|
-
|
83
|
-
# Consume and set any custom attributes that were specified
|
84
|
-
def icsp_set_custom_attributes(machine_options, my_server)
|
85
|
-
if machine_options[:driver_options][:custom_attributes]
|
86
|
-
curr_server = rest_api(:icsp, :get, my_server['uri'])
|
87
|
-
machine_options[:driver_options][:custom_attributes].each do |key, val|
|
88
|
-
curr_server['customAttributes'].push({
|
89
|
-
'values' => [{ 'scope' => 'server', 'value' => val.to_s }],
|
90
|
-
'key' => key.to_s
|
91
|
-
})
|
92
|
-
end
|
93
|
-
options = { 'body' => curr_server }
|
94
|
-
rest_api(:icsp, :put, my_server['uri'], options)
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def icsp_run_os_install(action_handler, machine_spec, machine_options, my_server, profile)
|
99
|
-
return if my_server['state'] == 'OK' # Skip if the OS has already been deployed
|
100
|
-
|
101
|
-
# Wait for my_server['state'] to be in MAINTENANCE mode
|
102
|
-
if my_server['state'] != 'MAINTENANCE'
|
103
|
-
action_handler.perform_action "Wait for #{machine_spec.name} to go into maintenance mode in ICsp" do
|
104
|
-
action_handler.report_progress "INFO: Waiting for #{machine_spec.name} to go into maintenance mode in ICsp"
|
105
|
-
120.times do # Wait for up to 20 min
|
106
|
-
my_server = get_icsp_server_by_sn(profile['serialNumber'])
|
107
|
-
break if my_server['state'] != 'MAINTENANCE'
|
108
|
-
print '.'
|
109
|
-
sleep 10
|
110
|
-
end
|
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
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
# Get the specified OS Build Plan(s)
|
116
|
-
os_builds = machine_options[:driver_options][:os_build]
|
117
|
-
os_builds = [os_builds] if os_builds.class == String
|
118
|
-
build_plan_uris = []
|
119
|
-
action_handler.perform_action "Get OS Build Plan(s) info for #{machine_spec.name}" do
|
120
|
-
action_handler.report_progress "INFO: Getting OS Build Plan(s) for #{machine_spec.name}"
|
121
|
-
os_builds.each do |os_build|
|
122
|
-
uri = "/rest/index/resources?userQuery=\"'#{os_build}'\"&category=osdbuildplan"
|
123
|
-
while uri
|
124
|
-
matching_plans = rest_api(:icsp, :get, uri)
|
125
|
-
raise "Search failed for OSBP '#{os_build}'. Response: #{matching_plans}" unless matching_plans['members']
|
126
|
-
build_plan_uri = matching_plans['members'].find {|bp| bp['name'] == os_build}['uri'] rescue nil
|
127
|
-
break unless build_plan_uri.nil?
|
128
|
-
uri = URI.unescape(matching_plans['nextPageUri']) rescue nil
|
129
|
-
end
|
130
|
-
raise "OS build plan #{os_build} not found!" if build_plan_uri.nil?
|
131
|
-
build_plan_uris.push build_plan_uri
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
# Build options for the OS deployment
|
136
|
-
options = {}
|
137
|
-
options['X-API-Version'] = 104 if @current_icsp_api_version.between?(104, 108)
|
138
|
-
options['body'] = {
|
139
|
-
'osbpUris' => build_plan_uris,
|
140
|
-
'serverData' => [{
|
141
|
-
'serverUri' => my_server['uri']
|
142
|
-
}]
|
143
|
-
}
|
144
|
-
|
145
|
-
# Do the OS deployment
|
146
|
-
action_handler.perform_action "Run: #{os_builds} OS Build Plan(s) on #{machine_spec.name}" do
|
147
|
-
action_handler.report_progress "INFO: Running: #{os_builds} OS Build Plan(s) on #{machine_spec.name}"
|
148
|
-
task = rest_api(:icsp, :post, '/rest/os-deployment-jobs/?force=true', options)
|
149
|
-
task_uri = task['uri']
|
150
|
-
raise "Failed to start OS Deployment Job. Details: #{task['details'] || task['message'] || task}" unless task_uri
|
151
|
-
task = icsp_wait_for(task_uri, 720)
|
152
|
-
raise "Error running OS build plan(s) #{os_builds}: #{task['jobResult'].first['jobMessage']}\n#{task['jobResult'].first['jobResultErrorDetails']}" unless task == true
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def icsp_configure_networking(action_handler, machine_spec, machine_options, my_server, profile)
|
157
|
-
return if machine_options[:driver_options][:skip_network_configuration] == true
|
158
|
-
action_handler.perform_action "Configure networking on #{machine_spec.name}" do
|
159
|
-
action_handler.report_progress "INFO: Configuring networking on #{machine_spec.name}"
|
160
|
-
personality_data = icsp_build_personality_data(machine_options, profile)
|
161
|
-
options = {}
|
162
|
-
options['X-API-Version'] = 104 if @current_icsp_api_version.between?(104, 108)
|
163
|
-
options['body'] = {
|
164
|
-
'serverData' => [{
|
165
|
-
'serverUri' => my_server['uri'],
|
166
|
-
'personalityData' => personality_data
|
167
|
-
}]
|
168
|
-
}
|
169
|
-
|
170
|
-
task = rest_api(:icsp, :post, '/rest/os-deployment-jobs/?force=true', options)
|
171
|
-
task_uri = task['uri']
|
172
|
-
raise "Failed to start network personalization job. Details: #{task['details']}" unless task_uri
|
173
|
-
task = icsp_wait_for(task_uri, 60) # Wait for up to 10 min
|
174
|
-
raise "Error running network personalization job: #{task['jobResult'].first['jobMessage']}\n#{task['jobResult'].first['jobResultErrorDetails']}" unless task == true
|
175
|
-
|
176
|
-
# Check if ICsp IP config matches machine options
|
177
|
-
requested_ips = []
|
178
|
-
machine_options[:driver_options][:connections].each do |_id, c|
|
179
|
-
requested_ips.push c[:ip4Address] if c[:ip4Address] && c[:dhcp] == false
|
180
|
-
end
|
181
|
-
my_server_connections = []
|
182
|
-
10.times do
|
183
|
-
my_server_connections = rest_api(:icsp, :get, my_server['uri'])['interfaces']
|
184
|
-
my_server_connections.each { |c| requested_ips.delete c['ipv4Addr'] }
|
185
|
-
break if requested_ips.empty?
|
186
|
-
print ','
|
187
|
-
sleep 10
|
188
|
-
end
|
189
|
-
puts "\nWARN: The following IPs are not visible on ICsp, so they may not have gotten configured correctly: #{requested_ips}" unless requested_ips.empty?
|
190
|
-
|
191
|
-
# Set interface data as normal node attributes
|
192
|
-
my_server_connections.each do |c|
|
193
|
-
c['oneViewId'] = profile['connections'].find {|x| x['mac'] == c['macAddr']}['id'] rescue nil
|
194
|
-
end
|
195
|
-
machine_spec.data['normal']['icsp'] ||= {}
|
196
|
-
machine_spec.data['normal']['icsp']['interfaces'] = my_server_connections
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
# Build options for the network configuration
|
201
|
-
def icsp_build_personality_data(machine_options, profile)
|
202
|
-
nics = []
|
203
|
-
if machine_options[:driver_options][:connections]
|
204
|
-
machine_options[:driver_options][:connections].each do |id, data|
|
205
|
-
c = Marshal.load(Marshal.dump(data))
|
206
|
-
next unless c[:dhcp] || c[:dhcpv4] || c[:ip4Address] || c[:ipv6autoconfig] || c[:staticNetworks] # Invalid network or only switch networks specified
|
207
|
-
c.delete_if { |k, _v| k.to_s == 'bootstrap' }
|
208
|
-
begin
|
209
|
-
c[:macAddress] = profile['connections'].find {|x| x['id'] == id}['mac']
|
210
|
-
rescue NoMethodError
|
211
|
-
ids = []
|
212
|
-
profile['connections'].each {|x| ids.push x['id']}
|
213
|
-
raise "Could not find connection id #{id} for #{profile['name']}. Available connection ids are: #{ids}. Please make sure the connection ids map to those on OneView."
|
214
|
-
end
|
215
|
-
if @current_icsp_api_version.between?(104, 108)
|
216
|
-
icsp_v104_parse_connection(machine_options, c)
|
217
|
-
else
|
218
|
-
c[:mask] ||= machine_options[:driver_options][:mask]
|
219
|
-
c[:dhcp] ||= false
|
220
|
-
c[:gateway] ||= machine_options[:driver_options][:gateway]
|
221
|
-
c[:dns] ||= machine_options[:driver_options][:dns]
|
222
|
-
end
|
223
|
-
nics.push c
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
if @current_icsp_api_version.between?(104, 108)
|
228
|
-
personality_data = icsp_v104_build_personality_data(machine_options, nics)
|
229
|
-
else
|
230
|
-
personality_data = {
|
231
|
-
'hostName' => machine_options[:driver_options][:host_name],
|
232
|
-
'domainType' => machine_options[:driver_options][:domainType],
|
233
|
-
'domainName' => machine_options[:driver_options][:domainName],
|
234
|
-
'nics' => nics
|
235
|
-
}
|
236
|
-
end
|
237
|
-
personality_data
|
238
|
-
end
|
239
|
-
|
240
|
-
def destroy_icsp_server(action_handler, machine_spec)
|
241
|
-
my_server = get_icsp_server_by_sn(machine_spec.reference['serial_number'])
|
242
|
-
return false if my_server.nil? || my_server['uri'].nil?
|
243
|
-
|
244
|
-
action_handler.perform_action "Delete server #{machine_spec.name} from ICSP" do
|
245
|
-
task = rest_api(:icsp, :delete, my_server['uri']) # TODO: This returns nil instead of task info
|
246
|
-
if task['uri']
|
247
|
-
task_uri = task['uri']
|
248
|
-
90.times do # Wait for up to 15 minutes
|
249
|
-
task = rest_api(:icsp, :get, task_uri)
|
250
|
-
break if task['taskState'].casecmp('completed') == 0
|
251
|
-
print '.'
|
252
|
-
sleep 10
|
253
|
-
end
|
254
|
-
raise "Deleting os deployment server #{machine_spec.name} at icsp failed!" unless task['taskState'].casecmp('completed') == 0
|
255
|
-
end
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
def icsp_configure_nic_teams(machine_options, profile)
|
260
|
-
return false if machine_options[:driver_options][:connections].nil?
|
261
|
-
teams = {}
|
262
|
-
|
263
|
-
machine_options[:driver_options][:connections].each do |id, options|
|
264
|
-
next unless options.is_a?(Hash) && options[:team]
|
265
|
-
raise "#{options[:team]}: Team names must not include hyphens" if options[:team].to_s.include?('-')
|
266
|
-
teams[options[:team].to_s] ||= []
|
267
|
-
begin
|
268
|
-
mac = profile['connections'].find {|x| x['id'] == id}['mac']
|
269
|
-
teams[options[:team].to_s].push mac
|
270
|
-
rescue NoMethodError
|
271
|
-
ids = []
|
272
|
-
profile['connections'].each {|x| ids.push x['id']}
|
273
|
-
raise "Failed to configure nic teams: Could not find connection id #{id} for #{profile['name']}. Available connection ids are: #{ids}. Please make sure the connection ids map to those on OneView."
|
274
|
-
end
|
275
|
-
end
|
276
|
-
team_strings = []
|
277
|
-
teams.each do |name, macs|
|
278
|
-
raise "Team '#{name}' must have at least 2 associated connections to form a NIC team" unless macs.size >= 2
|
279
|
-
team_strings.push "#{name}-#{macs.join(',')}"
|
280
|
-
end
|
281
|
-
machine_options[:driver_options][:custom_attributes] ||= {}
|
282
|
-
machine_options[:driver_options][:custom_attributes][:teams] = team_strings.join('|')
|
283
|
-
end
|
284
|
-
end # End module
|
@@ -1,186 +0,0 @@
|
|
1
|
-
Dir[File.dirname(__FILE__) + '/**/*.rb'].each {|file| require file } # Include all helper files in this directory & subdirectories
|
2
|
-
|
3
|
-
module OneViewAPI
|
4
|
-
private
|
5
|
-
|
6
|
-
include OneViewAPIv1_2
|
7
|
-
include OneViewAPIv2_0
|
8
|
-
include OneViewSanStorage
|
9
|
-
|
10
|
-
def get_oneview_api_version
|
11
|
-
begin
|
12
|
-
version = rest_api(:oneview, :get, '/rest/version', { 'Content-Type' => :none, 'X-API-Version' => :none, 'auth' => :none })['currentVersion']
|
13
|
-
raise "Couldn't get API version" unless version
|
14
|
-
if version.class != Fixnum
|
15
|
-
version = version.to_i
|
16
|
-
raise 'API version type mismatch' if !version > 0
|
17
|
-
end
|
18
|
-
rescue
|
19
|
-
Chef::Log.warn 'Failed to get OneView API version. Setting to default (120)'
|
20
|
-
version = 120
|
21
|
-
end
|
22
|
-
version
|
23
|
-
end
|
24
|
-
|
25
|
-
def login_to_oneview
|
26
|
-
path = '/rest/login-sessions'
|
27
|
-
options = {
|
28
|
-
'body' => {
|
29
|
-
'userName' => @oneview_username,
|
30
|
-
'password' => @oneview_password,
|
31
|
-
'authLoginDomain' => 'LOCAL'
|
32
|
-
}
|
33
|
-
}
|
34
|
-
response = rest_api(:oneview, :post, path, options)
|
35
|
-
return response['sessionID'] if response['sessionID']
|
36
|
-
raise("\nERROR! Couldn't log into OneView server at #{@oneview_base_url}. Response:\n#{response}")
|
37
|
-
end
|
38
|
-
|
39
|
-
def get_oneview_profile_by_sn(serial_number)
|
40
|
-
raise 'Must specify a serialNumber!' if serial_number.nil? || serial_number.empty?
|
41
|
-
matching_profiles = rest_api(:oneview, :get, "/rest/server-profiles?filter=serialNumber matches '#{serial_number}'&sort=name:asc")
|
42
|
-
raise "Failed to get oneview profile by serialNumber: #{serial_number}. Response: #{matching_profiles}" unless matching_profiles['count']
|
43
|
-
return matching_profiles['members'].first if matching_profiles['count'] > 0
|
44
|
-
nil
|
45
|
-
end
|
46
|
-
|
47
|
-
# Search for OneView Template by name
|
48
|
-
def get_oneview_template(template_name)
|
49
|
-
if @current_oneview_api_version >= 200
|
50
|
-
# Look for Server Profile Template (OneView 2.0 or higher)
|
51
|
-
options = { 'X-API-Version' => 200 }
|
52
|
-
templates = rest_api(:oneview, :get, "/rest/server-profile-templates?filter=\"name matches '#{template_name}'\"&sort=name:asc", options)['members']
|
53
|
-
return rest_api(:oneview, :get, "#{templates.first['uri']}/new-profile", options) if templates && templates.count == 1
|
54
|
-
raise "'#{template_name}' matches multiple templates! Please use a unique template name." if templates && templates.count > 1
|
55
|
-
end
|
56
|
-
|
57
|
-
# Look for Server Profile as second option
|
58
|
-
templates = rest_api(:oneview, :get, "/rest/server-profiles?filter=\"name matches '#{template_name}'\"&sort=name:asc")['members']
|
59
|
-
if templates && templates.count == 1
|
60
|
-
# Remove unwanted fields
|
61
|
-
%w(uri serialNumber uuid taskUri).each {|key| templates.first[key] = nil}
|
62
|
-
templates.first['connections'].each do |c|
|
63
|
-
%w(wwnn wwpn mac deploymentStatus interconnectUri wwpnType macType).each {|key| c[key] = nil}
|
64
|
-
end
|
65
|
-
return templates.first
|
66
|
-
end
|
67
|
-
raise "'#{template_name}' matches multiple profiles! Please use a unique template name." if templates && templates.count > 1
|
68
|
-
|
69
|
-
raise "Template '#{template_name}' not found! Please match the template name with one that exists on OneView."
|
70
|
-
end
|
71
|
-
|
72
|
-
def available_hardware_for_template(template, location = nil)
|
73
|
-
server_hardware_type_uri = template['serverHardwareTypeUri']
|
74
|
-
enclosure_group_uri = template['enclosureGroupUri']
|
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
|
-
params = "sort=name:asc&filter=serverHardwareTypeUri='#{server_hardware_type_uri}'&filter=serverGroupUri='#{enclosure_group_uri}'"
|
78
|
-
blades = rest_api(:oneview, :get, "/rest/server-hardware?#{params}")
|
79
|
-
raise 'Error! No available blades that are compatible with the server template!' unless blades['count'] > 0
|
80
|
-
Chef::Log.debug "Specific hardware requested: #{location}" if location
|
81
|
-
blades['members'].each do |member|
|
82
|
-
next unless member['state'] == 'NoProfileApplied'
|
83
|
-
next if location && member['name'] != location
|
84
|
-
return member
|
85
|
-
end
|
86
|
-
raise 'No more blades are available for provisioning!' # Every bay is full and no more machines can be allocated
|
87
|
-
end
|
88
|
-
|
89
|
-
def oneview_wait_for(task_uri, wait_iterations = 60, sleep_seconds = 10) # Default time is 10 min
|
90
|
-
raise 'Must specify a task_uri!' if task_uri.nil? || task_uri.empty?
|
91
|
-
wait_iterations.times do
|
92
|
-
task = rest_api(:oneview, :get, task_uri)
|
93
|
-
case task['taskState'].downcase
|
94
|
-
when 'completed'
|
95
|
-
return true
|
96
|
-
when 'error', 'killed', 'terminated'
|
97
|
-
return task
|
98
|
-
else
|
99
|
-
print '.'
|
100
|
-
sleep sleep_seconds
|
101
|
-
end
|
102
|
-
end
|
103
|
-
false
|
104
|
-
end
|
105
|
-
|
106
|
-
def wait_for_profile(action_handler, machine_spec, machine_options, profile)
|
107
|
-
unless profile['state'] == 'Normal'
|
108
|
-
action_handler.perform_action "Wait for #{machine_spec.name} server to start and profile to be applied" do
|
109
|
-
action_handler.report_progress "INFO: Waiting for #{machine_spec.name} server to start and profile to be applied"
|
110
|
-
task = oneview_wait_for(profile['taskUri'], 360) # Wait up to 60 min for profile to be created
|
111
|
-
raise 'Timed out waiting for server to start and profile to be applied' if task == false
|
112
|
-
unless task == true
|
113
|
-
server_template = machine_options[:driver_options][:server_template]
|
114
|
-
raise "Error creating server profile from template #{server_template}: #{task['taskErrors'].first['message']}"
|
115
|
-
end
|
116
|
-
end
|
117
|
-
profile = get_oneview_profile_by_sn(machine_spec.reference['serial_number']) # Refresh profile
|
118
|
-
raise "Server profile state '#{profile['state']}' not 'Normal'" unless profile['state'] == 'Normal'
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
|
123
|
-
def power_on(action_handler, machine_spec, hardware_uri = nil)
|
124
|
-
set_power_state(action_handler, machine_spec, 'on', hardware_uri)
|
125
|
-
end
|
126
|
-
|
127
|
-
def power_off(action_handler, machine_spec, hardware_uri = nil)
|
128
|
-
set_power_state(action_handler, machine_spec, 'off', hardware_uri)
|
129
|
-
end
|
130
|
-
|
131
|
-
def set_power_state(action_handler, machine_spec, state, hardware_uri = nil)
|
132
|
-
case state
|
133
|
-
when :on, 'on', true
|
134
|
-
state = 'on'
|
135
|
-
when :off, 'off', false
|
136
|
-
state = 'off'
|
137
|
-
else raise "Invalid power state #{state}"
|
138
|
-
end
|
139
|
-
|
140
|
-
if hardware_uri.nil?
|
141
|
-
profile = get_oneview_profile_by_sn(machine_spec.reference['serial_number'])
|
142
|
-
raise "Could not power #{state} #{machine_spec.name}: Profile with serial number '#{machine_spec.reference['serial_number']}' not found!" unless profile
|
143
|
-
hardware_uri = profile['serverHardwareUri']
|
144
|
-
end
|
145
|
-
|
146
|
-
hardware_info = rest_api(:oneview, :get, hardware_uri)
|
147
|
-
unless hardware_info['powerState'].casecmp(state) == 0
|
148
|
-
action_handler.perform_action "Power #{state} server #{hardware_info['name']} for #{machine_spec.name}" do
|
149
|
-
action_handler.report_progress "INFO: Powering #{state} server #{hardware_info['name']} for #{machine_spec.name}"
|
150
|
-
task = rest_api(:oneview, :put, "#{hardware_uri}/powerState", { 'body' => { 'powerState' => state.capitalize, 'powerControl' => 'MomentaryPress' } })
|
151
|
-
task_uri = task['uri']
|
152
|
-
60.times do # Wait for up to 10 minutes
|
153
|
-
task = rest_api(:oneview, :get, task_uri)
|
154
|
-
break if task['taskState'].casecmp('completed') == 0
|
155
|
-
print '.'
|
156
|
-
sleep 10
|
157
|
-
end
|
158
|
-
raise "Powering #{state} machine #{machine_spec.name} failed!" unless task['taskState'].casecmp('completed') == 0
|
159
|
-
end
|
160
|
-
end
|
161
|
-
hardware_uri
|
162
|
-
end
|
163
|
-
|
164
|
-
def destroy_oneview_profile(action_handler, machine_spec, profile = nil)
|
165
|
-
profile ||= get_oneview_profile_by_sn(machine_spec.reference['serial_number'])
|
166
|
-
|
167
|
-
hardware_info = rest_api(:oneview, :get, profile['serverHardwareUri'])
|
168
|
-
if hardware_info.nil?
|
169
|
-
action_handler.report_progress "INFO: #{machine_spec.name} is already deleted."
|
170
|
-
else
|
171
|
-
action_handler.perform_action "Delete server #{machine_spec.name} from oneview" do
|
172
|
-
action_handler.report_progress "INFO: Deleting server profile #{machine_spec.name}"
|
173
|
-
task = rest_api(:oneview, :Delete, profile['uri'])
|
174
|
-
task_uri = task['uri']
|
175
|
-
|
176
|
-
60.times do # Wait for up to 10 minutes
|
177
|
-
task = rest_api(:oneview, :get, task_uri)
|
178
|
-
break if task['taskState'].casecmp('completed') == 0
|
179
|
-
print '.'
|
180
|
-
sleep 10
|
181
|
-
end
|
182
|
-
raise "Deleting server profile #{machine_spec.name} failed!" unless task['taskState'].casecmp('completed') == 0
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|