Module: Fog::Vcloud::Terremark::Ecloud::Real

Defined in:
lib/fog/vcloud/terremark/ecloud.rb,
lib/fog/vcloud/terremark/ecloud/models/vdcs.rb,
lib/fog/vcloud/terremark/ecloud/models/networks.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_vdc.rb,
lib/fog/vcloud/terremark/ecloud/models/public_ips.rb,
lib/fog/vcloud/terremark/ecloud/requests/add_node.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_node.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_task.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_vapp.rb,
lib/fog/vcloud/terremark/ecloud/requests/power_on.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_nodes.rb,
lib/fog/vcloud/terremark/ecloud/requests/power_off.rb,
lib/fog/vcloud/terremark/ecloud/requests/clone_vapp.rb,
lib/fog/vcloud/terremark/ecloud/requests/delete_node.rb,
lib/fog/vcloud/terremark/ecloud/requests/delete_vapp.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_catalog.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_network.rb,
lib/fog/vcloud/terremark/ecloud/requests/power_reset.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_public_ip.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_task_list.rb,
lib/fog/vcloud/terremark/ecloud/requests/configure_node.rb,
lib/fog/vcloud/terremark/ecloud/requests/configure_vapp.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_network_ip.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_public_ips.rb,
lib/fog/vcloud/terremark/ecloud/requests/power_shutdown.rb,
lib/fog/vcloud/terremark/ecloud/models/internet_services.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_network_ips.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_catalog_item.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_firewall_acl.rb,
lib/fog/vcloud/terremark/ecloud/requests/configure_network.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_firewall_acls.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_vapp_template.rb,
lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb,
lib/fog/vcloud/terremark/ecloud/requests/configure_network_ip.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_internet_services.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_network_extensions.rb,
lib/fog/vcloud/terremark/ecloud/requests/delete_internet_service.rb,
lib/fog/vcloud/terremark/ecloud/requests/get_customization_options.rb,
lib/fog/vcloud/terremark/ecloud/requests/instantiate_vapp_template.rb,
lib/fog/vcloud/terremark/ecloud/requests/configure_internet_service.rb

Instance Method Summary collapse

Instance Method Details

#add_internet_service(internet_services_uri, service_data) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb', line 91

def add_internet_service(internet_services_uri, service_data)
  validate_internet_service_data(service_data)
  if monitor = service_data[:monitor]
    validate_internet_service_monitor(monitor)
    ensure_monitor_defaults!(monitor)
  end

  request(
    :body     => generate_internet_service_request(service_data),
    :expects  => 200,
    :headers  => {'Content-Type' => 'application/vnd.tmrk.ecloud.internetService+xml'},
    :method   => 'POST',
    :uri      => internet_services_uri,
    :parse    => true
  )
end

#add_node(nodes_uri, node_data) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/fog/vcloud/terremark/ecloud/requests/add_node.rb', line 7

def add_node(nodes_uri, node_data)
  validate_node_data(node_data)

  request(
    :body     => generate_node_request(node_data),
    :expects  => 200,
    :headers  => {'Content-Type' => 'application/vnd.tmrk.ecloud.nodeService+xml'},
    :method   => 'POST',
    :uri      => nodes_uri,
    :parse    => true
  )
end

#clone_vapp(vdc_uri, vapp_uri, options = {}) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/fog/vcloud/terremark/ecloud/requests/clone_vapp.rb', line 23

def clone_vapp(vdc_uri, vapp_uri, options = {})
  unless options.has_key?(:poweron)
    options[:poweron] = "false"
  end

  validate_clone_vapp_options(options)

  request(
    :body     => generate_clone_vapp_request(vapp_uri, options),
    :expects  => 202,
    :headers  => {'Content-Type' => 'application/vnd.vmware.vcloud.cloneVAppParams+xml'},
    :method   => 'POST',
    :uri      => vdc_uri + '/action/clonevapp',
    :parse    => true
  )
end

#configure_internet_service(internet_service_uri, service_data, ip_address_data) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_internet_service.rb', line 38

