bosh_vsphere_cpi 0.6.0 → 1.5.0.pre.1100

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/bin/vsphere_cpi_console +35 -0
  2. data/db/migrations/20120123235022_initial.rb +5 -0
  3. data/lib/cloud/vsphere/client.rb +4 -5
  4. data/lib/cloud/vsphere/cloud.rb +245 -226
  5. data/lib/cloud/vsphere/config.rb +0 -4
  6. data/lib/cloud/vsphere/models/disk.rb +3 -0
  7. data/lib/cloud/vsphere/path_finder.rb +12 -0
  8. data/lib/cloud/vsphere/resources.rb +0 -2
  9. data/lib/cloud/vsphere/version.rb +1 -1
  10. data/lib/cloud/vsphere.rb +5 -3
  11. data/lib/ruby_vim_sdk/base_type.rb +15 -0
  12. data/lib/ruby_vim_sdk/const.rb +32 -0
  13. data/lib/ruby_vim_sdk/core_types.rb +68 -0
  14. data/lib/ruby_vim_sdk/data_type.rb +14 -0
  15. data/lib/ruby_vim_sdk/enum_type.rb +12 -0
  16. data/lib/ruby_vim_sdk/ext.rb +9 -0
  17. data/lib/ruby_vim_sdk/managed_type.rb +12 -0
  18. data/lib/ruby_vim_sdk/method.rb +37 -0
  19. data/lib/ruby_vim_sdk/missing_types.rb +11 -0
  20. data/lib/ruby_vim_sdk/property.rb +49 -0
  21. data/lib/ruby_vim_sdk/server_objects.rb +2718 -0
  22. data/lib/ruby_vim_sdk/soap/deserializer.rb +301 -0
  23. data/lib/ruby_vim_sdk/soap/serializer.rb +225 -0
  24. data/lib/ruby_vim_sdk/soap/stub_adapter.rb +123 -0
  25. data/lib/ruby_vim_sdk/soap_exception.rb +12 -0
  26. data/lib/ruby_vim_sdk/typed_array.rb +9 -0
  27. data/lib/ruby_vim_sdk/types.rb +22 -0
  28. data/lib/ruby_vim_sdk/version.rb +5 -0
  29. data/lib/ruby_vim_sdk/vmodl/data_object.rb +102 -0
  30. data/lib/ruby_vim_sdk/vmodl/managed_object.rb +78 -0
  31. data/lib/ruby_vim_sdk/vmodl/method_name.rb +7 -0
  32. data/lib/ruby_vim_sdk/vmodl/property_path.rb +7 -0
  33. data/lib/ruby_vim_sdk/vmodl/type_name.rb +7 -0
  34. data/lib/ruby_vim_sdk/vmodl_helper.rb +33 -0
  35. data/lib/ruby_vim_sdk/vmomi_support.rb +280 -0
  36. data/lib/ruby_vim_sdk.rb +45 -0
  37. metadata +65 -53
  38. data/Rakefile +0 -50
  39. data/spec/spec_helper.rb +0 -33
  40. data/spec/unit/cloud/vsphere/resources/cluster_spec.rb +0 -383
  41. data/spec/unit/cloud/vsphere/resources/datacenter_spec.rb +0 -72
  42. data/spec/unit/cloud/vsphere/resources/datastore_spec.rb +0 -43
  43. data/spec/unit/cloud/vsphere/resources/folder_spec.rb +0 -63
  44. data/spec/unit/cloud/vsphere/resources/resource_pool_spec.rb +0 -42
  45. data/spec/unit/cloud/vsphere/resources/scorer_spec.rb +0 -73
  46. data/spec/unit/cloud/vsphere/resources/util_spec.rb +0 -35
  47. data/spec/unit/cloud/vsphere/resources_spec.rb +0 -216
