vmware-vra 2.7.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/CHANGELOG.md +27 -1
  4. data/README.md +91 -141
  5. data/Rakefile +1 -12
  6. data/lib/vra/catalog.rb +39 -8
  7. data/lib/vra/catalog_base.rb +62 -0
  8. data/lib/vra/catalog_item.rb +29 -75
  9. data/lib/vra/catalog_source.rb +116 -0
  10. data/lib/vra/catalog_type.rb +56 -0
  11. data/lib/vra/client.rb +72 -53
  12. data/lib/vra/deployment.rb +155 -0
  13. data/lib/vra/deployment_request.rb +117 -0
  14. data/lib/vra/{resources.rb → deployments.rb} +26 -17
  15. data/lib/vra/exceptions.rb +2 -2
  16. data/lib/vra/http.rb +20 -7
  17. data/lib/vra/request.rb +28 -36
  18. data/lib/vra/request_parameters.rb +12 -10
  19. data/lib/vra/resource.rb +33 -203
  20. data/lib/vra/version.rb +2 -2
  21. data/lib/vra.rb +15 -12
  22. data/spec/catalog_item_spec.rb +64 -222
  23. data/spec/catalog_source_spec.rb +178 -0
  24. data/spec/catalog_spec.rb +112 -72
  25. data/spec/catalog_type_spec.rb +114 -0
  26. data/spec/client_spec.rb +287 -228
  27. data/spec/deployment_request_spec.rb +192 -0
  28. data/spec/deployment_spec.rb +227 -0
  29. data/spec/deployments_spec.rb +80 -0
  30. data/spec/fixtures/resource/sample_catalog_item.json +18 -0
  31. data/spec/fixtures/resource/sample_catalog_item_2.json +18 -0
  32. data/spec/fixtures/resource/sample_catalog_source.json +20 -0
  33. data/spec/fixtures/resource/sample_catalog_type.json +49 -0
  34. data/spec/fixtures/resource/sample_dep_actions.json +58 -0
  35. data/spec/fixtures/resource/sample_dep_request.json +19 -0
  36. data/spec/fixtures/resource/sample_dep_resource.json +112 -0
  37. data/spec/fixtures/resource/sample_deployment.json +26 -0
  38. data/spec/fixtures/resource/sample_entitlements.json +25 -0
  39. data/spec/http_spec.rb +63 -61
  40. data/spec/request_spec.rb +62 -68
  41. data/spec/resource_spec.rb +71 -390
  42. data/spec/spec_helper.rb +10 -4
  43. data/vmware-vra.gemspec +2 -4
  44. metadata +42 -32
  45. data/.travis.yml +0 -14
  46. data/lib/vra/catalog_request.rb +0 -127
  47. data/lib/vra/requests.rb +0 -41
  48. data/spec/catalog_request_spec.rb +0 -265
  49. data/spec/requests_spec.rb +0 -60
  50. data/spec/resources_spec.rb +0 -71
data/lib/vra/resource.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # Author:: Chef Partner Engineering (<partnereng@chef.io>)
4
- # Copyright:: Copyright (c) 2015 Chef Software, Inc.
4
+ # Copyright:: Copyright (c) 2022 Chef Software, Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,255 +17,85 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
- require "ffi_yajl"
20
+ require "ffi_yajl" unless defined?(FFI_Yajl)
21
21
 
22
22
  module Vra
23
23
  class Resource
24
- attr_reader :client, :id, :resource_data
24
+ VM_TYPES = %w[
25
+ Cloud.vSphere.Machine
26
+ Cloud.Machine
27
+ ].freeze
25
28
 
26
- def initialize(client, opts)
29
+ attr_reader :client, :deployment_id, :id, :resource_data
30
+
31
+ def initialize(client, deployment_id, opts = {})
27
32
  @client = client
33
+ @deployment_id = deployment_id
28
34
  @id = opts[:id]
29
35
  @resource_data = opts[:data]
30
36
  @resource_actions = []
31
37
 
32
- if @id.nil? && @resource_data.nil?
33
- raise ArgumentError, "must supply an id or a resource data hash"
34
- end
35
-
36
- if !@id.nil? && !@resource_data.nil?
37
- raise ArgumentError, "must supply an id OR a resource data hash, not both"
38
- end
38
+ raise ArgumentError, 'must supply an id or a resource data hash' if @id.nil? && @resource_data.nil?
39
+ raise ArgumentError, 'must supply an id OR a resource data hash, not both' if !@id.nil? && !@resource_data.nil?
39
40
 
40
41
  if @resource_data.nil?
41
42
  fetch_resource_data
42
43
  else
43
- @id = @resource_data["id"]
44
+ @id = @resource_data['id']
44
45
  end
45
46
  end
46
47
 
