fog-softlayer 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. checksums.yaml +8 -8
  2. data/examples/tags.md +82 -0
  3. data/lib/fog/softlayer/compute.rb +13 -1
  4. data/lib/fog/softlayer/core.rb +6 -0
  5. data/lib/fog/softlayer/models/compute/server.rb +61 -48
  6. data/lib/fog/softlayer/models/compute/servers.rb +14 -5
  7. data/lib/fog/softlayer/models/compute/tag.rb +72 -0
  8. data/lib/fog/softlayer/models/compute/tags.rb +40 -0
  9. data/lib/fog/softlayer/requests/compute/create_bare_metal_server.rb +17 -17
  10. data/lib/fog/softlayer/requests/compute/create_bare_metal_tags.rb +50 -0
  11. data/lib/fog/softlayer/requests/compute/create_vm_tags.rb +50 -0
  12. data/lib/fog/softlayer/requests/compute/create_vms.rb +23 -22
  13. data/lib/fog/softlayer/requests/compute/delete_bare_metal_tags.rb +46 -0
  14. data/lib/fog/softlayer/requests/compute/delete_vm_tags.rb +46 -0
  15. data/lib/fog/softlayer/requests/compute/describe_tags.rb +30 -0
  16. data/lib/fog/softlayer/requests/compute/get_bare_metal_server.rb +9 -3
  17. data/lib/fog/softlayer/requests/compute/get_bare_metal_servers.rb +1 -1
  18. data/lib/fog/softlayer/requests/compute/get_bare_metal_tags.rb +47 -0
  19. data/lib/fog/softlayer/requests/compute/get_references_by_tag_name.rb +42 -0
  20. data/lib/fog/softlayer/requests/compute/get_tag.rb +27 -0
  21. data/lib/fog/softlayer/requests/compute/get_vm.rb +9 -3
  22. data/lib/fog/softlayer/requests/compute/get_vm_tags.rb +47 -0
  23. data/lib/fog/softlayer/requests/compute/get_vms.rb +1 -1
  24. data/lib/fog/softlayer/version.rb +1 -1
  25. data/tests/softlayer/compute/schema.rb +22 -0
  26. data/tests/softlayer/requests/compute/tag_tests.rb +92 -0
  27. metadata +14 -1
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- M2M4MGM2NTNkMTQ2M2UwZGUxZDU1MjBmZjJiZTIxY2ZkNzU3MWEyYg==
4
+ ODBkZjA5MDMwN2UzM2FlOGJiMmNkYjhmZTkxMGRkNGYwNmFkNDllYg==
5
5
  data.tar.gz: !binary |-
6
- MjEwY2EzZmE4YTEwOTYyOTEyNTVjNDY0ODVhM2ExN2VkZGY1NTQzMQ==
6
+ ZDk5ZjI0ZDE2YTA5OWQyN2RhYzNkNDY5OTYzMDFiYWQ2MzJmNWIxOA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZDRkN2ZmZmE1YWFmNGZmYWY5Yzk1ZjZlOTVkNWQ4MTVmMzkyNzYyOWJkYWY1
10
- NzMxMzFkYzU1YTc5Y2IwMzM1M2YzZDhiMDc1YjU5NWY1ZjU1ZmEzNGQ5MTg3
11
- MTYyYjlmMmEwY2Q4ZjY5NTM1MGUyZDliZDM0ZTJiZWNiOWE2NDU=
9
+ ODA5NzljZTFlNDZmMjUxYTJiZjI5ZjIzYjViZGY0YmE4M2RjMzRhNmE4MGQ1
10
+ NGVjY2E3ZTc2YzI0YjQxMWJkNjgxNDc4ODRjMWYwN2Y0NzE4MjM3Zjg2YWEx
11
+ NGE0OTNhYmVmOTI4MzkwMTNhZTk4NGZkMTdmZjJjNjgzMTBkM2E=
12
12
  data.tar.gz: !binary |-
