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



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

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



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

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



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

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



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

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
# File 'lib/vra/resource.rb', line 168

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

  addrs = []

  request_id = @resource_data["requestId"]

  print "Waiting For vRA to collect the IP"

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

    JSON.parse(resource_views.body)["content"].each do |content|
      if content.key?("data") &&
          !(content["data"]["ip_address"].nil? ||
            content["data"]["ip_address"] == "")
        addrs << content["data"]["ip_address"]
      end
    end

    break unless addrs.empty?

    sleep 10
  end

  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



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

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



234
235
236
237
238
239
# File 'lib/vra/resource.rb', line 234

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



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

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



264
265
266
267
268
269
# File 'lib/vra/resource.rb', line 264

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