47
- # @param client [Vra::Client]
48
- # @param name [String] - the hostname of the client you wish to lookup
49
- # @preturn [Vra::Resource] - return nil if not found, otherwise the resource associated with the name
50
- def self.by_name(client, name)
51
- raise ArgumentError.new("name cannot be nil") if name.nil?
52
- raise ArgumentError.new("client cannot be nil") if client.nil?
53
- Resources.all(client).find { |r| r.name.downcase =~ /#{name.downcase}/ }
54
- end
55
-
56
48
  def fetch_resource_data
57
- @resource_data = client.get_parsed("/catalog-service/api/consumer/resources/#{@id}")
49
+ @resource_data = client.get_parsed("/deployment/api/deployments/#{deployment_id}/resources/#{id}")
58
50
  rescue Vra::Exception::HTTPNotFound
59
51
  raise Vra::Exception::NotFound, "resource ID #{@id} does not exist"
60
52
  end
53
+
61
54
  alias refresh fetch_resource_data
62
55
 
63
56
  def name
64
- resource_data["name"]
65
- end
66
-
67
- def description
68
- resource_data["description"]
57
+ resource_data['name']
69
58
  end
70
59
 
71
60
  def status
72
- resource_data["status"]
73
- end
74
-
75
- def vm?
76
- %w{Infrastructure.Virtual Infrastructure.Cloud}.include?(resource_data["resourceTypeRef"]["id"])
77
- end
78
-
79
- def organization
80
- return {} if resource_data["organization"].nil?
81
-
82
- resource_data["organization"]
83
- end
84
-
85
- def tenant_id
86
- organization["tenantRef"]
87
- end
88
-
89
- def tenant_name
90
- organization["tenantLabel"]
91
- end
92
-
93
- def subtenant_id
94
- organization["subtenantRef"]
95
- end
96
-
97
- def subtenant_name
98
- organization["subtenantLabel"]
99
- end
100
-
101
- def catalog_item
102
- return {} if resource_data["catalogItem"].nil?
103
-
104
- resource_data["catalogItem"]
105
- end
106
-
107
- def catalog_id
108
- catalog_item["id"]
61
+ resource_data['syncStatus']
109
62
  end
110
63
 
111
- def catalog_name
112
- catalog_item["label"]
64
+ def properties
65
+ resource_data['properties']
113
66
  end
114
67
 
115
- def owner_ids
116
- resource_data["owners"].map { |x| x["ref"] }
68
+ def vm?
69
+ VM_TYPES.include?(resource_data['type'])
117
70
  end
118
71
 
119
72
  def owner_names
120
- resource_data["owners"].map { |x| x["value"] }
121
- end
122
-
123
- def machine_status
124
- status = resource_data["resourceData"]["entries"].find { |x| x["key"] == "MachineStatus" }
125
- raise "No MachineStatus entry available for resource" if status.nil?
126
-
127
- status["value"]["value"]
128
- end
129
-
130
- def machine_on?
131
- machine_status == "On"
132
- end
133
-
134
- def machine_off?
135
- machine_status == "Off"
73
+ properties['Owner']
136
74
  end
137
75
 
138
- def machine_turning_on?
139
- machine_status == "TurningOn" || machine_status == "MachineActivated"
140
- end
141
-
142
- def machine_turning_off?
143
- %w{TurningOff ShuttingDown}.include?(machine_status)
144
- end
145
-
146
- def machine_in_provisioned_state?
147
- machine_status == "MachineProvisioned"
76
+ def project_id
77
+ properties['project']
148
78
  end
149
79
 
150
80
  def network_interfaces
151
81
  return unless vm?
152
82
 
153
- network_list = resource_data["resourceData"]["entries"].find { |x| x["key"] == "NETWORK_LIST" }
83
+ network_list = properties['networks']
154
84
  return if network_list.nil?
155
85
 
156
- network_list["value"]["items"].each_with_object([]) do |item, nics|
157
- nic = {}
158
- item["values"]["entries"].each do |entry|
159
- key = entry["key"]
160
- value = entry["value"]["value"]
161
- nic[key] = value
162
- end
163
-
164
- nics << nic
86
+ network_list.each_with_object([]) do |item, nics|
87
+ nics << {
88
+ 'NETWORK_NAME' => item['name'],
89
+ 'NETWORK_ADDRESS' => item['address'],
90
+ 'NETWORK_MAC_ADDRESS' => item['mac_address']
91
+ }
165
92
  end
166
93
  end
167
94
 
168
- def ip_addresses
95
+ def ip_address
169
96
  return if !vm? || network_interfaces.nil?
170
97
 
171
- addrs = []
172
-
173
- request_id = @resource_data["requestId"]
174
-
175
- print "Waiting For vRA to collect the IP"
176
-
177
- loop do
178
- resource_views = @client.http_get("/catalog-service/api/consumer/requests/#{request_id}/resourceViews")
179
-
180
- JSON.parse(resource_views.body)["content"].each do |content|
181
- if content.key?("data") &&
182
- !(content["data"]["ip_address"].nil? ||
183
- content["data"]["ip_address"] == "")
184
- addrs << content["data"]["ip_address"]
185
- end
186
- end
187
-
188
- break unless addrs.empty?
189
-
190
- sleep 10
191
- end
192
-
193
- addrs
194
- end
195
-
196
- def actions
197
- # if this Resource instance was created with data from a "all_resources" fetch,
198
- # it is likely missing operations data because the vRA API is not pleasant sometimes.
199
- fetch_resource_data if resource_data["operations"].nil?
200
-
201
- resource_data["operations"]
202
- end
203
-
204
- def action_id_by_name(name)
205
- return if actions.nil?
206
-
207
- action = actions.find { |x| x["name"] == name }
208
- return if action.nil?
209
-
210
- action["id"]
211
- end
212
-
213
- def destroy
214
- action_id = action_id_by_name("Destroy")
215
- raise Vra::Exception::NotFound, "No destroy action found for resource #{@id}" if action_id.nil?
216
-
217
- submit_action_request(action_id)
218
- end
219
-
220
- def shutdown
221
- action_id = action_id_by_name("Shutdown")
222
- raise Vra::Exception::NotFound, "No shutdown action found for resource #{@id}" if action_id.nil?
223
-
224
- submit_action_request(action_id)
225
- end
226
-
227
- def poweroff
228
- action_id = action_id_by_name("Power Off")
229
- raise Vra::Exception::NotFound, "No power-off action found for resource #{@id}" if action_id.nil?
230
-
231
- submit_action_request(action_id)
232
- end
233
-
234
- def poweron
235
- action_id = action_id_by_name("Power On")
236
- raise Vra::Exception::NotFound, "No power-on action found for resource #{@id}" if action_id.nil?
237
-
238
- submit_action_request(action_id)
239
- end
240
-
241
- def action_request_payload(action_id)
242
- {
243
- "@type" => "ResourceActionRequest",
244
- "resourceRef" => {
245
- "id" => @id,
246
- },
247
- "resourceActionRef" => {
248
- "id" => action_id,
249
- },
250
- "organization" => {
251
- "tenantRef" => tenant_id,
252
- "tenantLabel" => tenant_name,
253
- "subtenantRef" => subtenant_id,
254
- "subtenantLabel" => subtenant_name,
255
- },
256
- "state" => "SUBMITTED",
257
- "requestNumber" => 0,
258
- "requestData" => {
259
- "entries" => [],
260
- },
261
- }
262
- end
263
-
264
- def submit_action_request(action_id)
265
- payload = action_request_payload(action_id).to_json
266
- response = client.http_post("/catalog-service/api/consumer/requests", payload)
267
- request_id = response.location.split("/")[-1]
268
- Vra::Request.new(client, request_id)
98
+ properties['address']
269
99
  end
270
100
  end
271
101
  end
data/lib/vra/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # Author:: Chef Partner Engineering (<partnereng@chef.io>)
4
- # Copyright:: Copyright (c) 2015 Chef Software, Inc.
4
+ # Copyright:: Copyright (c) 2022 Chef Software, Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,5 +18,5 @@
18
18
  #
19
19
 
20
20
  module Vra
21
- VERSION = "2.7.0"
21
+ VERSION = "3.0.1"
22
22
  end
data/lib/vra.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # Author:: Chef Partner Engineering (<partnereng@chef.io>)
4
- # Copyright:: Copyright (c) 2015 Chef Software, Inc.
4
+ # Copyright:: Copyright (c) 2022 Chef Software, Inc.
5
5
  # License:: Apache License, Version 2.0
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,14 +17,17 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
- require "vra/catalog"
21
- require "vra/catalog_item"
22
- require "vra/catalog_request"
23
- require "vra/client"
24
- require "vra/exceptions"
25
- require "vra/request"
26
- require "vra/request_parameters"
27
- require "vra/requests"
28
- require "vra/resource"
29
- require "vra/resources"
30
- require "vra/version"
20
+ require 'vra/catalog_base'
21
+ require 'vra/catalog'
22
+ require 'vra/catalog_item'
23
+ require 'vra/catalog_source'
24
+ require 'vra/catalog_type'
25
+ require 'vra/deployment_request'
26
+ require 'vra/deployment'
27
+ require 'vra/deployments'
28
+ require 'vra/client'
29
+ require 'vra/exceptions'
30
+ require 'vra/request'
31
+ require 'vra/request_parameters'
32
+ require 'vra/resource'
33
+ require 'vra/version'