fog-softlayer 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +15 -7
  2. data/.gitignore +28 -0
  3. data/Gemfile +7 -0
  4. data/Rakefile +225 -1
  5. data/fog-softlayer.gemspec +15 -5
  6. data/lib/fog.rb +29 -0
  7. data/lib/fog/softlayer.rb +8 -0
  8. data/lib/fog/softlayer/compute.rb +0 -15
  9. data/lib/fog/softlayer/core.rb +6 -8
  10. data/lib/fog/softlayer/version.rb +7 -1
  11. data/spec/fog/compute/softlayer_spec.rb +6 -0
  12. data/tests/compute/flavors_helper.rb +40 -0
  13. data/tests/compute/server_helper.rb +33 -0
  14. data/tests/compute/servers_helper.rb +18 -0
  15. data/tests/helper.rb +68 -0
  16. data/tests/helpers/collection_helper.rb +102 -0
  17. data/tests/helpers/compute/flavors_helper.rb +34 -0
  18. data/tests/helpers/compute/server_helper.rb +27 -0
  19. data/tests/helpers/compute/servers_helper.rb +12 -0
  20. data/tests/helpers/formats_helper.rb +99 -0
  21. data/tests/helpers/formats_helper_tests.rb +111 -0
  22. data/tests/helpers/mock_helper.rb +111 -0
  23. data/tests/helpers/model_helper.rb +35 -0
  24. data/tests/helpers/responds_to_helper.rb +13 -0
  25. data/tests/helpers/schema_validator_tests.rb +107 -0
  26. data/tests/helpers/succeeds_helper.rb +11 -0
  27. data/tests/lorem.txt +1 -0
  28. data/tests/softlayer/compute/helper.rb +7 -0
  29. data/tests/softlayer/compute/schema.rb +133 -0
  30. data/tests/softlayer/compute_tests.rb +34 -0
  31. data/tests/softlayer/helper.rb +9 -0
  32. data/tests/softlayer/models/compute/flavor_tests.rb +24 -0
  33. data/tests/softlayer/models/compute/image_tests.rb +25 -0
  34. data/tests/softlayer/models/compute/server_tests.rb +80 -0
  35. data/tests/softlayer/requests/compute/bmc_tests.rb +62 -0
  36. data/tests/softlayer/requests/compute/vm_tests.rb +90 -0
  37. metadata +254 -59
