Class: Vra::Resource

Inherits:
Object
  • Object
show all
Defined in:
lib/vra/resource.rb

Overview

rubocop:disable ClassLength

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client, opts) ⇒ Resource

Returns a new instance of Resource.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/vra/resource.rb', line 26

def initialize(client, opts)
  @client           = client
  @id               = opts[:id]
  @resource_data    = opts[:data]
  @resource_actions = []

  if @id.nil? && @resource_data.nil?
    raise ArgumentError, 'must supply an id or a resource data hash'
  end

  if !@id.nil? && !@resource_data.nil?
    raise ArgumentError, 'must supply an id OR a resource data hash, not both'
  end

  if @resource_data.nil?
    fetch_resource_data
  else
    @id = @resource_data['id']
  end
end

Instance Attribute Details

#clientObject (readonly)

Returns the value of attribute client.



24
25
26
# File 'lib/vra/resource.rb', line 24

def client
  @client
end

#idObject (readonly)

Returns the value of attribute id.



24
25
26
# File 'lib/vra/resource.rb', line 24

def id
  @id
end

#resource_dataObject (readonly)

Returns the value of attribute resource_data.



24
25
26
# File 'lib/vra/resource.rb', line 24

def resource_data
  @resource_data
end

Instance Method Details

#action_id_by_name(name) ⇒ Object



198
199
200
201
202
203
204
205
# File 'lib/vra/resource.rb', line 198

def action_id_by_name(name)
  return if actions.nil?

  action = actions.find { |x| x['name'] == name }
  return if action.nil?

  action['id']
end

#action_request_payload(action_id) ⇒ Object



235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/vra/resource.rb', line 235

def action_request_payload(action_id)
  {
    '@type' => 'ResourceActionRequest',
    'resourceRef' => {
      'id' => @id
    },
    'resourceActionRef' => {
      'id' => action_id
    },
    'organization' => {
      'tenantRef' => tenant_id,
      'tenantLabel' => tenant_name,
      'subtenantRef' => subtenant_id,
      'subtenantLabel' => subtenant_name
    },
    'state' => 'SUBMITTED',
    'requestNumber' => 0,
    'requestData' => {
      'entries' => []
    }
  }
end

#actionsObject



190
191
192
193
194
195
196
# File 'lib/vra/resource.rb', line 190

def actions
  # if this Resource instance was created with data from a "all_resources" fetch,
  # it is likely missing operations data because the vRA API is not pleasant sometimes.
  fetch_resource_data if resource_data['operations'].nil?

  resource_data['operations']
end

#catalog_idObject



98
99
100
# File 'lib/vra/resource.rb', line 98

def catalog_id
  catalog_item['id']
end

#catalog_itemObject



92
93
94
95
96
# File 'lib/vra/resource.rb', line 92

def catalog_item
  return {} if resource_data['catalogItem'].nil?

  resource_data['catalogItem']
end

#catalog_nameObject



102
103
104
# File 'lib/vra/resource.rb', line 102

def catalog_name
  catalog_item['label']
end

#descriptionObject



58
59
60
# File 'lib/vra/resource.rb', line 58

def description
  resource_data['description']
end

#destroyObject



207
208
209
210
211
212
# File 'lib/vra/resource.rb', line 207

def destroy
  action_id = action_id_by_name('Destroy')
  raise Vra::Exception::NotFound, "No destroy action found for resource #{@id}" if action_id.nil?

  submit_action_request(action_id)
end

#fetch_resource_dataObject Also known as: refresh



47
48
49
50
51
# File 'lib/vra/resource.rb', line 47

def fetch_resource_data
  @resource_data = client.get_parsed("/catalog-service/api/consumer/resources/#{@id}")
rescue Vra::Exception::HTTPNotFound
  raise Vra::Exception::NotFound, "resource ID #{@id} does not exist"
end

#ip_addressesObject



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/vra/resource.rb', line 159

def ip_addresses
  return if !vm? || network_interfaces.nil?

  addrs = []

  request_id = @resource_data['requestId']

  resource_views = @client.http_get("/catalog-service/api/consumer/requests/#{request_id}/resourceViews")

  data_zero = JSON.parse((resource_views.body))['content'][0]['data']['ip_address']
  data_one = JSON.parse((resource_views.body))['content'][1]['data']['ip_address']

  print "Waiting For vRA to collect the IP"
  while ((data_zero == "" || data_one == "") && (data_zero == nil || data_one == nil))
    resource_views = @client.http_get("/catalog-service/api/consumer/requests/#{request_id}/resourceViews")
    data_zero = JSON.parse((resource_views.body))['content'][0]['data']['ip_address']
    data_one = JSON.parse((resource_views.body))['content'][1]['data']['ip_address']
    sleep 10
    print "."
  end

  if JSON.parse((resource_views.body))['content'][0]['data']['ip_address'] == nil
    ip_address = JSON.parse((resource_views.body))['content'][1]['data']['ip_address']
  else
    ip_address = JSON.parse((resource_views.body))['content'][0]['data']['ip_address']
  end

  addrs << ip_address
  addrs