metadata CHANGED
@@ -1,89 +1,89 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh_vsphere_cpi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
5
- prerelease:
4
+ version: 1.5.0.pre.1100
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - VMware
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-05 00:00:00.000000000 Z
12
+ date: 2013-10-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bosh_common
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: 1.5.0.pre.1100
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: '0'
29
+ version: 1.5.0.pre.1100
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: bosh_cpi
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
- - - ! '>='
35
+ - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 0.5.0
37
+ version: 1.5.0.pre.1100
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
- - - ! '>='
43
+ - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 0.5.0
45
+ version: 1.5.0.pre.1100
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: membrane
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
- - - ! '>='
51
+ - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: 0.0.2
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
59
- - - ! '>='
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 0.0.2
62
62
  - !ruby/object:Gem::Dependency
63
- name: ruby_vim_sdk
63
+ name: sequel
64
64
  requirement: !ruby/object:Gem::Requirement
65
65
  none: false
66
66
  requirements:
67
- - - ! '>='
67
+ - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: 0.0.3
69
+ version: 3.43.0
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  none: false
74
74
  requirements:
75
- - - ! '>='
75
+ - - ~>
76
76
  - !ruby/object:Gem::Version
77
- version: 0.0.3
77
+ version: 3.43.0
78
78
  - !ruby/object:Gem::Dependency
79
- name: sequel
79
+ name: rspec
80
80
  requirement: !ruby/object:Gem::Requirement
81
81
  none: false
82
82
  requirements:
83
83
  - - ! '>='
84
84
  - !ruby/object:Gem::Version
85
85
  version: '0'
86
- type: :runtime
86
+ type: :development
87
87
  prerelease: false
88
88
  version_requirements: !ruby/object:Gem::Requirement
89
89
  none: false
@@ -92,14 +92,14 @@ dependencies:
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
94
  - !ruby/object:Gem::Dependency
95
- name: uuidtools
95
+ name: rspec-fire
96
96
  requirement: !ruby/object:Gem::Requirement
97
97
  none: false
98
98
  requirements:
99
99
  - - ! '>='
100
100
  - !ruby/object:Gem::Version
101
101
  version: '0'
102
- type: :runtime
102
+ type: :development
103
103
  prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
105
105
  none: false
@@ -107,9 +107,12 @@ dependencies:
107
107
  - - ! '>='
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
- description: BOSH VSphere CPI
111
- email: support@vmware.com
112
- executables: []
110
+ description: ! 'BOSH VSphere CPI
111
+
112
+ a5984f'
113
+ email: support@cloudfoundry.com
114
+ executables:
115
+ - vsphere_cpi_console
113
116
  extensions: []
114
117
  extra_rdoc_files: []
115
118
  files:
@@ -121,6 +124,7 @@ files:
121
124
  - lib/cloud/vsphere/config.rb
122
125
  - lib/cloud/vsphere/lease_updater.rb
123
126
  - lib/cloud/vsphere/models/disk.rb
127
+ - lib/cloud/vsphere/path_finder.rb
124
128
  - lib/cloud/vsphere/resources.rb
125
129
  - lib/cloud/vsphere/resources/cluster.rb
126
130
  - lib/cloud/vsphere/resources/datacenter.rb
@@ -130,19 +134,37 @@ files:
130
134
  - lib/cloud/vsphere/resources/scorer.rb
131
135
  - lib/cloud/vsphere/resources/util.rb
132
136
  - lib/cloud/vsphere/version.rb
