fog-softlayer 0.4.2.pre → 0.4.2

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 (61) hide show
  1. checksums.yaml +5 -13
  2. data/CONTRIBUTORS.md +2 -0
  3. data/examples/compute.md +37 -1
  4. data/lib/fog/softlayer/compute.rb +8 -1
  5. data/lib/fog/softlayer/dns.rb +0 -1
  6. data/lib/fog/softlayer/ext/hash.rb +6 -0
  7. data/lib/fog/softlayer/ext/string.rb +20 -0
  8. data/lib/fog/softlayer/models/compute/flavor.rb +0 -2
  9. data/lib/fog/softlayer/models/compute/flavors.rb +0 -1
  10. data/lib/fog/softlayer/models/compute/image.rb +0 -2
  11. data/lib/fog/softlayer/models/compute/images.rb +0 -1
  12. data/lib/fog/softlayer/models/compute/key_pair.rb +0 -2
  13. data/lib/fog/softlayer/models/compute/key_pairs.rb +0 -1
  14. data/lib/fog/softlayer/models/compute/network_component.rb +0 -2
  15. data/lib/fog/softlayer/models/compute/network_components.rb +0 -1
  16. data/lib/fog/softlayer/models/compute/server.rb +10 -0
  17. data/lib/fog/softlayer/models/compute/servers.rb +25 -1
  18. data/lib/fog/softlayer/models/compute/tag.rb +0 -2
  19. data/lib/fog/softlayer/models/compute/tags.rb +0 -1
  20. data/lib/fog/softlayer/models/dns/domain.rb +1 -1
  21. data/lib/fog/softlayer/models/dns/domains.rb +1 -1
  22. data/lib/fog/softlayer/models/dns/record.rb +0 -1
  23. data/lib/fog/softlayer/models/dns/records.rb +1 -1
  24. data/lib/fog/softlayer/models/network/datacenter.rb +0 -2
  25. data/lib/fog/softlayer/models/network/datacenters.rb +0 -1
  26. data/lib/fog/softlayer/models/network/ip.rb +0 -2
  27. data/lib/fog/softlayer/models/network/ips.rb +0 -1
  28. data/lib/fog/softlayer/models/network/network.rb +0 -2
  29. data/lib/fog/softlayer/models/network/networks.rb +0 -1
  30. data/lib/fog/softlayer/models/network/subnet.rb +0 -2
  31. data/lib/fog/softlayer/models/network/subnets.rb +0 -1
  32. data/lib/fog/softlayer/models/network/tag.rb +0 -1
  33. data/lib/fog/softlayer/models/network/tags.rb +1 -1
  34. data/lib/fog/softlayer/models/product/item.rb +0 -1
  35. data/lib/fog/softlayer/models/product/items.rb +0 -1
  36. data/lib/fog/softlayer/models/product/package.rb +0 -1
  37. data/lib/fog/softlayer/models/product/packages.rb +0 -1
  38. data/lib/fog/softlayer/models/storage/directories.rb +0 -1
  39. data/lib/fog/softlayer/models/storage/directory.rb +0 -1
  40. data/lib/fog/softlayer/models/storage/file.rb +0 -2
  41. data/lib/fog/softlayer/models/storage/files.rb +0 -1
  42. data/lib/fog/softlayer/network.rb +0 -2
  43. data/lib/fog/softlayer/product.rb +0 -1
  44. data/lib/fog/softlayer/requests/compute/create_bare_metal_server.rb +1 -0
  45. data/lib/fog/softlayer/requests/compute/create_vms.rb +1 -0
  46. data/lib/fog/softlayer/requests/compute/get_bare_metal_active_tickets.rb +79 -0
  47. data/lib/fog/softlayer/requests/compute/get_bare_metal_create_options.rb +1116 -0
  48. data/lib/fog/softlayer/requests/compute/get_bare_metal_server_by_ip.rb +32 -0
  49. data/lib/fog/softlayer/requests/compute/get_bare_metal_users.rb +148 -0
  50. data/lib/fog/softlayer/requests/compute/get_virtual_guest_active_tickets.rb +79 -0
  51. data/lib/fog/softlayer/requests/compute/get_virtual_guest_by_ip.rb +32 -0
  52. data/lib/fog/softlayer/requests/compute/get_virtual_guest_create_options.rb +4060 -0
  53. data/lib/fog/softlayer/requests/compute/get_virtual_guest_users.rb +148 -0
  54. data/lib/fog/softlayer/slapi.rb +96 -0
  55. data/lib/fog/softlayer/storage.rb +1 -3
  56. data/lib/fog/softlayer/version.rb +1 -1
  57. data/lib/fog/softlayer.rb +69 -6
  58. data/tests/softlayer/requests/compute/bmc_tests.rb +38 -0
  59. data/tests/softlayer/requests/compute/vm_tests.rb +37 -0
  60. metadata +41 -32
  61. data/lib/fog/softlayer/core.rb +0 -176
