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
@@ -0,0 +1,33 @@
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
+ require 'fog/core/collection'
9
+ require 'fog/softlayer/models/network/subnet'
10
+
11
+ module Fog
12
+ module Network
13
+ class Softlayer
14
+ class Subnets < Fog::Collection
15
+ attribute :filters
16
+
17
+ model Fog::Network::Softlayer::Subnet
18
+
19
+ def all
20
+ load(service.list_subnets.body)
21
+ end
22
+
23
+ def get(id)
24
+ if subnet = service.get_subnet(id).body
25
+ new(subnet)
26
+ end
27
+ rescue Fog::Network::Softlayer::NotFound
28
+ nil
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,54 @@
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 Network
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
+ service.delete_network_tags(self.resource_id, [self.name])
27
+ #load_network
28
+ #@network.delete_tags([self.name])
29
+ true
30
+ end
31
+
32
+ def references
33
+ @networks ||= service.request(:tag, "#{id}", :query => "objectMask=references;references.tagType").body['references'].map do |ref|
34
+ service.networks.get(ref['resourceTableId']) if ref['tagType']['keyName'] == 'NETWORK_VLAN'
35
+ end.compact
36
+ end
37
+
38
+ def save
39
+ requires :name, :resource_id
40
+ load_network
41
+ service.create_network_tags(self.resource_id, @network.tags << self.name)
42
+ true
43
+ end
44
+
45
+ private
46
+
47
+ def load_network
48
+ requires :resource_id
49
+ @network ||= service.networks.get(self.resource_id)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ 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/network/tag'
9
+
10
+ module Fog
11
+ module Network
12
+ class Softlayer
13
+ class Tags < Fog::Collection
14
+ attribute :filters
15
+
16
+ model Fog::Network::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.request(:account, :get_tags, :query => 'objectMask=mask[referenceCount]').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.request(:tag, id)
34
+ data = response.body
35
+ new.merge_attributes(data)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,10 @@
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
+
1
8
  require 'fog/core/collection'
2
9
  require 'fog/softlayer/models/storage/directory'
3
10
 
@@ -1,3 +1,10 @@
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
+
1
8
  require 'fog/core/model'
2
9
  require 'fog/softlayer/models/storage/files'
3
10
 
@@ -1,3 +1,10 @@
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
+
1
8
  require 'fog/core/model'
2
9
 
3
10
  module Fog
@@ -1,3 +1,10 @@
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
+
1
8
  require 'fog/core/collection'
2
9
  require 'fog/softlayer/models/storage/file'
3
10
 
