fog-softlayer 0.3.9 → 0.3.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MzZlM2IxNmJkYmZkNzUzMzQwZDgxNDYxOGVjYTE1YzMwNjNiNDNkMQ==
4
+ Mjk1ZTE3NWIzYTg1NjA2ZjhlNGEzNjA3ZGYzYjE5YWU1OTg5ZGEwMg==
5
5
  data.tar.gz: !binary |-
6
- ZTUyMzNiZmFlZGI3MDI2OThjYjAyMjgwYTNjNjdiNWY4MzZmYzA0ZQ==
6
+ ZjQ0YjRhZGYwNDQ5NjI0ZGQxZWQwZDJiMjA4YjYxNmQ3MWZhOWU5MQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZGU0ODY3MTRhMWM0NmM1MGIwZjNkNjU1NDBmMTNlZDZiODI0ZDQxMTI2YWYz
10
- YTYyNjk4YzI3ZGMwNDY5ZWY5Y2Q3MDU3OWNlOGViYWU3MWJjMTRlZDlkYzk5
11
- MzYwNWQyYzBmZmVjYmIyYTlkOWUzYzg2ODQ2NzI0ZTU2MTdhNTU=
9
+ MDU0NzA2ZjAxNjVlNWYwMWM1YWMwZDAyMGRmMzNmZjdhY2NlYmU3Y2E5Mjlj
10
+ OWQ4OTc2M2M3MGY0NDEzZjU1NjEzZjdiMDU0MGM3NTQ1MTlhYjg1NDA1M2M4
11
+ NmJiNGRhOTRkYWViMzY0OWM4Njk3Nzg4YjdmNTczNjVhMThjMTQ=
12
12
  data.tar.gz: !binary |-
13
- YzUwNjNlOGY1NzljZGM4MWEwMzNiNjNkYjcwNTE3ODAyM2ZkNDg3YTdlMTBm
14
- ZjI5MmFkZmE0NDc5YWExOGU5YjA4YTgyM2E0OTg5NTVhMDBlNGMyMzE3NzBm
15
- MzQyNWNkYzk5NGY1ZGI5ZjFkYjU2YmUzYzA1Y2FjY2Q1M2NhODc=
13
+ MzMyODY1MWVmNjU3ZjcyYzJkN2IzMWM0ZGE3NzVlMWFmMzJlZmM2ZDgzYWE5
14
+ YzM0YWEyZjhmZGY4ZTVjZjRjMzVmNTFhYjg4MTBlMjk4Zjk5OGFjNzZjYjMz
15
+ YzMzNDg2ZGFkZjk4OTA3OTkzY2YxNTg2Yzg1ZDI1NGE0MGQzMzI=
@@ -1,3 +1,10 @@
1
+ ## 0.3.10 2014-07-22
2
+ * Added support for Global IP addresses
3
+ * Create.
4
+ * Destroy.
5
+ * Route.
6
+ * Unroute.
7
+
1
8
  ## 0.3.7 2014-07-11
2
9
  * Added support for ssh key pairs.