@@ -0,0 +1,148 @@
1
+ #
2
+ # Author:: Matheus Francisco Barra Mina (<mfbmina@gmail.com>)
3
+ # © Copyright IBM Corporation 2015.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+ module Fog
8
+ module Compute
9
+ class Softlayer
10
+ class Mock
11
+ # Gets all Virtual Guest users
12
+ # @param [Integer] id
13
+ # @return [Excon::Response]
14
+ def get_virtual_guest_users(id)
15
+ response = Excon::Response.new
16
+ found = self.get_vms.body.map{|server| server['id']}.include?(id)
17
+ unless found
18
+ response.status = 404
19
+ response.body = {
20
+ "error" => "Unable to find object with id of '#{id}'.",
21
+ "code" => "SoftLayer_Exception_ObjectNotFound"
22
+ }
23
+ else
24
+ response.status = 200
25
+ response.body = get_users
26
+ end
27
+ response
28
+ end
29
+ end
30
+
31
+ class Real
32
+ def get_virtual_guest_users(id)
33
+ request(:virtual_guest, "#{id}/getUsers")
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+
40
+ module Fog
41
+ module Compute
42
+ class Softlayer
43
+ class Mock
44
+ def get_users
45
+ [
46
+ {
47
+ "accountId"=>000000,
48
+ "address1"=>"Your address",
49
+ "authenticationToken"=>
50
+ {
51
+ "hash"=>"06e849qqq25e5266753043484893344232",
52
+ "user"=>nil,
53
+ "userId"=>000000
54
+ },
55
+ "city"=>"Your City",
56
+ "companyName"=>"Your Company",
57
+ "country"=>"Your country",
58
+ "createDate"=>"2014-03-05T13:23:04-06:00",
59
+ "daylightSavingsTimeFlag"=>true,
60
+ "denyAllResourceAccessOnCreateFlag"=>false,
61
+ "displayName"=>"Your name",
62
+ "email"=>"youremail@example.com",
63
+ "firstName"=>"Your name",
64
+ "forumPasswordHash"=>"121kdsksdkvm323j4j3",
65
+ "id"=>000000,
66
+ "lastName"=>"Your last name",
67
+ "localeId"=>1,
68
+ "modifyDate"=>"2014-03-05T13:23:04-06:00",
69
+ "officePhone"=>"+55 00 111-111",
70
+ "parentId"=>nil,
71
+ "passwordExpireDate"=>nil,
72
+ "permissionSystemVersion"=>2,
73
+ "postalCode"=>"000000-000",
74
+ "pptpVpnAllowedFlag"=>false,
75
+ "savedId"=>"000000",
76
+ "secondaryLoginManagementFlag"=>nil,
77
+ "secondaryLoginRequiredFlag"=>nil,
78
+ "secondaryPasswordModifyDate"=>"2014-03-05T13:40:12-06:00",
79
+ "secondaryPasswordTimeoutDays"=>nil,
80
+ "sslVpnAllowedFlag"=>false,
81
+ "state"=>"OT",
82
+ "statusDate"=>"2014-03-05T13:23:04-06:00",
83
+ "timezoneId"=>114,
84
+ "userStatusId"=>1001,
85
+ "username"=>"Your username",
86
+ "vpnManualConfig"=>false,
87
+ "account"=>
88
+ {
89
+ "accountManagedResourcesFlag"=>false,
90
+ "accountStatusId"=>1001,
91
+ "address1"=>"Your address 1",
92
+ "address2"=>"Your address 2",
93
+ "allowedPptpVpnQuantity"=>1,
94
+ "brandId"=>2,
95
+ "city"=>"Your city",
96
+ "claimedTaxExemptTxFlag"=>false,
97
+ "companyName"=>"Your company",
98
+ "country"=>"Your country",
99
+ "createDate"=>"2014-03-05T13:23:04-06:00",
100
+ "email"=>"youremail@example.com",
101
+ "firstName"=>"Your name",
102
+ "id"=>000000,
103
+ "isReseller"=>1,
104
+ "lastName"=>"Your last name",
105
+ "lateFeeProtectionFlag"=>nil,
106
+ "modifyDate"=>"2014-04-29T15:22:55-05:00",
107
+ "officePhone"=>"+00 00 0000-0000",
108
+ "postalCode"=>"00000-000",
109
+ "state"=>"OT",
110
+ "statusDate"=>nil,
111
+ "masterUser"=>nil
112
+ },
113
+ "apiAuthenticationKeys"=>
114
+ [
115
+ {
116
+ "authenticationKey"=>"43k43dsmkf9994m3mdkm3k2mcdsk32",
117
+ "id"=>000000,
118
+ "timestampKey"=>302399304309,
119
+ "userId"=>000000
120
+ }
121
+ ],
122
+ "locale"=>
123
+ {
124
+ "friendlyName"=>"English",
125
+ "id"=>1,
126
+ "languageTag"=>"en-US",
127
+ "name"=>"English"
128
+ },
129
+ "timezone"=>
130
+ {
131
+ "id"=>114,
132
+ "longName"=>"(GMT-06:00) America/Dallas - CST", "name"=>"America/Chicago",
133
+ "offset"=>"-0600",
134
+ "shortName"=>"CST"
135
+ },
136
+ "userStatus"=>
137
+ {
138
+ "id"=>1001,
139
+ "keyName"=>"ACTIVE",
140
+ "name"=>"Active"
141
+ }
142
+ }
143
+ ]
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,96 @@
1
+ #
2
+ # Author:: Matt Eldridge (<plribeiro3000@gmail.com>)
3
+ # © Copyright IBM Corporation 2015.
4
+ #
5
+ # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
+ #
7
+
8
+ module Fog
9
+ module Softlayer
10
+ module Slapi
11
+ # Sends the real request to the real SoftLayer service.
12
+ #
13
+ # @param [String] service
14
+ # ...ayer.com/rest/v3/Softlayer_Service_Name...
15
+ # @param path [String]
16
+ # ...ayer.com/rest/v3/Softlayer_Service_Name/path.json
17
+ # @param [Hash] options
18
+ # @option options [Array<Hash>] :body
19
+ # HTTP request body parameters
20
+ # @option options [String] :softlayer_api_url
21
+ # Override the default (or configured) API endpoint
22
+ # @option options [String] :softlayer_username
23
+ # Email or user identifier for user based authentication
24
+ # @option options [String] :softlayer_api_key
25
+ # Password for user based authentication
26
+ # @return [Excon::Response]
27
+ def self.slapi_request(service, path, options)
28
+ # default HTTP method to get if not passed
29
+ http_method = options[:http_method] || :get
30
+ # set the target base url
31
+ @request_url = options[:softlayer_api_url] || Fog::Softlayer::SL_API_URL
32
+ # tack on the username and password
33
+ credentialize_url(options[:username], options[:api_key])
34
+ # set the SoftLayer Service name
35
+ set_sl_service(service)
36
+ # set the request path (known as the "method" in SL docs)
37
+ set_sl_path(path)
38
+ # set the query params if any
39
+
40
+
41
+ # build request params
42
+ params = { :headers => user_agent_header }
43
+ params[:headers]['Content-Type'] = 'application/json'
44
+ params[:expects] = options[:expected] || [200,201]
45
+ params[:query] = options[:query] unless options[:query].nil?
46
+ unless options[:body].nil?
47
+ options[:body] = [options[:body]] unless options[:body].kind_of?(Array)
48
+ params[:body] = Fog::JSON.encode({:parameters => options[:body]})
49
+ end
50
+
51
+ # initialize connection object
52
+ @connection = Fog::Core::Connection.new(@request_url, false, params)
53
+
54
+ # send it
55
+ response = @connection.request(:method => http_method)
56
+
57
+ # decode it
58
+ response.body = Fog::JSON.decode(response.body)
59
+ response
60
+ end
61
+
62
+ private
63
+
64
+ def self.credentialize_url(username, apikey)
65
+ @request_url = "https://#{sanitize_username(username)}:#{apikey}@#{@request_url}"
66
+ end
67
+
68
+ def self.sanitize_username(username)
69
+ username.gsub!(/@/, '%40')
70
+ username
71
+ end
72
+
73
+ ##
74
+ # Prepend "SoftLayer_" to the service name and Snake_Camel_Case the string before appending it to the @request_url.
75
+ #
76
+ def self.set_sl_service(service)
77
+ service = "SoftLayer_" << service.to_s.gsub(/^softlayer_/i, '').split('_').map{|i|i.capitalize}.join('_')
78
+ service.fix_convention_exceptions
79
+ @request_url += "/#{service}"
80
+ end
81
+
82
+ ##
83
+ # Try to smallCamelCase the path before appending it to the @request_url
84
+ #
85
+ def self.set_sl_path(path)
86
+ path = path.to_s.softlayer_underscore.softlayer_camelize
87
+ path.fix_convention_exceptions
88
+ @request_url += "/#{path}.json"
89
+ end
90
+
91
+ def self.user_agent_header
92
+ {"User-Agent" => "Fog SoftLayer Adapter #{Fog::Softlayer::VERSION}"}
93
+ end
94
+ end
95
+ end
96
+ end
@@ -5,8 +5,6 @@
5
5
  # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
