1
0
Fork 0
mirror of https://github.com/fog/fog.git synced 2022-11-09 13:51:43 -05:00

[TerremarkEcloud|compute] cleanup/consistency

This commit is contained in:
geemus 2011-01-20 16:28:28 -08:00
parent 5e6797f6b6
commit 05b2e59e87
36 changed files with 495 additions and 982 deletions

View file

@ -6,34 +6,29 @@ module Fog
class GetCatalog < Fog::Parsers::Base
def reset
@response = { 'catalogItems' => [] }
@response = { 'CatalogItems' => [] }
end
def start_element(name, attrs = [])
case name
when 'Catalog'
@response['name'] = attr_value('name', attrs)
@response['uri'] = attr_value('href', attrs)
when 'CatalogItems'
@in_catalog_items = true
when 'CatalogItem'
if @in_catalog_items
@response['catalogItems'].push({
'name' => attr_value('name', attrs),
'uri' => attr_value('href', attrs)
})
for attribute in %w{href name}
if value = attr_value(attribute, attrs)
@response[attribute] = value
end
end
when 'CatalogItem'
catalog_item = {}
for attribute in %w{href name rel type}
if value = attr_value(attribute, attrs)
catalog_item[attribute] = value
end
end
@response['CatalogItems'] << catalog_item
end
super
end
def end_element(name)
case name
when 'CatalogItems'
@in_catalog_items = false
end
end
end
end
end

View file

@ -6,22 +6,22 @@ module Fog
class GetCatalogItem < Fog::Parsers::Base
def reset
@response = { 'properties' => [] }
@response = { 'Entity' => {}, 'Link' => {}, 'Property' => {} }
end
def start_element(name, attrs = [])
case name
when 'CatalogItem'
@response['name'] = attr_value('name', attrs)
@response['uri'] = attr_value('href', attrs)
for attribute in %w{href type name}
if value = attr_value(attribute, attrs)
@response[attribute] = value
end
end
when 'Link', 'Entity'
href = attr_value('href', attrs)
case attr_value('type', attrs)
when 'application/vnd.tmrk.ecloud.catalogItemCustomizationParameters+xml'
@response['customization_uri'] = href
when 'application/vnd.vmware.vcloud.vAppTemplate+xml'
@response['template_uri'] = href
for attribute in %w{href name rel type}
if value = attr_value(attribute, attrs)
@response[name][attribute] = value
end
end
when 'Property'
@property_key = attr_value('key', attrs)
@ -33,7 +33,7 @@ module Fog
def end_element(name)
case name
when 'Property'
@response['properties'].push({ 'key' => @property_key, 'value' => @value})
@response['Property'][@property_key] = @value
end
end
end

View file

@ -0,0 +1,27 @@
module Fog
module Parsers
module TerremarkEcloud
module Compute
class GetIpAddresses < Fog::Parsers::Base
def reset
@response = { 'IpAddresses' => [] }
@ip_address = {}
end
def end_element(name)
case name
when 'Id', 'Href', 'Name', 'RnatAddress', 'Server', 'Status'
@ip_address[name] = @value
when 'IpAddress'
@response['IpAddresses'] << @ip_address
@ip_address = {}
end
end
end
end
end
end
end

View file

@ -6,22 +6,26 @@ module Fog
class GetNetwork < Fog::Parsers::Base
def reset
@response = { 'configuration' => {}, 'features' => {} }
@response = {
'Configuration' => {},
'Features' => {},
'Link' => {}
}
end
def start_element(name, attrs = [])
case name
when 'Network'
@response['name'] = attr_value('name', attrs)
@response['uri'] = attr_value('href', attrs)
for attribute in %w{href name}
if value = attr_value(attribute, attrs)
@response[attribute] = value
end
end
when 'Link'
href = attr_value('href', attrs)
case attr_value('name', attrs) # wut
when @response['name']
@response['extensions_uri'] = href
when 'IP Addresses'
@response['extensions_ips_uri'] = href
for attribute in %w{href name rel type}
if value = attr_value(attribute, attrs)
@response[name][attribute] = value
end
end
when 'Configuration'
@in_configuration = true
@ -38,13 +42,13 @@ module Fog
@in_configuration = false
when 'Gateway', 'Netmask'
if @in_configuration
@response['configuration'][name.downcase] = @value
@response['Configuration'][name] = @value
end
when 'Features'
@in_features = false
else
if @in_features
@response['features'][name] = @value
@response['Features'][name] = @value
end
end
end

View file

@ -1,33 +0,0 @@
module Fog
module Parsers
module TerremarkEcloud
module Compute
class GetNetworkExtensions < Fog::Parsers::Base
def end_element(name)
case name
when 'Name'
@response['name'] = @value
when 'Href'
@response['uri'] = @value
when 'RnatAddress'
@response['rnatAddress'] = @value
when 'Address'
@response['address'] = @value
when 'BroadcastAddress'
@response['broadcastAddress'] = @value
when 'GatewayAddress'
@response['gatewayAddress'] = @value
when 'NetworkType'
@response['type'] = @value
when 'FriendlyName'
@response['friendlyName'] = @value
end
end
end
end
end
end
end

View file