def configure_internet_service(internet_service_uri, service_data, ip_address_data)
  validate_internet_service_data(service_data, true)

  validate_public_ip_address_data(ip_address_data)

  if monitor = service_data[:monitor]
    validate_internet_service_monitor(monitor)
    ensure_monitor_defaults!(monitor)
  end

  request(
    :body     => generate_internet_service_response(service_data, ip_address_data),
    :expects  => 200,
    :headers  => {'Content-Type' => 'application/vnd.tmrk.ecloud.internetService+xml'},
    :method   => 'PUT',
    :uri      => internet_service_uri,
    :parse    => true
  )
end

#configure_network(network_uri, network_data) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_network.rb', line 14

def configure_network(network_uri, network_data)
  validate_network_data(network_data)

  request(
    :body     => generate_configure_network_request(network_data),
    :expects  => 200,
    :headers  => {'Content-Type' => 'application/vnd.tmrk.ecloud.networkService+xml'},
    :method   => 'PUT',
    :uri      => network_uri,
    :parse    => true
  )
end

#configure_network_ip(network_ip_uri, network_ip_data) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_network_ip.rb', line 14

def configure_network_ip(network_ip_uri, network_ip_data)
  validate_network_ip_data(network_ip_data)

  request(
    :body     => generate_configure_network_ip_request(network_ip_data),
    :expects  => 200,
    :headers  => {'Content-Type' => 'application/vnd.tmrk.ecloud.ip+xml' },
    :method   => 'PUT',
    :uri      => network_ip_uri,
    :parse    => true
  )
end

#configure_node(node_uri, node_data) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_node.rb', line 7

def configure_node(node_uri, node_data)
  validate_node_data(node_data, true)

  request(
    :body     => generate_configure_node_request(node_data),
    :expects  => 200,
    :headers  => {'Content-Type' => 'application/vnd.tmrk.ecloud.nodeService+xml'},
    :method   => 'PUT',
    :uri      => node_uri,
    :parse    => true
  )
end

#configure_vapp(vapp_uri, vapp_data) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_vapp.rb', line 92

def configure_vapp(vapp_uri, vapp_data)
  validate_vapp_data(vapp_data)

  request(
    :body     => generate_configure_vapp_request(vapp_uri, vapp_data),
    :expects  => 202,
    :headers  => {'Content-Type' => 'application/vnd.vmware.vcloud.vApp+xml' },
    :method   => 'PUT',
    :uri      => vapp_uri,
    :parse    => true
  )
end

#ensure_monitor_defaults!(monitor) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb', line 69

def ensure_monitor_defaults!(monitor)
  if monitor[:http_headers].is_a?(String)
    monitor[:http_headers] = [ monitor[:http_headers] ]
  end

  unless monitor[:retries]
    monitor[:retries] = 3
  end

  unless monitor[:response_timeout]
    monitor[:response_timeout] = 2
  end

  unless monitor[:down_time]
    monitor[:down_time] = 30
  end

  unless monitor[:interval]
    monitor[:interval] = 5
  end
end

#generate_clone_vapp_request(uri, options) ⇒ Object



15
16
17
18
19
20
21
# File 'lib/fog/vcloud/terremark/ecloud/requests/clone_vapp.rb', line 15

def generate_clone_vapp_request(uri, options)
  xml = Builder::XmlMarkup.new
  xml.CloneVAppParams(xmlns.merge!(:name => options[:name], :deploy => "true", :powerOn => options[:poweron])) {
    xml.VApp( :href => uri, :type => "application/vnd.vmware.vcloud.vApp+xml",
              :xmlns => "http://www.vmware.com/vcloud/v0.8")
  }
end

#generate_configure_vapp_request(vapp_uri, vapp_data) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_vapp.rb', line 7