@@ -0,0 +1,111 @@
1
+ Shindo.tests('test_helper', 'meta') do
2
+
3
+ tests('comparing welcome data against schema') do
4
+ data = {:welcome => "Hello" }
5
+ data_matches_schema(:welcome => String) { data }
6
+ end
7
+
8
+ tests('#data_matches_schema') do
9
+ tests('when value matches schema expectation') do
10
+ data_matches_schema({"key" => String}) { {"key" => "Value"} }
11
+ end
12
+
13
+ tests('when values within an array all match schema expectation') do
14
+ data_matches_schema({"key" => [Integer]}) { {"key" => [1, 2]} }
15
+ end
16
+
17
+ tests('when nested values match schema expectation') do
18
+ data_matches_schema({"key" => {:nested_key => String}}) { {"key" => {:nested_key => "Value"}} }
19
+ end
20
+
21
+ tests('when collection of values all match schema expectation') do
22
+ data_matches_schema([{"key" => String}]) { [{"key" => "Value"}, {"key" => "Value"}] }
23
+ end
24
+
25
+ tests('when collection is empty although schema covers optional members') do
26
+ data_matches_schema([{"key" => String}], {:allow_optional_rules => true}) { [] }
27
+ end
28
+
29
+ tests('when additional keys are passed and not strict') do
30
+ data_matches_schema({"key" => String}, {:allow_extra_keys => true}) { {"key" => "Value", :extra => "Bonus"} }
31
+ end
32
+
33
+ tests('when value is nil and schema expects NilClass') do
34
+ data_matches_schema({"key" => NilClass}) { {"key" => nil} }
35
+ end
36
+
37
+ tests('when value and schema match as hashes') do
38
+ data_matches_schema({}) { {} }
39
+ end
40
+
41
+ tests('when value and schema match as arrays') do
42
+ data_matches_schema([]) { [] }
43
+ end
44
+
45
+ tests('when value is a Time') do
46
+ data_matches_schema({"time" => Time}) { {"time" => Time.now} }
47
+ end
48
+
49
+ tests('when key is missing but value should be NilClass (#1477)') do
50
+ data_matches_schema({"key" => NilClass}, {:allow_optional_rules => true}) { {} }
51
+ end
52
+
53
+ tests('when key is missing but value is nullable (#1477)') do
54
+ data_matches_schema({"key" => Fog::Nullable::String}, {:allow_optional_rules => true}) { {} }
55
+ end
56
+ end
57
+
58
+ tests('#formats backwards compatible changes') do
59
+
60
+ tests('when value matches schema expectation') do
61
+ formats({"key" => String}) { {"key" => "Value"} }
62
+ end
63
+
64
+ tests('when values within an array all match schema expectation') do
65
+ formats({"key" => [Integer]}) { {"key" => [1, 2]} }
66
+ end
67
+
68
+ tests('when nested values match schema expectation') do
69
+ formats({"key" => {:nested_key => String}}) { {"key" => {:nested_key => "Value"}} }
70
+ end
71
+
72
+ tests('when collection of values all match schema expectation') do
73
+ formats([{"key" => String}]) { [{"key" => "Value"}, {"key" => "Value"}] }
74
+ end
75
+
76
+ tests('when collection is empty although schema covers optional members') do
77
+ formats([{"key" => String}]) { [] }
78
+ end
79
+
80
+ tests('when additional keys are passed and not strict') do
81
+ formats({"key" => String}, false) { {"key" => "Value", :extra => "Bonus"} }
82
+ end
83
+
84
+ tests('when value is nil and schema expects NilClass') do
85
+ formats({"key" => NilClass}) { {"key" => nil} }
86
+ end
87
+
88
+ tests('when value and schema match as hashes') do
89
+ formats({}) { {} }
90
+ end
91
+
92
+ tests('when value and schema match as arrays') do
93
+ formats([]) { [] }
94
+ end
95
+
96
+ tests('when value is a Time') do
97
+ formats({"time" => Time}) { {"time" => Time.now} }
98
+ end
99
+
100
+ tests('when key is missing but value should be NilClass (#1477)') do
101
+ formats({"key" => NilClass}) { {} }
102
+ end
103
+
104
+ tests('when key is missing but value is nullable (#1477)') do
105
+ formats({"key" => Fog::Nullable::String}) { {} }
106
+ end
107
+
108
+ end
109
+
110
+
111
+ end
@@ -0,0 +1,111 @@
1
+ # Use so you can run in mock mode from the command line
2
+ #
3
+ # FOG_MOCK=true fog
4
+
5
+ if ENV["FOG_MOCK"] == "true"
6
+ Fog.mock!
7
+ end
8
+
9
+ # if in mocked mode, fill in some fake credentials for us
10
+ if Fog.mock?
11
+ Fog.credentials = {
12
+ :aws_access_key_id => 'aws_access_key_id',
13
+ :aws_secret_access_key => 'aws_secret_access_key',
14
+ :ia_access_key_id => 'aws_access_key_id',
15
+ :ia_secret_access_key => 'aws_secret_access_key',
16
+ :atmos_storage_token => 'atmos_token',
17
+ :atmos_storage_secret => 'atmos_secret',
18
+ :atmos_storage_endpoint => 'http://atmos.is.cool:1000/test1.0',
19
+ :bluebox_api_key => 'bluebox_api_key',
20
+ :bluebox_customer_id => 'bluebox_customer_id',
21
+ :brightbox_client_id => 'brightbox_client_id',
22
+ :brightbox_secret => 'brightbox_secret',
23
+ :cloudstack_disk_offering_id => '',
24
+ :cloudstack_host => 'http://cloudstack.example.org',
25
+ :cloudstack_network_ids => '',
26
+ :cloudstack_service_offering_id => '4437ac6c-9fe3-477a-57ec-60a5a45896a4',
27
+ :cloudstack_template_id => '8a31cf9c-f248-0588-256e-9dbf58785216',
28
+ :cloudstack_zone_id => 'c554c592-e09c-9df5-7688-4a32754a4305',
29
+ :clodo_api_key => 'clodo_api_key',
30
+ :clodo_username => 'clodo_username',
31
+ :digitalocean_api_key => 'digitalocean_api_key',
32
+ :digitalocean_client_id => 'digitalocean_client_id',
33
+ :dnsimple_email => 'dnsimple_email',
34
+ :dnsimple_password => 'dnsimple_password',
35
+ :dnsmadeeasy_api_key => 'dnsmadeeasy_api_key',
36
+ :dnsmadeeasy_secret_key => 'dnsmadeeasy_secret_key',
37
+ :ecloud_username => 'ecloud_username',
38
+ :ecloud_password => 'ecloud_password',
39
+ :ecloud_versions_uri => 'http://ecloud.versions.uri',
40
+ :glesys_username => 'glesys_username',
41
+ :glesys_api_key => 'glesys_api_key',
42
+ :go_grid_api_key => 'go_grid_api_key',
43
+ :go_grid_shared_secret => 'go_grid_shared_secret',
44
+ :google_storage_access_key_id => 'google_storage_access_key_id',
45
+ :google_storage_secret_access_key => 'google_storage_secret_access_key',
46
+ :google_project => 'google_project_name',
47
+ :google_client_email => 'fake@developer.gserviceaccount.com',
48
+ :google_key_location => '~/fake.p12',
49
+ :hp_access_key => 'hp_access_key',
50
+ :hp_secret_key => 'hp_secret_key',
51
+ :hp_tenant_id => 'hp_tenant_id',
52
+ :hp_avl_zone => 'hp_avl_zone',
53
+ :os_account_meta_temp_url_key => 'os_account_meta_temp_url_key',
54
+ :ibm_username => 'ibm_username',
55
+ :ibm_password => 'ibm_password',
56
+ :joyent_username => "joyentuser",
57
+ :joyent_password => "joyentpass",
58
+ :linode_api_key => 'linode_api_key',
59
+ :local_root => '~/.fog',
60
+ :bare_metal_cloud_password => 'bare_metal_cloud_password',
61
+ :bare_metal_cloud_username => 'bare_metal_cloud_username',
62
+ :ninefold_compute_key => 'ninefold_compute_key',
63
+ :ninefold_compute_secret => 'ninefold_compute_secret',
64
+ :ninefold_storage_secret => 'ninefold_storage_secret',
65
+ :ninefold_storage_token => 'ninefold_storage_token',
66
+ # :public_key_path => '~/.ssh/id_rsa.pub',
67
+ # :private_key_path => '~/.ssh/id_rsa',
68
+ :openstack_api_key => 'openstack_api_key',
69
+ :openstack_username => 'openstack_username',
70
+ :openstack_tenant => 'openstack_tenant',
71
+ :openstack_auth_url => 'http://openstack:35357/v2.0/tokens',
72
+ :ovirt_url => 'http://ovirt:8080/api',
73
+ :ovirt_username => 'admin@internal',
74
+ :ovirt_password => '123123',
75
+ :libvirt_uri => 'qemu://libvirt/system',
76
+ :rackspace_api_key => 'rackspace_api_key',
77
+ :rackspace_username => 'rackspace_username',
78
+ :riakcs_access_key_id => 'riakcs_access_key_id',
79
+ :riakcs_secret_access_key => 'riakcs_secret_access_key',
80
+ :sakuracloud_api_token => 'sakuracloud_api_token',
81
+ :sakuracloud_api_token_secret => 'sakuracloud_api_token_secret',
82
+ :storm_on_demand_username => 'storm_on_demand_username',
83
+ :storm_on_demand_password => 'storm_on_demand_password',
84
+ :vcloud_host => 'vcloud_host',
85
+ :vcloud_password => 'vcloud_password',
86
+ :vcloud_username => 'vcloud_username',
87
+ :vcloud_director_host => 'vcloud-director-host',
88
+ :vcloud_director_password => 'vcloud_director_password',
89
+ :vcloud_director_username => 'vcd_user@vcd_org_name',
90
+ :voxel_api_key => 'voxel_api_key',
91
+ :voxel_api_secret => 'voxel_api_secret',
92
+ :zerigo_email => 'zerigo_email',
93
+ :zerigo_token => 'zerigo_token',
94
+ :dynect_customer => 'dynect_customer',
95
+ :dynect_username => 'dynect_username',
96
+ :dynect_password => 'dynect_password',
97
+ :vsphere_server => 'virtualcenter.lan',
98
+ :vsphere_username => 'apiuser',
99
+ :vsphere_password => 'apipassword',
100
+ :vsphere_expected_pubkey_hash => 'abcdef1234567890',
101
+ :libvirt_uri => 'qemu:///system',
102
+ :libvirt_username => 'root',
103
+ :libvirt_password => 'password',
104
+ :cloudsigma_username => 'csuname',
105
+ :cloudsigma_password => 'cspass',
106
+ :docker_username => 'docker-fan',
107
+ :docker_password => 'i<3docker',
108
+ :docker_email => 'dockerfan@gmail.com',
109
+ :docker_url => 'unix://var/run/docker.sock'
110
+ }.merge(Fog.credentials)
111
+ end
@@ -0,0 +1,35 @@
1
+ def model_tests(collection, params = {}, mocks_implemented = true)
2
+
3
+ tests('success') do
4
+
5
+ @instance = collection.new(params)
6
+
7
+ tests("#save").succeeds do
8
+ pending if Fog.mocking? && !mocks_implemented
9
+ @instance.save
10
+ end
11
+
12
+ if block_given?
13
+ yield
14
+ end
15
+
16
+ tests("#destroy").succeeds do
17
+ pending if Fog.mocking? && !mocks_implemented
18
+ @instance.destroy
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+
25
+ # Generates a unique identifier with a random differentiator.
26
+ # Useful when rapidly re-running tests, so we don't have to wait
27
+ # serveral minutes for deleted objects to disappear from the API
28
+ # E.g. 'fog-test-1234'
29
+ def uniq_id(base_name = 'fog-test')
30
+ # random_differentiator
31
+ suffix = rand(65536).to_s(16).rjust(4, '0')
32
+ [base_name, suffix] * '-'
33
+ end
34
+
35
+
@@ -0,0 +1,13 @@
1
+ module Shindo
2
+ class Tests
3
+
4
+ def responds_to(method_names)
5
+ for method_name in [*method_names]
6
+ tests("#respond_to?(:#{method_name})").returns(true) do
7
+ @instance.respond_to?(method_name)
8
+ end
9
+ end
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,107 @@
1
+ Shindo.tests('Fog::Schema::DataValidator', 'meta') do
2
+
3
+ validator = Fog::Schema::DataValidator.new
4
+
5
+ tests('#validate') do
6
+
7
+ tests('returns true') do
8
+
9
+ returns(true, 'when value matches schema expectation') do
10
+ validator.validate({"key" => "Value"}, {"key" => String})
11
+ end
12
+
13
+ returns(true, 'when values within an array all match schema expectation') do
14
+ validator.validate({"key" => [1, 2]}, {"key" => [Integer]})
15
+ end
16
+
17
+ returns(true, 'when nested values match schema expectation') do
18
+ validator.validate({"key" => {:nested_key => "Value"}}, {"key" => {:nested_key => String}})
19
+ end
20
+
21
+ returns(true, 'when collection of values all match schema expectation') do
22
+ validator.validate([{"key" => "Value"}, {"key" => "Value"}], [{"key" => String}])
23
+ end
24
+
25
+ returns(true, 'when collection is empty although schema covers optional members') do
26
+ validator.validate([], [{"key" => String}])
27
+ end
28
+
29
+ returns(true, 'when additional keys are passed and not strict') do
30
+ validator.validate({"key" => "Value", :extra => "Bonus"}, {"key" => String}, {:allow_extra_keys => true})
31
+ end
32
+
33
+ returns(true, 'when value is nil and schema expects NilClass') do
34
+ validator.validate({"key" => nil}, {"key" => NilClass})
35
+ end
36
+
37
+ returns(true, 'when value and schema match as hashes') do
38
+ validator.validate({}, {})
39
+ end
40
+
41
+ returns(true, 'when value and schema match as arrays') do
42
+ validator.validate([], [])
43
+ end
44
+
45
+ returns(true, 'when value is a Time') do
46
+ validator.validate({"time" => Time.now}, {"time" => Time})
47
+ end
48
+
49
+ returns(true, 'when key is missing but value should be NilClass (#1477)') do
50
+ validator.validate({}, {"key" => NilClass}, {:allow_optional_rules => true})
51
+ end
52
+
53
+ returns(true, 'when key is missing but value is nullable (#1477)') do
54
+ validator.validate({}, {"key" => Fog::Nullable::String}, {:allow_optional_rules => true})
55
+ end
56
+
57
+ end
58
+
59
+ tests('returns false') do
60
+
61
+ returns(false, 'when value does not match schema expectation') do
62
+ validator.validate({"key" => nil}, {"key" => String})
63
+ end
64
+
65
+ returns(false, 'when key formats do not match') do
66
+ validator.validate({"key" => "Value"}, {:key => String})
67
+ end
68
+
69
+ returns(false, 'when additional keys are passed and strict') do
70
+ validator.validate({"key" => "Missing"}, {})
71
+ end
72
+
73
+ returns(false, 'when some keys do not appear') do
74
+ validator.validate({}, {"key" => String})
75
+ end
76
+
77
+ returns(false, 'when collection contains a member that does not match schema') do
78
+ validator.validate([{"key" => "Value"}, {"key" => 5}], [{"key" => String}])
79
+ end
80
+
81
+ returns(false, 'when collection has multiple schema patterns') do
82
+ validator.validate([{"key" => "Value"}], [{"key" => Integer}, {"key" => String}])
83
+ end
84
+
85
+ returns(false, 'when hash and array are compared') do
86
+ validator.validate({}, [])
87
+ end
88
+
89
+ returns(false, 'when array and hash are compared') do
90
+ validator.validate([], {})
91
+ end
92
+
93
+ returns(false, 'when a hash is expected but another data type is found') do
94
+ validator.validate({"key" => {:nested_key => []}}, {"key" => {:nested_key => {}}})
95
+ end
96
+
97
+ returns(false, 'when key is missing but value should be NilClass (#1477)') do
98
+ validator.validate({}, {"key" => NilClass}, {:allow_optional_rules => false})
99
+ end
100
+
101
+ returns(false, 'when key is missing but value is nullable (#1477)') do
102
+ validator.validate({}, {"key" => Fog::Nullable::String}, {:allow_optional_rules => false})
103
+ end
104
+
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,11 @@
1
+ module Shindo
2
+ class Tests
3
+
4
+ def succeeds
5
+ test('succeeds') do
6
+ !!instance_eval(&Proc.new)
7
+ end
8
+ end
9
+
10
+ end
11
+ end
data/tests/lorem.txt ADDED
@@ -0,0 +1 @@
1
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
@@ -0,0 +1,7 @@
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 File.expand_path("schema", File.dirname(__FILE__))
@@ -0,0 +1,133 @@
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
+ module Fog
8
+ module Softlayer
9
+ module Nullable
10
+ module Account; end
11
+ module BareMetal; end
12
+ module Collected; end
13
+ module Collection; end
14
+ module VirtualGuest; end
15
+ module Image; end
16
+ module IPV4; end
17
+ module LoadBalancer; end
18
+ end
19
+ end
20
+ end
21
+
22
+ Hash.send :include, Fog::Softlayer::Nullable::Account
23
+ NilClass.send :include, Fog::Softlayer::Nullable::Account
24
+
25
+ Hash.send :include, Fog::Softlayer::Nullable::BareMetal
26
+ NilClass.send :include, Fog::Softlayer::Nullable::BareMetal
27
+
28
+ Hash.send :include, Fog::Softlayer::Nullable::Collected
29
+ NilClass.send :include, Fog::Softlayer::Nullable::Collected
30
+
31
+ Hash.send :include, Fog::Softlayer::Nullable::Collection
32
+ NilClass.send :include, Fog::Softlayer::Nullable::Collection
33
+
34
+ Hash.send :include, Fog::Softlayer::Nullable::VirtualGuest
35
+ NilClass.send :include, Fog::Softlayer::Nullable::VirtualGuest
36
+
37
+ Hash.send :include, Fog::Softlayer::Nullable::Image
38
+ NilClass.send :include, Fog::Softlayer::Nullable::Image
39
+
40
+ Hash.send :include, Fog::Softlayer::Nullable::IPV4
41
+ NilClass.send :include, Fog::Softlayer::Nullable::IPV4
42
+
43
+ Hash.send :include, Fog::Softlayer::Nullable::LoadBalancer
44
+ NilClass.send :include, Fog::Softlayer::Nullable::LoadBalancer
45
+
46
+
47
+ class Softlayer
48
+ module Compute
49
+ module Formats
50
+ module Struct
51
+ ## nothing here yet
52
+ end
53
+
54
+ module BareMetal
55
+ SERVER = {
56
+ "accountId" => String,
57
+ "createDate" => String,
58
+ "dedicatedAccountHostOnlyFlag" => Fog::Nullable::Boolean,
59
+ "domain" => Fog::Nullable::String,
60
+ "fullyQualifiedDomainName" => Fog::Nullable::String,
61
+ "hostname" => Fog::Nullable::String,
62
+ "id" => String,
63
+ "lastPowerStateId" => Fog::Nullable::String,
64
+ "lastVerifiedDate" => Fog::Nullable::String,
65
+ "maxCpu" => Fog::Nullable::String,
66
+ "maxCpuUnits" => String,
67
+ "maxMemory" => Fog::Nullable::String,
68
+ "metricPollDate" => Fog::Nullable::String,
69
+ "modifyDate" => Fog::Nullable::String,
70
+ "startCpus" => Fog::Nullable::String,
71
+ "statusId" => Integer,
72
+ "globalIdentifier" => String
73
+ }
74
+
75
+ end
76
+
77
+ module VirtualGuest
78
+ SERVER = {
79
+ "accountId" => String,
80
+ "createDate" => String,
81
+ "dedicatedAccountHostOnlyFlag" => Fog::Nullable::Boolean,
82
+ "domain" => String,
83
+ "fullyQualifiedDomainName" => Fog::Nullable::String,
84
+ "hostname" => String,
85
+ "id" => String,
86
+ "lastPowerStateId" => Fog::Nullable::String,
87
+ "lastVerifiedDate" => Fog::Nullable::String,
88
+ "maxCpu" => Fog::Nullable::String,
89
+ "maxCpuUnits" => String,
90
+ "maxMemory" => Integer,
91
+ "metricPollDate" => Fog::Nullable::String,
92
+ "modifyDate" => Fog::Nullable::String,
93
+ "startCpus" => Integer,
94
+ "statusId" => Integer,
95
+ "globalIdentifier" => String
96
+ }
97
+
98
+ end
99
+
100
+ module Collected
101
+ SERVER = {
102
+ :id => Fog::Nullable::Integer,
103
+ :hostname => Fog::Nullable::String,
104
+ :domain => Fog::Nullable::String,
105
+ :fqdn => Fog::Nullable::String,
106
+ :cpu => Fog::Nullable::String,
107
+ :ram => Fog::Nullable,
108
+ :disk => Fog::Nullable::Array,
109
+ :private_ip => Fog::Nullable::String,
110
+ :public_ip => Fog::Nullable::String,
111
+ :flavor_id => Fog::Nullable::String,
112
+ :bare_metal => Fog::Nullable::Boolean,
113
+ :os_code => Fog::Nullable::String,
114
+ :image_id => Hash,
115
+ :ephemeral_storage => Fog::Nullable::Boolean,
116
+ :created_at => Fog::Nullable::Time,
117
+ :last_verified_date => Fog::Nullable::Time,
118
+ :metric_poll_date => Fog::Nullable::Time,
119
+ :modify_date => Fog::Nullable::Time,
120
+ :account_id => Fog::Nullable::Integer,
121
+ :datacenter => Fog::Nullable::String,
122
+ :single_tenant => Fog::Nullable::Boolean,
123
+ :global_identifier => Fog::Nullable::String,
124
+ :hourly_billing_flag => Fog::Nullable::Boolean,
125
+ }
126
+ end
127
+
128
+ module Collection
129
+ SERVERS = [Softlayer::Compute::Formats::Collected::SERVER]
130
+ end
131
+ end
132
+ end
133
+ end