@ -6,28 +6,24 @@ module Fog
class GetOrganization < Fog::Parsers::Base
def reset
@response = { 'vdcs' => [] }
@response = { 'Link' => [] }
end
def start_element(name, attrs = [])
case name
when 'Org'
@response['name'] = attr_value('name', attrs)
@response['uri'] = attr_value('href', attrs)
when 'Link'
href = attr_value('href', attrs)
case attr_value('type', attrs)
when 'application/vnd.vmware.vcloud.vdc+xml'
@response['vdcs'].push({ 'name' => attr_value('name', attrs), 'uri' => href })
when 'application/vnd.vmware.vcloud.catalog+xml'
@response['catalog_uri'] = href
when 'application/vnd.vmware.vcloud.tasksList+xml'
@response['tasksList_uri'] = href
when 'application/vnd.tmrk.ecloud.keysList+xml'
@response['keysList_uri'] = href
when 'application/vnd.tmrk.ecloud.tagsList+xml'
@response['tagsList_uri'] = href
link = {}
for attribute in %w{href name rel type}
if value = attr_value(attribute, attrs)
link[attribute] = value
end
end
@response['Link'] << link
when 'Org'
for attribute in %w{href name}
if value = attr_value(attribute, attrs)
@response[attribute] = value
end
end
end
end

View file

@ -1,35 +0,0 @@
module Fog
module Parsers
module TerremarkEcloud
module Compute
class GetTask < Fog::Parsers::Base
def reset
@response = { 'owner' => {}, 'result' => {} }
end
def start_element(name, attrs = [])
case name
when 'Task'
@response['uri'] = attr_value('href', attrs)
@response['status'] = attr_value('status', attrs)
@response['startTime'] = (start_time = attr_value('startTime', attrs) and Time.parse(start_time))
@response['endTime'] = (end_time = attr_value('endTime', attrs) and Time.parse(end_time))
when 'Owner', 'Result'
href, type, this_name = %w(href type name).map {|a| attr_value(a, attrs) }
@response[name.downcase] = {
'uri' => href,
'type' => type,
'name' => this_name
}
end
super
end
end
end
end
end
end

View file

@ -7,84 +7,99 @@ module Fog
def reset
@response = {
'storageCapacity' => {}, 'cpuCapacity' => {},
'memoryCapacity' => {}, 'networks' => [], 'vms' => []
'AvailableNetworks' => [],
'ComputeCapacity' => {
'Cpu' => {},
'DeployedVmsQuota' => {},
'InstantiatedVmsQuota' => {},
'Memory' => {}
},
'Link' => [],
'ResourceEntities' => [],
'StorageCapacity' => {}
}
end
def start_element(name, attrs = [])
case name
when 'Vdc'
@response['name'] = attr_value('name', attrs)
@response['uri'] = attr_value('href', attrs)
when 'Cpu'
@in_cpu = true
when 'DeployedVmsQuota'
@in_deployed_vms_quota = true
when 'InstantiatedVmsQuota'
@in_instantiated_vms_quota = true
when 'Link'
href = attr_value('href', attrs)
case attr_value('type', attrs)
when 'application/vnd.vmware.vcloud.catalog+xml'
@response['catalog_uri'] = href
when 'application/vnd.tmrk.ecloud.publicIpsList+xml'
@response['publicIpsList_uri'] = href
when 'application/vnd.tmrk.ecloud.internetServicesList+xml'
@response['internetServicesList_uri'] = href
when 'application/vnd.tmrk.ecloud.firewallAclsList+xml'
@response['firewallAclsList_uri'] = href
when 'application/vnd.tmrk.ecloud.networkGroupList+xml'
@response['trustedNetworkGroupsList_uri'] = href
link = {}
for attribute in %w{href name rel type}
if value = attr_value(attribute, attrs)
link[attribute] = value
end
end
@response['Link'] << link
when 'Memory'
@in_memory = true
when 'Network'
network = {}
for attribute in %w{href name type}
if value = attr_value(attribute, attrs)
network[attribute] = value
end
end
@response['AvailableNetworks'] << network
when 'StorageCapacity'
@in_storage_capacity = true
when 'ComputeCapacity'
@in_compute_capacity = true
when 'Cpu'
@in_compute_capacity && @in_cpu_capacity = true
when 'Memory'
@in_compute_capacity && @in_memory_capacity = true
when 'ResourceEntities'
@in_resource_entities = true
when 'ResourceEntity'
if @in_resource_entities
@response['vms'].push({
'name' => attr_value('name', attrs),
'uri' => attr_value('href', attrs)
})
resource_entity = {}
for attribute in %w{href name type}
if value = attr_value(attribute, attrs)
resource_entity[attribute] = value
end
end
when 'AvailableNetworks'
@in_available_networks = true
when 'Network'
if @in_available_networks
@response['networks'].push({
'name' => attr_value('name', attrs),
'uri' => attr_value('href', attrs)
})
@response['ResourceEntities'] << resource_entity
when 'Vdc'
for attribute in %w{href name}
if value = attr_value(attribute, attrs)
@response[attribute] = value
end
end
end
super
end
def end_element(name)
case name
when 'Allocated', 'Used'
if @in_storage_capacity
@response['storageCapacity'][name.downcase] = @value.to_i
elsif @in_cpu_capacity
@response['cpuCapacity'][name.downcase] = @value.to_i
elsif @in_memory_capacity
@response['memoryCapacity'][name.downcase] = @value.to_i
when 'Description'
@response[name] = @value
when 'Allocated', 'Limit', 'Used'
if @in_cpu
@response['ComputeCapacity']['Cpu'][name] = @value.to_i
elsif @in_deployed_vms_quota
@response['ComputeCapacity']['DeployedVmsQuota'][name] = @value.to_i
elsif @in_instantiated_vms_quota
@response['ComputeCapacity']['InstantiatedVmsQuota'][name] = @value.to_i
elsif @in_memory
@response['ComputeCapacity']['Memory'][name] = @value.to_i
elsif @in_storage_capacity
@response['StorageCapacity'][name] = @value.to_i
end
when 'Cpu'
@in_cpu = false
when 'DeployedVmsQuota'
@in_deployed_vms_quota = false
when 'InstantiatedVmsQuota'
@in_instantiated_vms_quota = false
when 'Memory'
@in_memory = false
when 'StorageCapacity'
@in_storage_capacity = false
when 'ComputeCapacity'
@in_compute_capacity = false
when 'Cpu'
@in_compute_capacity && @in_cpu_capacity = false
when 'Memory'
@in_compute_capacity && @in_memory_capacity = false
when 'ResourceEntities'
@in_resource_entities = false
when 'AvailableNetworks'
@in_available_networks = false
when 'Units'
if @in_storage_capacity
@response['StorageCapacity'][name] = @value
elsif @in_cpu
@response['ComputeCapacity']['Cpu'][name] = @value
elsif @in_memory
@response['ComputeCapacity']['Memory'][name] = @value
end
end
end

