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.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +119 -65
  3. data/chef-provisioning-oneview.gemspec +39 -0
  4. data/lib/chef/provisioning/create_machine.rb +43 -46
  5. data/lib/chef/provisioning/customize_machine.rb +50 -48
  6. data/lib/chef/provisioning/helpers.rb +18 -0
  7. data/lib/chef/provisioning/icsp/api_v104.rb +3 -2
  8. data/lib/chef/provisioning/icsp/icsp_helper.rb +288 -0
  9. data/lib/chef/provisioning/icsp/rest.rb +50 -0
  10. data/lib/chef/provisioning/oneview/oneview_helper.rb +53 -0
  11. data/lib/chef/provisioning/oneview/san_storage.rb +69 -69
  12. data/lib/chef/provisioning/oneview_driver.rb +124 -105
  13. data/lib/chef/provisioning/version.rb +1 -1
  14. metadata +23 -61
  15. data/Rakefile +0 -19
  16. data/lib/chef/provisioning/icsp/icsp_api.rb +0 -284
  17. data/lib/chef/provisioning/oneview/oneview_api.rb +0 -186
  18. data/lib/chef/provisioning/oneview/v1.2/api.rb +0 -3
  19. data/lib/chef/provisioning/oneview/v2.0/api.rb +0 -3
  20. data/lib/chef/provisioning/rest.rb +0 -52
  21. data/spec/shared_context.rb +0 -78
  22. data/spec/spec_helper.rb +0 -23
  23. data/spec/support/fake_action_handler.rb +0 -6
  24. data/spec/support/fake_icsp.rb +0 -73
  25. data/spec/support/fake_machine_spec.rb +0 -18
  26. data/spec/support/fake_oneview.rb +0 -148
  27. data/spec/support/fixtures/icsp/v102/error_404.json +0 -14
  28. data/spec/support/fixtures/icsp/v102/login.json +0 -5
  29. data/spec/support/fixtures/icsp/v102/os-deployment-build-plans.json +0 -99
  30. data/spec/support/fixtures/icsp/v102/os-deployment-servers.json +0 -179
  31. data/spec/support/fixtures/icsp/v102/os-deployment-servers_1670001.json +0 -83
  32. data/spec/support/fixtures/icsp/v102/os-deployment-servers_fakesn.json +0 -9
  33. data/spec/support/fixtures/icsp/v102/server_by_sn_VCGE9KB041.json +0 -45
  34. data/spec/support/fixtures/icsp/v102/server_by_sn_empty.json +0 -16
  35. data/spec/support/fixtures/icsp/v102/version.json +0 -4
  36. data/spec/support/fixtures/oneview/v120/error_404.json +0 -14
  37. data/spec/support/fixtures/oneview/v120/login.json +0 -5
  38. data/spec/support/fixtures/oneview/v120/server-hardware.json +0 -1476
  39. data/spec/support/fixtures/oneview/v120/server-hardware_Template-WebServer.json +0 -468
  40. data/spec/support/fixtures/oneview/v120/server-hardware_specific.json +0 -151
  41. data/spec/support/fixtures/oneview/v120/server-profiles.json +0 -369
  42. data/spec/support/fixtures/oneview/v120/server-profiles_invalid_filter.json +0 -14
  43. data/spec/support/fixtures/oneview/v120/server-profiles_name_Template-WebServer.json +0 -133
  44. data/spec/support/fixtures/oneview/v120/server-profiles_name_Template-WebServerWithSAN.json +0 -200
  45. data/spec/support/fixtures/oneview/v120/server-profiles_name_chef-web01.json +0 -133
  46. data/spec/support/fixtures/oneview/v120/server-profiles_name_chef-web03.json +0 -133
  47. data/spec/support/fixtures/oneview/v120/server-profiles_name_empty.json +0 -15
  48. data/spec/support/fixtures/oneview/v120/server-profiles_sn_VCGE9KB041.json +0 -133
  49. data/spec/support/fixtures/oneview/v120/server-profiles_sn_VCGE9KB042.json +0 -206
  50. data/spec/support/fixtures/oneview/v120/server-profiles_sn_empty.json +0 -15
  51. data/spec/support/fixtures/oneview/v120/storage-volumes_1B5D3CA2-6C5B-41C2-8B97-1821F1883F22.json +0 -26
  52. data/spec/support/fixtures/oneview/v120/tasks_fake_active.json +0 -5
  53. data/spec/support/fixtures/oneview/v120/tasks_fake_complete.json +0 -5
  54. data/spec/support/fixtures/oneview/v120/version.json +0 -4
  55. data/spec/support/fixtures/oneview/v200/server-profile-templates_WebServerTemplate.json +0 -109
  56. data/spec/support/fixtures/oneview/v200/server-profile-templates_WebServerTemplateWithSAN.json +0 -144
  57. data/spec/support/fixtures/oneview/v200/server-profile-templates_invalid.json +0 -16
  58. data/spec/support/fixtures/oneview/v200/server-profile-templates_new-profile_WebServerTemplate.json +0 -125
  59. data/spec/support/fixtures/oneview/v200/server-profile-templates_new-profile_WebServerTemplateWithSAN.json +0 -178
  60. data/spec/support/fixtures/oneview/v200/version.json +0 -4
  61. data/spec/unit/create_machine_spec.rb +0 -78
  62. data/spec/unit/destroy_spec.rb +0 -26
  63. data/spec/unit/icsp_nic_teams_spec.rb +0 -38
  64. data/spec/unit/icsp_search_spec.rb +0 -25
  65. data/spec/unit/oneview_driver_spec.rb +0 -79
  66. data/spec/unit/oneview_login_spec.rb +0 -17
  67. data/spec/unit/oneview_power_spec.rb +0 -51
  68. data/spec/unit/oneview_san_spec.rb +0 -86
  69. data/spec/unit/oneview_search_spec.rb +0 -63
  70. data/spec/unit/rest_api_spec.rb +0 -115