137
+ - lib/ruby_vim_sdk.rb
138
+ - lib/ruby_vim_sdk/base_type.rb
139
+ - lib/ruby_vim_sdk/const.rb
140
+ - lib/ruby_vim_sdk/core_types.rb
141
+ - lib/ruby_vim_sdk/data_type.rb
142
+ - lib/ruby_vim_sdk/enum_type.rb
143
+ - lib/ruby_vim_sdk/ext.rb
144
+ - lib/ruby_vim_sdk/managed_type.rb
145
+ - lib/ruby_vim_sdk/method.rb
146
+ - lib/ruby_vim_sdk/missing_types.rb
147
+ - lib/ruby_vim_sdk/property.rb
148
+ - lib/ruby_vim_sdk/server_objects.rb
149
+ - lib/ruby_vim_sdk/soap/deserializer.rb
150
+ - lib/ruby_vim_sdk/soap/serializer.rb
151
+ - lib/ruby_vim_sdk/soap/stub_adapter.rb
152
+ - lib/ruby_vim_sdk/soap_exception.rb
153
+ - lib/ruby_vim_sdk/typed_array.rb
154
+ - lib/ruby_vim_sdk/types.rb
155
+ - lib/ruby_vim_sdk/version.rb
156
+ - lib/ruby_vim_sdk/vmodl/data_object.rb
157
+ - lib/ruby_vim_sdk/vmodl/managed_object.rb
158
+ - lib/ruby_vim_sdk/vmodl/method_name.rb
159
+ - lib/ruby_vim_sdk/vmodl/property_path.rb
160
+ - lib/ruby_vim_sdk/vmodl/type_name.rb
161
+ - lib/ruby_vim_sdk/vmodl_helper.rb
162
+ - lib/ruby_vim_sdk/vmomi_support.rb
133
163
  - README
134
- - Rakefile
135
- - spec/spec_helper.rb
136
- - spec/unit/cloud/vsphere/resources/cluster_spec.rb
137
- - spec/unit/cloud/vsphere/resources/datacenter_spec.rb
138
- - spec/unit/cloud/vsphere/resources/datastore_spec.rb
139
- - spec/unit/cloud/vsphere/resources/folder_spec.rb
140
- - spec/unit/cloud/vsphere/resources/resource_pool_spec.rb
141
- - spec/unit/cloud/vsphere/resources/scorer_spec.rb
142
- - spec/unit/cloud/vsphere/resources/util_spec.rb
143
- - spec/unit/cloud/vsphere/resources_spec.rb
144
- homepage: http://www.vmware.com
145
- licenses: []
164
+ - bin/vsphere_cpi_console
165
+ homepage: https://github.com/cloudfoundry/bosh
166
+ licenses:
167
+ - Apache 2.0
146
168
  post_install_message:
147
169
  rdoc_options: []
148
170
  require_paths:
@@ -152,27 +174,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
174
  requirements:
153
175
  - - ! '>='
154
176
  - !ruby/object:Gem::Version
155
- version: '0'
177
+ version: 1.9.3
156
178
  required_rubygems_version: !ruby/object:Gem::Requirement
157
179
  none: false
158
180
  requirements:
159
- - - ! '>='
181
+ - - ! '>'
160
182
  - !ruby/object:Gem::Version
161
- version: '0'
183
+ version: 1.3.1
162
184
  requirements: []
163
185
  rubyforge_project:
164
186
  rubygems_version: 1.8.23
165
187
  signing_key:
166
188
  specification_version: 3
167
189
  summary: BOSH VSphere CPI
