Class: Vra::Resource

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

Instance Attribute Summary collapse

Class Method 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

Class Method Details

.by_name(client, name) ⇒ Object

Parameters:

  • client (Vra::Client)
  • name (String)
    • the hostname of the client you wish to lookup

Raises:

  • (ArgumentError)


50
51
52
53
54
# File 'lib/vra/resource.rb', line 50

def self.by_name(client, name)
  raise ArgumentError.new("name cannot be nil") if name.nil?
  raise ArgumentError.new("client cannot be nil") if client.nil?
  Resources.all(client).find { |r| r.name.downcase =~ /#{name.downcase}/ }
end

Instance Method Details

#action_id_by_name(name) ⇒ Object



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

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



244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
# File 'lib/vra/resource.rb', line 244

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



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

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



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

def catalog_id
  catalog_item["id"]
end

#catalog_itemObject



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

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

  resource_data["catalogItem"]
end

#catalog_nameObject



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

def catalog_name
  catalog_item["label"]
end

#descriptionObject



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

def description
  resource_data["description"]
end

#destroyObject



216
217
218
219
220
221
# File 'lib/vra/resource.rb', line 216

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



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

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



168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# File 'lib/vra/resource.rb', line 168

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

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

  addrs << ip_address
  addrs
end

#machine_in_provisioned_state?Boolean

Returns:

  • (Boolean)


146
147
148
# File 'lib/vra/resource.rb', line 146

def machine_in_provisioned_state?
  machine_status == "MachineProvisioned"
end

#machine_off?Boolean

Returns:

  • (Boolean)


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

def machine_off?
  machine_status == "Off"
end

#machine_on?Boolean

Returns:

  • (Boolean)


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

def machine_on?
  machine_status == "On"
end

#machine_statusObject



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

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)


142
143
144
# File 'lib/vra/resource.rb', line 142

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

#machine_turning_on?Boolean

Returns:

  • (Boolean)


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

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

#nameObject



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

def name
  resource_data["name"]
end

#network_interfacesObject



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# File 'lib/vra/resource.rb', line 150

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



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

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

  resource_data["organization"]
end

#owner_idsObject



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

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

#owner_namesObject



119
120
121
# File 'lib/vra/resource.rb', line 119

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

#poweroffObject



230
231
232
233
234
235
# File 'lib/vra/resource.rb', line 230

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



237
238
239
240
241
242
# File 'lib/vra/resource.rb', line 237

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



223
224
225
226
227
228
# File 'lib/vra/resource.rb', line 223

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



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

def status
  resource_data["status"]
end

#submit_action_request(action_id) ⇒ Object



267
268
269
270
271
272
# File 'lib/vra/resource.rb', line 267

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



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

def subtenant_id
  organization["subtenantRef"]
end

#subtenant_nameObject



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

def subtenant_name
  organization["subtenantLabel"]
end

#tenant_idObject



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

def tenant_id
  organization["tenantRef"]
end

#tenant_nameObject



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

def tenant_name
  organization["tenantLabel"]
end

#vm?Boolean

Returns:

  • (Boolean)


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

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