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



167
168
169
170
171
172
173
174
# File 'lib/vra/resource.rb', line 167

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



204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# File 'lib/vra/resource.rb', line 204

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



159
160
161
162
163
164
165
# File 'lib/vra/resource.rb', line 159

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



86
87
88
# File 'lib/vra/resource.rb', line 86

def catalog_id
  resource_data['catalogItem']['id']
end

#catalog_nameObject



90
91
92
# File 'lib/vra/resource.rb', line 90

def catalog_name
  resource_data['catalogItem']['label']
end

#descriptionObject



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

def description
  resource_data['description']
end

#destroyObject



176
177
178
179
180
181
# File 'lib/vra/resource.rb', line 176

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 = FFI_Yajl::Parser.parse(client.http_get!("/catalog-service/api/consumer/resources/#{@id}"))
rescue Vra::Exception::HTTPNotFound
  raise Vra::Exception::NotFound, "resource ID #{@id} does not exist"
end

#ip_addressesObject



147
148
149
150
151
152
153
154
155
156
157
# File 'lib/vra/resource.rb', line 147

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

  addrs = []
  network_interfaces.each do |nic|
    next unless nic.key?('NETWORK_ADDRESS')
    addrs << nic['NETWORK_ADDRESS']
  end

  addrs
end

#machine_in_provisioned_state?Boolean

Returns:

  • (Boolean)


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

def machine_in_provisioned_state?
  machine_status == 'MachineProvisioned'
end

#machine_off?Boolean

Returns:

  • (Boolean)


113
114
115
# File 'lib/vra/resource.rb', line 113

def machine_off?
  machine_status == 'Off'
end

#machine_on?Boolean

Returns:

  • (Boolean)


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

def machine_on?
  machine_status == 'On'
end

#machine_statusObject



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

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)


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

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

#machine_turning_on?Boolean

Returns:

  • (Boolean)


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

def machine_turning_on?
  machine_status == 'TurningOn'
end

#nameObject



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

def name
  resource_data['name']
end

#network_interfacesObject



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/vra/resource.rb', line 129

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

#owner_idsObject



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

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

#owner_namesObject



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

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

#poweroffObject



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

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



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

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



183
184
185
186
187
188
# File 'lib/vra/resource.rb', line 183

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



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

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.headers[:location].split('/')[-1]
  Vra::Request.new(client, request_id)
end

#subtenant_idObject



78
79
80
# File 'lib/vra/resource.rb', line 78

def subtenant_id
  resource_data['organization']['subtenantRef']
end

#subtenant_nameObject



82
83
84
# File 'lib/vra/resource.rb', line 82

def subtenant_name
  resource_data['organization']['subtenantLabel']
end

#tenant_idObject



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

def tenant_id
  resource_data['organization']['tenantRef']
end

#tenant_nameObject



74
75
76
# File 'lib/vra/resource.rb', line 74

def tenant_name
  resource_data['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