fog-softlayer 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. checksums.yaml +8 -8
  2. data/.travis.yml +0 -1
  3. data/CHANGELOG.md +25 -9
  4. data/CONTRIBUTING.md +13 -25
  5. data/CONTRIBUTORS.md +1 -1
  6. data/Rakefile +3 -3
  7. data/examples/compute.md +114 -3
  8. data/examples/network.md +285 -0
  9. data/examples/tags.md +76 -1
  10. data/fog-softlayer.gemspec +2 -3
  11. data/lib/fog/softlayer.rb +2 -0
  12. data/lib/fog/softlayer/compute.rb +16 -73
  13. data/lib/fog/softlayer/core.rb +105 -1
  14. data/lib/fog/softlayer/models/compute/flavor.rb +1 -0
  15. data/lib/fog/softlayer/models/compute/flavors.rb +1 -0
  16. data/lib/fog/softlayer/models/compute/image.rb +1 -0
  17. data/lib/fog/softlayer/models/compute/images.rb +1 -0
  18. data/lib/fog/softlayer/models/compute/server.rb +71 -12
  19. data/lib/fog/softlayer/models/compute/servers.rb +9 -5
  20. data/lib/fog/softlayer/models/compute/tag.rb +5 -6
  21. data/lib/fog/softlayer/models/compute/tags.rb +1 -0
  22. data/lib/fog/softlayer/models/network/datacenter.rb +52 -0
  23. data/lib/fog/softlayer/models/network/datacenters.rb +42 -0
  24. data/lib/fog/softlayer/models/network/ip.rb +67 -0
  25. data/lib/fog/softlayer/models/network/ips.rb +39 -0
  26. data/lib/fog/softlayer/models/network/network.rb +121 -0
  27. data/lib/fog/softlayer/models/network/networks.rb +47 -0
  28. data/lib/fog/softlayer/models/network/subnet.rb +62 -0
  29. data/lib/fog/softlayer/models/network/subnets.rb +33 -0
  30. data/lib/fog/softlayer/models/network/tag.rb +54 -0
  31. data/lib/fog/softlayer/models/network/tags.rb +40 -0
  32. data/lib/fog/softlayer/models/storage/directories.rb +7 -0
  33. data/lib/fog/softlayer/models/storage/directory.rb +7 -0
  34. data/lib/fog/softlayer/models/storage/file.rb +7 -0
  35. data/lib/fog/softlayer/models/storage/files.rb +7 -0
  36. data/lib/fog/softlayer/network.rb +139 -0
  37. data/lib/fog/softlayer/requests/compute/create_bare_metal_server.rb +1 -1
  38. data/lib/fog/softlayer/requests/compute/get_vms.rb +1 -1
  39. data/lib/fog/softlayer/requests/network/create_network.rb +488 -0
  40. data/lib/fog/softlayer/requests/network/create_network_tags.rb +50 -0
  41. data/lib/fog/softlayer/requests/network/delete_network.rb +37 -0
  42. data/lib/fog/softlayer/requests/network/delete_network_tags.rb +46 -0
  43. data/lib/fog/softlayer/requests/network/get_datacenter_routers.rb +41 -0
  44. data/lib/fog/softlayer/requests/network/get_datacenters.rb +30 -0
  45. data/lib/fog/softlayer/requests/network/get_ip_address.rb +28 -0
  46. data/lib/fog/softlayer/requests/network/get_network.rb +34 -0
  47. data/lib/fog/softlayer/requests/network/get_network_tags.rb +47 -0
  48. data/lib/fog/softlayer/requests/network/get_private_vlan_price_code.rb +27 -0
  49. data/lib/fog/softlayer/requests/network/get_public_vlan_price_code.rb +27 -0
  50. data/lib/fog/softlayer/requests/network/get_references_by_tag_name.rb +42 -0
  51. data/lib/fog/softlayer/requests/network/get_subnet.rb +28 -0
  52. data/lib/fog/softlayer/requests/network/get_subnet_package_id.rb +29 -0
  53. data/lib/fog/softlayer/requests/network/get_subnet_price_code.rb +30 -0
  54. data/lib/fog/softlayer/requests/network/list_networks.rb +30 -0
  55. data/lib/fog/softlayer/requests/network/list_subnets.rb +28 -0
  56. data/lib/fog/softlayer/storage.rb +7 -0
  57. data/lib/fog/softlayer/version.rb +2 -1
  58. data/tests/compute/flavors_helper.rb +1 -0
  59. data/tests/compute/server_helper.rb +1 -0
  60. data/tests/compute/servers_helper.rb +1 -0
  61. data/tests/helper.rb +7 -0
  62. data/tests/helpers/collection_helper.rb +7 -0
  63. data/tests/helpers/compute/flavors_helper.rb +7 -0
  64. data/tests/helpers/compute/server_helper.rb +7 -0
  65. data/tests/helpers/compute/servers_helper.rb +7 -0
  66. data/tests/helpers/formats_helper.rb +7 -0
  67. data/tests/helpers/formats_helper_tests.rb +7 -0
  68. data/tests/helpers/mock_helper.rb +7 -0
  69. data/tests/helpers/model_helper.rb +7 -0
  70. data/tests/helpers/responds_to_helper.rb +7 -0
  71. data/tests/helpers/schema_validator_tests.rb +7 -0
  72. data/tests/helpers/succeeds_helper.rb +7 -0
  73. data/tests/softlayer/compute/helper.rb +1 -0
  74. data/tests/softlayer/compute/schema.rb +1 -0
  75. data/tests/softlayer/models/compute/server_tests.rb +31 -4
  76. data/tests/softlayer/requests/compute/bmc_tests.rb +4 -3
  77. data/tests/softlayer/requests/compute/tag_tests.rb +1 -1
  78. data/tests/softlayer/requests/network/network_tests.rb +129 -0
  79. metadata +35 -25