View file

@ -0,0 +1,28 @@
module Fog
module Parsers
module TerremarkEcloud
module Compute
class GetVersions < Fog::Parsers::Base
def reset
@response = { 'SupportedVersions' => [] }
@version_info = {}
end
def end_element(name)
case name
when 'LoginUrl', 'Version'
@version_info[name] = @value
when 'VersionInfo'
@response['SupportedVersions'] << @version_info
@version_info = {}
end
end
end
end
end
end
end

View file

@ -1,105 +0,0 @@
module Fog
module Parsers
module TerremarkEcloud
module Compute
class GetVm < Fog::Parsers::Base
def reset
@response = {
'network_connections' => [],
'disks' => []
}
@network_connection = {}
@virtual_hardware_item = {}
end
def start_element(name, attrs = [])
case name
when 'VApp'
@response['name'] = attr_value('name', attrs)
@response['uri'] = attr_value('href', attrs)
@response['status'] = case attr_value('status', attrs)
when '0' then 'creating'
when '1' then 'deploying'
when '2' then 'powered_off'
when '4' then 'powered_on'
end
@response['storage_size'] = attr_value('size', attrs).to_i
when 'Link'
href = attr_value('href', attrs)
case attr_value('type', attrs)
when 'application/vnd.vmware.vcloud.vdc+xml'
@response['vdc_uri'] = href
when 'application/vnd.tmrk.ecloud.vApp+xml'
@response['extension_uri'] = href
end
when 'NetworkConnectionSection'
@in_network_connection_section = true
when 'NetworkConnection'
if @in_network_connection_section
@in_network_connection = true
@network_connection = { 'name' => attr_value('Network', attrs) }
end
when 'VirtualHardwareSection'
@in_virtual_hardware_section = true
when 'Item'
if @in_virtual_hardware_section
@in_virtual_hardware_item = true
@virtual_hardware_item = {}
end
end
super
end
def end_element(name)
case name
when 'NetworkConnectionSection'
@in_network_connection_section = false
when 'NetworkConnection'
if @in_network_connection_section
@in_network_connection = false
@response['network_connections'].push(@network_connection)
end
when 'IpAddress'
@in_network_connection && @network_connection['ip_address'] = @value
when 'Item'
if @in_virtual_hardware_item
@in_virtual_hardware_item = false
case @virtual_hardware_item['type']
when 3
@response['cpus'] = @virtual_hardware_item['count']
when 4
@response['memory'] = @virtual_hardware_item['count']
when 17
@response['disks'].push({
'id' => @virtual_hardware_item['id'],
'size' => @virtual_hardware_item['count']
})
end
end
when 'AddressOnParent'
if @in_virtual_hardware_item
@virtual_hardware_item['id'] = @value.to_i
end
when 'ResourceType'
if @in_virtual_hardware_item
@virtual_hardware_item['type'] = @value.to_i
end
when 'VirtualQuantity'
if @in_virtual_hardware_item
@virtual_hardware_item['count'] = @value.to_i
end
end
end
end
end
end
end
end

View file

@ -1,23 +0,0 @@
module Fog
module Parsers
module TerremarkEcloud
module Compute
class InstantiateVmTemplate < Fog::Parsers::Base
def start_element(name, attrs = [])
case name
when 'VApp'
@response['name'] = attr_value('name', attrs)
@response['uri'] = attr_value('href', attrs)
@response['status'] = 'deploying'
end
super
end
end
end
end
end
end

View file

@ -0,0 +1,27 @@
module Fog
module Parsers
module TerremarkEcloud
module Compute
class Login < Fog::Parsers::Base
def reset
@response = { 'OrgList' => [] }
end
def start_element(name, attrs = [])
case name
when 'Org'
@response['OrgList'] << {
'href' => attr_value('href', attrs),
'name' => attr_value('name', attrs),
'type' => attr_value('type', attrs)
}
end
end
end
end
end
end
end