@@ -1,51 +0,0 @@
1
- require_relative './../spec_helper'
2
-
3
- RSpec.describe Chef::Provisioning::OneViewDriver do
4
- include_context 'shared context'
5
-
6
- describe '#power_on' do
7
- it 'calls set_power_state with correct params' do
8
- a = action_handler
9
- m = machine_spec
10
- ret_val = @instance.instance_eval { power_on(a, m) }
11
- expect(a_request(:get, %r{/rest/server-hardware/.*})).to have_been_made
12
- expect(a_request(:put, %r{/rest/server-hardware/.*/powerState}).with(body: '{"powerState":"On","powerControl":"MomentaryPress"}')).to have_been_made
13
- expect(ret_val).to match(%r{\/rest\/server-hardware\/.+})
14
- end
15
-
16
- it 'allows hardware_uri to be passed in' do
17
- a = action_handler
18
- m = machine_spec
19
- @instance.instance_eval { power_on(a, m, '/rest/server-hardware/31363636-3136-584D-5132-333230314D38') }
20
- expect(a_request(:get, %r{/rest/server-profiles})).to_not have_been_made
21
- end
22
- end
23
-
24
- describe '#power_off' do
25
- it 'calls set_power_state with correct params' do
26
- a = action_handler
27
- m = machine_spec
28
- ret_val = @instance.instance_eval { power_off(a, m) }
29
- expect(ret_val).to match(%r{\/rest\/server-hardware\/.+})
30
- expect(a_request(:put, %r{/rest/server-hardware/.*/powerState}).with(body: '{"powerState":"Off","powerControl":"MomentaryPress"}')).to have_been_made
31
- end
32
-
33
- it 'allows hardware_uri to be passed in' do
34
- a = action_handler
35
- m = machine_spec
36
- @instance.instance_eval { power_off(a, m, '/rest/server-hardware/31363636-3136-584D-5132-333230314D38') }
37
- expect(a_request(:get, %r{/rest/server-profiles})).to_not have_been_made
38
- end
39
- end
40
-
41
- describe '#set_power_state' do
42
-
43
- it 'fails when an invalid state is requested' do
44
- a = action_handler
45
- m = machine_spec
46
- expect { @instance.instance_eval { set_power_state(a, m, :invalid) } }.to raise_error('Invalid power state invalid')
47
- end
48
-
49
- end
50
-
51
- end
@@ -1,86 +0,0 @@
1
- require_relative './../spec_helper'
2
-
3
- RSpec.describe Chef::Provisioning::OneViewDriver do
4
- include_context 'shared context'
5
-
6
- describe '#fill_volume_details' do
7
- it 'fills the correct volume details' do
8
- profile = @instance.instance_eval { get_oneview_template('Template - Web Server with SAN') }
9
- v = profile['sanStorage']['volumeAttachments'].first
10
- expect(v['volumeName']).to be_nil
11
- expect(v['volumeShareable']).to be_nil
12
- @instance.instance_eval { fill_volume_details(v) }
13
- expect(a_request(:get, /#{v['volumeUri']}/)).to have_been_made
14
- expect(v['volumeName']).to eq('bootVol')
15
- expect(v['volumeShareable']).to be false
16
- end
17
- end
18
-
19
- describe '#update_san_info' do
20
- context 'profile coppies (OV 1.2)' do
21
- it 'prepares copies of profiles for SAN storage' do
22
- m = machine_spec
23
- profile = @instance.instance_eval { get_oneview_template('Template - Web Server with SAN') }
24
- profile['name'] = 'web01'
25
- ret_val = @instance.instance_eval { update_san_info(m, profile) }
26
- v = ret_val['sanStorage']['volumeAttachments'].first
27
- expect(v['uri']).to be_nil
28
- expect(v['volumeName']).to eq('bootVol web01')
29
- expect(v['lun']).to eq('0')
30
- end
31
- end
32
-
33
- context 'Server Profile Templates (OV 2.0)' do
34
- before :each do
35
- @instance.instance_variable_set('@current_oneview_api_version', 200)
36
- end
37
-
38
- it 'leaves profiles from Templates largely the same' do
39
- m = machine_spec
40
- profile = @instance.instance_eval { get_oneview_template('Web Server Template with SAN') }
41
- ret_val = @instance.instance_eval { update_san_info(m, profile) }
42
- expect(ret_val['sanStorage']['volumeAttachments'].first['storagePaths'].first.key?('state')).to be false
43
- end
44
-
45
- it 'appends the profile name to the volume name' do
46
- m = machine_spec
47
- profile = @instance.instance_eval { get_oneview_template('Web Server Template with SAN') }
48
- profile['name'] = 'web01'
49
- ret_val = @instance.instance_eval { update_san_info(m, profile) }
50
- expect(ret_val['sanStorage']['volumeAttachments'].first['volumeName']).to eq('bootVol web01')
51
- end
52
-
53
- it 'requires profiles to specify the volumeShareable attribute' do
54
- m = machine_spec
55
- profile = @instance.instance_eval { get_oneview_template('Web Server Template with SAN') }
56
- profile['sanStorage']['volumeAttachments'].first.delete('volumeShareable')
57
- expect { @instance.instance_eval { update_san_info(m, profile) } }.to raise_error(/Should know if volume is sharable/)
58
- end
59
-
60
- it 'only allows 1 SAN boot volume' do
61
- m = machine_spec
62
- profile = @instance.instance_eval { get_oneview_template('Web Server Template with SAN') }
63
- profile['sanStorage']['volumeAttachments'].push('id' => 2, 'volumeName' => 'bootVol2', 'volumeShareable' => true)
64
- expect { @instance.instance_eval { update_san_info(m, profile) } }.to raise_error(/should only be 1 SAN boot volume/)
65
- end
66
- end
67
- end
68
-
69
- describe '#enable_boot_from_san' do
70
- context 'Server Profile Templates (OV 2.0)' do
71
- before :each do
72
- @instance.instance_variable_set('@current_oneview_api_version', 200)
73
- end
74
-
75
- it 'configures connections to boot from a SAN volume' do
76
- a = action_handler
77
- m = machine_spec
78
- profile = @instance.instance_eval { get_oneview_profile_by_sn('VCGE9KB042') }
79
- ret_val = @instance.instance_eval { enable_boot_from_san(a, m, profile) }
80
- expect(a_request(:get, /#{profile['sanStorage']['volumeAttachments'].first['volumeUri']}/)).to have_been_made
81
- expect(ret_val['connections'].last['boot']['targets'].first['arrayWwpn']).to eq('21210002AC00159E')
82
- end
83
- end
84
- end
85
-
86
- end
@@ -1,63 +0,0 @@
1
- require_relative './../spec_helper'
2
-
3
- RSpec.describe Chef::Provisioning::OneViewDriver do
4
- include_context 'shared context'
5
-
6
- describe '#get_oneview_profile_by_sn' do
7
-
8
- it 'gets profile for a valid SN' do
9
- ret_val = @instance.instance_eval { get_oneview_profile_by_sn('VCGE9KB041') }
10
- expect(ret_val).to_not be_nil
11
- end
12
-
13
- it 'returns nil for fake SN' do
14
- ret_val = @instance.instance_eval { get_oneview_profile_by_sn('11111BBBBB') }
15
- expect(ret_val).to be_nil
16
- end
17
-
18
- it 'fails when an empty SN is given' do
19
- expect { @instance.instance_eval { get_oneview_profile_by_sn('') } }.to raise_error('Must specify a serialNumber!')
20
- end
21
-
22
- it 'fails when an invalid filter is specified' do
23
- expect { @instance.instance_eval { get_oneview_profile_by_sn('INVALIDFILTER') } }.to raise_error(/Failed to get oneview profile by serialNumber/)
24
- end
25
- end
26
-
27
- describe '#get_oneview_template' do
28
-
29
- context 'OneView 120' do
30
- it 'gets profile template by name' do
31
- ret_val = @instance.instance_eval { get_oneview_template('Template - Web Server') }
32
- expect(ret_val['name']).to eq('Template - Web Server')
33
- end
34
-
35
- it 'clears necessary attributes from profile' do
36
- ret_val = @instance.instance_eval { get_oneview_template('Template - Web Server') }
37
- expect(ret_val['name']).to_not be_nil
38
- %w(uri serialNumber uuid taskUri).each { |key| expect(ret_val[key]).to be_nil }
39
- ret_val['connections'].each do |c|
40
- %w(wwnn wwpn mac deploymentStatus interconnectUri wwpnType macType).each { |key| expect(c[key]).to be_nil }
41
- end
42
- end
43
- end
44
-
45
- context 'OneView 200' do
46
- before :each do
47
- @instance.instance_variable_set('@current_oneview_api_version', 200)
48
- end
49
-
50
- it 'gets template by name' do
51
- ret_val = @instance.instance_eval { get_oneview_template('Web Server Template') }
52
- expect(ret_val['uri']).to be_nil
53
- expect(ret_val['serverProfileTemplateUri']).to_not be_nil
54
- end
55
-
56
- it 'gets profile template by name' do
57
- ret_val = @instance.instance_eval { get_oneview_template('Template - Web Server') }
58
- expect(ret_val['name']).to eq('Template - Web Server')
59
- expect(ret_val['uri']).to be_nil
60
- end
61
- end
62
- end
63
- end
@@ -1,115 +0,0 @@
1
- require_relative './../spec_helper'
2
-
3
- RSpec.describe Chef::Provisioning::OneViewDriver do
4
- include_context 'shared context'
5
-
6
- describe '#rest_api' do
7
-
8
- context 'fake_oneview' do
9
- it 'completes get request with correct parameters' do
10
- resp = @instance.instance_eval { rest_api(:oneview, :get, '/', {}) }
11
- expect(resp['method']).to eq('GET')
12
- expect(resp['message']).to eq('Fake OneView works!')
13
- expect(resp['content_type']).to eq('application/json')
14
- expect(resp['api_version']).to eq(@instance.instance_variable_get('@oneview_api_version'))
15
- expect(resp['auth']).to eq(@oneview_key)
16
- end
17
-
18
- it 'completes post request with correct parameters' do
19
- resp = @instance.instance_eval { rest_api(:oneview, :post, '/', {}) }
20
- expect(resp['method']).to eq('POST')
21
- expect(resp['message']).to eq('Fake OneView works!')
22
- expect(resp['content_type']).to eq('application/json')
23
- expect(resp['api_version']).to eq(@instance.instance_variable_get('@oneview_api_version'))
24
- expect(resp['auth']).to eq(@oneview_key)
25
- end
26
-
27
- it 'completes put request with correct parameters' do
28
- resp = @instance.instance_eval { rest_api(:oneview, :put, '/', {}) }
29
- expect(resp['method']).to eq('PUT')
30
- expect(resp['message']).to eq('Fake OneView works!')
31
- expect(resp['content_type']).to eq('application/json')
32
- expect(resp['api_version']).to eq(@instance.instance_variable_get('@oneview_api_version'))
33
- expect(resp['auth']).to eq(@oneview_key)
34
- end
35
-
36
- it 'completes delete request with correct parameters' do
37
- resp = @instance.instance_eval { rest_api(:oneview, :delete, '/', {}) }
38
- expect(resp['method']).to eq('DELETE')
39
- expect(resp['message']).to eq('Fake OneView works!')
40
- expect(resp['content_type']).to eq('application/json')
41
- expect(resp['api_version']).to eq(@instance.instance_variable_get('@oneview_api_version'))
42
- expect(resp['auth']).to eq(@oneview_key)
43
- end
44
-
45
- it 'returns 404 error for invalid get request' do
46
- resp = @instance.instance_eval { rest_api(:oneview, :get, '/invalid_path', {}) }
47
- expect(resp['errorCode']).to eq('GENERIC_HTTP_404')
48
- end
49
- end
50
-
51
- context 'fake_icsp' do
52
- it 'completes get request with correct parameters' do
53
- resp = @instance.instance_eval { rest_api(:icsp, :get, '/', {}) }
54
- expect(resp['method']).to eq('GET')
55
- expect(resp['message']).to eq('Fake ICsp works!')
56
- expect(resp['content_type']).to eq('application/json')
57
- expect(resp['api_version']).to eq(@instance.instance_variable_get('@icsp_api_version'))
58
- expect(resp['auth']).to eq(@icsp_key)
59
- end
60
-
61
- it 'completes post request with correct parameters' do
62
- resp = @instance.instance_eval { rest_api(:icsp, :post, '/', {}) }
63
- expect(resp['method']).to eq('POST')
64
- expect(resp['message']).to eq('Fake ICsp works!')
65
- expect(resp['content_type']).to eq('application/json')
66
- expect(resp['api_version']).to eq(@instance.instance_variable_get('@icsp_api_version'))
67
- expect(resp['auth']).to eq(@icsp_key)
68
- end
69
-
70
- it 'completes put request with correct parameters' do
71
- resp = @instance.instance_eval { rest_api(:icsp, :put, '/', {}) }
72
- expect(resp['method']).to eq('PUT')
73
- expect(resp['message']).to eq('Fake ICsp works!')
74
- expect(resp['content_type']).to eq('application/json')
75
- expect(resp['api_version']).to eq(nil)
76
- expect(resp['auth']).to eq(@icsp_key)
77
- end
78
-
79
- it 'completes delete request with correct parameters' do
80
- resp = @instance.instance_eval { rest_api(:icsp, :delete, '/', {}) }
81
- expect(resp['method']).to eq('DELETE')
82
- expect(resp['message']).to eq('Fake ICsp works!')
83
- expect(resp['content_type']).to eq('application/json')
84
- expect(resp['api_version']).to eq(@instance.instance_variable_get('@icsp_api_version'))
85
- expect(resp['auth']).to eq(@icsp_key)
86
- end
87
-
88
- it 'returns 404 error for invalid get request' do
89
- resp = @instance.instance_eval { rest_api(:icsp, :get, '/invalid_path', {}) }
90
- expect(resp['errorCode']).to eq('GENERIC_HTTP_404')
91
- end
92
- end
93
-
94
- it 'only accepts oneview or icsp hosts parameter' do
95
- expect { @instance.instance_eval { rest_api(:invalid, :get, '/', {}) } }.to raise_error(/Invalid rest host/)
96
- end
97
-
98
- it 'only accepts rest action parameters' do
99
- expect { @instance.instance_eval { rest_api(:oneview, :invalid, '/', {}) } }.to raise_error(/Invalid rest call/)
100
- end
101
-
102
- end
103
-
104
- describe 'get api versions' do
105
-
106
- it 'can parse the oneview api version' do
107
- expect(@instance.instance_eval { get_oneview_api_version }).to match(120)
108
- end
109
-
110
- it 'can parse the icsp api version' do
111
- expect(@instance.instance_eval { get_icsp_api_version }).to match(102)
112
- end
113
- end
114
-
115
- end