Class: Fog::Network::Softlayer::Real

Inherits:
Object
  • Object
show all
Includes:
Softlayer::Slapi
Defined in:
lib/fog/softlayer/network.rb,
lib/fog/softlayer/requests/network/get_subnet.rb,
lib/fog/softlayer/requests/network/get_network.rb,
lib/fog/softlayer/requests/network/list_subnets.rb,
lib/fog/softlayer/requests/network/create_subnet.rb,
lib/fog/softlayer/requests/network/list_networks.rb,
lib/fog/softlayer/requests/network/create_network.rb,
lib/fog/softlayer/requests/network/delete_network.rb,
lib/fog/softlayer/requests/network/get_ip_address.rb,
lib/fog/softlayer/requests/network/get_datacenters.rb,
lib/fog/softlayer/requests/network/route_global_ip.rb,
lib/fog/softlayer/requests/network/get_ip_addresses.rb,
lib/fog/softlayer/requests/network/get_network_tags.rb,
lib/fog/softlayer/requests/network/unroute_global_ip.rb,
lib/fog/softlayer/requests/network/create_network_tags.rb,
lib/fog/softlayer/requests/network/delete_network_tags.rb,
lib/fog/softlayer/requests/network/get_global_ip_address.rb,
lib/fog/softlayer/requests/network/get_global_ip_records.rb,
lib/fog/softlayer/requests/network/get_subnet_package_id.rb,
lib/fog/softlayer/requests/network/get_subnet_price_code.rb,
lib/fog/softlayer/requests/network/get_datacenter_routers.rb,
lib/fog/softlayer/requests/network/delete_global_ip_address.rb,
lib/fog/softlayer/requests/network/get_public_vlan_price_code.rb,
lib/fog/softlayer/requests/network/get_references_by_tag_name.rb,
lib/fog/softlayer/requests/network/get_private_vlan_price_code.rb,
lib/fog/softlayer/requests/network/get_portable_subnet_package_id.rb,
lib/fog/softlayer/requests/network/get_portable_subnet_price_code.rb

Instance Method Summary collapse

Methods included from Softlayer::Slapi

slapi_request

Constructor Details

#initialize(options = {}) ⇒ Real

Returns a new instance of Real.



116
117
118
119
# File 'lib/fog/softlayer/network.rb', line 116

def initialize(options={})
  @softlayer_api_key = options[:softlayer_api_key]
  @softlayer_username = options[:softlayer_username]
end

Instance Method Details

#create_network(order) ⇒ Object

Raises:

  • (ArgumentError)


481
482
483
484
# File 'lib/fog/softlayer/requests/network/create_network.rb', line 481

def create_network(order)
  raise ArgumentError, "Order argument for #{self.class.name}##{__method__} must be Hash." unless order.is_a?(Hash)
  self.request(:product_order, :place_order, :body => order, :http_method => :post)
end

#create_network_tags(id, tags = []) ⇒ Object

Raises:

  • (ArgumentError)


43
44
45
46
# File 'lib/fog/softlayer/requests/network/create_network_tags.rb', line 43

def create_network_tags(id, tags = [])
  raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
  self.request(:network_vlan, "#{id}/set_tags", :body => tags.join(','), :http_method => :post)
end

#create_new_global_ipv4Object



126
127
128
129
130
131
132
133
134
# File 'lib/fog/softlayer/network.rb', line 126

def create_new_global_ipv4
  order = {
      "complexType" => 'SoftLayer_Container_Product_Order_Network_Subnet',
      "packageId" => 0, # everything that's not a Server is package 0 when using placeOrder
      "prices" => [{"id"=>global_ipv4_price_code}],
      "quantity" => 1
  }
  request(:product_order, :place_order, :body => order, :http_method => :POST).status == 200
end

#create_new_global_ipv6Object



136
137
138
139
140
141
142
143
144
# File 'lib/fog/softlayer/network.rb', line 136

def create_new_global_ipv6
  order = {
      "complexType" => 'SoftLayer_Container_Product_Order_Network_Subnet',
      "packageId" => 0, # everything that's not a Server is package 0 when using placeOrder
      "prices" => [{"id"=>global_ipv6_price_code}],
      "quantity" => 1
  }
  request(:product_order, :place_order, :body => order, :http_method => :POST).status == 200
end

#create_subnet(order) ⇒ Object

Raises:

  • (ArgumentError)


20
21
22
23
# File 'lib/fog/softlayer/requests/network/create_subnet.rb', line 20

def create_subnet(order)
  raise ArgumentError, "Order argument for #{self.class.name}##{__method__} must be Hash." unless order.is_a?(Hash)
  self.request(:product_order, :place_order, :body => order, :http_method => :post)
end

#delete_global_ip_address(id) ⇒ Object



22
23
24
25
26
# File 'lib/fog/softlayer/requests/network/delete_global_ip_address.rb', line 22