13
- N2NmN2YyNjUyZjUyZjhjNzBlNDZjYzM2MTQ0MzdlYjdkODA3YzYwMDJmMDE0
14
- NDAyZjQ3NTdmYTM0NzYzNDgyNWFmYjUzZjE3NjM2Y2JiMmJmM2FmZTAwNjcw
15
- MzgxOGVjZTRkMTBhOTg2MTkyYWY2ZDljNjlhNDU0ODdlZmY4ZDY=
13
+ NmYyN2ZhOGI2Mjg4YjQ5ZTdmOGNjMWViYzgxZWY0ZWM1Y2FmZmI0NGJiNWVk
14
+ YmI1ZTc5NjUxMDcxODM0ZWU0OWQzYTQwNWJkMjc2OGY3YmI5MjUwM2I0MGYw
15
+ YjBmYWE2MzBiNDIxOTk2MzZjMzRjZmYyMTExOWIzM2RhNzQxODA=
@@ -0,0 +1,82 @@
1
+ ### Tags Examples
2
+
3
+ These examples all assume you have `~/.fog` which contains the following
4
+
5
+ ```yaml
6
+ :softlayer_username: example-username
7
+ :softlayer_api_key: 1a1a1a1a1a1a1a1a1a11a1a1a1a1a1a1a1a1a1
8
+ :softlayer_default_domain: example.com
9
+ ```
10
+
11
+ #### Create a connection to SoftLayer Compute Service
12
+
13
+ ```ruby
14
+ require 'fog/softlayer'
15
+ @sl = Fog::Compute[:softlayer]
16
+ ```
17
+
18
+ #### Tags with Servers
19
+ 1. Add some tags to a server.
20
+
21
+ ```ruby
22
+ server = @sl.servers.get(1234567) # get the server in question
23
+ server.add_tags(['sparkle', 'motion']) # => true
24
+ ```
25
+
26
+ 1. Verify that the tags stuck.
27
+
28
+ ```ruby
29
+ server.tags # => ["sparkle", "motion"]
30
+ ```
31
+
32
+ 1. Remove a tag.
33
+
34
+ ```ruby
35
+ server.tags # => ["sparkle", "motion"]
36
+ server.delete_tags(["sparkle"]) # => true
37
+ server.tags # => ["motion"]
38
+ ```
39
+
40
+ 1. Put it back.
41
+
42
+ ```ruby
43
+ server.tags # => ["motion"]
44
+ server.add_tags(['sparkle']) # => true
45
+ server.tags # => ["sparkle", "motion"]
46
+ ```
47
+
48
+ 1. Get servers tagged by a single tag.
49
+
50
+ ```ruby
51
+ @sl.servers.tagged_with(['foo']) # => [<Fog::Compute::Softlayer::Server>, <Fog::Compute::Softlayer::Server>, ...]
52
+ ```
53
+
54
+ 1. Get servers tagged by multiple tags (tag OR tag OR ...).
55
+
56
+ ```ruby
57
+ @sl.servers.tagged_with(['foo','bar']) # => [<Fog::Compute::Softlayer::Server>, <Fog::Compute::Softlayer::Server>, ...]
58
+ ```
59
+
60
+ 1. List all tags on account.
61
+
62
+ ```ruby
63
+ @sl.tags.all # => [<Fog::Compute::Softlayer::Tag>, <Fog::Compute::Softlayer::Tag>, ...]
64
+ ```
65
+ 1. Anatomy of a Tag object.
66
+
67
+ ```ruby
68
+ <Fog::Compute::Softlayer::Tag
69
+ id=32850, # SoftLayer assigned ID
70
+ name="sparkle", # the tag itself
71
+ referenceCount=2, # number of SL API objects that "have" this tag
72
+ resource_id=nil, # fog-softlayer property used by models
73
+ internal=0 # SoftLayer API flag indicating user assigned (0) or system assigned (1)
74
+ >
75
+ ```
76
+
77
+ 1. Miscellany
78
+
79
+ ```ruby
80
+ tag = @sl.tags.get(32850)
81
+ tag.references # => [<Fog::Compute::Softlayer::Server>, <Fog::Compute::Softlayer::Server>, ...]
82
+ ```
@@ -28,15 +28,26 @@ module Fog
28
28
  model :image
29
29
  collection :servers
30
30
  model :server
31
+ collection :tags
32
+ model :tag
31
33
 
32
34
  request_path 'fog/softlayer/requests/compute'
33
35
  request :create_bare_metal_server
36
+ request :create_bare_metal_tags
34
37
  request :create_vm
35
38
  request :create_vms
39
+ request :create_vm_tags
36
40
  request :delete_bare_metal_server
41
+ request :delete_bare_metal_tags
37
42
  request :delete_vm
43
+ request :delete_vm_tags
44
+ request :describe_tags
38
45
  request :get_bare_metal_server
39
46
  request :get_bare_metal_servers
47
+ request :get_bare_metal_tags
48
+ request :get_references_by_tag_name
49
+ request :get_tag
50
+ request :get_vm_tags
40
51
  request :get_vm
41
52
  request :get_vms
42
53
 
@@ -52,6 +63,7 @@ module Fog
52
63
  def initialize(args)
53
64
  @virtual_guests = []
54
65
  @bare_metal_servers = []
66
+ @tags = []
55
67
  super(args)
56
68
  end
57
69
 
@@ -130,7 +142,7 @@ module Fog
130
142
  end
131
143
 
132
144
  def list_servers
133
- (self.get_vms.body << self.get_bare_metal_servers.body).flatten
145
+ (self.get_vms.body << self.get_bare_metal_servers.body.map {|s| s['bare_metal'] = true; s}).flatten
134
146
  end
135
147
 
136
148
  private
@@ -42,6 +42,12 @@ module Fog
42
42
  '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
43
43
  end
44
44
  end
45
+
46
+ def self.stringify_keys(obj)
47
+ return obj.inject({}){|memo,(k,v)| memo[k.to_s] = stringify_keys(v); memo} if obj.is_a? Hash
48
+ return obj.inject([]){|memo,v | memo << stringify_keys(v); memo} if obj.is_a? Array
49
+ obj
50
+ end
45
51
  end
46
52
  end
47
53
 
@@ -22,7 +22,7 @@ module Fog
22
22
  attribute :private_ip, :aliases => 'primaryBackendIpAddress'
23
23
  attribute :public_ip, :aliases => 'primaryIpAddress'
24
24
  attribute :flavor_id
25
- attribute :bare_metal, :aliases => 'bareMetalInstanceFlag'
25
+ attribute :bare_metal, :type => :boolean
26
26
  attribute :os_code, :aliases => 'operatingSystemReferenceCode'
27
27
  attribute :image_id, :type => :squash
28
28
  attribute :ephemeral_storage, :aliases => 'localDiskFlag'
@@ -40,25 +40,33 @@ module Fog
40
40
  attribute :single_tenant, :aliases => 'dedicatedAccountHostOnlyFlag'
41
41
  attribute :global_identifier, :aliases => 'globalIdentifier'
42
42
  attribute :hourly_billing_flag, :aliases => 'hourlyBillingFlag'
43
-
43
+ attribute :tags, :aliases => 'tagReferences'
44
44
 
45
45
  def initialize(attributes = {})
46
46
  super(attributes)
47
47
  set_defaults
48
48
  end
49
49
 
50
+ def add_tags(tags)
51
+ requires :id
52
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
53
+ tags.each do |tag|
54
+ service.tags.new(:resource_id => self.id, :name => tag).save
55
+ end
56
+ self.reload
57
+ true
58
+ end
59
+
50
60
  def bare_metal?
51
61
  bare_metal
52
62
  end
53
63
 
54
64
  def bare_metal=(set)
55
65
  attributes[:bare_metal] = case set