data/examples/tags.md CHANGED
@@ -57,7 +57,7 @@ These examples all assume you have `~/.fog` which contains the following
57
57
  @sl.servers.tagged_with(['foo','bar']) # => [<Fog::Compute::Softlayer::Server>, <Fog::Compute::Softlayer::Server>, ...]
58
58
  ```
59
59
 
60
- 1. List all tags on account.
60
+ 1. List all tags on account that have been assigned to a server.
61
61
 
62
62
  ```ruby
63
63
  @sl.tags.all # => [<Fog::Compute::Softlayer::Tag>, <Fog::Compute::Softlayer::Tag>, ...]
@@ -80,3 +80,78 @@ These examples all assume you have `~/.fog` which contains the following
80
80
  tag = @sl.tags.get(32850)
81
81
  tag.references # => [<Fog::Compute::Softlayer::Server>, <Fog::Compute::Softlayer::Server>, ...]
82
82
  ```
83
+
84
+ #### Create a connection to SoftLayer Network Service
85
+
86
+ ```ruby
87
+ require 'fog/softlayer'
88
+ @sl = Fog::Network[:softlayer]
89
+ ```
90
+
91
+ #### Tags with Networks
92
+
93
+ 1. Add some tags to a network.
94
+
95
+ ```ruby
96
+ net = @sl.networks.get(1234567) # get the network in question
97
+ net.add_tags(['sparkle', 'motion']) # => true
98
+ ```
99
+
100
+ 1. Verify that the tags stuck.
101
+
102
+ ```ruby
103
+ net.tags # => ["sparkle", "motion"]
104
+ ```
105
+
106
+ 1. Remove a tag.
107
+
108
+ ```ruby
109
+ net.tags # => ["sparkle", "motion"]
110
+ net.delete_tags(["sparkle"]) # => true
111
+ net.tags # => ["motion"]
112
+ ```
113
+
114
+ 1. Put it back.
115
+
116
+ ```ruby
117
+ net.tags # => ["motion"]
118
+ net.add_tags(['sparkle']) # => true
119
+ net.tags # => ["sparkle", "motion"]
120
+ ```
121
+
122
+ 1. Get networks tagged by a single tag.
123
+
124
+ ```ruby
125
+ @sl.networks.tagged_with(['foo']) # => [<Fog::Network::Softlayer::Network>, <Fog::Network::Softlayer::Network>, ...]
126
+ ```
127
+
128
+ 1. Get networks tagged by multiple tags (tag OR tag OR ...).
129
+
130
+ ```ruby
131
+ @sl.networks.tagged_with(['foo','bar']) # => [<Fog::Network::Softlayer::Network>, <Fog::Network::Softlayer::Network>, ...]
132
+ ```
133
+
134
+ 1. List all tags on account that have been assigned to a network.
135
+
136
+ ```ruby
137
+ @sl.tags.all # => [<Fog::Network::Softlayer::Network>, <Fog::Network::Softlayer::Network>, ...]
138
+ ```
139
+ 1. Anatomy of a Tag object.
140
+
141
+ ```ruby
142
+ <Fog::Network::Softlayer::Tag
143
+ id=32850, # SoftLayer assigned ID
144
+ name="sparkle", # the tag itself
145
+ referenceCount=2, # number of SL API objects that "have" this tag
146
+ resource_id=nil, # fog-softlayer property used by models
147
+ internal=0 # SoftLayer API flag indicating user assigned (0) or system assigned (1)
148
+ >
149
+ ```
150
+
151
+ 1. Miscellany
152
+
153
+ ```ruby
154
+ tag = @sl.tags.get(32850)
155
+ tag.references # => [<Fog::Network::Softlayer::Network>, <Fog::Network::Softlayer::Network>, ...]
156
+ ```
157
+
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Fog::Softlayer::VERSION
9
9
  spec.authors = ["Matt Eldridge"]
10
10
  spec.email = ["matt.eldridge@us.ibm.com"]
11
- spec.date = '2014-06-05'
11
+ spec.date = '2014-06-26'
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}
@@ -25,7 +25,6 @@ Gem::Specification.new do |spec|
25
25
  spec.add_dependency 'fog-json'
26
26
 
27
27
  spec.add_development_dependency('minitest')
28
- spec.add_development_dependency('jekyll') unless RUBY_PLATFORM == 'java'
29
28
  spec.add_development_dependency('rake')
30
29
  spec.add_development_dependency('rbvmomi')
31
30
  spec.add_development_dependency('yard')
@@ -34,5 +33,5 @@ Gem::Specification.new do |spec|
34
33
  spec.add_development_dependency('shindo', '~> 0.3.4')
35
34
  spec.add_development_dependency('fission')
36
35
  spec.add_development_dependency('pry')
37
- spec.add_development_dependency('google-api-client', '~> 0.6', '>= 0.6.2')
36
+ spec.add_development_dependency('osrcry')
38
37
  end
data/lib/fog/softlayer.rb CHANGED
@@ -4,8 +4,10 @@
4
4
  #
5
5
  # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
6
  #
7
+
7
8
  require 'fog'
8
9
  require 'fog/softlayer'
9
10
  require 'fog/softlayer/compute'
10
11
  require 'fog/softlayer/dns'
12
+ require 'fog/softlayer/network'
11
13
  require 'fog/softlayer/storage'
@@ -57,6 +57,7 @@ module Fog
57
57
  #
58
58
  class Mock
59
59
  attr_accessor :default_domain
60
+ include Fog::Softlayer::Slapi
60
61
  include Fog::Softlayer::Compute::Shared
61
62
  attr_accessor :virtual_guests, :bare_metal_servers
62
63
 
@@ -67,7 +68,7 @@ module Fog
67
68
  super(args)
68
69
  end
69
70
 
70
- def request(method, path, parameters = {})
71
+ def request(method, path, options = {})
71
72
  _request
72
73
  end
73
74
 
@@ -80,7 +81,11 @@ module Fog
80
81
  end
81
82
 
82
83
  def list_servers
83
- (self.get_vms.body << self.get_bare_metal_servers.body).flatten
84
+ vms = self.get_vms.body
85
+ bare_metals = self.get_bare_metal_servers.body
86
+ vms.map! { |server| server['bare_metal'] = false }
87
+ bare_metals.map! { |server| server['bare_metal'] = true }
88
+ (vms << bare_metals).flatten
84
89
  end
85
90
 
86
91
  end
@@ -90,86 +95,24 @@ module Fog
90
95
  #
91
96
  class Real
92
97
  attr_accessor :default_domain
98
+ include Fog::Softlayer::Slapi
93
99
  include Fog::Softlayer::Compute::Shared
94
100
 
95
- # Sends the real request to the real SoftLayer service.
96
- #
97
- # @param [String] service
98
- # ...ayer.com/rest/v3/Softlayer_Service_Name...
99
- # @param path [String]
100
- # ...ayer.com/rest/v3/Softlayer_Service_Name/path.json
101
- # @param [Hash] options
102
- # @option options [Array<Hash>] :body
103
- # HTTP request body parameters
104
- # @option options [String] :softlayer_api_url
105
- # Override the default (or configured) API endpoint
106
- # @option options [String] :softlayer_username
107
- # Email or user identifier for user based authentication
108
- # @option options [String] :softlayer_api_key
109
- # Password for user based authentication
110
- # @return [Excon::Response]
111
- def request(service, path, options={})
112
-
113
- # default HTTP method to get if not passed
114
- http_method = options[:http_method] || :get
115
- # set the target base url
116
- @request_url = options[:softlayer_api_url] || Fog::Softlayer::SL_API_URL
117
- # tack on the username and password
118
- credentialize_url(@credentials[:username], @credentials[:api_key])
119
- # set the SoftLayer Service name
120
- set_sl_service(service)
121
- # set the request path (known as the "method" in SL docs)
122
- set_sl_path(path)
123
- # set the query params if any
124
-
125
-
126
- # build request params
127
- params = { :headers => user_agent_header }
128
- params[:headers]['Content-Type'] = 'application/json'
129
- params[:expects] = options[:expected] || [200,201]
130
- params[:body] = Fog::JSON.encode({:parameters => [ options[:body] ]}) unless options[:body].nil?
131
- params[:query] = options[:query] unless options[:query].nil?
132
-
133
- # initialize connection object
134
- @connection = Fog::Core::Connection.new(@request_url, false, params)
135
-
136
- # send it
137
- response = @connection.request(:method => http_method)
138
-
139
- # decode it
140
- response.body = Fog::JSON.decode(response.body)
141
- response
101
+ def initialize(options={})
102
+ @softlayer_api_key = options[:softlayer_api_key]
103
+ @softlayer_username = options[:softlayer_username]
142
104
  end
143
105
 
144
- def list_servers
145
- (self.get_vms.body << self.get_bare_metal_servers.body.map {|s| s['bare_metal'] = true; s}).flatten
106
+ def request(service, path, options = {})
107
+ options = {:username => @softlayer_username, :api_key => @softlayer_api_key}.merge(options)
108
+ Fog::Softlayer::Slapi.slapi_request(service, path, options)
146
109
  end
147
110
 
148
- private
149
-
150
- def credentialize_url(username, apikey)
151
- @request_url = "https://#{username}:#{apikey}@#{@request_url}"
152
- end
153
111
 
154
- ##
155
- # Prepend "SoftLayer_" to the service name and Snake_Camel_Case the string before appending it to the @request_url.
156
- #
157
- def set_sl_service(service)
158
- service = "SoftLayer_" << service.to_s.gsub(/^softlayer_/i, '').split('_').map{|i|i.capitalize}.join('_')
159
- @request_url += "/#{service}"
160
- end
161
-
162
- ##
163
- # Try to smallCamelCase the path before appending it to the @request_url
164
- #
165
- def set_sl_path(path)
166
- path = path.to_s.underscore.camelize
167
- @request_url += "/#{path}.json"
112
+ def list_servers
113
+ (self.get_vms.body.map {|s| s['bare_metal'] = false; s } << self.get_bare_metal_servers.body.map {|s| s['bare_metal'] = true; s}).flatten
168
114
  end
169
115
 
170
- def user_agent_header
171
- {"User-Agent" => "Fog SoftLayer Adapter #{Fog::Softlayer::VERSION}"}
172
- end
173
116
 
174
117
  end
175
118
 
@@ -4,6 +4,7 @@
4
4
  #
5
5
  # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
6
  #
7
+
7
8
  require 'fog/core'
8
9
  require 'fog/json'
9
10
  require 'fog/softlayer/version'
@@ -11,13 +12,95 @@ require 'time'
11
12
 
12
13
  module Fog
13
14
  module Softlayer
14
- extend Fog::Provider
15
15
 
16
+ module Slapi
17
+
18
+ # Sends the real request to the real SoftLayer service.
19
+ #
20
+ # @param [String] service
21
+ # ...ayer.com/rest/v3/Softlayer_Service_Name...
22
+ # @param path [String]
23
+ # ...ayer.com/rest/v3/Softlayer_Service_Name/path.json
24
+ # @param [Hash] options
25
+ # @option options [Array<Hash>] :body
26
+ # HTTP request body parameters
27
+ # @option options [String] :softlayer_api_url
28
+ # Override the default (or configured) API endpoint
29
+ # @option options [String] :softlayer_username
30
+ # Email or user identifier for user based authentication
31
+ # @option options [String] :softlayer_api_key
32
+ # Password for user based authentication
33
+ # @return [Excon::Response]
34
+ def self.slapi_request(service, path, options)
35
+ # default HTTP method to get if not passed
36
+ http_method = options[:http_method] || :get
37
+ # set the target base url
38
+ @request_url = options[:softlayer_api_url] || Fog::Softlayer::SL_API_URL
39
+ # tack on the username and password
40
+ credentialize_url(options[:username], options[:api_key])
41
+ # set the SoftLayer Service name
42
+ set_sl_service(service)
43
+ # set the request path (known as the "method" in SL docs)
44
+ set_sl_path(path)
45
+ # set the query params if any
46
+
47
+
48
+ # build request params
49
+ params = { :headers => user_agent_header }
50
+ params[:headers]['Content-Type'] = 'application/json'
51
+ params[:expects] = options[:expected] || [200,201]
52
+ params[:body] = Fog::JSON.encode({:parameters => [ options[:body] ]}) unless options[:body].nil?
53
+ params[:query] = options[:query] unless options[:query].nil?
54
+
55
+ # initialize connection object
56
+ @connection = Fog::Core::Connection.new(@request_url, false, params)
57
+
58
+ # send it
59
+ response = @connection.request(:method => http_method)
60
+
61
+ # decode it
62
+ response.body = Fog::JSON.decode(response.body)
63
+ response
64
+ end
65
+
66
+ private
67
+
68
+ def self.credentialize_url(username, apikey)
69
+ @request_url = "https://#{username}:#{apikey}@#{@request_url}"
70
+ end
71
+
72
+ ##
73
+ # Prepend "SoftLayer_" to the service name and Snake_Camel_Case the string before appending it to the @request_url.
74
+ #
75
+ def self.set_sl_service(service)
76
+ service = "SoftLayer_" << service.to_s.gsub(/^softlayer_/i, '').split('_').map{|i|i.capitalize}.join('_')
77
+ service.fix_convention_exceptions
78
+ @request_url += "/#{service}"
79
+ end
80
+
81
+ ##
82
+ # Try to smallCamelCase the path before appending it to the @request_url
83
+ #
84
+ def self.set_sl_path(path)
85
+ path = path.to_s.underscore.camelize
86
+ path.fix_convention_exceptions
87
+ @request_url += "/#{path}.json"
88
+ end
89
+
90
+ def self.user_agent_header
91
+ {"User-Agent" => "Fog SoftLayer Adapter #{Fog::Softlayer::VERSION}"}
92
+ end
93
+
94
+ end
95
+
96
+
97
+ extend Fog::Provider
16
98
  SL_API_URL = 'api.softlayer.com/rest/v3' unless defined? SL_API_URL
17
99
  SL_STORAGE_AUTH_URL = 'objectstorage.softlayer.net/auth/v1.0' unless defined? SL_STORAGE_AUTH_URL
18
100
 
19
101
  service(:compute, 'Compute')
20
102
  service(:dns, 'DNS')
103
+ service(:network, 'Network')
21
104
  service(:storage, 'Storage')
22
105
 
23
106
  def self.mock_account_id
@@ -49,6 +132,7 @@ module Fog
49
132
  obj
50
133
  end
51
134
  end
135
+
52
136
  end
53
137
 
54
138
  class Hash
@@ -57,3 +141,23 @@ class Hash
57
141
  self.merge(second, &merger)
58
142
  end
59
143
  end
144
+
145
+ ## some helpers for some dirty work
146
+ class String
147
+ def camelize
148
+ self.split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
149
+ end
150
+
151
+ def fix_convention_exceptions
152
+ self.gsub!(/ipaddress/i, 'IpAddress') # SLAPI WHY U No Follow Own Convention!?
153
+ end
154
+
155
+ def underscore
156
+ self.gsub(/::/, '/').
157
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
158
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
159
+ tr("-", "_").
160
+ downcase
161
+ end
162
+ end
163
+
@@ -4,6 +4,7 @@
4
4
  #
5
5
  # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
6
  #
7
+
7
8
  require 'fog/core/model'
8
9
 
9
10
  module Fog
@@ -4,6 +4,7 @@
4
4
  #
5
5
  # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
6
  #
7
+
7
8
  require 'fog/core/collection'
8
9
  require 'fog/softlayer/models/compute/flavor'
9
10
 
@@ -4,6 +4,7 @@
4
4
  #
5
5
  # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
6
  #
7
+
7
8
  require 'fog/core/model'
8
9
 
9
10
  module Fog
@@ -4,6 +4,7 @@
4
4
  #
5
5
  # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
6
  #
7
+
7
8
  require 'fog/core/collection'
8
9
  require 'fog/softlayer/models/compute/image'
9
10
 
@@ -4,6 +4,7 @@
4
4
  #
5
5
  # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
6
  #
7
+
7
8
  require 'fog/compute/models/server'
8
9
 
9
10
  module Fog
@@ -43,6 +44,8 @@ module Fog
43
44
  attribute :tags, :aliases => 'tagReferences'
44
45
 
45
46
  def initialize(attributes = {})
47
+ # Forces every request inject bare_metal parameter
48
+ raise Exception if attributes[:collection].nil? and attributes['bare_metal'].nil?
46
49
  super(attributes)
47
50
  set_defaults
48
51
  end
@@ -60,18 +63,9 @@ module Fog
60
63
  def bare_metal?
61
64
  bare_metal
62
65
  end
63
-
64
- def bare_metal=(set)
65
- attributes[:bare_metal] = case set
66
- when false, 'false', 0, nil, ''
67
- 0
68
- else
69
- 1
70
- end
71
- end
72
-
66
+
73
67
  def bare_metal
74
- attributes[:bare_metal] === 1 ? true : false
68
+ @bare_metal
75
69
  end
76
70
 
77
71
  def datacenter=(name)
@@ -123,10 +117,40 @@ module Fog
123
117
  def pre_save
124
118
  extract_flavor
125
119
  validate_attributes
120
+ if self.vlan
121
+ attributes[:vlan] = { :networkVlan => { :id => self.vlan.id } }
122
+ end
123
+ if self.private_vlan
124
+ attributes[:private_vlan] = { :networkVlan => { :id => self.private_vlan.id } }
125
+ end
126
126
  remap_attributes(attributes, attributes_mapping)
127
127
  clean_attributes
128
128
  end
129
129
 
130
+ def vlan
131
+ attributes[:vlan] ||= _get_vlan
132
+ end
133
+
134
+ def private_vlan
135
+ attributes[:private_vlan] ||= _get_private_vlan
136
+ end
137
+
138
+ def vlan=(value)
139
+ unless value.is_a?(Integer) or value.is_a?(Fog::Network::Softlayer::Network)
140
+ raise ArgumentError, "vlan argument for #{self.class.name}##{__method__} must be Integer or Fog::Network::Softlayer::Network."
141
+ end
142
+ value = Fog::Network[:softlayer].networks.get(value) if value.is_a?(Integer)
143
+ attributes[:vlan] = value
144
+ end
145
+
146
+ def private_vlan=(value)
147
+ unless value.is_a?(Integer) or value.is_a?(Fog::Network::Softlayer::Network)
148
+ raise ArgumentError, "vlan argument for #{self.class.name}##{__method__} must be Integer or Fog::Network::Softlayer::Network."
149
+ end
150
+ value = Fog::Network[:softlayer].networks.get(value) if value.is_a?(Integer)
151
+ attributes[:private_vlan] = value
152
+ end
153
+
130
154
  def ram=(set)
131
155
  if set.is_a?(Array) and set.first['hardwareComponentModel']
132
156
  set = 1024 * set.first['hardwareComponentModel']['capacity'].to_i
@@ -198,6 +222,7 @@ module Fog
198
222
  service.create_vm(copy.attributes).body.first
199
223
  end
200
224
 
225
+ data.delete("bare_metal")
201
226
  merge_attributes(data)
202
227
  true
203
228
  end
@@ -208,12 +233,36 @@ module Fog
208
233
 
209
234
  private
210
235
 
236
+ def _get_private_vlan
237
+ if self.id
238
+ vlan_id = if bare_metal?
239
+ service.request(:hardware_server, "#{self.id}/get_private_vlan").body['id']
240
+ else
241
+ service.request(:virtual_guest, self.id, :query => 'objectMask=primaryBackendNetworkComponent.networkVlan').body['primaryBackendNetworkComponent']['networkVlan']['id']
242
+ end
243
+ Fog::Network[:softlayer].networks.get(vlan_id)
244
+ end
245
+ end
246
+
247
+ def _get_vlan
248
+ if self.id
249
+ vlan_id = if bare_metal?
250
+ service.request(:hardware_server, "#{self.id}/get_public_vlan").body['id']
251
+ else
252
+ service.request(:virtual_guest, self.id, :query => 'objectMask=primaryNetworkComponent.networkVlan').body['primaryNetworkComponent']['networkVlan']['id']
253
+ end
254
+ Fog::Network[:softlayer].networks.get(vlan_id)
255
+ end
256
+ end
257
+
211
258
  ##
212
259
  # Generate mapping for use with remap_attributes
213
260
  def attributes_mapping
214
261
  common = {
215
262
  :hourly_billing_flag => :hourlyBillingFlag,
216
263
  :os_code => :operatingSystemReferenceCode,
264
+ :vlan => :primaryNetworkComponent,
265
+ :private_vlan => :primaryBackendNetworkComponent,
217
266
 
218
267
  }
219
268
 
@@ -236,10 +285,20 @@ module Fog
236
285
  common.merge(conditional)
237
286
  end
238
287
 
288
+ def bare_metal=(set)
289
+ raise Exception, "Bare metal flag has already been set" unless @bare_metal.nil?
290
+ @bare_metal = case set
291
+ when false, 'false', 0, nil, ''
292
+ false
293
+ else
294
+ true
295
+ end
296
+ end
297
+
239
298
  ##
240
299
  # Remove model attributes that aren't expected by the SoftLayer API
241
300
  def clean_attributes
242
- @bare_metal = attributes.delete(:bare_metal)
301
+ attributes.delete(:bare_metal)
243
302
  attributes.delete(:flavor_id)
244
303
  attributes.delete(:ephemeral_storage)
245
304
  end