def generate_configure_vapp_request(vapp_uri, vapp_data)
  rasd_xmlns = { "xmlns" => "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData" }

  xml = Nokogiri::XML(request( :uri => vapp_uri).body)
  xml.root['name'] = vapp_data[:name]

  #cpu
  xml.at("//xmlns:ResourceType[.='3']/..", rasd_xmlns).at('.//xmlns:VirtualQuantity', rasd_xmlns).content = vapp_data[:cpus]

  #memory
  xml.at("//xmlns:ResourceType[.='4']/..", rasd_xmlns).at('.//xmlns:VirtualQuantity', rasd_xmlns).content = vapp_data[:memory]

  #disks
  real_disks = xml.xpath("//xmlns:ResourceType[ .='17']/..", rasd_xmlns)
  real_disk_numbers = real_disks.map { |disk| disk.at('.//xmlns:AddressOnParent', rasd_xmlns).content }
  disk_numbers = vapp_data[:disks].map { |vdisk| vdisk[:number].to_s }

  if vapp_data[:disks].length < real_disks.length
    #Assume we're removing a disk
    remove_disk_numbers = real_disk_numbers - disk_numbers
    remove_disk_numbers.each do |number|
      if result = xml.at("//xmlns:ResourceType[ .='17']/../xmlns:AddressOnParent[.='#{number}']/..", rasd_xmlns)
        result.remove
      end
    end
  elsif vapp_data[:disks].length > real_disks.length
    add_disk_numbers = disk_numbers - real_disk_numbers

    add_disk_numbers.each do |number|
      new_disk = real_disks.first.dup
      new_disk.at('.//xmlns:AddressOnParent', rasd_xmlns).content = -1
      new_disk.at('.//xmlns:VirtualQuantity', rasd_xmlns).content = vapp_data[:disks].detect { |disk| disk[:number].to_s == number.to_s }[:size]
      real_disks.first.parent << new_disk
    end
  end

  #puts xml.root.to_s
  xml.root.to_s
  
  #builder = Builder::XmlMarkup.new
  #builder.Vapp(:href => vapp_uri.to_s,
  #             :type => 'application/vnd.vmware.vcloud.vApp+xml',
  #             :name => vapp_data[:name],
  #             :status => 2,
  #             :size => 0,
  #             :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') {
  #  #builder.VirtualHardwareSection(:xmlns => 'http://schemas.dmtf.org/ovf/envelope/1') {
  #  builder.Section(:"xsi:type" => "q2:VirtualHardwareSection_Type", :xmlns => "http://schemas.dmtf.org/ovf/envelope/1", :"xmlns:q2" => "http://www.vmware.com/vcloud/v0.8") {
  #    builder.Info('Virtual Hardware')
  #    builder.Item(:xmlns => 'http://schemas.dmtf.org/ovf/envelope/1') {
  #    #builder.Item {
  #      builder.InstanceID(1, :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #      builder.ResourceType(3, :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #      builder.VirtualQuantity(vapp_data[:cpus], :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #    }
  #    builder.Item(:xmlns => 'http://schemas.dmtf.org/ovf/envelope/1') {
  #    #builder.Item {
  #      builder.InstanceID(2, :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #      builder.ResourceType(4, :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #      builder.VirtualQuantity(vapp_data[:memory], :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #    }
  #    vapp_data[:disks].each do |disk_data|
  #      #builder.Item(:xmlns => 'http://schemas.dmtf.org/ovf/envelope/1') {
  #      builder.Item {
  #        builder.AddressOnParent(disk_data[:number], :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #        builder.HostResource(disk_data[:resource], :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #        builder.InstanceID(9, :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #        builder.ResourceType(17, :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #        builder.VirtualQuantity(disk_data[:size], :xmlns => 'http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData')
  #      }
  #    end
  #
  #  }
  #}
end

#generate_instantiate_vapp_template_request(options) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/fog/vcloud/terremark/ecloud/requests/instantiate_vapp_template.rb', line 43