56
- when true, 'true', 1
57
- 1
58
- when false, 'false', 0, nil
66
+ when false, 'false', 0, nil, ''
59
67
  0
60
68
  else
61
- raise ArgumentError, ":bare_metal cannot be #{set.class}"
69
+ 1
62
70
  end
63
71
  end
64
72
 
@@ -75,6 +83,27 @@ module Fog
75
83
  attributes[:datacenter][:name] unless attributes[:datacenter].nil?
76
84
  end
77
85
 
86
+ def delete_tags(tags)
87
+ requires :id
88
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
89
+ tags.each do |tag|
90
+ service.tags.new(:resource_id => self.id, :name => tag).destroy
91
+ end
92
+ self.reload
93
+ true
94
+ end
95
+
96
+ def destroy
97
+ requires :id
98
+ request = bare_metal? ? :delete_bare_metal_server : :delete_vm
99
+ response = service.send(request, self.id)
100
+ response.body
101
+ end
102
+
103
+ def dns_name
104
+ fqdn
105
+ end
106
+
78
107
  def image_id=(uuid)
79
108
  attributes[:image_id] = {:globalIdentifier => uuid}
80
109
  end
@@ -83,8 +112,19 @@ module Fog
83
112
  attributes[:image_id][:globalIdentifier] unless attributes[:image_id].nil?
84
113
  end
85
114
 
86
- def ssh_password
87
- self.os['passwords'][0]['password'] if self.id
115
+ def name=(set)
116
+ attributes[:hostname] = set
117
+ end
118
+
119
+ def name
120
+ attributes[:hostname]
121
+ end
122
+
123
+ def pre_save
124
+ extract_flavor
125
+ validate_attributes
126
+ remap_attributes(attributes, attributes_mapping)
127
+ clean_attributes
88
128
  end
89
129
 
90
130
  def ram=(set)
@@ -94,23 +134,23 @@ module Fog
94
134
  attributes[:ram] = set
95
135
  end
96
136
 
97
- def name=(set)
98
- attributes[:hostname] = set
137
+ def ready?
138
+ if bare_metal?
139
+ state == "on"
140
+ else
141
+ state == "Running"
142
+ end
99
143
  end
100
144
 
101
- def name
102
- attributes[:hostname]
145
+ def reboot(use_hard_reboot = true)
146
+ # TODO: implement
103
147
  end
104
148
 
105
- #def ram
106
- #
107
- #end
108
-
109
- def snapshot
110
- # TODO: implement
149
+ def ssh_password
150
+ self.os['passwords'][0]['password'] if self.id
111
151
  end
112
152
 
113
- def reboot(use_hard_reboot = true)
153
+ def snapshot
114
154
  # TODO: implement
115
155
  end
116
156
 
@@ -130,36 +170,12 @@ module Fog
130
170
  # TODO: implement
131
171
  end
132
172
 
133
- def destroy
134
- requires :id
135
- request = bare_metal? ? :delete_bare_metal_server : :delete_vm
136
- response = service.send(request, self.id)
137
- response.body
138
- end
139
-
140
- # Returns the public DNS name of the server
141
- #
142
- # @return [String]
143
- #
144
- def dns_name
145
- fqdn
146
- end
147
-
148
173
  def state
149
174
  if bare_metal?
150
175
  service.request(:hardware_server, "#{id}/getServerPowerState").body
151
176
  else
152
177
  service.request(:virtual_guest, "#{id}/getPowerState").body['name']
153
178
  end
154
-
155
- end
156
-
157
- def ready?
158
- if bare_metal?
159
- state == "on"
160
- else
161
- state == "Running"
162
- end
163
179
  end
164
180
 
165
181
  # Creates server
@@ -186,11 +202,8 @@ module Fog
186
202
  true
187
203
  end
188
204
 
189
- def pre_save
190
- extract_flavor
191
- validate_attributes
192
- remap_attributes(attributes, attributes_mapping)
193
- clean_attributes
205
+ def tags
206
+ attributes[:tags].map { |i| i['tag']['name'] } if attributes[:tags]
194
207
  end
195
208
 
196
209
  private
@@ -22,11 +22,12 @@ module Fog
22
22
 
23
23
  ## Get a SoftLayer server.
24
24
  #
25
- def get(identifier)
26
- return nil if identifier.nil? || identifier == ""
27
- response = service.get_vm(identifier)
25
+ def get(id)
26
+ return nil if id.nil? || id == ""
27
+ response = service.get_vm(id)
28
28
  if response.status == 404 # we didn't find it as a VM, look for a BMC server
29
- response = service.get_bare_metal_server(identifier)
29
+ response = service.get_bare_metal_server(id)
30
+ response.body['bare_metal'] = true
30
31
  end
31
32
  data = response.body
32
33
  new.merge_attributes(data)
@@ -40,8 +41,16 @@ module Fog
40
41
  server
41
42
  end
42
43
 
44
+ def tagged_with(tags)
45
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
46
+ ids = service.get_references_by_tag_name(tags.join(',')).body.map do |tag|
47
+ tag['references'].map do |ref|
48
+ ref['resourceTableId']
49
+ end
50
+ end.flatten.uniq
51
+ ids.map { |id| get(id) }
52
+ end
43
53
  end
44
-
45
54
  end
46
55
  end
47
56
  end