168
- test_files:
169
- - spec/spec_helper.rb
170
- - spec/unit/cloud/vsphere/resources/cluster_spec.rb
171
- - spec/unit/cloud/vsphere/resources/datacenter_spec.rb
172
- - spec/unit/cloud/vsphere/resources/datastore_spec.rb
173
- - spec/unit/cloud/vsphere/resources/folder_spec.rb
174
- - spec/unit/cloud/vsphere/resources/resource_pool_spec.rb
175
- - spec/unit/cloud/vsphere/resources/scorer_spec.rb
176
- - spec/unit/cloud/vsphere/resources/util_spec.rb
177
- - spec/unit/cloud/vsphere/resources_spec.rb
178
- has_rdoc:
190
+ test_files: []
data/Rakefile DELETED
@@ -1,50 +0,0 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
- $:.unshift(File.expand_path("../../rake", __FILE__))
4
-
5
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __FILE__)
6
-
7
- require "rubygems"
8
- require "bundler"
9
- Bundler.setup(:default, :test)
10
-
11
- require "rake"
12
- begin
13
- require "rspec/core/rake_task"
14
- rescue LoadError
15
- end
16
-
17
- require "bundler_task"
18
- require "ci_task"
19
-
20
- gem_helper = Bundler::GemHelper.new(Dir.pwd)
21
-
22
- desc "Build VSphere CPI gem into the pkg directory"
23
- task "build" do
24
- gem_helper.build_gem
25
- end
26
-
27
- desc "Build and install VSphere CPI into system gems"
28
- task "install" do
29
- Rake::Task["bundler:install"].invoke
30
- gem_helper.install_gem
31
- end
32
-
33
- BundlerTask.new
34
-
35
- if defined?(RSpec)
36
- namespace :spec do
37
- desc "Run Unit Tests"
38
- rspec_task = RSpec::Core::RakeTask.new(:unit) do |t|
39
- t.pattern = "spec/unit/**/*_spec.rb"
40
- t.rspec_opts = %w(--format progress --colour)
41
- end
42
-
43
- CiTask.new do |task|
44
- task.rspec_task = rspec_task
45
- end
46
- end
47
-
48
- desc "Run tests"
49
- task :spec => %w(spec:unit)
50
- end
data/spec/spec_helper.rb DELETED
@@ -1,33 +0,0 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__)
4
-
5
- require "rubygems"
6
- require "bundler"
7
- Bundler.setup(:default, :test)
8
-
9
- require "rspec"
10
-
11
- require "sequel"
12
- require "sequel/adapters/sqlite"
13
-
14
- Sequel.extension :migration
15
- db = Sequel.sqlite(':memory:')
16
- migration = File.expand_path("../../db/migrations/vsphere_cpi", __FILE__)
17
- Sequel::TimestampMigrator.new(db, migration, :table => "vsphere_cpi_schema").run
18
-
19
- require 'cloud'
20
- require 'cloud/vsphere'
21
-
22
- class VSphereSpecConfig
23
- attr_accessor :db, :logger, :uuid
24
- end
25
-
26
- config = VSphereSpecConfig.new
27
- config.db = db
28
- config.logger = Logger.new(STDOUT)
29
- config.logger.level = Logger::ERROR
30
- config.uuid = "123"
31
-
32
- Bosh::Clouds::Config.configure(config)
33
- VSphereCloud::Config.logger = config.logger
@@ -1,383 +0,0 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
- require File.expand_path("../../../../../spec_helper", __FILE__)
4
-
5
- describe VSphereCloud::Resources::Cluster do
6
- before(:each) do
7
- @client = mock(:client)
8
- VSphereCloud::Config.client = @client
9
- VSphereCloud::Config.mem_overcommit = 1.0
10
- @dc = mock(:datacenter)
11
- @dc_config = mock(:datacenter_config)
12
- @dc.stub!(:config).and_return(@dc_config)
13
- end
14
-
15
- describe :initialize do
16
- it "should create a cluster" do
17
- cluster_mob = mock(:cluster_mob)
18
-
19
- @client.should_receive(:get_properties).with(
20
- [], VimSdk::Vim::Datastore,
21
- %w(summary.freeSpace summary.capacity name)).and_return(
22
- {})
23
-
24
- VSphereCloud::Resources::Cluster.any_instance.stub(
25
- :fetch_cluster_utilization)
26
-
27
- cluster_config = mock(:cluster_config)
28
- cluster_config.stub!(:name).and_return("foo")
29
- cluster_config.stub!(:resource_pool).and_return(nil)
30
- cluster = VSphereCloud::Resources::Cluster.new(@dc, cluster_config, {
31
- :obj => cluster_mob,
32
- "datastore" => []
33
- })
34
-
35
- cluster.name.should == "foo"
36
- cluster.mob.should == cluster_mob
37
- cluster.ephemeral_datastores.should be_empty
38
- cluster.persistent_datastores.should be_empty
39
- cluster.shared_datastores.should be_empty
40
- end
41
-
42
- it "should create a cluster with dedicated datastores" do
43
- datastore_config = mock(:datastore_config)
44
- datastore_config.stub!(:ephemeral_pattern).and_return(/a/)
45
- datastore_config.stub!(:persistent_pattern).and_return(/b/)
46
- datastore_config.stub!(:allow_mixed).and_return(false)
47
- @dc_config.stub!(:datastores).and_return(datastore_config)
48
-
49
- datastore_a = mock(:datastore_a)
50
- datastore_a.stub(:name).and_return("a")
51
- datastore_a_mob = mock(:datastore_a_mob)
52
- datastore_a_properties = {
53
- "name" => "a",
54
- "summary.capacity" => 128 * 1024 * 1024 * 1024,
55
- "summary.freeSpace" => 32 * 1024 * 1024 * 1024
56
- }
57
- VSphereCloud::Resources::Datastore.stub!(:new).
58
- with(datastore_a_properties).and_return(datastore_a)
59
-
60
- datastore_b = mock(:datastore_b)
61
- datastore_b.stub(:name).and_return("b")
62
- datastore_b_mob = mock(:datastore_b_mob)
63
- datastore_b_properties = {
64
- "name" => "b",
65
- "summary.capacity" => 64 * 1024 * 1024 * 1024,
66
- "summary.freeSpace" => 8 * 1024 * 1024 * 1024
67
- }
68
- VSphereCloud::Resources::Datastore.stub!(:new).
69
- with(datastore_b_properties).and_return(datastore_b)
70
-
71
- @client.should_receive(:get_properties).with(
72
- [datastore_a_mob, datastore_b_mob], VimSdk::Vim::Datastore,
73
- %w(summary.freeSpace summary.capacity name)).and_return(
74
- {"a" => datastore_a_properties, "b" => datastore_b_properties})
75
-
76
- VSphereCloud::Resources::Cluster.any_instance.stub(
77
- :fetch_cluster_utilization)
78
-
79
- cluster_config = mock(:cluster_config)
80
- cluster_config.stub!(:name).and_return("foo")
81
- cluster_config.stub!(:resource_pool).and_return(nil)
82
- cluster = VSphereCloud::Resources::Cluster.new(@dc, cluster_config, {
83
- "datastore" => [datastore_a_mob, datastore_b_mob]
84
- })
85
-
86
- cluster.ephemeral_datastores.should == {"a" => datastore_a}
87
- cluster.persistent_datastores.should == {"b" => datastore_b}
88
- cluster.shared_datastores.should be_empty
89
- end
90
-
91
- it "should fail to create a cluster with overlapped dedicated datastores" do
92
- datastore_config = mock(:datastore_config)
93
- datastore_config.stub!(:ephemeral_pattern).and_return(/[ab]/)
94
- datastore_config.stub!(:persistent_pattern).and_return(/b/)
95
- datastore_config.stub!(:allow_mixed).and_return(false)
96
- @dc_config.stub!(:datastores).and_return(datastore_config)
97
-
98
- datastore_a = mock(:datastore_a)
99
- datastore_a.stub(:name).and_return("a")
100
- datastore_a_mob = mock(:datastore_a_mob)
101
- datastore_a_properties = {
102
- "name" => "a"
103
- }
104
- VSphereCloud::Resources::Datastore.stub!(:new).
105
- with(datastore_a_properties).and_return(datastore_a)
106
-
107
- datastore_b = mock(:datastore_b)
108
- datastore_b.stub(:name).and_return("b")
109
- datastore_b_mob = mock(:datastore_b_mob)
110
- datastore_b_properties = {
111
- "name" => "b"
112
- }
113
- VSphereCloud::Resources::Datastore.stub!(:new).
114
- with(datastore_b_properties).and_return(datastore_b)
115
-
116
- @client.should_receive(:get_properties).with(
117
- [datastore_a_mob, datastore_b_mob], VimSdk::Vim::Datastore,
118
- %w(summary.freeSpace summary.capacity name)).and_return(
119
- {"a" => datastore_a_properties, "b" => datastore_b_properties})
120
-
121
- VSphereCloud::Resources::Cluster.any_instance.stub(
122
- :fetch_cluster_utilization)
123
-
124
- cluster_config = mock(:cluster_config)
125
- cluster_config.stub!(:name).and_return("foo")
126
- cluster_config.stub!(:resource_pool).and_return(nil)
127
- expect {
128
- VSphereCloud::Resources::Cluster.new(@dc, cluster_config, {
129
- "datastore" => [datastore_a_mob, datastore_b_mob]
130
- })
131
- }.to raise_error /Datastore patterns are not mutually exclusive/
132
- end
133
-
134
- it "should create a cluster with shared datastores" do
135
- datastore_config = mock(:datastore_config)
136
- datastore_config.stub!(:ephemeral_pattern).and_return(/a/)
137
- datastore_config.stub!(:persistent_pattern).and_return(/a/)
138
- datastore_config.stub!(:allow_mixed).and_return(true)
139
- @dc_config.stub!(:datastores).and_return(datastore_config)
140
-
141
- datastore_a = mock(:datastore_a)
142
- datastore_a.stub(:name).and_return("a")
143
- datastore_a_mob = mock(:datastore_a_mob)
144
- datastore_a_properties = {
145
- "name" => "a",
146
- "summary.capacity" => 128 * 1024 * 1024 * 1024,
147
- "summary.freeSpace" => 32 * 1024 * 1024 * 1024
148
- }
149
- VSphereCloud::Resources::Datastore.stub!(:new).
150
- with(datastore_a_properties).and_return(datastore_a)
151
-
152
- @client.should_receive(:get_properties).with(
153
- [datastore_a_mob], VimSdk::Vim::Datastore,
154
- %w(summary.freeSpace summary.capacity name)).and_return(
155
- {"a" => datastore_a_properties})
156
-
157
- VSphereCloud::Resources::Cluster.any_instance.stub(
158
- :fetch_cluster_utilization)
159
-
160
- cluster_config = mock(:cluster_config)
161
- cluster_config.stub!(:name).and_return("foo")
162
- cluster_config.stub!(:resource_pool).and_return(nil)
163
- cluster = VSphereCloud::Resources::Cluster.new(@dc, cluster_config, {
164
- "datastore" => [datastore_a_mob]
165
- })
166
-
167
- cluster.ephemeral_datastores.should be_empty
168
- cluster.persistent_datastores.should be_empty
169
- cluster.shared_datastores.should == {"a" => datastore_a}
170
- end
171
-
172
- it "should create a cluster without a resource pool" do
173
- host = mock(:host)
174
- host_properties = {
175
- :obj => host,
176
- "runtime.inMaintenanceMode" => "false",
177
- "hardware.memorySize" => 64 * 1024 * 1024 * 1024
178
- }
179
- host_counters = {
180
- "cpu.usage.average" => "1000",
181
- "mem.usage.average" => "5000"
182
- }
183
- @client.should_receive(:get_properties).with(
184
- [], VimSdk::Vim::Datastore,
185
- %w(summary.freeSpace summary.capacity name)).and_return(
186
- {})
187
- @client.should_receive(:get_properties).with(
188
- [host], VimSdk::Vim::HostSystem,
189
- %w(hardware.memorySize runtime.inMaintenanceMode),
190
- {:ensure_all => true}).and_return(
191
- {"foo" => host_properties})
192
- @client.should_receive(:get_perf_counters).with(
193
- [host], %w(cpu.usage.average mem.usage.average), {:max_sample => 5}).
194
- and_return({"foo" => host_counters})
195
- cluster_config = mock(:cluster_config)
196
- cluster_config.stub!(:name).and_return("foo")
197
- cluster_config.stub!(:resource_pool).and_return(nil)
198
- cluster = VSphereCloud::Resources::Cluster.new(@dc, cluster_config, {
199
- "datastore" => [],
200
- "host" => [host]
201
- })
202
-
203
- cluster.free_memory.should == 32768
204
- cluster.total_memory.should == 65536
205
- cluster.idle_cpu.should == 0.9
206
- end
207
-
208
- it "should create a cluster with a resource pool" do
209
- resource_pool = mock(:resource_pool)
210
- resource_pool_mob = mock(:resource_pool_mob)
211
- resource_pool.stub(:mob).and_return(resource_pool_mob)
212
- VSphereCloud::Resources::ResourcePool.stub!(:new).
213
- with(an_instance_of(VSphereCloud::Resources::Cluster), nil).
214
- and_return(resource_pool)
215
-
216
- summary = mock(:summary)
217
- runtime = mock(:runtime)
218
- runtime.stub(:overall_status).and_return("green")
219
- cpu = mock(:cpu)
220
- cpu.stub(:overall_usage).and_return(5)
221
- cpu.stub(:max_usage).and_return(10)
222
- runtime.stub(:cpu).and_return(cpu)
223
- memory = mock(:memory)
224
- memory.stub(:overall_usage).and_return(32 * 1024 * 1024 * 1024)
225
- memory.stub(:max_usage).and_return(64 * 1024 * 1024 * 1024)
226
- runtime.stub(:memory).and_return(memory)
227
- summary.stub(:runtime).and_return(runtime)
228
-
229
- @client.should_receive(:get_properties).with(
230
- [], VimSdk::Vim::Datastore,
231
- %w(summary.freeSpace summary.capacity name)).and_return(
232
- {})
233
- @client.should_receive(:get_properties).with(
234
- resource_pool_mob, VimSdk::Vim::ResourcePool, %w(summary)).
235
- and_return({"summary" => summary})
236
- cluster_config = mock(:cluster_config)
237
- cluster_config.stub!(:name).and_return("foo")
238
- cluster_config.stub!(:resource_pool).and_return("baz")
239
- cluster = VSphereCloud::Resources::Cluster.new(@dc, cluster_config, {
240
- "datastore" => []
241
- })
242
-
243
- cluster.free_memory.should == 32768
244
- cluster.total_memory.should == 65536
245
- cluster.idle_cpu.should == 0.5
246
- end
247
-
248
- it "should create a cluster with an unhealthy resource pool" do
249
- resource_pool = mock(:resource_pool)
250
- resource_pool_mob = mock(:resource_pool_mob)
251
- resource_pool.stub(:mob).and_return(resource_pool_mob)
252
- VSphereCloud::Resources::ResourcePool.stub!(:new).
253
- with(an_instance_of(VSphereCloud::Resources::Cluster), nil).
254
- and_return(resource_pool)
255
-
256
- summary = mock(:summary)
257
- runtime = mock(:runtime)
258
- runtime.stub(:overall_status).and_return("gray")
259
- summary.stub(:runtime).and_return(runtime)
260
-
261
- @client.should_receive(:get_properties).with(
262
- [], VimSdk::Vim::Datastore,
263
- %w(summary.freeSpace summary.capacity name)).and_return(
264
- {})
265
- @client.should_receive(:get_properties).with(
266
- resource_pool_mob, VimSdk::Vim::ResourcePool, %w(summary)).
267
- and_return({"summary" => summary})
268
- cluster_config = mock(:cluster_config)
269
- cluster_config.stub!(:name).and_return("foo")
270
- cluster_config.stub!(:resource_pool).and_return("baz")
271
- cluster = VSphereCloud::Resources::Cluster.new(@dc, cluster_config, {
272
- "datastore" => []
273
- })
274
-
275
- cluster.free_memory.should == 0
276
- cluster.total_memory.should == 0
277
- cluster.idle_cpu.should == 0.0
278
- end
279
- end
280
-
281
- describe :allocate do
282
- it "should record the allocation against the cached utilization" do
283
- @client.should_receive(:get_properties).with(
284
- [], VimSdk::Vim::Datastore,
285
- %w(summary.freeSpace summary.capacity name)).and_return(
286
- {})
287
-
288
- VSphereCloud::Resources::Cluster.any_instance.stub(
289
- :fetch_cluster_utilization)
290
-
291
- cluster_config = mock(:cluster_config)
292
- cluster_config.stub!(:name).and_return("foo")
293
- cluster_config.stub!(:resource_pool).and_return(nil)
294
- cluster = VSphereCloud::Resources::Cluster.new(@dc, cluster_config, {
295
- "datastore" => []
296
- })
297
- cluster.instance_eval { @synced_free_memory = 2048 }
298
- cluster.allocate(1024)
299
- cluster.free_memory.should == 1024
300
- end
301
- end
302
-
303
- describe :pick_persistent do
304
- before(:each) do
305
- @client.should_receive(:get_properties).with(
306
- [], VimSdk::Vim::Datastore,
307
- %w(summary.freeSpace summary.capacity name)).and_return(
308
- {})
309
-
310
- VSphereCloud::Resources::Cluster.any_instance.stub(
311
- :fetch_cluster_utilization)
312
-
313
- cluster_config = mock(:cluster_config)
314
- cluster_config.stub!(:name).and_return("foo")
315
- cluster_config.stub!(:resource_pool).and_return(nil)
316
- @cluster = VSphereCloud::Resources::Cluster.new(@dc, cluster_config, {
317
- "datastore" => []
318
- })
319
- end
320
-
321
- it "should only use persistent datastores if possible" do
322
- datastore_a = mock(:datastore_a)
323
- datastore_a.stub(:free_space).and_return(4096)
324
- datastore_b = mock(:datastore_b)
325
-
326
- @cluster.persistent_datastores["foo"] = datastore_a
327
- @cluster.shared_datastores["bar"] = datastore_b
328
-
329
- VSphereCloud::Resources::Util.should_receive(:weighted_random).
330
- with([[datastore_a, 4096]]).and_return(datastore_a)
331
-
332
- datastore = @cluster.pick_persistent(1024)
333
- datastore.should == datastore_a
334
- end
335
-
336
- it "should filter out datastores that are low on free space" do
337
- datastore_a = mock(:datastore_a)
338
- datastore_a.stub(:free_space).and_return(2000)
339
- datastore_b = mock(:datastore_b)
340
- datastore_b.stub(:free_space).and_return(4096)
341
-
342
- @cluster.persistent_datastores["foo"] = datastore_a
343
- @cluster.shared_datastores["bar"] = datastore_b
344
-
345
- VSphereCloud::Resources::Util.should_receive(:weighted_random).
346
- with([[datastore_b, 4096]]).and_return(datastore_b)
347
-
348
- datastore = @cluster.pick_persistent(1024)
349
- datastore.should == datastore_b
350
- end
351
- end
352
-
353
- describe :pick_ephemeral do
354
- it "should only use ephemeral datastores if possible" do
355
- @client.should_receive(:get_properties).with(
356
- [], VimSdk::Vim::Datastore,
357
- %w(summary.freeSpace summary.capacity name)).and_return(
358
- {})
359
-
360
- VSphereCloud::Resources::Cluster.any_instance.stub(
361
- :fetch_cluster_utilization)
362
-
363
- cluster_config = mock(:cluster_config)
364
- cluster_config.stub!(:name).and_return("foo")
365
- cluster_config.stub!(:resource_pool).and_return(nil)
366
- @cluster = VSphereCloud::Resources::Cluster.new(@dc, cluster_config, {
367
- "datastore" => []
368
- })
369
- datastore_a = mock(:datastore_a)
370
- datastore_a.stub(:free_space).and_return(4096)
371
- datastore_b = mock(:datastore_b)
372
-
373
- @cluster.ephemeral_datastores["foo"] = datastore_a
374
- @cluster.shared_datastores["bar"] = datastore_b
375
-
376
- VSphereCloud::Resources::Util.should_receive(:weighted_random).
377
- with([[datastore_a, 4096]]).and_return(datastore_a)
378
-
379
- datastore = @cluster.pick_ephemeral(1024)
380
- datastore.should == datastore_a
381
- end
382
- end
383
- end