View file

@ -1,22 +0,0 @@
module Fog
module TerremarkEcloud
class Compute
class Real
def delete_vm(uri)
response = request({
:uri => uri,
:method => 'DELETE',
:expects => 202
})
# raise here if Location is missing?
{ 'task_uri' => response.headers['Location'] }
end
end
end
end
end

View file

@ -1,17 +1,24 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/get_catalog'
def get_catalog(catalog_uri)
def get_catalog(href)
request({
:uri => catalog_uri,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetCatalog.new
})
:href => href,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetCatalog.new
})
end
end
class Mock
def get_catalog(href)
Fog::Mock.not_implemented
end
end

View file

@ -1,17 +1,24 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/get_catalog_item'
def get_catalog_item(catalog_item_uri)
def get_catalog_item(href)
request({
:uri => catalog_item_uri,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetCatalogItem.new
})
:href => href,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetCatalogItem.new
})
end
end
class Mock
def get_catalog_item(href)
Fog::Mock.not_implemented
end
end

View file

@ -0,0 +1,27 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/get_ip_addresses'
def get_ip_addresses(href)
request({
:href => href,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetIpAddresses.new
})
end
end
class Mock
def get_ip_addresses(href)
Fog::Mock.not_implemented
end
end
end
end
end

View file

@ -1,17 +1,24 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/get_network'
def get_network(network_uri)
def get_network(href)
request({
:uri => network_uri,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetNetwork.new
})
:href => href,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetNetwork.new
})
end
end
class Mock
def get_network(href)
Fog::Mock.not_implemented
end
end

View file

@ -1,20 +0,0 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/get_network_extensions'
def get_network_extensions(network_extensions_uri)
request({
:uri => network_extensions_uri,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetNetworkExtensions.new
})
end
end
end
end
end

View file

@ -1,17 +1,24 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/get_organization'
def get_organization(uri = nil)
def get_organization(href = organization_href)
request({
:uri => uri || organization_uri,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetOrganization.new
})
:href => href,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetOrganization.new
})
end
end
class Mock
def get_organization(href = organization_href)
Fog::Mock.not_implemented
end
end

View file

@ -1,20 +0,0 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/get_task'
def get_task(uri)
request({
:uri => uri,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetTask.new
})
end
end
end
end
end

View file

@ -1,17 +1,24 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/get_vdc'
def get_vdc(uri)
def get_vdc(href)
request({
:uri => uri,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetVdc.new
})
:href => href,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetVdc.new
})
end
end
class Mock
def get_vdc
Fog::Mock.not_implemented
end
end

View file

@ -0,0 +1,32 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/get_versions'
def get_versions
connection = Fog::Connection.new(@versions_endpoint)
response = connection.request({
:expects => 200,
:method => 'GET',
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetVersions.new
});
version_info = response.body['SupportedVersions'].detect {|version_info| version_info['Version'] == @version}
unless login_url = version_info && version_info['LoginUrl']
raise "TerremarkEcloud does not support version #{@version}"
end
end
end
class Mock
def get_versions
Fog::Mock.not_implemented
end
end
end
end
end

View file

@ -1,20 +0,0 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/get_vm'
def get_vm(uri)
request({
:uri => uri,
:idempotent => true,
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetVm.new
})
end
end
end
end
end

View file