6
  #
7
7
 
8
- require 'fog/softlayer/core'
9
-
10
8
  module Fog
11
9
  module Storage
12
10
  class Softlayer < Fog::Service
@@ -108,7 +106,7 @@ module Fog
108
106
  params = _build_params(params)
109
107
  response = @connection.request(params)
110
108
 
111
- if response.status == 401
109
+ if response.status == 401 && !!@auth_token
112
110
  @auth_token = nil; @auth_expires = nil
113
111
  authenticate
114
112
  response = @connection.request(params)
@@ -7,6 +7,6 @@
7
7
 
8
8
  module Fog
9
9
  module Softlayer
10
- VERSION = "0.4.2.pre"
10
+ VERSION = "0.4.2"
11
11
  end
12
12
  end
data/lib/fog/softlayer.rb CHANGED
@@ -5,9 +5,72 @@
5
5
  # LICENSE: MIT (http://opensource.org/licenses/MIT)
6
6
  #
7
7
 
8
- require 'fog/softlayer'
9
- require 'fog/softlayer/compute'
10
- require 'fog/softlayer/dns'
11
- require 'fog/softlayer/network'
12
- require 'fog/softlayer/product'
13
- require 'fog/softlayer/storage'
8
+ require 'fog/core'
9
+ require 'fog/json'
10
+ require 'time'
11
+ require File.expand_path('../softlayer/version', __FILE__)
12
+ require File.expand_path('../softlayer/ext/string', __FILE__)
13
+ require File.expand_path('../softlayer/ext/hash', __FILE__) unless {}.respond_to? :deep_merge
14
+
15
+ module Fog
16
+ module Compute
17
+ autoload :Softlayer, File.expand_path('../softlayer/compute', __FILE__)
18
+ end
19
+
20
+ module DNS
21
+ autoload :Softlayer, File.expand_path('../softlayer/dns', __FILE__)
22
+ end
23
+
24
+ module Network
25
+ autoload :Softlayer, File.expand_path('../softlayer/network', __FILE__)
26
+ end
27
+
28
+ module Storage
29
+ autoload :Softlayer, File.expand_path('../softlayer/storage', __FILE__)
30
+ end
31
+
32
+ module Softlayer
33
+ extend Fog::Provider
34
+
35
+ autoload :Product, File.expand_path('../softlayer/product', __FILE__)
36
+ autoload :Slapi, File.expand_path('../softlayer/slapi', __FILE__)
37
+
38
+ SL_API_URL = 'api.softlayer.com/rest/v3' unless defined? SL_API_URL
39
+ SL_STORAGE_AUTH_URL = 'objectstorage.softlayer.net/auth/v1.0' unless defined? SL_STORAGE_AUTH_URL
40
+
41
+ service(:compute, 'Compute')
42
+ service(:dns, 'DNS')
43
+ service(:network, 'Network')
44
+ service(:product, 'Product')
45
+ service(:storage, 'Storage')
46
+
47
+ def self.mock_account_id
48
+ Fog.mocking? and @sl_account_id ||= Fog::Mock.random_numbers(7)
49
+ end
50
+
51
+ def self.mock_vm_id
52
+ Fog::Mock.random_numbers(7)
53
+ end
54
+
55
+ def self.mock_global_identifier
56
+ Fog::UUID.uuid
57
+ end
58
+
59
+ def self.valid_request?(required, passed)
60
+ required.all? {|k| k = k.to_sym; passed.key?(k) and !passed[k].nil?}
61
+ end
62
+
63
+ # CGI.escape, but without special treatment on spaces
64
+ def self.escape(str,extra_exclude_chars = '')
65
+ str.gsub(/([^a-zA-Z0-9_.-#{extra_exclude_chars}]+)/) do
66
+ '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase
67
+ end
68
+ end
69
+
70
+ def self.stringify_keys(obj)
71
+ return obj.inject({}){|memo,(k,v)| memo[k.to_s] = stringify_keys(v); memo} if obj.is_a? Hash
72
+ return obj.inject([]){|memo,v | memo << stringify_keys(v); memo} if obj.is_a? Array
73
+ obj
74
+ end
75
+ end
76
+ end
@@ -23,16 +23,36 @@ Shindo.tests("Fog::Compute[:softlayer] | server requests", ["softlayer"]) do
23
23
  tests("#create_bare_metal_server('#{@bmc}')") do
24
24
  response = @sl_connection.create_bare_metal_server(@bmc)
25
25
  @server_id = response.body['id']
26
+ @server_ip = response.body['primaryIpAddress']
26
27
  data_matches_schema(Softlayer::Compute::Formats::BareMetal::SERVER, {:allow_extra_keys => true}) { response.body }
27
28
  data_matches_schema(201) { response.status }
28
29
  end
29
30
 
31
+ tests"#get_bare_metal_server_by_ip('#{@server_ip}'))" do
32
+ response = @sl_connection.get_bare_metal_server_by_ip(@server_ip)
33
+ data_matches_schema(200) { response.status }
34
+ data_matches_schema(Softlayer::Compute::Formats::BareMetal::SERVER) { response.body }
35
+ end
36
+
37
+
30
38
  tests("#get_bare_metal_servers()") do
31
39
  @sl_connection.get_bare_metal_servers.body.each do |bms|
32
40
  data_matches_schema(Softlayer::Compute::Formats::BareMetal::SERVER) { bms }
33
41
  end
34
42
  end
35
43
 
44
+ tests("#get_bare_metal_active_tickets('#{@server_id})'") do
45
+ response = @sl_connection.get_bare_metal_active_tickets(@server_id)
46
+ data_matches_schema(Array) {response.body}
47
+ data_matches_schema(200) {response.status}
48
+ end
49
+
50
+ tests("#get_bare_metal_users('#{@server_id})'") do
51
+ response = @sl_connection.get_bare_metal_users(@server_id)
52
+ data_matches_schema(Array) {response.body}
53
+ data_matches_schema(200) {response.status}
54
+ end
55
+
36
56
  tests("#power_on_bare_metal_server('#{@server_id})'") do
37
57
  response = @sl_connection.power_on_bare_metal_server(@server_id)
38
58
  data_matches_schema(true) {response.body}
@@ -62,6 +82,12 @@ Shindo.tests("Fog::Compute[:softlayer] | server requests", ["softlayer"]) do
62
82
  data_matches_schema(true) {response.body}
63
83
  data_matches_schema(200) {response.status}
64
84
  end
85
+
86
+ tests("#get_bare_metal_create_options()") do
87
+ response = @sl_connection.get_bare_metal_create_options
88
+ data_matches_schema(Hash) {response.body}
89
+ data_matches_schema(200) {response.status}
90
+ end
65
91
  end
66
92
 
67
93
  tests('failure') do
@@ -77,6 +103,18 @@ Shindo.tests("Fog::Compute[:softlayer] | server requests", ["softlayer"]) do
77
103
  @sl_connection.create_bare_metal_server([@bmc])
78
104
  end
79
105
 
106
+ tests("#get_bare_metal_server_by_ip('1.1.1.1')") do
107
+ response = @sl_connection.get_bare_metal_server_by_ip('1.1.1.1')
108
+ data_matches_schema('SoftLayer_Exception_ObjectNotFound'){ response.body['code'] }
109
+ data_matches_schema(404){ response.status }
110
+ end
111
+
112
+ tests("#get_bare_metal_users('#{bmc}')") do
113
+ response = @sl_connection.get_bare_metal_users(bmc)
114
+ data_matches_schema('SoftLayer_Exception_ObjectNotFound'){ response.body['code'] }
115
+ data_matches_schema(404){ response.status }
116
+ end
117
+
80
118
  tests("#power_on_bare_metal_server('#{bmc}')") do
81
119
  response = @sl_connection.power_on_bare_metal_server(bmc)
82
120
  data_matches_schema('SoftLayer_Exception_ObjectNotFound'){ response.body['code'] }
@@ -40,16 +40,35 @@ Shindo.tests("Fog::Compute[:softlayer] | server requests", ["softlayer"]) do
40
40
  tests("#create_vm('#{@vm}')") do
41
41
  response = @sl_connection.create_vm(@vm)
42
42
  @vm_id = response.body.first['id']
43
+ @vm_ip = response.body.first['primaryIpAddress']
43
44
  #data_matches_schema([Softlayer::Compute::Formats::VirtualGuest::SERVER], {:allow_extra_keys => true}) { response.body }
44
45
  data_matches_schema(200) { response.status }
45
46
  end
46
47
 
48
+ tests"#get_virtual_guest_by_ip('#{@vm_ip}'))" do
49
+ response = @sl_connection.get_virtual_guest_by_ip(@vm_ip)
50
+ data_matches_schema(200) { response.status }
51
+ data_matches_schema(Softlayer::Compute::Formats::VirtualGuest::SERVER) { response.body }
52
+ end
53
+
47
54
  tests"#get_vms()" do
48
55
  response = @sl_connection.get_vms
49
56
  data_matches_schema(200) { response.status }
50
57
  #data_matches_schema(Softlayer::Compute::Formats::VirtualGuest::SERVER) { vm }
51
58
  end
52
59
 
60
+ tests("#get_virtual_guest_active_tickets(#{@vm_id})") do
61
+ response = @sl_connection.get_virtual_guest_active_tickets(@vm_id)
62
+ data_matches_schema(Array) {response.body}
63
+ data_matches_schema(200) {response.status}
64
+ end
65
+
66
+ tests("#get_virtual_guest_users(#{@vm_id})") do
67
+ response = @sl_connection.get_virtual_guest_users(@vm_id)
68
+ data_matches_schema(Array) {response.body}
69
+ data_matches_schema(200) {response.status}
70
+ end
71
+
53
72
  tests("#power_on_vm(#{@vm_id})") do
54
73
  response = @sl_connection.power_on_vm(@vm_id)
55
74
  data_matches_schema(true) {response.body}
@@ -85,6 +104,12 @@ Shindo.tests("Fog::Compute[:softlayer] | server requests", ["softlayer"]) do
85
104
  data_matches_schema(true) {response.body}
86
105
  data_matches_schema(200) {response.status}
87
106
  end
107
+
108
+ tests("#get_virtual_guest_create_options()") do
109
+ response = @sl_connection.get_virtual_guest_create_options
110
+ data_matches_schema(Hash) {response.body}
111
+ data_matches_schema(200) {response.status}
112
+ end
88
113
  end
89
114
 
90
115
  tests('failure') do
@@ -110,6 +135,18 @@ Shindo.tests("Fog::Compute[:softlayer] | server requests", ["softlayer"]) do
110
135
  @sl_connection.create_vm(@vms)
111
136
  end
112
137
 
138
+ tests("#get_virtual_guest_by_ip('1.1.1.1')") do
139
+ response = @sl_connection.get_virtual_guest_by_ip('1.1.1.1')
140
+ data_matches_schema('SoftLayer_Exception_ObjectNotFound'){ response.body['code'] }
141
+ data_matches_schema(404) {response.status}
142
+ end
143
+
144
+ tests("#get_virtual_guest_users('99999999999999')") do
145
+ response = @sl_connection.get_virtual_guest_users(99999999999999)
146
+ data_matches_schema('SoftLayer_Exception_ObjectNotFound'){ response.body['code'] }
147
+ data_matches_schema(404) {response.status}
148
+ end
149
+
113
150
  tests("#power_on_vm('99999999999999')") do
114
151
  response = @sl_connection.power_on_vm(99999999999999)
115
152
  data_matches_schema('SoftLayer_Exception_ObjectNotFound'){ response.body['code'] }