@@ -0,0 +1,139 @@
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
+ require 'fog/softlayer/core'
9
+
10
+ module Fog
11
+ module Network
12
+ class Softlayer < Fog::Service
13
+
14
+ requires :softlayer_username, :softlayer_api_key
15
+
16
+
17
+ ## MODELS
18
+ #
19
+ model_path 'fog/softlayer/models/network'
20
+ model :datacenter
21
+ collection :datacenters
22
+ model :network
23
+ collection :networks
24
+ #model :port
25
+ #collection :ports
26
+ model :subnet
27
+ collection :subnets
28
+ model :ip
29
+ collection :ips
30
+ model :tag
31
+ collection :tags
32
+ #model :router
33
+ #collection :routers
34
+
35
+
36
+ ## REQUESTS
37
+ #
38
+ request_path 'fog/softlayer/requests/network'
39
+
40
+ request :list_networks
41
+ request :create_network
42
+ request :delete_network
43
+ request :get_network
44
+ #request :update_network
45
+
46
+ request :get_private_vlan_price_code
47
+ request :get_public_vlan_price_code
48
+ request :get_subnet_package_id
49
+ request :get_subnet_price_code
50
+ request :get_datacenters
51
+ request :get_datacenter_routers
52
+ request :get_references_by_tag_name
53
+
54
+
55
+ request :create_network_tags
56
+ request :delete_network_tags
57
+ request :get_network_tags
58
+
59
+ #request :list_ports
60
+ #request :create_port
61
+ #request :delete_port
62
+ #request :get_port
63
+ #request :update_port
64
+
65
+ request :list_subnets
66
+ #request :create_subnet
67
+ #request :delete_subnet
68
+ request :get_subnet
69
+ #request :update_subnet
70
+
71
+ #request :list_ip_addresses
72
+ #request :create_ip_addresse
73
+ #request :delete_ip_addresse
74
+ request :get_ip_address
75
+ #request :associate_ip_address
76
+ #request :disassociate_ip_address
77
+
78
+ class Mock
79
+ #Fog::Mock.random_ip,
80
+
81
+ def self.reset
82
+ @data = nil
83
+ end
84
+
85
+ def initialize(options={})
86
+ @softlayer_api_key = options[:softlayer_api_key]
87
+ @softlayer_username = options[:softlayer_username]
88
+
89
+ @networks = []
90
+ @datacenters = [
91
+ {"id"=>265592, "longName"=>"Amsterdam 1", "name"=>"ams01"},
92
+ {"id"=>358698, "longName"=>"Ashburn, VA 3", "name"=>"wdc03"},
93
+ {"id"=>3, "longName"=>"Dallas 1", "name"=>"dal01"},
94
+ {"id"=>154770, "longName"=>"Dallas 2", "name"=>"dal02"},
95
+ {"id"=>167092, "longName"=>"Dallas 4", "name"=>"dal04"},
96
+ {"id"=>138124, "longName"=>"Dallas 5", "name"=>"dal05"},
97
+ {"id"=>154820, "longName"=>"Dallas 6", "name"=>"dal06"},
98
+ {"id"=>142776, "longName"=>"Dallas 7", "name"=>"dal07"},
99
+ {"id"=>352494, "longName"=>"Hong Kong 2", "name"=>"hkg02"},
100
+ {"id"=>142775, "longName"=>"Houston 2", "name"=>"hou02"},
101
+ {"id"=>358694, "longName"=>"London 2", "name"=>"lon02"},
102
+ {"id"=>168642, "longName"=>"San Jose 1", "name"=>"sjc01"},
103
+ {"id"=>18171, "longName"=>"Seattle", "name"=>"sea01"},
104
+ {"id"=>224092, "longName"=>"Singapore 1", "name"=>"sng01"},
105
+ {"id"=>448994, "longName"=>"Toronto 1", "name"=>"tor01"},
106
+ {"id"=>37473, "longName"=>"Washington, DC 1", "name"=>"wdc01"}
107
+ ]
108
+ @tags = []
109
+ end
110
+
111
+ def credentials
112
+ { :provider => 'softlayer',
113
+ :softlayer_username => @softlayer_username,
114
+ :softlayer_api_key => @softlayer_api_key
115
+ }
116
+ end
117
+ end
118
+
119
+ class Real
120
+ include Fog::Softlayer::Slapi
121
+
122
+ def initialize(options={})
123
+ @softlayer_api_key = options[:softlayer_api_key]
124
+ @softlayer_username = options[:softlayer_username]
125
+ end
126
+
127
+ def request(service, path, options = {})
128
+ options = {:username => @softlayer_username, :api_key => @softlayer_api_key}.merge(options)
129
+ Fog::Softlayer::Slapi.slapi_request(service, path, options)
130
+ end
131
+
132
+ def list_networks
133
+ self.list_networks
134
+ end
135
+
136
+ end
137
+ end
138
+ end
139
+ end
@@ -39,7 +39,7 @@ module Fog
39
39
 
40
40
  begin
41
41
  Fog::Softlayer.valid_request?(required, opts) or raise MissingRequiredParameter
42
- response.status = 200
42
+ response.status = 201
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
45
  'accountId' => Fog::Softlayer.mock_account_id,
@@ -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,tagReferences,blockDevices,blockDeviceTemplateGroup.globalIdentifier,operatingSystem.passwords.password]')
23
+ request(:account, :get_virtual_guests, :query => 'objectMask=mask[datacenter,tagReferences,blockDevices,blockDeviceTemplateGroup.globalIdentifier,operatingSystem.passwords.password,primaryNetworkComponent.networkVlan]')
24
24
  end
25
25
  end
26
26
  end