@ -1,135 +0,0 @@
module Fog
module TerremarkEcloud
class Compute
class Real
require 'fog/compute/parsers/terremark_ecloud/instantiate_vm_template'
# Instantiate a VM template
#
# ==== Parameters
# * options<~Hash>:
# * 'vdc_uri'<~String>: URI of the VDC to place the VM in (required)
# * 'catalog_item_uri'<~String>: URI of the catalog item (template) to use (required)
# * 'network_uri'<~String>: URI of the network to place the VM in (required)
# * 'name'<~String>: Name of the VM to create
# * 'row'<~String>: UI row to place the VM in (required)
# * 'group'<~String>: UI group to place the VM in (required)
# * 'cpus'<~Integer>: Number of CPUs the VM should have (defaults to 1)
# * 'memory'<~Integer>: Megabytes of memory the VM should have (defaults to 512)
# * 'ipAddress'<~String>: IP to use within the network
# * 'longName'<~String>: Long name for the VM
# * 'tags'<~Array>: Tags to assign to the VM
# * 'password'<~String>: Password
def instantiate_vm_template(options = {})
options['cpus'] ||= 1
options['memory'] ||= 512
required_options = %w(vdc_uri catalog_item_uri network_uri name row group)
supplied_options = options.keys
missing_options = required_options - supplied_options
unless missing_options.empty?
raise ArgumentError, "Missing required options: #{missing_options.sort.join(', ')}"
end
# could take parsed catalog_item Hash instead/also to avoid this
template_uri = get_catalog_item(options['catalog_item_uri']).body['template_uri']
builder = Builder::XmlMarkup.new
body_xml = builder.InstantiateVAppTemplateParams({
'name' => options['name'],
'xmlns' => 'http://www.vmware.com/vcloud/v0.8',
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
'xml:lang' => 'en'
}) do |b|
b.VAppTemplate(:href => template_uri)
b.InstantiationParams do
b.ProductSection({
'xmlns:q1' => 'http://www.vmware.com/vcloud/v0.8',
'xmlns:ovf' => 'http://schemas.dmtf.org/ovf/envelope/1'
}) do
b.Property({
'xmlns' => 'http://schemas.dmtf.org/ovf/envelope/1',
'ovf:key' => 'row',
'ovf:value' => options['row']
})
b.Property({
'xmlns' => 'http://schemas.dmtf.org/ovf/envelope/1',
'ovf:key' => 'group',
'ovf:value' => options['group']
})
if options['password']
b.Property({
'xmlns' => 'http://schemas.dmtf.org/ovf/envelope/1',
'ovf:key' => 'password',
'ovf:value' => options['password']
})
end
if options['ipAddress']
b.Property({
'xmlns' => 'http://schemas.dmtf.org/ovf/envelope/1',
'ovf:key' => 'ipaddress',
'ovf:value' => options['ipAddress']
})
end
if options['longName']
b.Property({
'xmlns' => 'http://schemas.dmtf.org/ovf/envelope/1',
'ovf:key' => 'longName',
'ovf:value' => options['longName']
})
end
if options['tags']
b.Property({
'xmlns' => 'http://schemas.dmtf.org/ovf/envelope/1',
'ovf:key' => 'tags',
'ovf:value' => options['tags'].join(',') # groan
})
end
end # ProductSection
b.VirtualHardwareSection({
'xmlns:q1' => 'http://www.vmware.com/vcloud/v0.8'
}) do
b.Item({
'xmlns' => 'http://schemas.dmtf.org/ovf/envelope/1'
}) do
b.InstanceID(2, 'xmlns' => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
b.ResourceType(4, 'xmlns' => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
b.VirtualQuantity(options['memory'], 'xmlns' => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
end
b.Item({
'xmlns' => 'http://schemas.dmtf.org/ovf/envelope/1'
}) do
b.InstanceID(1, 'xmlns' => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
b.ResourceType(3, 'xmlns' => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
b.VirtualQuantity(options['cpus'], 'xmlns' => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
end
end # VirtualHardwareSection
b.NetworkConfigSection do
b.NetworkConfig do
b.NetworkAssociation(:href => options['network_uri'])
end
end
end # InstantiationParams
end # InstantiateVAppTemplateParams
request({
:uri => options['vdc_uri'] + '/action/instantiatevAppTemplate',
:method => 'POST',
:headers => {
'Content-Type' => 'application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml'
},
:body => body_xml,
:parser => Fog::Parsers::TerremarkEcloud::Compute::InstantiateVmTemplate.new
})
end
end
end
end
end

View file

@ -1,20 +0,0 @@
module Fog
module TerremarkEcloud
class Compute
class Real
def power_off_vm(vm_uri)
response = request({
:uri => vm_uri + '/power/action/powerOff',
:method => 'POST',
:expects => 202
})
{ 'task_uri' => response.headers['Location'] }
end
end
end
end
end

View file

@ -1,20 +0,0 @@
module Fog
module TerremarkEcloud
class Compute
class Real
def power_on_vm(vm_uri)
response = request({
:uri => vm_uri + '/power/action/powerOn',
:method => 'POST',
:expects => 202
})
{ 'task_uri' => response.headers['Location'] }
end
end
end
end
end

View file

@ -1,20 +0,0 @@
module Fog
module TerremarkEcloud
class Compute
class Real
def shutdown_vm(vm_uri)
response = request({
:uri => vm_uri + '/power/action/shutdown',
:method => 'POST',
:expects => 204
})
{ 'task_uri' => response.headers['Location'] }
end
end
end
end
end

View file

@ -8,26 +8,19 @@ module Fog
recognizes :versions_endpoint
request_path 'fog/compute/requests/terremark_ecloud'
request :delete_vm
request :get_catalog
request :get_catalog_item
request :get_ip_addresses
request :get_network
request :get_network_extensions
request :get_organization
request :get_task
request :get_vdc
request :get_vm
request :instantiate_vm_template
request :power_on_vm
request :power_off_vm
request :shutdown_vm
class Mock
def initialize(options={})
end
def request(params)
def organization_href
Mock.not_implemented
end
@ -36,99 +29,78 @@ module Fog
class Real
def initialize(options = {})
require 'fog/compute/parsers/terremark_ecloud/get_versions'
require 'fog/compute/parsers/terremark_ecloud/login'
@username = options[:terremark_ecloud_username]
@password = options[:terremark_ecloud_password]
@version = '0.8b-ext2.6'
@versions_endpoint = options[:versions_endpoint] || 'https://services.enterprisecloud.terremark.com/api/versions'
end
if @versions_endpoint = options[:versions_endpoint]
else
@versions_endpoint = 'https://services.enterprisecloud.terremark.com/api/versions'
def organization_href
unless @organization_href
get_token_and_organization
end
@organization_href
end
def request(params)
begin
get_token_and_organization if @token.nil?
response = authenticated_request(params)
rescue Excon::Errors::Unauthorized
get_token_and_organization
response = authenticated_request(params)
end
end
raise ArgumentError.new('Need :href in params') unless params[:href]
def organization_uri
unless @organization_uri
# set auth token
if @token.nil?
get_token_and_organization
end
@organization_uri
begin
Fog::Connection.new(params[:href]).request({
:parser => params[:parser],
:expects => params[:expects] || 200,
:method => params[:method] || 'GET',
:body => params[:body],
:headers => {
'Cookie' => @token
}.merge(params[:headers] || {})
})
rescue Excon::Errors::Unauthorized # expired token
get_token_and_organization
retry
end
end
private
def authenticated_request(params)
raise ArgumentError.new('Need :uri in params') unless params[:uri]
Fog::Connection.new(params[:uri]).request({
:parser => params[:parser],
:expects => params[:expects] || 200,
:method => params[:method] || 'GET',
:body => params[:body],
:headers => {
'Cookie' => @token
}.merge(params[:headers] || {})
})
end
def get_token_and_organization
login_uri = login_uri_for(@version)
# lookup LoginUrl for specified version
connection = Fog::Connection.new(@versions_endpoint)
response = connection.request({
:expects => 200,
:method => 'GET',
:parser => Fog::Parsers::TerremarkEcloud::Compute::GetVersions.new
});
version_info = response.body['SupportedVersions'].detect {|version_info| version_info['Version'] == @version}
unless login_url = version_info && version_info['LoginUrl']
# no LoginUrl matches specified version
raise "TerremarkEcloud does not support version #{@version}"
end
username_colon_password = [@username, @password].join(':')
base64_encoded = Base64.encode64(username_colon_password).gsub("\n", '')
authorization_header_data = "Basic #{base64_encoded}"
connection = Fog::Connection.new(login_uri)
connection = Fog::Connection.new(login_url)
response = connection.request({
:expects => 200,
:method => 'POST',
:headers => {
'Authorization' => authorization_header_data
}
})
:expects => 200,
:method => 'POST',
:headers => {
'Authorization' => ('Basic ' << Base64.encode64("#{@username}:#{@password}").chomp!),
'Content-Type' => 'application/vnd.vmware.vcloud.orgList+xml'
},
:parser => Fog::Parsers::TerremarkEcloud::Compute::Login.new
})
@token = response.headers['Set-Cookie']
unless response.body.empty?
document = Fog::ToHashDocument.new
parser = Nokogiri::XML::SAX::PushParser.new(document)
parser << response.body
parser.finish
response.body = document.body
if organization = response.body['OrgList'].first
@organization_href = organization['href']
end
if organization = [response.body[:Org]].first
@organization_uri = organization[:href]
end
end
def login_uri_for(version)
connection = Fog::Connection.new(@versions_endpoint)
response = connection.request({
:expects => 200,
:method => 'GET'
})
unless response.body.empty?
document = Fog::ToHashDocument.new
parser = Nokogiri::XML::SAX::PushParser.new(document)
parser << response.body
parser.finish
response.body = document.body
end
version_info = [response.body[:VersionInfo]].flatten.detect {|v| v[:Version] == version }
version_info && version_info[:LoginUrl]
end
end

View file

@ -16,7 +16,7 @@ module Fog
def self.new(options={})
location = caller.first
warning = "[yellow][WARN] Fog::Terremark::Ecloud is deprecated, use Fog::Vcloud::Terremark::Ecloud[/]"
warning = "[yellow][WARN] Fog::Terremark::Ecloud is deprecated, use Fog::Compute.new(:provider => 'TerremarkEcloud')[/]"
warning << " [light_black](" << location << ")[/] "
Formatador.display_line(warning)

View file

@ -2,32 +2,42 @@ Shindo.tests('TerremarkEcloud::Compute | catalog requests', ['terremark_ecloud']
@catalog_format = {
'name' => String,
'uri' => String,
'catalogItems' => [{
'name' => String,
'uri' => String
}]
'href' => String,
'CatalogItems' => [{
'href' => String,
'name' => String,
'type' => String
}]
}
@catalog_item_format = {
'name' => String,
'uri' => String,
'customization_uri' => String,
'template_uri' => String,
'properties' => [{
'key' => String,
'value' => String
}]
'name' => String,
'Entity' => {
'href' => String,
'name' => String,
'type' => String
},
'href' => String,
'Link' => {
'href' => String,
'name' => String,
'rel' => String,
'type' => String
},
'Property' => {
'LicensingCost' => String
},
'type' => String,
}
tests('success') do
tests("#get_catalog").formats(@catalog_format) do
TerremarkEcloud[:compute].get_catalog(TerremarkEcloud::Compute.preferred_vdc['catalog_uri']).body
TerremarkEcloud[:compute].get_catalog(TerremarkEcloud::Compute.preferred_catalog['href']).body
end
tests("#get_catalog_item").formats(@catalog_item_format) do
TerremarkEcloud[:compute].get_catalog_item(TerremarkEcloud::Compute.preferred_catalog_item['uri']).body
TerremarkEcloud[:compute].get_catalog_item(TerremarkEcloud::Compute.preferred_catalog_item['href']).body
end
end

View file

@ -11,51 +11,35 @@ class TerremarkEcloud
end
def self.preferred_vdc
@preferred_vdc ||= TerremarkEcloud[:compute].get_vdc(vdc_from_list(TerremarkEcloud[:compute].get_organization.body['vdcs'])['uri']).body
@preferred_vdc ||= begin
href = vdc_from_list(TerremarkEcloud[:compute].get_organization.body['Link'])['href']
TerremarkEcloud[:compute].get_vdc(href).body
end
end
def self.preferred_catalog
@preferred_catalog ||= begin
catalog_href = preferred_vdc['Link'].detect {|link| link['type'] == 'application/vnd.vmware.vcloud.catalog+xml' }['href']
TerremarkEcloud[:compute].get_catalog(catalog_href).body
end
end
def self.preferred_catalog_item
return @preferred_catalog_item if @preferred_catalog_item
catalog = TerremarkEcloud[:compute].get_catalog(preferred_vdc['catalog_uri']).body
catalog_item = catalog['catalogItems'].detect do |item|
item['name'] == 'Ubuntu Server 10.04 x32'
@preferred_catalog_item ||= begin
catalog_item = preferred_catalog['CatalogItems'].detect do |item|
item['name'] == 'Ubuntu Server 10.04 x32'
end
TerremarkEcloud[:compute].get_catalog_item(catalog_item['href']).body
end
@preferred_catalog_item = TerremarkEcloud[:compute].get_catalog_item(catalog_item['uri']).body
end
def self.preferred_network
return @preferred_network if @preferred_network
preferred_vdc['networks'].detect do |network|
fetched_network = TerremarkEcloud[:compute].get_network(network['uri']).body
network_extensions_uri = fetched_network['extensions_uri']
if TerremarkEcloud[:compute].get_network_extensions(network_extensions_uri).body['type'] == 'DMZ'
return @preferred_network = fetched_network
end
@preferred_network ||= begin
network_href = preferred_vdc['AvailableNetworks'].first['href']
TerremarkEcloud[:compute].get_network(network_href).body
end
end
def self.create_vm!(options = {})
data = TerremarkEcloud[:compute].instantiate_vm_template({
'vdc_uri' => preferred_vdc['uri'],
'catalog_item_uri' => preferred_catalog_item['uri'],
'network_uri' => preferred_network['uri'],
'name' => options['name'] || "fogtest-#{rand(99999)}",
'row' => options['row'] || 'fogtest',
'group' => options['group'] || 'fogtest'
}).body
if options[:wait_for_powered_off]
Fog.wait_for(600, 10) do
TerremarkEcloud[:compute].get_vm(data['uri']).body['status'] == 'powered_off'
end
end
data
end
end
end

View file

@ -1,38 +1,29 @@
Shindo.tests('TerremarkEcloud::Compute | network requests', ['terremark_ecloud']) do
@network_format = {
'name' => String,
'uri' => String,
'extensions_ips_uri' => String,
'extensions_uri' => String,
'features' => { 'FenceMode' => String },
'configuration' => {
'netmask' => String,
'gateway' => String
}
}
@network_extensions_format = {
'name' => String,
'uri' => String,
'friendlyName' => String,
'type' => String,
'rnatAddress' => String,
'gatewayAddress' => String,
'broadcastAddress' => String,
'address' => String
'Configuration' => {
'Gateway' => String,
'Netmask' => String
},
'Features' => {
'FenceMode' => String
},
'href' => String,
'Link' => {
'href' => String,
'name' => String,
'rel' => String,
'type' => String
},
'name' => String
}
tests('success') do
tests("#get_network").formats(@network_format) do
TerremarkEcloud[:compute].get_network(TerremarkEcloud::Compute.preferred_network['uri']).body
TerremarkEcloud[:compute].get_network(TerremarkEcloud::Compute.preferred_network['href']).body
end
tests("#get_network_extensions").formats(@network_extensions_format) do
network_extensions_uri = TerremarkEcloud::Compute.preferred_network['extensions_uri']
TerremarkEcloud[:compute].get_network_extensions(network_extensions_uri).body
end
end
end

View file

@ -1,16 +1,14 @@
Shindo.tests('TerremarkEcloud::Compute | organization requests', ['terremark_ecloud']) do
@organization_format = {
'name' => String,
'uri' => String,
'vdcs' => [{
'name' => String,
'uri' => String
}],
'catalog_uri' => String,
'tasksList_uri' => String,
'keysList_uri' => String,
'tagsList_uri' => String
'name' => String,
'href' => String,
'Link' => [{
'href' => String,
'name' => String,
'rel' => String,
'type' => String
}],
}
tests('success') do

View file

@ -1,58 +0,0 @@
Shindo.tests('TerremarkEcloud::Compute | task requests', ['terremark_ecloud']) do
@get_task_queued_format = {
'uri' => String,
'status' => String,
'startTime' => Time,
'endTime' => NilClass,
'owner' => {
'uri' => String,
'type' => String,
'name' => String
},
'result' => {}
}
@get_task_format = {
'uri' => String,
'status' => String,
'startTime' => Time,
'endTime' => Time,
'owner' => {
'uri' => String,
'type' => String,
'name' => String
},
'result' => {
'uri' => String,
'type' => String,
'name' => String
}
}
tests('success') do
# this is heavy but it works to start
@vm_uri = TerremarkEcloud::Compute.create_vm!(:wait_for_powered_off => true)['uri']
# fragile
tests("#get_task when queued").formats(@get_task_queued_format) do
@task_uri = TerremarkEcloud[:compute].power_on_vm(@vm_uri)['task_uri']
TerremarkEcloud[:compute].get_task(@task_uri).body
end
Fog.wait_for do
TerremarkEcloud[:compute].get_task(@task_uri).body['status'] == 'success'
end
tests("#get_task").formats(@get_task_format) do
TerremarkEcloud[:compute].get_task(@task_uri).body
end
TerremarkEcloud[:compute].delete_vm(@vm_uri)
end
end

View file

@ -1,40 +1,57 @@
Shindo.tests('TerremarkEcloud::Compute | vdc requests', ['terremark_ecloud']) do
@vdc_format = {
'AvailableNetworks' => [{
'href' => String,
'name' => String,
'type' => String
}],
'ComputeCapacity' => {
'Cpu' => {
'Allocated' => Integer,
'Units' => String
},
'DeployedVmsQuota' => {
'Limit' => Integer,
'Used' => Integer
},
'InstantiatedVmsQuota' => {
'Limit' => Integer,
'Used' => Integer
},
'Memory' => {
'Allocated' => Integer,
'Units' => String
}
},
'Description' => Fog::Nullable::String,
'href' => String,
'Link' => [{
'href' => String,
'name' => String,
'rel' => String,
'type' => String
}],
'name' => String,
'uri' => String,
'catalog_uri' => String,
'publicIpsList_uri' => String,
'internetServicesList_uri' => String,
'firewallAclsList_uri' => String,
'trustedNetworkGroupsList_uri' => String,
'storageCapacity' => {
'allocated' => Integer,
'used' => Integer
},
'cpuCapacity' => {
'allocated' => Integer
},
'memoryCapacity' => {
'allocated' => Integer
},
'networks' => [{
'name' => String,
'uri' => String
}],
'vms' => [{
'name' => String,
'uri' => String
}]
'ResourceEntities' => [{
'href' => String,
'name' => String,
'type' => String
}],
'StorageCapacity' => {
'Allocated' => Integer,
'Units' => String,
'Used' => Integer
}
}
tests('success') do
tests("#get_vdc").formats(@vdc_format) do
vdc = TerremarkEcloud::Compute.preferred_vdc
vdc_uri = vdc['uri']
vdc_href = vdc['href']
TerremarkEcloud[:compute].get_vdc(vdc_uri).body
TerremarkEcloud[:compute].get_vdc(vdc_href).body
end
end

View file

@ -1,114 +0,0 @@
Shindo.tests('TerremarkEcloud::Compute | vm requests', ['terremark_ecloud']) do
@instantiate_vm_template_format = {
'name' => String,
'uri' => String,
'status' => String
}
@get_vm_deploying_format = {
'name' => String,
'uri' => String,
'status' => String,
'storage_size' => Integer,
'vdc_uri' => String,
'extension_uri' => String,
'network_connections' => [],
'disks' => []
}
@get_vm_format = {
'name' => String,
'uri' => String,
'status' => String,
'storage_size' => Integer,
'vdc_uri' => String,
'extension_uri' => String,
'network_connections' => [{
'name' => String,
'ip_address' => String
}],
'cpus' => Integer,
'memory' => Integer,
'disks' => [{
'id' => Integer,
'size' => Integer
}]
}
@power_on_vm_format = {
'task_uri' => String
}
@power_reset_vm_format = {
'task_uri' => String
}
@power_off_vm_format = {
'task_uri' => String
}
@shutdown_vm_format = {
'task_uri' => String
}
@delete_vm_format = {
'task_uri' => String
}
tests('success') do
tests("#instantiate_vm_template").formats(@instantiate_vm_template_format) do
TerremarkEcloud::Compute.create_vm!.tap do |data|
@vm_uri = data['uri']
end
end
tests("#get_vm when deploying").formats(@get_vm_deploying_format) do
TerremarkEcloud[:compute].get_vm(@vm_uri).body
end
# to be replaced with server.wait_for
Fog.wait_for(600, 10) do
TerremarkEcloud[:compute].get_vm(@vm_uri).body['status'] == 'powered_off'
end
tests("#get_vm").formats(@get_vm_format) do
TerremarkEcloud[:compute].get_vm(@vm_uri).body
end
tests("#power_on_vm").formats(@power_on_vm_format) do
TerremarkEcloud[:compute].power_on_vm(@vm_uri).tap do |data|
@power_task_uri = data['task_uri']
end
end
Fog.wait_for { TerremarkEcloud[:compute].get_task(@power_task_uri).body['status'] == 'success' }
tests("#power_off_vm").formats(@power_off_vm_format) do
TerremarkEcloud[:compute].power_off_vm(@vm_uri).tap do |data|
@power_task_uri = data['task_uri']
end
end
Fog.wait_for { TerremarkEcloud[:compute].get_task(@power_task_uri).body['status'] == 'success' }
@power_task_uri = TerremarkEcloud[:compute].power_on_vm(@vm_uri)['task_uri']
Fog.wait_for { TerremarkEcloud[:compute].get_task(@power_task_uri).body['status'] == 'success' }
tests("#shutdown_vm").formats(@shutdown_vm_format) do
pending # need to wait for the VM to boot up
TerremarkEcloud[:compute].shutdown_vm(@vm_uri).tap do |data|
@power_task_uri = data['task_uri']
end
end
#Fog.wait_for { TerremarkEcloud[:compute].get_task(@power_task_uri).body['status'] == 'success' }
tests("#delete_vm").formats(@delete_vm_format) do
TerremarkEcloud[:compute].delete_vm(@vm_uri)
end
end
end