@@ -0,0 +1,72 @@
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
+ require 'fog/core/model'
8
+
9
+ module Fog
10
+ module Compute
11
+ class Softlayer
12
+ class Tag < Fog::Model
13
+ identity :id
14
+
15
+ attribute :name
16
+ attribute :referenceCount, :type => :integer
17
+ attribute :resource_id
18
+ attribute :internal, :type => :boolean
19
+
20
+ def initialize(attributes = {})
21
+ super
22
+ end
23
+
24
+ def destroy
25
+ requires :name, :resource_id
26
+ load_server
27
+ @server.bare_metal? ? destroy_bare_metal_tag : destroy_vm_tag
28
+ true
29
+ end
30
+
31
+ def references
32
+ service.get_tag(self.id).body['references'].map do |ref|
33
+ @refs ||= case ref['tagType']['keyName']
34
+ when 'GUEST', 'HARDWARE'
35
+ @servers ||= service.servers.get(ref['resourceTableId'])
36
+ end
37
+ end
38
+ end
39
+
40
+ def save
41
+ requires :name, :resource_id
42
+ load_server
43
+ @server.bare_metal? ? add_bare_metal_tag : add_vm_tag
44
+ true
45
+ end
46
+
47
+ private
48
+
49
+ def add_bare_metal_tag
50
+ service.create_bare_metal_tags(@server.id, @server.tags << self.name)
51
+ end
52
+
53
+ def add_vm_tag
54
+ service.create_vm_tags(@server.id, @server.tags << self.name)
55
+ end
56
+
57
+ def destroy_bare_metal_tag
58
+ service.delete_bare_metal_tags(@server.id, [self.name])
59
+ end
60
+
61
+ def destroy_vm_tag
62
+ service.delete_vm_tags(@server.id, [self.name])
63
+ end
64
+
65
+ def load_server
66
+ requires :resource_id
67
+ @server ||= service.servers.get(self.resource_id)
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,40 @@
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
+ require 'fog/core/collection'
8
+ require 'fog/softlayer/models/compute/tag'
9
+
10
+ module Fog
11
+ module Compute
12
+ class Softlayer
13
+ class Tags < Fog::Collection
14
+ attribute :filters
15
+
16
+ model Fog::Compute::Softlayer::Tag
17
+
18
+ def initialize(attributes)
19
+ self.filters ||= []
20
+ super
21
+ end
22
+
23
+ def all(filters = filters)
24
+ raise ArgumentError, "Filters argument for #{self.class.name}##{__method__} must be Array." unless filters.is_a?(Array)
25
+ self.filters = filters
26
+ data = service.describe_tags.body
27
+ data.select! { |tag| filters.include?(tag) } unless filters.empty?
28
+ load(data)
29
+ end
30
+
31
+ def get(id)
32
+ return nil if id.nil? || id == ""
33
+ response = service.get_tag(id)
34
+ data = response.body
35
+ new.merge_attributes(data)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -42,23 +42,23 @@ module Fog
42
42
  response.status = 200
43
43
  # a real response comes back with lots of nil values like this too, it takes 1 - 2 hours for a real BMC server to provision
44
44
  response.body = {
45
- "accountId" => Fog::Softlayer.mock_account_id,
46
- "createDate" => Time.now.iso8601,
47
- "dedicatedAccountHostOnlyFlag" => false,
48
- "domain" => nil,
49
- "fullyQualifiedDomainName" => nil,
50
- "hostname" => nil,
51
- "id" => Fog::Softlayer.mock_vm_id,
52
- "lastPowerStateId" => nil,
53
- "lastVerifiedDate" => nil,
54
- "maxCpu" => nil,
55
- "maxCpuUnits" => "CORE",
56
- "maxMemory" => nil,
57
- "metricPollDate" => nil,
58
- "modifyDate" => nil,
59
- "startCpus" => nil,
60
- "statusId" => 1001,
61
- "globalIdentifier" => Fog::Softlayer.mock_global_identifier
45
+ 'accountId' => Fog::Softlayer.mock_account_id,
46
+ 'createDate' => Time.now.iso8601,
47
+ 'dedicatedAccountHostOnlyFlag' => false,
48
+ 'domain' => nil,
49
+ 'fullyQualifiedDomainName' => nil,
50
+ 'hostname' => nil,
51
+ 'id' => Fog::Softlayer.mock_vm_id,
52
+ 'lastPowerStateId' => nil,
53
+ 'lastVerifiedDate' => nil,
54
+ 'maxCpu' => nil,
55
+ 'maxCpuUnits' => "CORE",
56
+ 'maxMemory' => nil,
57
+ 'metricPollDate' => nil,
58
+ 'modifyDate' => nil,
59
+ 'startCpus' => nil,
60
+ 'statusId' => 1001,
61
+ 'globalIdentifier' => Fog::Softlayer.mock_global_identifier
62
62
  }
63
63
  rescue MissingRequiredParameter
64
64
  response.status = 500
@@ -0,0 +1,50 @@
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 Compute
10
+ class Softlayer
11
+
12
+ class Mock
13
+ def create_bare_metal_tags(id, tags = [])
14
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
15
+ response = Excon::Response.new
16
+ response.status = self.get_bare_metal_server(id).status
17
+
18
+ if response.status != 404
19
+ tags.each do |tag|
20
+ @tags << {
21
+ 'empRecordId'=>nil,
22
+ 'id'=>Fog::Mock.random_numbers(7),
23
+ 'resourceTableId'=>id,
24
+ 'tagId'=> tagId = Fog::Mock.random_numbers(5),
25
+ 'tagTypeId'=>1,
26
+ 'usrRecordId'=>123456,
27
+ 'tag'=>{'accountId'=>987654, 'id'=>tagId, 'internal'=>0, 'name'=>tag},
28
+ 'tagType'=>{'description'=>'Hardware', 'keyName'=>'HARDWARE'}
29
+ }
30
+ end
31
+ response.body = true
32
+ else
33
+ response.body = {
34
+ "error"=>"Unable to find object with id of '#{id}'.",
35
+ "code"=>"SoftLayer_Exception_ObjectNotFound"
36
+ }
37
+ end
38
+ response
39
+ end
40
+ end
41
+
42
+ class Real
43
+ def create_bare_metal_tags(id, tags = [])
44
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
45
+ self.request(:hardware_server, "#{id}/set_tags", :body => tags.join(','), :http_method => :post)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,50 @@
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 Compute
10
+ class Softlayer
11
+
12
+ class Mock
13
+ def create_vm_tags(id, tags = [])
14
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
15
+ response = Excon::Response.new
16
+ response.status = self.get_vm(id).status
17
+
18
+ if response.status != 404
19
+ tags.each do |tag|
20
+ @tags << {
21
+ 'empRecordId'=>nil,
22
+ 'id'=>Fog::Mock.random_numbers(7),
23
+ 'resourceTableId'=>id,
24
+ 'tagId'=> tagId = Fog::Mock.random_numbers(5),
25
+ 'tagTypeId'=>1,
26
+ 'usrRecordId'=>123456,
27
+ 'tag'=>{'accountId'=>987654, 'id'=>tagId, 'internal'=>0, 'name'=>tag},
28
+ 'tagType'=>{'description'=>'CCI', 'keyName'=>'GUEST'}
29
+ }
30
+ end
31
+ response.body = true
32
+ else
33
+ response.body = {
34
+ "error"=>"Unable to find object with id of '#{id}'.",
35
+ "code"=>"SoftLayer_Exception_ObjectNotFound"
36
+ }
37
+ end
38
+ response
39
+ end
40
+ end
41
+
42
+ class Real
43
+ def create_vm_tags(id, tags = [])
44
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
45
+ self.request(:virtual_guest, "#{id}/set_tags", :body => tags.join(','), :http_method => :post)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -44,32 +44,33 @@ module Fog
44
44
 