3
10
  * See [key_pairs.md](https://github.com/fog/fog-softlayer/blob/master/examples/key_pairs.md) for details.
@@ -0,0 +1,169 @@
1
+ #### Global IP Address examples
2
+
3
+ These examples all assume you have `~/.fog` which contains the following:
4
+
5
+
6
+ ```yaml
7
+ default:
8
+ softlayer_username: example-username
9
+ softlayer_api_key: 1a1a1a1a1a1a1a1a1a11a1a1a1a1a1a1a1a1a1
10
+ ```
11
+
12
+ ##### Create a connection to SoftLayer network
13
+
14
+ ```ruby
15
+ require 'fog/softlayer'
16
+ @sl = Fog::Network[:softlayer]
17
+ ```
18
+
19
+ Global IP addresses are accessed through the `Fog::Network::Softlayer::Ip` model. Unlike "normal" IP addresses they can be specifically created and destroyed (non-global IP addresses are created/destroyed via a subnet).
20
+
21
+ ```ruby
22
+ global_ips = @network.ips.select { |ip| ip.global? }
23
+ # => [ <Fog::Network::Softlayer::Ip
24
+ # id=123456789,
25
+ # subnet_id=123456,
26
+ # address="203.0.113.5",
27
+ # broadcast=false,
28
+ # gateway=false,
29
+ # network=false,
30
+ # reserved=false,
31
+ # global_id=1234,
32
+ # destination_ip=nil,
33
+ # note=nil,
34
+ # assigned_to=nil
35
+ # >,
36
+ # <Fog::Network::Softlayer::Ip
37
+ # id=123456790,
38
+ # subnet_id=123457,
39
+ # address="203.0.113.6",
40
+ # broadcast=false,
41
+ # gateway=false,
42
+ # network=false,
43
+ # reserved=false,
44
+ # global_id=1235,
45
+ # destination_ip= <Fog::Network::Softlayer::Ip
46
+ # id=123458,
47
+ # subnet_id=123456,
48
+ # address="203.0.113.7",
49
+ # broadcast=false,
50
+ # gateway=false,
51
+ # network=false,
52
+ # reserved=false,
53
+ # global_id=nil,
54
+ # destination_ip=nil,
55
+ # note=nil,
56
+ # assigned_to=nil
57
+ # >,
58
+ # note=nil,
59
+ # assigned_to=nil
60
+ # >
61
+ # ]
62
+ ```
63
+
64
+
65
+
66
+
67
+ Route an unrouted global IP to a specific server:
68
+
69
+ ```ruby
70
+ global_ip = @network.ips.select { |ip| ip.global? && !ip.routed? }.first
71
+ # => <Fog::Network::Softlayer::Ip
72
+ # id=123456789,
73
+ # subnet_id=123456,
74
+ # address="203.0.113.5",
75
+ # broadcast=false,
76
+ # gateway=false,
77
+ # network=false,
78
+ # reserved=false,
79
+ # global_id=1234,
80
+ # destination_ip=nil,
81
+ # note=nil,
82
+ # assigned_to=nil
83
+ # >
84
+ global_ip.routed? # => false
85
+
86
+
87
+ @compute = Fog::Compute[:softlayer]
88
+ dest_server = @compute.servers.tagged_with(['production', 'frontend', 'hkg']).first # => <Fog::Compute::Softlayer::Server>
89
+ dest_ip = @network.ips.by_address(dest_server.public_ip) # => <Fog::Network::Softlayer::Ip>
90
+
91
+
92
+ global_ip.route(dest_ip) # => true
93
+
94
+ global_ip.reload
95
+ # => <Fog::Network::Softlayer::Ip
96
+ # id=123456789,
97
+ # subnet_id=123456,
98
+ # address="203.0.113.5",
99
+ # broadcast=false,
100
+ # gateway=false,
101
+ # network=false,
102
+ # reserved=false,
103
+ # global_id=1234,
104
+ # destination_ip= <Fog::Network::Softlayer::Ip
105
+ # id=123458,
106
+ # subnet_id=123456,
107
+ # address="203.0.113.8",
108
+ # broadcast=false,
109
+ # gateway=false,
110
+ # network=false,
111
+ # reserved=false,
112
+ # global_id=nil,
113
+ # destination_ip=nil,
114
+ # note=nil,
115
+ # assigned_to=nil
116
+ # >,
117
+ # note=nil,
118
+ # assigned_to=nil
119
+ # >
120
+
121
+ global_ip.routed?
122
+ # => true
123
+ ```
124
+
125
+ That same address to a different server:
126
+
127
+ ```ruby
128
+ global_ip = @network.ips.by_address('203.0.113.5')
129
+ global_ip.destination.address # => 203.0.113.8
130
+
131
+ london_server = @compute.servers.tagged_with(['production', 'frontend', 'lon']).first # => <Fog::Compute::Softlayer::Server>
132
+ dest_ip = @network.ips.by_address(london_server.public_ip) # => <Fog::Network::Softlayer::Ip>
133
+
134
+ global_ip.route(dest_ip) # => true
135
+ global_ip.reload # => <Fog::Network::Softlayer::Ip>
136
+ global_ip.destination.address # => 203.0.113.9
137
+ ```
138
+
139
+ Unroute the same address:
140
+ ```ruby
141
+ global_ip = @network.ips.by_address('203.0.113.5')
142
+ global_ip.routed? # => true
143
+
144
+ global_ip.unroute # => true
145
+ global_ip.reload # => <Fog::Network::Softlayer::Ip>
146
+
147
+ global_ip.routed? # => false
148
+ ```
149
+
150
+ Create new IPv4:
151
+ *Note:* these methods are blocking and can take several seconds to respond.
152
+ ```ruby
153
+ @network.create_new_global_ipv4 # => <Fog::Network::Softlayer::Ip>
154
+ ```
155
+
156
+ Create new IPv6:
157
+ ```ruby
158
+ @network.create_new_global_ipv6 # => <Fog::Network::Softlayer::Ip>
159
+ ```
160
+
161
+ Destroy a global IP address:
162
+ ```ruby
163
+ ip = @network.ips.by_address('203.0.113.5')
164
+ ip.global? # => true
165
+ ip.destroy # => true
166
+ ```
167
+
168
+
169
+
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.description = %q{Module for the 'fog' gem to support SoftLayer Cloud}
13
13
  spec.summary = %q{This library can be used as a module for `fog` or as standalone provider
14
14
  to use the SoftLayer Cloud in applications}
15
- spec.homepage = "https://github.com/softlayer/fog-softlayer"
15
+ spec.homepage = "https://github.com/fog/fog-softlayer"
16
16
  spec.license = "MIT"
17
17
 
18
18
  spec.files = `git ls-files`.split($/)
@@ -13,12 +13,14 @@ module Fog
13
13
  class Ip < Fog::Model
14
14
  identity :id
15
15
 
16
- attribute :subnet_id, :aliases => 'subnetId'
17
- attribute :address, :aliases => 'ipAddress'
16
+ attribute :subnet_id, :aliases => 'subnetId'
17
+ attribute :address, :aliases => 'ipAddress'
18
18
  attribute :broadcast, :aliases => 'isBroadcast'
19
19
  attribute :gateway, :aliases => 'isGateway'
20
20
  attribute :network, :aliases => 'isNetwork'
21
21
  attribute :reserved, :aliases => 'isReserved'
22
+ attribute :global_id
23
+ attribute :destination_ip, :aliases => 'destinationIpAddress'
22
24
  attribute :note
23
25
  attribute :assigned_to, :aliases => ['hardware', 'virtualGuest']
24
26
 
@@ -40,25 +42,58 @@ module Fog
40
42
  self
41
43
  end
42
44
 
45
+ def destination_ip=(ip)
46
+ if ip.is_a?(Hash)
47
+ attributes[:destination_ip] = Fog::Network::Softlayer::Ip.new(ip)
48
+ elsif ip.is_a?(Fog::Network::Softlayer::Ip) or ip.nil?
49
+ attributes[:destination_ip] = ip
50
+ else
51
+ raise ArgumentError, "Invalid argument type in #{self.class.name}##{__method__}."
52
+ end
53
+ end
54
+
43
55
  def destroy
44
- requires :id
45
- true
56
+ raise "Only Global IP Addresses can be destroyed. Regular IP Addresses are part of Fog::Softlayer::Network::Subnet" unless global?
57
+ service.delete_global_ip_address(self.global_id).status == 200
46
58
  end
47
59
 
48
60
  def broadcast?
49
- attribute[:broadcast]
61
+ !!attributes[:broadcast]
50
62
  end
51
63
 
52
64
  def gateway?
53
- attribute[:gateway]
65
+ !!attributes[:gateway]
66
+ end
67
+
68
+ def global?
69
+ !!attributes[:global_id]
54
70
  end
55
71
 
56
72
  def network?
57
- attribute[:network]
73
+ !!attributes[:network]
58
74
  end
59
75
 
60
76
  def reserved?
61
- attribute[:reserved]
77
+ !!attributes[:reserved]
78
+ end
79
+
80
+ def route(dest_ip)
81
+ requires :global_id
82
+ raise ArgumentError, "Invalid argument type in #{self.class.name}##{__method__}." unless dest_ip.is_a?(Fog::Network::Softlayer::Ip)
83
+ raise ArgumentError, "The destination IP may not be the network address of the destination subnet" if dest_ip.network?
84
+ raise ArgumentError, "The destination IP may not be the gateway address of the destination subnet" if dest_ip.gateway?
85
+ raise ArgumentError, "The destination IP may not be the broadcast address of the destination subnet" if dest_ip.broadcast?
86
+ raise ArgumentError, "The destination IP may not be another global IP address" if dest_ip.global?
87
+ service.route_global_ip(self.global_id, dest_ip.address).status == 200
88
+ end
89
+
90
+ def routed?
91
+ !!self.assigned_to or !!self.destination_ip
92
+ end
93
+
94
+ def unroute
95
+ requires :global_id
96
+ service.unroute_global_ip(self.global_id).status == 200
62
97
  end
63
98
 
64
99
  end
@@ -23,16 +23,53 @@ module Fog
23
23
 
24
24
  def all(filters = filters)
25
25
  self.filters = filters
26
- load(service.list_ips(filters).body)
26
+ ips = service.get_ip_addresses.body
27
+
28
+ ips.each_with_index do |ip,i|
29
+ if global_records.keys.include?(ip['id'])
30
+ ips[i] = parse_global_ip_record(service.get_global_ip_address(global_records[ip['id']]['id']).body)
31
+ end
32
+ end
33
+
34
+ load(ips)
35
+ end
36
+
37
+ def by_address(address)
38
+ ip = service.get_ip_addresses.body.select do |ip|
39
+ ip['ipAddress'] == address
40
+ end.first
41
+ new(ip) if ip
27
42
  end
28
43
 
29
44
  def get(id)
30
- if ip = service.get_ip_address(id).body
31
- new(ip)
45
+ if global_records.keys.include?(id)
46
+ response = service.get_global_ip_address(global_records[id]['id']).body
47
+ ip = parse_global_ip_record(response)
48
+ else
49
+ ip = service.get_ip_address(id).body
32
50
  end
51
+
52
+ new(ip) if ip
53
+
33
54
  rescue Fog::Network::Softlayer::NotFound
34
55
  nil
35
56
  end
57
+
58
+ def global_records
59
+ @records ||= {}
60
+ service.get_global_ip_records.body.each { |record| @records[record['ipAddressId']] = record } if @records.empty?
61
+ @records
62
+ end
63
+
64
+ private
65
+
66
+ def parse_global_ip_record(record)
67
+ response = service.request(:network_subnet_ipaddress_global, record['id'], :query => 'objectMask=mask[ipAddress,destinationIpAddress]').body
68
+ parsed = response['ipAddress']
69
+ parsed['destinationIpAddress'] = response['destinationIpAddress']
70
+ parsed[:global_id] = record['id']
71
+ parsed
72
+ end
36
73
  end
37
74
  end
38
75
  end
@@ -41,7 +41,6 @@ module Fog
41
41
  request :create_network
42
42
  request :delete_network
43
43
  request :get_network
44
- #request :update_network
45
44
 
46
45
  request :get_private_vlan_price_code
47
46
  request :get_public_vlan_price_code
@@ -56,24 +55,16 @@ module Fog
56
55
  request :delete_network_tags
57
56
  request :get_network_tags
58
57
 
59
- #request :list_ports
60
- #request :create_port
61
- #request :delete_port
62
- #request :get_port
63
- #request :update_port
64
-
65
58
  request :list_subnets
66
- #request :create_subnet
67
- #request :delete_subnet
68
59
  request :get_subnet
69
- #request :update_subnet
70
60
 
71
- #request :list_ip_addresses
72
- #request :create_ip_addresse
73
- #request :delete_ip_addresse
74
61
  request :get_ip_address
75
- #request :associate_ip_address
76
- #request :disassociate_ip_address
62
+ request :get_global_ip_address
63
+ request :get_ip_addresses
64
+ request :get_global_ip_records
65
+ request :route_global_ip
66
+ request :unroute_global_ip
67
+ request :delete_global_ip_address
77
68
 
78
69
  class Mock
79
70
  #Fog::Mock.random_ip,
@@ -129,10 +120,68 @@ module Fog
129
120
  Fog::Softlayer::Slapi.slapi_request(service, path, options)
130
121
  end
131
122
 
123
+ def create_new_global_ipv4
124
+ order = {
125
+ "complexType" => 'SoftLayer_Container_Product_Order_Network_Subnet',
126
+ "packageId" => 0, # everything that's not a Server is package 0 when using placeOrder
127
+ "prices" => [{"id"=>global_ipv4_price_code}],
128
+ "quantity" => 1
129
+ }
130
+ request(:product_order, :place_order, :body => order, :http_method => :POST).status == 200
131
+ end
132
+
133
+ def create_new_global_ipv6
134
+ order = {
135
+ "complexType" => 'SoftLayer_Container_Product_Order_Network_Subnet',
136
+ "packageId" => 0, # everything that's not a Server is package 0 when using placeOrder
137
+ "prices" => [{"id"=>global_ipv6_price_code}],
138
+ "quantity" => 1
139
+ }
140
+ request(:product_order, :place_order, :body => order, :http_method => :POST).status == 200
141
+ end
142
+
132
143
  def list_networks
133
144
  self.list_networks
134
145
  end
135
146
 
147
+ private
148
+
149
+ ##
150
+ # Queries the SoftLayer API and returns the "category code" required for ordering a Global IPv4 address.
151
+ # @return [Integer]
152
+ def global_ipv4_cat_code
153
+ request(:product_package, '0/get_configuration', :query => 'objectMask=mask[isRequired,itemCategory]').body.map do |item|
154
+ item['itemCategory']['id'] if item['itemCategory']['categoryCode'] == 'global_ipv4'
155
+ end.compact.first
156
+ end
157
+
158
+ ##
159
+ # Queries the SoftLayer API and returns the "category code" required for ordering a Global IPv4 address.
160
+ # @return [Integer]
161
+ def global_ipv6_cat_code
162
+ request(:product_package, '0/get_configuration', :query => 'objectMask=mask[isRequired,itemCategory]').body.map do |item|
163
+ item['itemCategory']['id'] if item['itemCategory']['categoryCode'] == 'global_ipv6'
164
+ end.compact.first
165
+ end
166
+
167
+ ##
168
+ # Queries the SoftLayer API and returns the "price code" required for ordering a Global IPv4 address.
169
+ # @return [Integer]
170
+ def global_ipv4_price_code
171
+ request(:product_package, '0/get_item_prices', :query => 'objectMask=mask[id,item.description,categories.id]').body.map do |item|
172
+ item['id'] if item['categories'][0]['id'] == global_ipv4_cat_code
173
+ end.compact.first
174
+ end
175
+
176
+ ##
177
+ # Queries the SoftLayer API and returns the "price code" required for ordering a Global IPv4 address.
178
+ # @return [Integer]
179
+ def global_ipv6_price_code
180
+ request(:product_package, '0/get_item_prices', :query => 'objectMask=mask[id,item.description,categories.id]').body.map do |item|
181
+ item['id'] if item['categories'][0]['id'] == global_ipv6_cat_code
182
+ end.compact.first
183
+ end
184
+
136
185
  end
137
186
  end
138
187
  end
@@ -0,0 +1,30 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+
8
+ module Fog
9
+ module Network
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def delete_global_ip_address(id)
15
+ # TODO: Implement.
16
+ raise Fog::Errors::MockNotImplemented
17
+ end
18
+
19
+ end
20
+
21
+ class Real
22
+ def delete_global_ip_address(id)
23
+ billing = self.request(:network_subnet_ipaddress_global, "#{id}/get_billing_item").body
24
+ billing.nil? and raise "Global IP Address with ID #{id} not found."
25
+ request(:billing_item, "#{billing['id']}/cancel_service")
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+
8
+ module Fog
9
+ module Network
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def get_global_ip_address(id)
15
+ # TODO: Implement.
16
+ raise Fog::Errors::MockNotImplemented
17
+ end
18
+
19
+ end
20
+
21
+ class Real
22
+ def get_global_ip_address(id)
23
+ self.request(:network_subnet_ipaddress_global, id, :query => 'objectMask=mask[ipAddress,destinationIpAddress]')
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+
8
+ module Fog
9
+ module Network
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def get_global_ip_records
15
+ # TODO: Implement.
16
+ raise Fog::Errors::MockNotImplemented
17
+ end
18
+
19
+ end
20
+
21
+ class Real
22
+ def get_global_ip_records
23
+ self.request(:account, :get_global_ip_records)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -19,8 +19,8 @@ module Fog
19
19
  end
20
20
 
21
21
  class Real
22
- def get_ip_address(ip_address)
23
- self.request(:network_subnet_IpAddress, "#{ip_address}/get_object", :query => 'objectMask=mask[hardware.fullyQualifiedDomainName,hardware.id,virtualGuest.id,virtualGuest.fullyQualifiedDomainName,subnet.id]')
22
+ def get_ip_address(id)
23
+ self.request(:network_subnet_IpAddress, id, :query => 'objectMask=mask[hardware.fullyQualifiedDomainName,hardware.id,virtualGuest.id,virtualGuest.fullyQualifiedDomainName,subnet.id]')
24
24
  end
25
25
  end
26
26
  end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+
8
+ module Fog
9
+ module Network
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def get_ip_addresses
15
+ # TODO: Implement.
16
+ raise Fog::Errors::MockNotImplemented
17
+ end
18
+
19
+ end
20
+
21
+ class Real
22
+ def get_ip_addresses
23
+ self.request(:account, :get_ip_addresses, :query => 'objectMask=mask[hardware.fullyQualifiedDomainName,hardware.id,virtualGuest.id,virtualGuest.fullyQualifiedDomainName,subnet.id]')
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+
8
+ module Fog
9
+ module Network
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def route_global_ip(global_ip, destination_ip)
15
+ # TODO: Implement.
16
+ raise Fog::Errors::MockNotImplemented
17
+ end
18
+
19
+ end
20
+
21
+ class Real
22
+ def route_global_ip(global_ip_id, destination_ip_address)
23
+ self.request(:network_subnet_ipaddress_global, "#{global_ip_id}/route", :body => destination_ip_address, :http_method => :post)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,28 @@
1
+ #
2
+ # Author:: Matt Eldridge (<matt.eldridge@us.ibm.com>)
3
+ # © Copyright IBM Corporation 2014.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+
8
+ module Fog
9
+ module Network
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def unroute_global_ip(global_ip_id)
15
+ # TODO: Implement.
16
+ raise Fog::Errors::MockNotImplemented
17
+ end
18
+
19
+ end
20
+
21
+ class Real
22
+ def unroute_global_ip(global_ip_id)
23
+ self.request(:network_subnet_ipaddress_global, "#{global_ip_id}/unroute")
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -7,6 +7,6 @@
7
7
 
8
8
  module Fog
9
9
  module Softlayer
10
- VERSION = "0.3.9"
10
+ VERSION = "0.3.10"
11
11
  end
12
12
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-softlayer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.9
4
+ version: 0.3.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Eldridge
@@ -200,6 +200,7 @@ files:
200
200
  - docs/fog-softlayer-CLA.pdf
201
201
  - examples/compute.md
202
202
  - examples/dns.md
203
+ - examples/global_ip_address.md
203
204
  - examples/key_pairs.md
204
205
  - examples/network.md
205
206
  - examples/storage.md
@@ -276,11 +277,15 @@ files:
276
277
  - lib/fog/softlayer/requests/dns/update_record.rb
277
278
  - lib/fog/softlayer/requests/network/create_network.rb
278
279
  - lib/fog/softlayer/requests/network/create_network_tags.rb
280
+ - lib/fog/softlayer/requests/network/delete_global_ip_address.rb
279
281
  - lib/fog/softlayer/requests/network/delete_network.rb
280
282
  - lib/fog/softlayer/requests/network/delete_network_tags.rb
281
283
  - lib/fog/softlayer/requests/network/get_datacenter_routers.rb
282
284
  - lib/fog/softlayer/requests/network/get_datacenters.rb
285
+ - lib/fog/softlayer/requests/network/get_global_ip_address.rb
286
+ - lib/fog/softlayer/requests/network/get_global_ip_records.rb
283
287
  - lib/fog/softlayer/requests/network/get_ip_address.rb
288
+ - lib/fog/softlayer/requests/network/get_ip_addresses.rb
284
289
  - lib/fog/softlayer/requests/network/get_network.rb
285
290
  - lib/fog/softlayer/requests/network/get_network_tags.rb
286
291
  - lib/fog/softlayer/requests/network/get_private_vlan_price_code.rb
@@ -291,6 +296,8 @@ files:
291
296
  - lib/fog/softlayer/requests/network/get_subnet_price_code.rb
292
297
  - lib/fog/softlayer/requests/network/list_networks.rb
293
298
  - lib/fog/softlayer/requests/network/list_subnets.rb
299
+ - lib/fog/softlayer/requests/network/route_global_ip.rb
300
+ - lib/fog/softlayer/requests/network/unroute_global_ip.rb
294
301
  - lib/fog/softlayer/requests/storage/copy_object.rb
295
302
  - lib/fog/softlayer/requests/storage/delete_container.rb
296
303
  - lib/fog/softlayer/requests/storage/delete_multiple_objects.rb
@@ -350,7 +357,7 @@ files:
350
357
  - tests/softlayer/requests/storage/auth_tests.rb
351
358
  - tests/softlayer/requests/storage/container_tests.rb
352
359
  - tests/softlayer/requests/storage/object_tests.rb
353
- homepage: https://github.com/softlayer/fog-softlayer
360
+ homepage: https://github.com/fog/fog-softlayer
354
361
  licenses:
355
362
  - MIT
356
363
  metadata: {}