def delete_global_ip_address(id)
  billing = self.request(:network_subnet_ipaddress_global, "#{id}/get_billing_item").body
  billing.nil? and raise "Global IP Address with ID #{id} not found."
  request(:billing_item, "#{billing['id']}/cancel_service")
end

#delete_network(id) ⇒ Object



29
30
31
32
33
# File 'lib/fog/softlayer/requests/network/delete_network.rb', line 29

def delete_network(id)
  billing_id = request(:network_vlan, "#{id}/get_billing_item").body['id']
  billing_id.nil? and raise "SoftLayer VLAN with ID #{id} cannot be deleted." # will be automatically deleted when hardware using it is deleted.
  request(:billing_item, "#{billing_id}/cancel_service").body
end

#delete_network_tags(id, tags = []) ⇒ Object

Raises:

  • (ArgumentError)


36
37
38
39
40
41
42
# File 'lib/fog/softlayer/requests/network/delete_network_tags.rb', line 36

def delete_network_tags(id, tags = [])
  raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
  subset = self.get_network_tags(id).body['tagReferences'].map do |i|
    i['tag']['name'] unless tags.include?(i['tag']['name'])
  end.compact
  self.create_network_tags(id, subset)
end

#get_datacenter_routers(id) ⇒ Object



35
36
37
38
39
40
# File 'lib/fog/softlayer/requests/network/get_datacenter_routers.rb', line 35

def get_datacenter_routers(id)
  Excon.defaults[:read_timeout] *= 2 # this SLAPI method is incredibly slow to respond
  result = request(:location_datacenter, "#{id}/get_hardware_routers", :query => 'objectMask=id;hostname')
  Excon.defaults[:read_timeout] /= 2
  result
end

#get_datacentersObject



24
25
26
# File 'lib/fog/softlayer/requests/network/get_datacenters.rb', line 24

def get_datacenters
  request(:location_datacenter, :get_datacenters)
end

#get_global_ip_address(id) ⇒ Object



22
23
24
# File 'lib/fog/softlayer/requests/network/get_global_ip_address.rb', line 22

def get_global_ip_address(id)
  self.request(:network_subnet_ipaddress_global, id, :query => 'objectMask=mask[ipAddress,destinationIpAddress]')
end

#get_global_ip_recordsObject



22
23
24
# File 'lib/fog/softlayer/requests/network/get_global_ip_records.rb', line 22

def get_global_ip_records
  self.request(:account, :get_global_ip_records)
end

#get_ip_address(id) ⇒ Object



22
23
24
# File 'lib/fog/softlayer/requests/network/get_ip_address.rb', line 22

def get_ip_address(id)
  self.request(:network_subnet_IpAddress, id, :query => 'objectMask=mask[hardware.fullyQualifiedDomainName,hardware.id,virtualGuest.id,virtualGuest.fullyQualifiedDomainName,subnet.id]')
end

#get_ip_addressesObject



22
23
24
# File 'lib/fog/softlayer/requests/network/get_ip_addresses.rb', line 22

def get_ip_addresses
  self.request(:account, :get_ip_addresses, :query => 'objectMask=mask[hardware.fullyQualifiedDomainName,hardware.id,virtualGuest.id,virtualGuest.fullyQualifiedDomainName,subnet.id]')
end

#get_network(id) ⇒ Object



28
29
30
# File 'lib/fog/softlayer/requests/network/get_network.rb', line 28

def get_network(id)
  self.request(:network_vlan, "#{id}/get_object", :query => 'objectMask=mask[subnets,tagReferences,type,primaryRouter.datacenter,networkSpace]')
end

#get_network_tags(id) ⇒ Object



41
42
43
# File 'lib/fog/softlayer/requests/network/get_network_tags.rb', line 41

def get_network_tags(id)
  self.request(:network_vlan, id, :query => 'objectMask=mask[tagReferences]')
end

#get_portable_subnet_package_id(address_space) ⇒ Object

Raises:

  • (ArgumentError)


23
24
25
26
27
28
29
# File 'lib/fog/softlayer/requests/network/get_portable_subnet_package_id.rb', line 23

def get_portable_subnet_package_id(address_space)
  address_space.downcase!; err_msg = "Argument for #{self.class.name}##{__method__} must be 'PRIVATE' or 'PUBLIC'."
  raise ArgumentError, err_msg unless %{private public}.include?(address_space)
  request(:product_package, '0/get_configuration', :query => 'objectMask=mask[isRequired,itemCategory]').body.map do |item|
    item['itemCategory']['id'] if item['itemCategory']['categoryCode'] == "sov_sec_ip_addresses_#{address_space == 'public' ? 'pub' : 'priv'}"
  end.compact.first
end

#get_portable_subnet_price_code(address_count, public = true) ⇒ Object



21
22
23
24
25
26
27
# File 'lib/fog/softlayer/requests/network/get_portable_subnet_price_code.rb', line 21