45
45
  ## stub some responses
46
46
  fields = {
47
- :accountId => Fog::Softlayer.mock_account_id,
48
- :createDate => Time.now.iso8601,
49
- :dedicatedAccountHostOnlyFlag => false,
50
- :domain => nil,
51
- :fullyQualifiedDomainName => nil,
52
- :hostname => nil,
53
- :id => Fog::Softlayer.mock_vm_id,
54
- :lastPowerStateId => nil,
55
- :lastVerifiedDate => nil,
56
- :maxCpu => nil,
57
- :maxCpuUnits => "CORE",
58
- :maxMemory => nil,
59
- :metricPollDate => nil,
60
- :modifyDate => nil,
61
- :startCpus => nil,
62
- :statusId => 1001,
63
- :globalIdentifier => Fog::Softlayer.mock_global_identifier
47
+ 'accountId' => Fog::Softlayer.mock_account_id,
48
+ 'createDate' => Time.now.iso8601,
49
+ 'datacenter' => nil,
50
+ 'dedicatedAccountHostOnlyFlag' => false,
51
+ 'domain' => nil,
52
+ 'fullyQualifiedDomainName' => nil,
53
+ 'hostname' => nil,
54
+ 'id' => Fog::Softlayer.mock_vm_id,
55
+ 'lastPowerStateId' => nil,
56
+ 'lastVerifiedDate' => nil,
57
+ 'maxCpu' => nil,
58
+ 'maxCpuUnits' => "CORE",
59
+ 'maxMemory' => nil,
60
+ 'metricPollDate' => nil,
61
+ 'modifyDate' => nil,
62
+ 'startCpus' => nil,
63
+ 'statusId' => 1001,
64
+ 'globalIdentifier' => Fog::Softlayer.mock_global_identifier,
65
+ 'operatingSystem' => {},
66
+ 'tagReferences' => []
64
67
  }
65
68
 
66
69
  # clobber stubbed values where applicable
67
- response.body = opts.each_with_index.map do |vm,i|
68
- fields.reduce({}) do |result,(field,default)|
69
- result[field] = vm[field] || default
70
- result
71
- end
70
+ response.body = opts.map do |vm|
71
+ fields.deep_merge(Fog::Softlayer.stringify_keys(opts.first)) # stringify in case :symbols were passed.
72
72
  end
73
+
73
74
  rescue MissingRequiredParameter
74
75
  response.status = 500