def generate_instantiate_vapp_template_request(options)
  xml = Builder::XmlMarkup.new
  xml.InstantiateVAppTemplateParams(xmlns.merge!(:name => options[:name], :"xml:lang" => "en")) {
    xml.VAppTemplate(:href => options[:template_uri])
    xml.InstantiationParams {
      xml.ProductSection( :"xmlns:q1" => "http://www.vmware.com/vcloud/v0.8", :"xmlns:ovf" => "http://schemas.dmtf.org/ovf/envelope/1") {
        if options[:password]
          xml.Property( :xmlns => "http://schemas.dmtf.org/ovf/envelope/1", :"ovf:key" => "password", :"ovf:value" => options[:password] )
        end
        xml.Property( :xmlns => "http://schemas.dmtf.org/ovf/envelope/1", :"ovf:key" => "row", :"ovf:value" => options[:row] )
        xml.Property( :xmlns => "http://schemas.dmtf.org/ovf/envelope/1", :"ovf:key" => "group", :"ovf:value" => options[:group] )
      }
      xml.VirtualHardwareSection( :"xmlns:q1" => "http://www.vmware.com/vcloud/v0.8" ) {
        # # of CPUS
        xml.Item( :xmlns => "http://schemas.dmtf.org/ovf/envelope/1" ) {
          xml.InstanceID(1, :xmlns => "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData")
          xml.ResourceType(3, :xmlns => "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData")
          xml.VirtualQuantity(options[:cpus], :xmlns => "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData")
        }
        # Memory
        xml.Item( :xmlns => "http://schemas.dmtf.org/ovf/envelope/1" ) {
          xml.InstanceID(2, :xmlns => "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData")
          xml.ResourceType(4, :xmlns => "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData")
          xml.VirtualQuantity(options[:memory], :xmlns => "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData")
        }
      }
      xml.NetworkConfigSection {
        xml.NetworkConfig {
          xml.NetworkAssociation( :href => options[:network_uri] )
        }
      }
    }
  }
end

#generate_internet_service_request(service_data) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb', line 7

def generate_internet_service_request(service_data)
  builder = Builder::XmlMarkup.new
  builder.CreateInternetServiceRequest(:"xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance",
                                       :"xmlns:xsd" => "http://www.w3.org/2001/XMLSchema",
                                       :xmlns => "urn:tmrk:eCloudExtensions-2.3") {
    builder.Name(service_data[:name])
    builder.Protocol(service_data[:protocol])
    builder.Port(service_data[:port])
    builder.Enabled(service_data[:enabled])
    builder.Description(service_data[:description])
    builder.RedirectURL(service_data[:redirect_url])
    if monitor = service_data[:monitor]
      generate_monitor_section(builder,monitor)
    end
  }
end

#generate_internet_service_response(service_data, ip_address_data) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_internet_service.rb', line 7

def generate_internet_service_response(service_data,ip_address_data)
  builder = Builder::XmlMarkup.new
  builder.InternetService(:"xmlns:i" => "http://www.w3.org/2001/XMLSchema-instance",
                          :xmlns => "urn:tmrk:eCloudExtensions-2.3") {
    builder.Id(service_data[:id])
    builder.Href(service_data[:href].to_s)
    builder.Name(service_data[:name])
    builder.Protocol(service_data[:protocol])
    builder.Port(service_data[:port])
    builder.Enabled(service_data[:enabled])
    builder.Description(service_data[:description])
    builder.Timeout(service_data[:timeout])
    builder.RedirectURL(service_data[:redirect_url])
    builder.PublicIpAddress {
      builder.Id(ip_address_data[:id])
      builder.Href(ip_address_data[:href].to_s)
      builder.Name(ip_address_data[:name])
    }
    if monitor = service_data[:monitor]
      generate_monitor_section(builder,monitor)
    end
  }
end

#generate_monitor_section(builder, monitor) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb', line 24

def generate_monitor_section(builder, monitor)
  builder.Monitor {
    builder.MonitorType(monitor[:type])
    builder.UrlSendString(monitor[:url_send_string])
    builder.HttpHeader(monitor[:http_headers].join("\n"))
    builder.ReceiveString(monitor[:receive_string])
    builder.Interval(monitor[:interval])
    builder.ResponseTimeOut(monitor[:response_timeout])
    builder.DownTime(monitor[:downtime])
    builder.Retries(monitor[:retries])
    builder.IsEnabled(monitor[:is_enabled])
  }
end