@@ -0,0 +1,488 @@
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
+ def create_network(order)
14
+ raise ArgumentError, "Order argument for #{self.class.name}##{__method__} must be Hash." unless order.is_a?(Hash)
15
+ # TODO: make this better, this will never fail...
16
+ @networks << {
17
+ 'accountId' => Fog::Softlayer.mock_account_id,
18
+ 'id' => Fog::Mock.random_numbers(6).to_i,
19
+ 'modifyDate' => Time.now.iso8601,
20
+ 'name' => order['name'],
21
+ 'networkVrfId' => nil,
22
+ 'primarySubnetId' => Fog::Mock.random_numbers(6).to_i,
23
+ 'vlanNumber' => Fog::Mock.random_numbers(4).to_i,
24
+ 'networkSpace' => 'PRIVATE',
25
+ 'primaryRouter' =>
26
+ {
27
+ 'bareMetalInstanceFlag' => 0,
28
+ 'domain' => 'softlayer.com',
29
+ 'fullyQualifiedDomainName' => order['router'] << '.softlayer.com',
30
+ 'hostname' => order['router'],
31
+ 'id' => order['routerId'],
32
+ 'notes' => '',
33
+ 'serviceProviderId' => 1,
34
+ 'serviceProviderResourceId' => Fog::Mock.random_numbers(6).to_i,
35
+ 'datacenter' => {'id' => order['location'], 'longName' => 'Lilliput 4', 'name' => 'llp04'},
36
+ 'primaryIpAddress' => Fog::Mock.random_ip
37
+ },
38
+ 'subnets' =>
39
+ [
40
+ {
41
+ 'broadcastAddress' => Fog::Mock.random_ip,
42
+ 'cidr' => 30,
43
+ 'gateway' => Fog::Mock.random_ip,
44
+ 'id' => Fog::Mock.random_numbers(6).to_i,
45
+ 'isCustomerOwned' => false,
46
+ 'isCustomerRoutable' => false,
47
+ 'modifyDate' => Time.now.iso8601,
48
+ 'netmask' => '255.255.255.0',
49
+ 'networkIdentifier' => Fog::Mock.random_ip,
50
+ 'networkVlanId' => Fog::Mock.random_numbers(6).to_i,
51
+ 'sortOrder' => '4',
52
+ 'subnetType' => 'PRIMARY',
53
+ 'totalIpAddresses' => 4,
54
+ 'usableIpAddressCount' => 1,
55
+ 'version' => 4
56
+ }
57
+ ],
58
+ 'tagReferences' => [],
59
+ 'type' =>
60
+ {
61
+ 'description' => 'Standard network VLAN',
62
+ 'id' => 1,
63
+ 'keyName' => 'STANDARD',
64
+ 'name' => 'Standard'
65
+ }
66
+ }
67
+
68
+ response = Excon::Response.new
69
+ response.status = 200
70
+ response.body = {
71
+ 'orderDate' => Time.now.iso8601,
72
+ 'orderDetails' =>
73
+ {
74
+ 'bigDataOrderFlag' => false,
75
+ 'billingInformation' =>
76
+ {
77
+ 'billingAddressLine1' => '42 Haviture Way.',
78
+ 'billingCity' => 'Glover',
79
+ 'billingCountryCode' => 'US',
80
+ 'billingEmail' => 'donotreply@softlayer.com',
81
+ 'billingNameCompany' => 'SLayer\'s Inc.',
82
+ 'billingNameFirst' => 'Mr.',
83
+ 'billingNameLast' => 'Rogers',
84
+ 'billingPhoneVoice' => '123.456.7890',
85
+ 'billingPostalCode' => '90210',
86
+ 'billingState' => 'VT',
87
+ 'cardExpirationMonth' => nil,
88
+ 'cardExpirationYear' => nil,
89
+ 'taxExempt' => 0
90
+ },
91
+ 'billingOrderItemId' => nil,
92
+ 'containerSplHash' => '00000000000000000000000000000000',
93
+ 'currencyShortName' => 'USD',
94
+ 'extendedHardwareTesting' => nil,
95
+ 'imageTemplateId' => nil,
96
+ 'isManagedOrder' => 0,
97
+ 'itemCategoryQuestionAnswers' => [],
98
+ 'location' => Fog::Mock.random_numbers(6).to_i,
99
+ 'locationObject' =>
100
+ {
101
+ 'id' => Fog::Mock.random_numbers(6).to_i,
102
+ 'longName' => 'Amsterdam 1',
103
+ 'name' => 'ams01',
104
+ 'activePresaleEvents' => []},
105
+ 'packageId' => 0,
106
+ 'paymentType' => 'PAYPAL',
107
+ 'postTaxRecurring' => '0',
108
+ 'postTaxRecurringHourly' => '0',
109
+ 'postTaxRecurringMonthly' => '0',
110
+ 'postTaxSetup' => '0',
111
+ 'preTaxRecurring' => '0',
112
+ 'preTaxRecurringHourly' => '0',
113
+ 'preTaxRecurringMonthly' => '0',
114
+ 'preTaxSetup' => '0',
115
+ 'presetId' => nil,
116
+ 'prices' =>
117
+ [
118
+ {
119
+ 'currentPriceFlag' => nil,
120
+ 'hourlyRecurringFee' => '0',
121
+ 'id' => Fog::Mock.random_numbers(4).to_i,
122
+ 'itemId' => Fog::Mock.random_numbers(4).to_i,
123
+ 'laborFee' => '0',
124
+ 'onSaleFlag' => nil,
125
+ 'oneTimeFee' => '0',
126
+ 'oneTimeFeeTax' => '0',
127
+ 'proratedRecurringFee' => '0',
128
+ 'proratedRecurringFeeTax' => '0',
129
+ 'quantity' => nil,
130
+ 'recurringFee' => '0',
131
+ 'recurringFeeTax' => '0',
132
+ 'setupFee' => '0',
133
+ 'sort' => 0,
134
+ 'categories' =>
135
+ [
136
+ {
137
+ 'categoryCode' => 'network_vlan',
138
+ 'id' => 113,
139
+ 'name' => 'Network Vlan',
140
+ 'quantityLimit' => 0}],
141
+ 'item' =>
142
+ {
143
+ 'capacity' => '0',
144
+ 'description' => 'Private Network Vlan',
145
+ 'id' => Fog::Mock.random_numbers(4).to_i,
146
+ 'softwareDescriptionId' => nil,
147
+ 'units' => 'N/A',
148
+ 'upgradeItemId' => nil,
149
+ 'bundle' => [],
150
+ 'itemCategory' =>
151
+ {
152
+ 'categoryCode' => 'network_vlan',
153
+ 'id' => 113,
154
+ 'name' => 'Network Vlan',
155
+ 'quantityLimit' => 0}}},
156
+ {
157
+ 'currentPriceFlag' => nil,
158
+ 'hourlyRecurringFee' => '0',
159
+ 'id' => Fog::Mock.random_numbers(4).to_i,
160
+ 'itemId' => 577,
161
+ 'laborFee' => '0',
162
+ 'onSaleFlag' => nil,
163
+ 'oneTimeFee' => '0',
164
+ 'oneTimeFeeTax' => '0',
165
+ 'proratedRecurringFee' => '0',
166
+ 'proratedRecurringFeeTax' => '0',
167
+ 'quantity' => nil,
168
+ 'recurringFee' => '0',
169
+ 'recurringFeeTax' => '0',
170
+ 'setupFee' => '0',
171
+ 'sort' => 0,
172
+ 'categories' =>
173
+ [
174
+ {
175
+ 'categoryCode' => 'static_sec_ip_addresses',
176
+ 'id' => 53,
177
+ 'name' => 'Public Secondary Static IP Addresses',
178
+ 'quantityLimit' => 0}],
179
+ 'item' =>
180
+ {
181
+ 'capacity' => '4',
182
+ 'description' => '4 Static Public IP Addresses',
183
+ 'id' => 577,
184
+ 'softwareDescriptionId' => nil,
185
+ 'upgradeItemId' => nil,
186
+ 'bundle' => [],
187
+ 'itemCategory' =>
188
+ {
189
+ 'categoryCode' => 'static_sec_ip_addresses',
190
+ 'id' => 53,
191
+ 'name' => 'Public Secondary Static IP Addresses',
192
+ 'quantityLimit' => 0
193
+ }
194
+ }
195
+ }
196
+ ],
197
+ 'primaryDiskPartitionId' => nil,
198
+ 'privateCloudOrderFlag' => false,
199
+ 'properties' => [],
200
+ 'proratedInitialCharge' => '0',
201
+ 'proratedOrderTotal' => '0',
202
+ 'quantity' => 1,
203
+ 'resourceGroupId' => nil,
204
+ 'resourceGroupTemplateId' => nil,
205
+ 'sendQuoteEmailFlag' => nil,
206
+ 'serverCoreCount' => nil,
207
+ 'sourceVirtualGuestId' => nil,
208
+ 'sshKeys' => [],
209
+ 'stepId' => nil,
210
+ 'storageGroups' => [],
211
+ 'totalRecurringTax' => '0',
212
+ 'totalSetupTax' => '0',
213
+ 'useHourlyPricing' => false,
214
+ 'id' => nil,
215
+ 'name' => 'foobar',
216
+ 'router' =>
217
+ {
218
+ 'bareMetalInstanceFlag' => 0,
219
+ 'domain' => 'softlayer.com',
220
+ 'fullyQualifiedDomainName' => order['router'] << '.softlayer.com',
221
+ 'hostname' => order['router'],
222
+ 'id' => Fog::Mock.random_numbers(6).to_i,
223
+ 'notes' => '',
224
+ 'serviceProviderId' => 1,
225
+ 'serviceProviderResourceId' => Fog::Mock.random_numbers(6).to_i,
226
+ 'datacenter' => {'id' => order['location'], 'longName' => 'Lilliput 4', 'name' => 'llp04'}
227
+ },
228
+ 'routerId' => order['routerId'],
229
+ 'vlanNumber' => nil
230
+ },
231
+ 'orderId' => Fog::Mock.random_numbers(7).to_i,
232
+ 'placedOrder' =>
233
+ {
234
+ 'accountId' => Fog::Mock.random_numbers(6).to_i,
235
+ 'createDate' => Time.now.iso8601,
236
+ 'id' => Fog::Mock.random_numbers(7).to_i,
237
+ 'impersonatingUserRecordId' => nil,
238
+ 'modifyDate' => nil,
239
+ 'orderQuoteId' => nil,
240
+ 'orderTypeId' => 4,
241
+ 'presaleEventId' => nil,
242
+ 'privateCloudOrderFlag' => false,
243
+ 'status' => 'PENDING_AUTO_APPROVAL',
244
+ 'userRecordId' => Fog::Mock.random_numbers(6).to_i,
245
+ 'account' =>
246
+ {
247
+ 'accountStatusId' => Fog::Mock.random_numbers(4).to_i,
248
+ 'address1' => '4849 Alpha Rd.',
249
+ 'allowedPptpVpnQuantity' => 1,
250
+ 'brandId' => 2,
251
+ 'city' => 'Dallas',
252
+ 'claimedTaxExemptTxFlag' => false,
253
+ 'companyName' => 'SoftLayer Internal - Development Community',
254
+ 'country' => 'US',
255
+ 'createDate' => Time.now.iso8601,
256
+ 'email' => 'pjackson@softlayer.com',
257
+ 'firstName' => 'Phil',
258
+ 'id' => Fog::Mock.random_numbers(6).to_i,
259
+ 'isReseller' => 0,
260
+ 'lastName' => 'Jackson',
261
+ 'lateFeeProtectionFlag' => nil,
262
+ 'modifyDate' => Time.now.iso8601,
263
+ 'officePhone' => '281.714.3156',
264
+ 'postalCode' => '75244',
265
+ 'state' => 'TX',
266
+ 'statusDate' => nil,
267
+ 'hardwareCount' => 7,
268
+ 'canOrderAdditionalVlansFlag' => true,
269
+ 'hasPendingOrder' => 3},
270
+ 'items' =>
271
+ [
272
+ {
273
+ 'categoryCode' => 'network_vlan',
274
+ 'description' => 'Private Network Vlan',
275
+ 'id' => Fog::Mock.random_numbers(8).to_i,
276
+ 'itemId' => Fog::Mock.random_numbers(4).to_i,
277
+ 'itemPriceId' => '2019',
278
+ 'laborFee' => '0',
279
+ 'laborFeeTaxRate' => '.066',
280
+ 'oneTimeFee' => '0',
281
+ 'oneTimeFeeTaxRate' => '.066',
282
+ 'parentId' => nil,
283
+ 'promoCodeId' => nil,
284
+ 'quantity' => nil,
285
+ 'recurringFee' => '0',
286
+ 'setupFee' => '0',
287
+ 'setupFeeDeferralMonths' => 12,
288
+ 'setupFeeTaxRate' => '.066',
289
+ 'bundledItems' => [],
290
+ 'category' =>
291
+ {
292
+ 'categoryCode' => 'network_vlan',
293
+ 'id' => 113,
294
+ 'name' => 'Network Vlan',
295
+ 'quantityLimit' => 0},
296
+ 'children' =>
297
+ [
298
+ {
299
+ 'categoryCode' => 'static_sec_ip_addresses',
300
+ 'description' => '4 Static Public IP Addresses',
301
+ 'id' => Fog::Mock.random_numbers(8).to_i,
302
+ 'itemId' => 577,
303
+ 'itemPriceId' => '1084',
304
+ 'laborFee' => '0',
305
+ 'laborFeeTaxRate' => '.066',
306
+ 'oneTimeFee' => '0',
307
+ 'oneTimeFeeTaxRate' => '.066',
308
+ 'parentId' => Fog::Mock.random_numbers(8).to_i,
309
+ 'promoCodeId' => nil,
310
+ 'quantity' => nil,
311
+ 'recurringFee' => '0',
312
+ 'setupFee' => '0',
313
+ 'setupFeeDeferralMonths' => 12,
314
+ 'setupFeeTaxRate' => '.066',
315
+ 'bundledItems' => [],
316
+ 'category' =>
317
+ {
318
+ 'categoryCode' => 'static_sec_ip_addresses',
319
+ 'id' => 53,
320
+ 'name' => 'Public Secondary Static IP Addresses',
321
+ 'quantityLimit' => 0},
322
+ 'children' => [],
323
+ 'order' => nil,
324
+ 'storageGroups' => []
325
+ }
326
+ ],
327
+ 'location' => {'id' => Fog::Mock.random_numbers(6).to_i, 'longName' => 'Amsterdam 1', 'name' => 'ams01'},
328
+ 'order' => nil,
329
+ 'storageGroups' => []},
330
+ {
331
+ 'categoryCode' => 'static_sec_ip_addresses',
332
+ 'description' => '4 Static Public IP Addresses',
333
+ 'id' => Fog::Mock.random_numbers(8).to_i,
334
+ 'itemId' => 577,
335
+ 'itemPriceId' => '1084',
336
+ 'laborFee' => '0',
337
+ 'laborFeeTaxRate' => '.066',
338
+ 'oneTimeFee' => '0',
339
+ 'oneTimeFeeTaxRate' => '.066',
340
+ 'parentId' => Fog::Mock.random_numbers(8).to_i,
341
+ 'promoCodeId' => nil,
342
+ 'quantity' => nil,
343
+ 'recurringFee' => '0',
344
+ 'setupFee' => '0',
345
+ 'setupFeeDeferralMonths' => 12,
346
+ 'setupFeeTaxRate' => '.066',
347
+ 'bundledItems' => [],
348
+ 'category' =>
349
+ {
350
+ 'categoryCode' => 'static_sec_ip_addresses',
351
+ 'id' => 53,
352
+ 'name' => 'Public Secondary Static IP Addresses',
353
+ 'quantityLimit' => 0},
354
+ 'children' => [],
355
+ 'order' => nil,
356
+ 'storageGroups' => []
357
+ }
358
+ ],
359
+ 'orderTopLevelItems' =>
360
+ [
361
+ {
362
+ 'categoryCode' => 'network_vlan',
363
+ 'description' => 'Private Network Vlan',
364
+ 'id' => Fog::Mock.random_numbers(8).to_i,
365
+ 'itemId' => Fog::Mock.random_numbers(4).to_i,
366
+ 'itemPriceId' => '2019',
367
+ 'laborFee' => '0',
368
+ 'laborFeeTaxRate' => '.066',
369
+ 'oneTimeFee' => '0',
370
+ 'oneTimeFeeTaxRate' => '.066',
371
+ 'parentId' => nil,
372
+ 'promoCodeId' => nil,
373
+ 'quantity' => nil,
374
+ 'recurringFee' => '0',
375
+ 'setupFee' => '0',
376
+ 'setupFeeDeferralMonths' => 12,
377
+ 'setupFeeTaxRate' => '.066',
378
+ 'bundledItems' => [],
379
+ 'category' =>
380
+ {
381
+ 'categoryCode' => 'network_vlan',
382
+ 'id' => 113,
383
+ 'name' => 'Network Vlan',
384
+ 'quantityLimit' => 0},
385
+ 'children' =>
386
+ [
387
+ {
388
+ 'categoryCode' => 'static_sec_ip_addresses',
389
+ 'description' => '4 Static Public IP Addresses',
390
+ 'id' => Fog::Mock.random_numbers(8).to_i,
391
+ 'itemId' => 577,
392
+ 'itemPriceId' => '1084',
393
+ 'laborFee' => '0',
394
+ 'laborFeeTaxRate' => '.066',
395
+ 'oneTimeFee' => '0',
396
+ 'oneTimeFeeTaxRate' => '.066',
397
+ 'parentId' => Fog::Mock.random_numbers(8).to_i,
398
+ 'promoCodeId' => nil,
399
+ 'quantity' => nil,
400
+ 'recurringFee' => '0',
401
+ 'setupFee' => '0',
402
+ 'setupFeeDeferralMonths' => 12,
403
+ 'setupFeeTaxRate' => '.066',
404
+ 'bundledItems' => [],
405
+ 'category' =>
406
+ {
407
+ 'categoryCode' => 'static_sec_ip_addresses',
408
+ 'id' => 53,
409
+ 'name' => 'Public Secondary Static IP Addresses',
410
+ 'quantityLimit' => 0},
411
+ 'children' => [],
412
+ 'order' => nil,
413
+ 'storageGroups' => []
414
+ }
415
+ ],
416
+ 'location' => {'id' => 265592, 'longName' => 'Amsterdam 1', 'name' => 'ams01'},
417
+ 'order' => nil,
418
+ 'storageGroups' => []
419
+ }
420
+ ],
421
+ 'userRecord' =>
422
+ {
423
+ 'accountId' => Fog::Mock.random_numbers(6).to_i,
424
+ 'address1' => '315 Capitol Street',
425
+ 'authenticationToken' =>
426
+ {
427
+ 'hash' => 'd83e82b1c9a04befe6ac48368d9b61f3',
428
+ 'user' => nil,
429
+ 'userId' => 184064
430
+ },
431
+ 'city' => 'Houston',
432
+ 'companyName' => 'SLayer\'s Inc.',
433
+ 'country' => 'US',
434
+ 'createDate' => Time.now.iso8601,
435
+ 'daylightSavingsTimeFlag' => true,
436
+ 'denyAllResourceAccessOnCreateFlag' => false,
437
+ 'displayName' => 'PulseL',
438
+ 'email' => 'noreply@softlayer.com',
439
+ 'firstName' => 'Mr.',
440
+ 'forumPasswordHash' => '000000000000000000000000000000000000000000',
441
+ 'id' => Fog::Mock.random_numbers(6).to_i,
442
+ 'lastName' => 'Rogers',
443
+ 'localeId' => 1,
444
+ 'modifyDate' => Time.now.iso8601,
445
+ 'parentId' => Fog::Mock.random_numbers(6).to_i,
446
+ 'passwordExpireDate' => nil,
447
+ 'permissionSystemVersion' => 2,
448
+ 'postalCode' => '77002',
449
+ 'pptpVpnAllowedFlag' => false,
450
+ 'savedId' => Fog::Mock.random_numbers(6).to_i,
451
+ 'secondaryLoginManagementFlag' => nil,
452
+ 'secondaryLoginRequiredFlag' => nil,
453
+ 'secondaryPasswordModifyDate' => Time.now.iso8601,
454
+ 'secondaryPasswordTimeoutDays' => 0,
455
+ 'sslVpnAllowedFlag' => false,
456
+ 'state' => 'TX',
457
+ 'statusDate' => nil,
458
+ 'timezoneId' => 113,
459
+ 'userStatusId' => Fog::Mock.random_numbers(4).to_i,
460
+ 'username' => 'sl307608-meldridge',
461
+ 'vpnManualConfig' => false,
462
+ 'hasFullHardwareAccessFlag' => true,
463
+ 'timezone' =>
464
+ {
465
+ 'id' => 113,
466
+ 'longName' => '(GMT-06:00) America/Chicago - CST',
467
+ 'name' => 'America/Chicago',
468
+ 'offset' => '-0600',
469
+ 'shortName' => 'CST'
470
+ }
471
+ }
472
+ }
473
+ }
474
+ response
475
+
476
+
477
+ end
478
+ end
479
+
480
+ class Real
481
+ def create_network(order)
482
+ raise ArgumentError, "Order argument for #{self.class.name}##{__method__} must be Hash." unless order.is_a?(Hash)
483
+ self.request(:product_order, :place_order, :body => order, :http_method => :post)
484
+ end
485
+ end
486
+ end
487
+ end
488
+ end