75
76
  response.body = {
@@ -0,0 +1,46 @@
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 Compute
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def delete_bare_metal_tags(id, tags = [])
15
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
16
+ response = Excon::Response.new
17
+ response.status = self.get_bare_metal_server(id).status
18
+
19
+ if response.status != 404
20
+ @tags = @tags.reject do |tag|
21
+ tag['resourceTableId'] == id and tags.include?(tag['tag']['name'])
22
+ end
23
+ response.body = true
24
+ else
25
+ response.body = {
26
+ "error"=>"Unable to find object with id of '#{id}'.",
27
+ "code"=>"SoftLayer_Exception_ObjectNotFound"
28
+ }
29
+ end
30
+ response
31
+ end
32
+
33
+ end
34
+
35
+ class Real
36
+ def delete_bare_metal_tags(id, tags = [])
37
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
38
+ subset = self.get_bare_metal_tags(id).body['tagReferences'].map do |i|
39
+ i['tag']['name'] unless tags.include?(i['tag']['name'])
40
+ end.compact
41
+ self.create_bare_metal_tags(id, subset)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,46 @@
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 Compute
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def delete_vm_tags(id, tags = [])
15
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
16
+ response = Excon::Response.new
17
+ response.status = self.get_vm(id).status
18
+
19
+ if response.status != 404
20
+ @tags = @tags.reject do |tag|
21
+ tag['resourceTableId'] == id and tags.include?(tag['tag']['name'])
22
+ end
23
+ response.body = true
24
+ else
25
+ response.body = {
26
+ "error"=>"Unable to find object with id of '#{id}'.",
27
+ "code"=>"SoftLayer_Exception_ObjectNotFound"
28
+ }
29
+ end
30
+ response
31
+ end
32
+
33
+ end
34
+
35
+ class Real
36
+ def delete_vm_tags(id, tags = [])
37
+ raise ArgumentError, "Tags argument for #{self.class.name}##{__method__} must be Array." unless tags.is_a?(Array)
38
+ subset = self.get_vm_tags(id).body['tagReferences'].map do |i|
39
+ i['tag']['name'] unless tags.include?(i['tag']['name'])
40
+ end.compact
41
+ self.create_vm_tags(id, subset)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ 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 Compute
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def describe_tags
15
+ response = Excon::Response.new
16
+ response.body = @tags
17
+ response.status = 200
18
+ response
19
+ end
20
+
21
+ end
22
+
23
+ class Real
24
+ def describe_tags
25
+ self.request(:account, :get_tags, :query => 'objectMask=mask[referenceCount]')
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -11,8 +11,14 @@ module Fog
11
11
  class Mock
12
12
  def get_bare_metal_server(identifier)
13
13
  response = Excon::Response.new
14
- response.body = @bare_metal_servers.map {|vm| vm if vm['id'] == identifier}.compact.reduce
15
- response.status = 200
14
+ response.body = @bare_metal_servers.map {|vm| vm if vm['id'] == identifier.to_s }.compact.first || {}
15
+ response.status = response.body.empty? ? 404 : 200
16
+ if response.status == 404
17
+ response.body = {
18
+ "error"=>"Unable to find object with id of '#{identifier}'.",
19
+ "code"=>"SoftLayer_Exception_ObjectNotFound"
20
+ }
21
+ end
16
22
  response
17
23
  end
18
24
 
@@ -20,7 +26,7 @@ module Fog
20
26
 
21
27
  class Real
22
28
  def get_bare_metal_server(identifier)
23
- request(:hardware_server, identifier, :expected => [200, 404], :query => 'objectMask=mask[datacenter,memory,provisionDate,processorCoreAmount,hardDrives,datacenter,hourlyBillingFlag,operatingSystem.passwords.password]')
29
+ request(:hardware_server, identifier, :expected => [200, 404], :query => 'objectMask=mask[datacenter,tagReferences,memory,provisionDate,processorCoreAmount,hardDrives,datacenter,hourlyBillingFlag,operatingSystem.passwords.password]')
24
30
  end
25
31
  end
26
32
  end
@@ -20,7 +20,7 @@ module Fog
20
20
 
21
21
  class Real
22
22
  def get_bare_metal_servers
23
- request(:account, :get_hardware, :query => 'objectMask=mask[datacenter,memory,processorCoreAmount,hardDrives,datacenter,hourlyBillingFlag,operatingSystem.passwords.password]')
23
+ request(:account, :get_hardware, :query => 'objectMask=mask[datacenter,tagReferences,memory,processorCoreAmount,hardDrives,datacenter,hourlyBillingFlag,operatingSystem.passwords.password]')
24
24
  end
25
25
  end
26
26
  end
@@ -0,0 +1,47 @@
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 Compute
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def get_bare_metal_tags(id)
15
+ response = Excon::Response.new
16
+
17
+ response.status = self.get_bare_metal_server(id).status
18
+
19
+ bmc = self.get_bare_metal_server(id).body
20
+ unless bmc['error']
21
+ tags = @tags.map do |tag|
22
+ tag if tag['resourceTableId'] == id
23
+ end.compact
24
+ end
25
+
26
+ bmc['tagReferences'] = tags
27
+ response.body = bmc
28
+
29
+ if response.status == 404
30
+ response.body = {
31
+ "error"=>"Unable to find object with id of '#{id}'.",
32
+ "code"=>"SoftLayer_Exception_ObjectNotFound"
33
+ }
34
+ end
35
+ response
36
+ end
37
+
38
+ end
39
+
40
+ class Real
41
+ def get_bare_metal_tags(id)
42
+ self.request(:hardware_server, id, :query => 'objectMask=id;tagReferences')
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,42 @@
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 Compute
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def get_references_by_tag_name(tag_list)
15
+ response = Excon::Response.new
16
+ response.status = 200
17
+
18
+ response.body = tag_list.split(',').map do |tag|
19
+ refs = @tags.select { |ref| ref['tag']['name'] == tag }
20
+ unless refs.empty?
21
+ {
22
+ 'accountId' => Fog::Softlayer.mock_account_id,
23
+ 'id'=>Fog::Mock.random_numbers(7),
24
+ 'internal' => 0,
25
+ 'name' => tag,
26
+ 'references' => refs
27
+ }
28
+ end
29
+ end.compact
30
+ response
31
+ end
32
+
33
+ end
34
+
35
+ class Real
36
+ def get_references_by_tag_name(tag_list)
37
+ self.request(:tag, "get_tag_by_tag_name/#{tag_list}", :query => 'objectMask=references')
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,27 @@
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 Compute
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def get_tag(id)
15
+ # TODO: Implement
16
+ end
17
+
18
+ end
19
+
20
+ class Real
21
+ def get_tag(id)
22
+ self.request(:tag, "#{id}/get_object", :query => "objectMask=references;references.tagType")
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -11,8 +11,14 @@ module Fog
11
11
  class Mock
12
12
  def get_vm(identifier)
13
13
  response = Excon::Response.new
14
- response.body = @virtual_guests.map {|vm| vm if vm['id'] == identifier}.compact.reduce
15
- response.status = 200
14
+ response.body = @virtual_guests.map {|vm| vm if vm['id'] == identifier.to_s }.compact.first || {}
15
+ response.status = response.body.empty? ? 404 : 200
16
+ if response.status == 404
17
+ response.body = {
18
+ "error"=>"Unable to find object with id of '#{identifier}'.",
19
+ "code"=>"SoftLayer_Exception_ObjectNotFound"
20
+ }
21
+ end
16
22
  response
17
23
  end
18
24
 
@@ -20,7 +26,7 @@ module Fog
20
26
 
21
27
  class Real
22
28
  def get_vm(identifier)
23
- request(:virtual_guest, identifier, :expected => [200, 404], :query => 'objectMask=mask[datacenter,blockDevices,blockDeviceTemplateGroup.globalIdentifier,operatingSystem.passwords.password]')
29
+ request(:virtual_guest, identifier, :expected => [200, 404], :query => 'objectMask=mask[datacenter,tagReferences,blockDevices,blockDeviceTemplateGroup.globalIdentifier,operatingSystem.passwords.password]')
24
30
  end
25
31
  end
26
32
  end
@@ -0,0 +1,47 @@
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 Compute
10
+ class Softlayer
11
+
12
+ class Mock
13
+
14
+ def get_vm_tags(id)
15
+ response = Excon::Response.new
16
+
17
+ response.status = self.get_vm(id).status
18
+
19
+ vm = self.get_vm(id).body
20
+ unless vm['error']
21
+ tags = @tags.map do |tag|
22
+ tag if tag['resourceTableId'] == id
23
+ end.compact
24
+ end
25
+
26
+ vm['tagReferences'] = tags
27
+ response.body = vm
28
+
29
+ if response.status == 404
30
+ response.body = {
31
+ "error"=>"Unable to find object with id of '#{id}'.",
32
+ "code"=>"SoftLayer_Exception_ObjectNotFound"
33
+ }
34
+ end
35
+ response
36
+ end
37
+
38
+ end
39
+
40
+ class Real
41
+ def get_vm_tags(id)
42
+ self.request(:virtual_guest, id, :query => 'objectMask=mask[tagReferences]')
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -20,7 +20,7 @@ module Fog
20
20
 
21
21
  class Real
22
22
  def get_vms
23
- request(:account, :get_virtual_guests, :query => 'objectMask=mask[datacenter,blockDevices,blockDeviceTemplateGroup.globalIdentifier,operatingSystem.passwords.password]')
23
+ request(:account, :get_virtual_guests, :query => 'objectMask=mask[datacenter,tagReferences,blockDevices,blockDeviceTemplateGroup.globalIdentifier,operatingSystem.passwords.password]')
24
24
  end
25
25
  end
26
26
  end
@@ -6,6 +6,6 @@
6
6
  #
7
7
  module Fog
8
8
  module Softlayer
9
- VERSION = "0.1.1"
9
+ VERSION = "0.2.1"
10
10
  end
11
11
  end
@@ -72,6 +72,17 @@ class Softlayer
72
72
  "globalIdentifier" => String
73
73
  }