#instantiate_vapp_template(catalog_item_uri, options = {}) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/fog/vcloud/terremark/ecloud/requests/instantiate_vapp_template.rb', line 78

def instantiate_vapp_template(catalog_item_uri, options = {})
  validate_instantiate_vapp_template_options(catalog_item_uri, options)

  request(
    :body     => generate_instantiate_vapp_template_request(options),
    :expects  => 200,
    :headers  => {'Content-Type' => 'application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml'},
    :method   => 'POST',
    :uri      => options[:vdc_uri] + '/action/instantiatevAppTemplate',
    :parse    => true
  )
end

#internet_services(options = {}) ⇒ Object



7
8
9
# File 'lib/fog/vcloud/terremark/ecloud/models/internet_services.rb', line 7

def internet_services(options = {})
  @internet_services ||= Fog::Vcloud::Terremark::Ecloud::InternetServices.new(options.merge(:connection => self))
end

#networks(options = {}) ⇒ Object



7
8
9
# File 'lib/fog/vcloud/terremark/ecloud/models/networks.rb', line 7

def networks(options = {})
  @networks ||= Fog::Vcloud::Terremark::Ecloud::Networks.new(options.merge(:connection => self))
end

#public_ips(options = {}) ⇒ Object



13
14
15
# File 'lib/fog/vcloud/terremark/ecloud/models/public_ips.rb', line 13

def public_ips(options = {})
  @public_ips ||= Fog::Vcloud::Terremark::Ecloud::PublicIps.new(options.merge(:connection => self))
end

#supporting_versionsObject



191
192
193
# File 'lib/fog/vcloud/terremark/ecloud.rb', line 191

def supporting_versions
  ["v0.8b-ext2.3", "0.8b-ext2.3"]
end

#validate_clone_vapp_options(options) ⇒ Object



8
9
10
11
12
13
# File 'lib/fog/vcloud/terremark/ecloud/requests/clone_vapp.rb', line 8

def validate_clone_vapp_options(options)
  valid_opts = [:name, :poweron]
  unless valid_opts.all? { |opt| options.keys.include?(opt) }
    raise ArgumentError.new("Required data missing: #{(valid_opts - options.keys).map(&:inspect).join(", ")}")
  end
end

#validate_instantiate_vapp_template_options(catalog_item_uri, options) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/fog/vcloud/terremark/ecloud/requests/instantiate_vapp_template.rb', line 8

def validate_instantiate_vapp_template_options(catalog_item_uri, options)
  valid_opts = [:name, :vdc_uri, :network_uri, :cpus, :memory, :row, :group]
  unless valid_opts.all? { |opt| options.keys.include?(opt) }
    raise ArgumentError.new("Required data missing: #{(valid_opts - options.keys).map(&:inspect).join(", ")}")
  end

  # Figure out the template_uri
  catalog_item = get_catalog_item( catalog_item_uri ).body
  catalog_item[:Entity] = [ catalog_item[:Entity] ] if catalog_item[:Entity].is_a?(Hash)
  catalog_item[:Link] = [ catalog_item[:Link] ] if catalog_item[:Link].is_a?(Hash)

  options[:template_uri] = begin
     catalog_item[:Entity].detect { |entity| entity[:type] == "application/vnd.vmware.vcloud.vAppTemplate+xml" }[:href]
  rescue
    raise RuntimeError.new("Unable to locate template uri for #{catalog_item_uri}")
  end

  customization_options = begin
      customization_href = catalog_item[:Link].detect { |link| link[:type] == "application/vnd.tmrk.ecloud.catalogItemCustomizationParameters+xml" }[:href]
      get_customization_options( customization_href ).body
  rescue
    raise RuntimeError.new("Unable to get customization options for #{catalog_item_uri}")
  end

  # Check to see if we can set the password
  if options[:password] and customization_options[:CustomizePassword] == "false"
    raise ArgumentError.new("This catalog item (#{catalog_item_uri}) does not allow setting a password.")
  end

  # According to the docs if CustomizePassword is "true" then we NEED to set a password
  if customization_options[:CustomizePassword] == "true" and ( options[:password].nil? or options[:password].empty? )
    raise ArgumentError.new("This catalog item (#{catalog_item_uri}) requires a :password to instantiate.")
  end