def get_portable_subnet_price_code(address_count, public=true)
  portable_subnet_package_id = get_portable_subnet_package_id(public ? 'PUBLIC' : 'PRIVATE')
  request(:product_package, '0/get_item_prices', :query => 'objectMask=mask[id,categories.id,item.description]').body.map do |item|
    catg = item['categories'][0]
    item['id'] if catg['id'] == portable_subnet_package_id && item['item']['description'] =~ /^#{address_count}/
  end.compact.first
end

#get_private_vlan_price_codeObject



21
22
23
# File 'lib/fog/softlayer/requests/network/get_private_vlan_price_code.rb', line 21

def get_private_vlan_price_code
  request(:product_package, '0/get_items').body.map { |item| item['prices'][0]['id'] if item['description'] =~ /vlan/i and item['description'] =~ /private/i }.compact.first
end

#get_public_vlan_price_codeObject



21
22
23
# File 'lib/fog/softlayer/requests/network/get_public_vlan_price_code.rb', line 21

def get_public_vlan_price_code
  request(:product_package, '0/get_items').body.map { |item| item['prices'][0]['id'] if item['description'] =~ /vlan/i and item['description'] =~ /public/i }.compact.first
end

#get_references_by_tag_name(tag_list) ⇒ Object



36
37
38
# File 'lib/fog/softlayer/requests/network/get_references_by_tag_name.rb', line 36

def get_references_by_tag_name(tag_list)
  self.request(:tag, "get_tag_by_tag_name/#{tag_list}", :query => 'objectMask=references')
end

#get_subnet(id) ⇒ Object



22
23
24
# File 'lib/fog/softlayer/requests/network/get_subnet.rb', line 22

def get_subnet(id)
  self.request(:network_subnet, "#{id}/get_object", :query => 'objectMask=mask[datacenter,ipAddresses.id,virtualGuests.fullyQualifiedDomainName,virtualGuests.id,hardware.fullyQualifiedDomainName,hardware.id,addressSpace]')
end

#get_subnet_package_id(address_space) ⇒ Object

Raises:

  • (ArgumentError)


23
24
25
26
27
28
29
# File 'lib/fog/softlayer/requests/network/get_subnet_package_id.rb', line 23

def get_subnet_package_id(address_space)
  address_space.downcase!; err_msg = "Argument for #{self.class.name}##{__method__} must be 'PRIVATE' or 'PUBLIC'."
  raise ArgumentError, err_msg unless %{private public}.include?(address_space)
  request(:product_package, '0/get_configuration', :query => 'objectMask=mask[isRequired,itemCategory]').body.map do |item|
    item['itemCategory']['id'] if item['itemCategory']['categoryCode'] == 'static_sec_ip_addresses'
  end.compact.first
end

#get_subnet_price_code(address_count, public = true) ⇒ Object



21
22
23
24
25
26
# File 'lib/fog/softlayer/requests/network/get_subnet_price_code.rb', line 21

def get_subnet_price_code(address_count, public=true)
  subnet_package_id = get_subnet_package_id(public ? 'PUBLIC' : 'PRIVATE')
  request(:product_package, '0/get_item_prices', :query => 'objectMask=mask[id,categories.id,item.description]').body.map do |item|
    item['id'] if catg['id'] == subnet_package_id && item['item']['description'] =~ /^#{address_count}/
  end.compact.first
end

#list_networksObject



146
147
148
# File 'lib/fog/softlayer/network.rb', line 146

def list_networks
  self.list_networks
end

#list_subnetsObject



22
23
24
# File 'lib/fog/softlayer/requests/network/list_subnets.rb', line 22

def list_subnets
self.request(:account, :get_subnets, :query => 'objectMask=mask[networkVlan,ipAddresses.id,datacenter,hardware,virtualGuests.id,virtualGuests.fullyQualifiedDomainName]')
end

#request(service, path, options = {}) ⇒ Object



121
122
123
124
# File 'lib/fog/softlayer/network.rb', line 121

def request(service, path, options = {})
  options = {:username => @softlayer_username, :api_key => @softlayer_api_key}.merge(options)
  Fog::Softlayer::Slapi.slapi_request(service, path, options)
end

#route_global_ip(global_ip_id, destination_ip_address) ⇒ Object



22
23
24
# File 'lib/fog/softlayer/requests/network/route_global_ip.rb', line 22

def route_global_ip(global_ip_id, destination_ip_address)
  self.request(:network_subnet_ipaddress_global, "#{global_ip_id}/route", :body => destination_ip_address, :http_method => :post)
end

#unroute_global_ip(global_ip_id) ⇒ Object



22
23
24
# File 'lib/fog/softlayer/requests/network/unroute_global_ip.rb', line 22

def unroute_global_ip(global_ip_id)
  self.request(:network_subnet_ipaddress_global, "#{global_ip_id}/unroute")
end