74
74
 
75
+ TAGS = {
76
+ 'empRecordId'=>nil,
77
+ 'id'=>String,
78
+ 'resourceTableId'=>Integer,
79
+ 'tagId'=> Fog::Nullable::String,
80
+ 'tagTypeId'=>Fog::Nullable::Integer,
81
+ 'usrRecordId'=>Fog::Nullable::Integer,
82
+ 'tag'=>{'accountId'=>Integer, 'id'=>String, 'internal'=>Integer, 'name'=>String},
83
+ 'tagType'=>{'description'=>String, 'keyName'=>String}
84
+ }
85
+
75
86
  end
76
87
 
77
88
  module VirtualGuest
@@ -95,6 +106,17 @@ class Softlayer
95
106
  "globalIdentifier" => String
96
107
  }
97
108
 
109
+ TAGS = {
110
+ 'empRecordId'=>nil,
111
+ 'id'=>String,
112
+ 'resourceTableId'=>Integer,
113
+ 'tagId'=> Fog::Nullable::String,
114
+ 'tagTypeId'=>Fog::Nullable::Integer,
115
+ 'usrRecordId'=>Fog::Nullable::Integer,
116
+ 'tag'=>{'accountId'=>Integer, 'id'=>String, 'internal'=>Integer, 'name'=>String},
117
+ 'tagType'=>{'description'=>String, 'keyName'=>String}
118
+ }
119
+
98
120
  end
99
121
 
100
122
  module Collected