end

#validate_internet_service_data(service_data, configure = false) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb', line 38

def validate_internet_service_data(service_data, configure=false)
  required_opts = [:name, :protocol, :port, :description, :enabled]
  if configure
    required_opts + [ :id, :href, :timeout ]
  end
  unless required_opts.all? { |opt| service_data.keys.include?(opt) }
    raise ArgumentError.new("Required Internet Service data missing: #{(required_opts - service_data.keys).map(&:inspect).join(", ")}")
  end
end

#validate_internet_service_monitor(monitor) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/fog/vcloud/terremark/ecloud/requests/add_internet_service.rb', line 48

def validate_internet_service_monitor(monitor)
  #FIXME: Refactor this type of function into something generic
  required_opts = [:type, :url_send_string, :http_headers, :receive_string, :is_enabled]

  unless required_opts.all? { |opt| monitor.keys.include?(opt) && monitor[opt] }
    raise ArgumentError.new("Required Monitor data missing: #{(required_opts - monitor.keys).map(&:inspect).join(", ")}")
  end

  unless ['HTTP','ECV'].include?(monitor[:type])
    raise ArgumentError.new("Supported monitor types are: ECV & HTTP")
  end

  unless monitor[:http_headers].is_a?(Array) || monitor[:http_headers].is_a?(String)
    raise ArgumentError.new("Monitor :http_headers must be a String or Array")
  end

  unless [true, false, "true", "false"].include?(monitor[:is_enabled])
    raise ArgumentError.new("Monitor :is_enabled must be true or false")
  end
end

#validate_network_data(network_data, configure = false) ⇒ Object



7
8
9
10
11
12
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_network.rb', line 7

def validate_network_data(network_data, configure=false)
  valid_opts = [:id, :href, :name, :rnat, :address, :broadcast, :gateway]
  unless valid_opts.all? { |opt| network_data.keys.include?(opt) }
    raise ArgumentError.new("Required data missing: #{(valid_opts - network_data.keys).map(&:inspect).join(", ")}")
  end
end

#validate_network_ip_data(network_ip_data, configure = false) ⇒ Object



7
8
9
10
11
12
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_network_ip.rb', line 7

def validate_network_ip_data(network_ip_data, configure=false)
  valid_opts = [:id, :href, :name, :status, :server, :rnat]
  unless valid_opts.all? { |opt| network_ip_data.keys.include?(opt) }
    raise ArgumentError.new("Required data missing: #{(valid_opts - network_ip_data.keys).map(&:inspect).join(", ")}")
  end
end

#validate_public_ip_address_data(ip_address_data) ⇒ Object



31
32
33
34
35
36
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_internet_service.rb', line 31

def validate_public_ip_address_data(ip_address_data)
  valid_opts = [:name, :href, :id]
  unless valid_opts.all? { |opt| ip_address_data.keys.include?(opt) }
    raise ArgumentError.new("Required Internet Service data missing: #{(valid_opts - ip_address_data.keys).map(&:inspect).join(", ")}")
  end
end

#validate_vapp_data(vapp_data) ⇒ Object



85
86
87
88
89
90
# File 'lib/fog/vcloud/terremark/ecloud/requests/configure_vapp.rb', line 85

def validate_vapp_data(vapp_data)
  valid_opts = [:name, :cpus, :memory, :disks]
  unless valid_opts.all? { |opt| vapp_data.keys.include?(opt) }
    raise ArgumentError.new("Required Vapp data missing: #{(valid_opts - vapp_data.keys).map(&:inspect).join(", ")}")
  end
end

#vdcs(options = {}) ⇒ Object



7
8
9
# File 'lib/fog/vcloud/terremark/ecloud/models/vdcs.rb', line 7

def vdcs(options = {})
  @vdcs ||= Fog::Vcloud::Terremark::Ecloud::Vdcs.new(options.merge(:connection => self))
end