end

#machine_in_provisioned_state?Boolean

Returns:

  • (Boolean)


137
138
139
# File 'lib/vra/resource.rb', line 137

def machine_in_provisioned_state?
  machine_status == 'MachineProvisioned'
end

#machine_off?Boolean

Returns:

  • (Boolean)


125
126
127
# File 'lib/vra/resource.rb', line 125

def machine_off?
  machine_status == 'Off'
end

#machine_on?Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/vra/resource.rb', line 121

def machine_on?
  machine_status == 'On'
end

#machine_statusObject



114
115
116
117
118
119
# File 'lib/vra/resource.rb', line 114

def machine_status
  status = resource_data['resourceData']['entries'].find { |x| x['key'] == 'MachineStatus' }
  raise 'No MachineStatus entry available for resource' if status.nil?

  status['value']['value']
end

#machine_turning_off?Boolean

Returns:

  • (Boolean)


133
134
135
# File 'lib/vra/resource.rb', line 133

def machine_turning_off?
  %w(TurningOff ShuttingDown).include?(machine_status)
end

#machine_turning_on?Boolean

Returns:

  • (Boolean)


129
130
131
# File 'lib/vra/resource.rb', line 129

def machine_turning_on?
  machine_status == 'TurningOn' || machine_status == 'MachineActivated'
end

#nameObject



54
55
56
# File 'lib/vra/resource.rb', line 54

def name
  resource_data['name']
end

#network_interfacesObject



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/vra/resource.rb', line 141

def network_interfaces
  return unless vm?

  network_list = resource_data['resourceData']['entries'].find { |x| x['key'] == 'NETWORK_LIST' }
  return if network_list.nil?

  network_list['value']['items'].each_with_object([]) do |item, nics|
    nic = {}
    item['values']['entries'].each do |entry|
      key = entry['key']
      value = entry['value']['value']
      nic[key] = value
    end

    nics << nic
  end
end

#organizationObject



70
71
72
73
74
# File 'lib/vra/resource.rb', line 70

def organization
  return {} if resource_data['organization'].nil?

  resource_data['organization']
end

#owner_idsObject



106
107
108
# File 'lib/vra/resource.rb', line 106

def owner_ids
  resource_data['owners'].map { |x| x['ref'] }
end

#owner_namesObject



110
111
112
# File 'lib/vra/resource.rb', line 110

def owner_names
  resource_data['owners'].map { |x| x['value'] }
end

#poweroffObject



221
222
223
224
225
226
# File 'lib/vra/resource.rb', line 221

def poweroff
  action_id = action_id_by_name('Power Off')
  raise Vra::Exception::NotFound, "No power-off action found for resource #{@id}" if action_id.nil?

  submit_action_request(action_id)
end

#poweronObject



228
229
230
231
232
233
# File 'lib/vra/resource.rb', line 228

def poweron
  action_id = action_id_by_name('Power On')
  raise Vra::Exception::NotFound, "No power-on action found for resource #{@id}" if action_id.nil?

  submit_action_request(action_id)
end

#shutdownObject



214
215
216
217
218
219
# File 'lib/vra/resource.rb', line 214

def shutdown
  action_id = action_id_by_name('Shutdown')
  raise Vra::Exception::NotFound, "No shutdown action found for resource #{@id}" if action_id.nil?

  submit_action_request(action_id)
end

#statusObject



62
63
64
# File 'lib/vra/resource.rb', line 62

def status
  resource_data['status']
end

#submit_action_request(action_id) ⇒ Object



258
259
260
261
262
263
# File 'lib/vra/resource.rb', line 258

def submit_action_request(action_id)
  payload = action_request_payload(action_id).to_json
  response = client.http_post('/catalog-service/api/consumer/requests', payload)
  request_id = response.location.split('/')[-1]
  Vra::Request.new(client, request_id)
end

#subtenant_idObject



84
85
86
# File 'lib/vra/resource.rb', line 84

def subtenant_id
  organization['subtenantRef']
end

#subtenant_nameObject



88
89
90
# File 'lib/vra/resource.rb', line 88

def subtenant_name
  organization['subtenantLabel']
end

#tenant_idObject



76
77
78
# File 'lib/vra/resource.rb', line 76

def tenant_id
  organization['tenantRef']
end

#tenant_nameObject



80
81
82
# File 'lib/vra/resource.rb', line 80

def tenant_name
  organization['tenantLabel']
end

#vm?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'lib/vra/resource.rb', line 66

def vm?
  %w(Infrastructure.Virtual Infrastructure.Cloud).include?(resource_data['resourceTypeRef']['id'])
end