@@ -0,0 +1,92 @@
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
+ Shindo.tests("Fog::Compute[:softlayer] | tag requests", ["softlayer"]) do
9
+
10
+ @sl_connection = Fog::Compute[:softlayer]
11
+
12
+ opts = { :flavor_id => 'm1.small', :os_code => 'UBUNTU_LATEST', :name => 'matt', :datacenter => 'dal05'}
13
+ @vm = @sl_connection.servers.create(opts)
14
+
15
+ opts[:bare_metal] = true
16
+ @bmc = @sl_connection.servers.create(opts)
17
+
18
+ test_tags = ['foo', 'bar', 'baz']
19
+
20
+ tests('success') do
21
+
22
+ tests("#create_vm_tags('#{@vm.id}', #{test_tags})") do
23
+ returns(true, "returns true") { @sl_connection.create_vm_tags(@vm.id, test_tags).body}
24
+ end
25
+
26
+ tests("#create_bare_metal_tags('#{@bmc.id}', #{test_tags})") do
27
+ returns(true, "returns true") { @sl_connection.create_bare_metal_tags(@bmc.id, test_tags).body }
28
+ end
29
+
30
+ tests("#get_vm_tags('#{@vm.id}')") do
31
+ data_matches_schema(Softlayer::Compute::Formats::VirtualGuest::TAGS, {:allow_extra_keys => true}) { @sl_connection.get_vm_tags(@vm.id).body['tagReferences'].first }
32
+ end
33
+
34
+ tests("#get_bare_metal_tags('#{@bmc.id}')") do
35
+ data_matches_schema(Softlayer::Compute::Formats::BareMetal::TAGS, {:allow_extra_keys => true}) { @sl_connection.get_bare_metal_tags(@bmc.id).body['tagReferences'].first }
36
+ end
37
+
38
+ tests("#delete_vm_tags('#{@vm.id}')") do
39
+ returns(3, "three tags for VM with id #{@vm.id}") { @sl_connection.get_vm_tags(@vm.id).body['tagReferences'].count }
40
+ returns(true, "returns true") { @sl_connection.delete_vm_tags(@vm.id, ['foo', 'bar']).body }
41
+ returns(1, "one tag remains for VM with id #{@vm.id}") { @sl_connection.get_vm_tags(@vm.id).body['tagReferences'].count }
42
+ end
43
+
44
+ tests("#delete_bare_metal_tags('#{@bmc.id}')") do
45
+ returns(3, "three tags for BM server with id #{@bmc.id}") { @sl_connection.get_bare_metal_tags(@bmc.id).body['tagReferences'].count }
46
+ returns(true, "returns true") { @sl_connection.delete_bare_metal_tags(@bmc.id, ['foo', 'bar']).body }
47
+ returns(1, "one tag remains for BM server with id #{@bmc.id}") { @sl_connection.get_bare_metal_tags(@bmc.id).body['tagReferences'].count }
48
+ end
49
+
50
+ end
51
+
52
+ tests('failure') do
53
+
54
+ tests("#create_vm_tags(123456789, #{test_tags})") do
55
+ returns(404, "server doesn't exist") { @sl_connection.create_vm_tags(123456789).status }
56
+ end
57
+
58
+ tests("#create_bare_metal_tags(123456789, #{test_tags})") do
59
+ returns(404, "server doesn't exist") { @sl_connection.create_bare_metal_tags(123456789).status }
60
+ end
61
+
62
+ tests("#get_vm_tags(123456789)") do
63
+ returns(404, "server doesn't exist") { @sl_connection.get_vm_tags(123456789).status }
64
+ end
65
+
66
+ tests("#get_bare_metal_tags(123456789)") do
67
+ returns(404, "server doesn't exist") { @sl_connection.get_bare_metal_tags(123456789).status }
68
+ end
69
+
70
+ tests("#delete_vm_tags(123456789, #{test_tags})") do
71
+ returns(404, "server doesn't exist") { @sl_connection.delete_vm_tags(123456789, test_tags).status }
72
+ end
73
+
74
+ tests("#delete_bare_metal_tags(123456789, #{test_tags})") do
75
+ returns(404, "server doesn't exist") { @sl_connection.delete_bare_metal_tags(123456789, test_tags).status }
76
+ end
77
+
78
+ tests("#delete_bare_metal_tags(123456789, #{test_tags})") do
79
+ returns(404, "server doesn't exist") { @sl_connection.delete_bare_metal_tags(123456789, test_tags).status }
80
+ end
81
+
82
+ tests("#create_vm_tags").raises(ArgumentError) do
83
+ @sl_connection.create_vm_tags(@vm.id, 'foo')
84
+ end
85
+
86
+ tests("#create_bare_metal_tags").raises(ArgumentError) do
87
+ @sl_connection.create_bare_metal_tags(@vm.id, 'foo')
88
+ end
89
+
90
+ end
91
+
92
+ 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.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Eldridge
@@ -235,6 +235,7 @@ files:
235
235
  - examples/compute.md
236
236
  - examples/dns.md
237
237
  - examples/storage.md
238
+ - examples/tags.md
238
239
  - fog-softlayer.gemspec
239
240
  - gemfiles/Gemfile-edge
240
241
  - gemfiles/Gemfile-ruby-1.8.7
@@ -250,6 +251,8 @@ files:
250
251
  - lib/fog/softlayer/models/compute/images.rb
251
252
  - lib/fog/softlayer/models/compute/server.rb
252
253
  - lib/fog/softlayer/models/compute/servers.rb
254
+ - lib/fog/softlayer/models/compute/tag.rb
255
+ - lib/fog/softlayer/models/compute/tags.rb
253
256
  - lib/fog/softlayer/models/dns/domain.rb
254
257
  - lib/fog/softlayer/models/dns/domains.rb
255
258
  - lib/fog/softlayer/models/dns/record.rb
@@ -259,13 +262,22 @@ files:
259
262
  - lib/fog/softlayer/models/storage/file.rb
260
263
  - lib/fog/softlayer/models/storage/files.rb
261
264
  - lib/fog/softlayer/requests/compute/create_bare_metal_server.rb
265
+ - lib/fog/softlayer/requests/compute/create_bare_metal_tags.rb
262
266
  - lib/fog/softlayer/requests/compute/create_vm.rb
267
+ - lib/fog/softlayer/requests/compute/create_vm_tags.rb
263
268
  - lib/fog/softlayer/requests/compute/create_vms.rb
264
269
  - lib/fog/softlayer/requests/compute/delete_bare_metal_server.rb
270
+ - lib/fog/softlayer/requests/compute/delete_bare_metal_tags.rb
265
271
  - lib/fog/softlayer/requests/compute/delete_vm.rb
272
+ - lib/fog/softlayer/requests/compute/delete_vm_tags.rb
273
+ - lib/fog/softlayer/requests/compute/describe_tags.rb
266
274
  - lib/fog/softlayer/requests/compute/get_bare_metal_server.rb
267
275
  - lib/fog/softlayer/requests/compute/get_bare_metal_servers.rb
276
+ - lib/fog/softlayer/requests/compute/get_bare_metal_tags.rb
277
+ - lib/fog/softlayer/requests/compute/get_references_by_tag_name.rb
278
+ - lib/fog/softlayer/requests/compute/get_tag.rb
268
279
  - lib/fog/softlayer/requests/compute/get_vm.rb
280
+ - lib/fog/softlayer/requests/compute/get_vm_tags.rb
269
281
  - lib/fog/softlayer/requests/compute/get_vms.rb
270
282
  - lib/fog/softlayer/requests/dns/create_domain.rb
271
283
  - lib/fog/softlayer/requests/dns/create_record.rb
@@ -328,6 +340,7 @@ files:
328
340
  - tests/softlayer/models/storage/directory_tests.rb
329
341
  - tests/softlayer/models/storage/file_tests.rb
330
342
  - tests/softlayer/requests/compute/bmc_tests.rb
343
+ - tests/softlayer/requests/compute/tag_tests.rb
331
344
  - tests/softlayer/requests/compute/vm_tests.rb
332
345
  - tests/softlayer/requests/storage/auth_tests.rb
333
346
  - tests/softlayer/requests/storage/container_tests.rb