bosh_vsphere_cpi 1.1868.0 → 1.1975.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,85 +1,75 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
1
  module VSphereCloud
4
2
  class Resources
5
-
6
- # Datacenter resource.
7
3
  class Datacenter
8
4
  include VimSdk
9
5
 
10
- # @!attribute mob
11
- # @return [Vim::Datacenter] datacenter vSphere MOB.
12
- attr_accessor :mob
13
-
14
- # @!attribute clusters
15
- # @return [Hash<String, Cluster>] hash of cluster names to clusters.
16
- attr_accessor :clusters
17
-
18
- # @!attribute vm_folder
19
- # @return [Folder] inventory folder for VMs.
20
- attr_accessor :vm_folder
21
-
22
- # @!attribute template_folder
23
- # @return [Folder] inventory folder for stemcells/templates.
24
- attr_accessor :template_folder
25
-
26
- # @!attribute config
27
- # @return [DatacenterConfig] datacenter config.
28
6
  attr_accessor :config
29
7
 
30
- # Creates a new Datacenter resource from the operator provided datacenter
31
- # configuration.
32
- #
33
- # This traverses the provided datacenter/resource pools/datastores and
34
- # builds the underlying resources and utilization.
35
- #
36
- # @param [DatacenterConfig] config datacenter configuration.
37
8
  def initialize(config)
38
- client = Config.client
39
9
  @config = config
40
- @mob = client.find_by_inventory_path(name)
41
- raise "Datacenter: #{name} not found" if @mob.nil?
42
-
43
- @vm_folder = Folder.new(self, config.folders.vm,
44
- config.folders.shared)
45
- @template_folder = Folder.new(self, config.folders.template,
46
- config.folders.shared)
10
+ end
47
11
 
48
- cluster_mobs = client.get_managed_objects(
49
- Vim::ClusterComputeResource, :root => @mob, :include_name => true)
50
- cluster_mobs.delete_if { |name, _| !config.clusters.has_key?(name) }
51
- cluster_mobs = Hash[*cluster_mobs.flatten]
12
+ def mob
13
+ mob = @config.client.find_by_inventory_path(name)
14
+ raise "Datacenter: #{name} not found" if mob.nil?
15
+ mob
16
+ end
52
17
 
53
- clusters_properties = client.get_properties(
54
- cluster_mobs.values, Vim::ClusterComputeResource,
55
- Cluster::PROPERTIES, :ensure_all => true)
18
+ def vm_folder
19
+ Folder.new(@config.datacenter_vm_folder, @config)
20
+ end
56
21
 
57
- @clusters = {}
58
- config.clusters.each do |name, cluster_config|
59
- cluster_mob = cluster_mobs[name]
60
- raise "Can't find cluster: #{name}" if cluster_mob.nil?
61
- cluster_properties = clusters_properties[cluster_mob]
62
- if cluster_properties.nil?
63
- raise "Can't find properties for cluster: #{name}"
64
- end
65
- cluster = Cluster.new(self, cluster_config, cluster_properties)
66
- @clusters[cluster.name] = cluster
67
- end
22
+ def template_folder
23
+ Folder.new(@config.datacenter_template_folder, @config)
68
24
  end
69
25
 
70
- # @return [String] datacenter name.
71
26
  def name
72
- @config.name
27
+ @config.datacenter_name
73
28
  end
74
29
 
75
- # @return [String] vCenter path/namespace for VMDKs.
76
30
  def disk_path
77
- @config.datastores.disk_path
31
+ @config.datacenter_disk_path
32
+ end
33
+
34
+ def ephemeral_pattern
35
+ @config.datacenter_datastore_pattern
36
+ end
37
+
38
+ def persistent_pattern
39
+ @config.datacenter_persistent_datastore_pattern
40
+ end
41
+
42
+ def allow_mixed
43
+ @config.datacenter_allow_mixed_datastores
78
44
  end
79
45
 
80
- # @return [String] debug datacenter information.
81
46
  def inspect
82
- "<Datacenter: #@mob / #{@config.name}>"
47
+ "<Datacenter: #{mob} / #{name}>"
48
+ end
49
+
50
+ def clusters
51
+ client = @config.client
52
+ cluster_mobs = client.get_managed_objects(
53
+ Vim::ClusterComputeResource, root: mob, include_name: true)
54
+ cluster_mobs.delete_if { |name, _| !config.datacenter_clusters.has_key?(name) }
55
+ cluster_mobs = Hash[*cluster_mobs.flatten]
56
+
57
+ clusters_properties = client.get_properties(
58
+ cluster_mobs.values, Vim::ClusterComputeResource,
59
+ Cluster::PROPERTIES, :ensure_all => true)
60
+
61
+ clusters = {}
62
+ config.datacenter_clusters.each do |cluster_name, cluster_config|
63
+ cluster_mob = cluster_mobs[cluster_name]
64
+ raise "Can't find cluster: #{cluster_name}" if cluster_mob.nil?
65
+
66
+ cluster_properties = clusters_properties[cluster_mob]
67
+ raise "Can't find properties for cluster: #{cluster_name}" if cluster_properties.nil?
68
+
69
+ cluster = Cluster.new(self, @config, cluster_config, cluster_properties)
70
+ clusters[cluster.name] = cluster
71
+ end
72
+ clusters
83
73
  end
84
74
  end
85
75
  end
@@ -1,5 +1,3 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
1
  module VSphereCloud
4
2
  class Resources
5
3
 
@@ -58,4 +56,4 @@ module VSphereCloud
58
56
  end
59
57
  end
60
58
  end
61
- end
59
+ end
@@ -1,54 +1,54 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
2
-
3
1
  module VSphereCloud
2
+
4
3
  class Resources
5
4
 
6
- # Folder resource.
7
5
  class Folder
6
+ attr_reader :mob
7
+ attr_reader :name
8
8
 
9
- # @!attribute mob
10
- # @return [Vim::Folder] folder vSphere MOB.
11
- attr_accessor :mob
12
-
13
- # @!attribute name
14
- # @return [String] folder name.
15
- attr_accessor :name
16
-
17
- # Creates a new Folder resource given the parent datacenter and folder
18
- # name.
19
- #
20
- # @param [Datacenter] datacenter parent datacenter.
21
- # @param [String] name folder name.
22
- # @param [true, false] shared flag signaling to use the director guid as
23
- # the namespace for multi tenancy.
24
- def initialize(datacenter, name, shared)
25
- client = Config.client
26
- logger = Config.logger
27
-
28
- folder = client.find_by_inventory_path([datacenter.name, "vm", name])
29
- raise "Missing folder: #{name}" if folder.nil?
30
-
31
- if shared
32
- shared_folder = folder
33
-
34
- uuid = Bosh::Clouds::Config.uuid
35
- name = [name, uuid]
36
-
37
- logger.debug("Search for folder #{name.join("/")}")
38
- folder = client.find_by_inventory_path([datacenter.name, "vm", name])
39
- if folder.nil?
40
- logger.debug("Creating folder #{name.join("/")}")
41
- folder = shared_folder.create_folder(uuid)
42
- end
43
- logger.debug("Found folder #{name.join("/")}: #{folder}")
9
+ def initialize(name, config)
10
+ @name = name
11
+ @config = config
44
12
 
45
- @mob = folder
46
- @name = name
13
+ find_or_create_folder
14
+ end
15
+
16
+ private
17
+
18
+ def find_or_create_folder
19
+ folder = find_folder
20
+
21
+ if @config.datacenter_use_sub_folder
22
+ @name, @mob = find_or_create_sub_folder(folder)
47
23
  else
48
24
  @mob = folder
49
- @name = name
50
25
  end
51
26
  end
27
+
28
+ def find_folder
29
+ folder = @config.client.find_by_inventory_path([@config.datacenter_name, 'vm', @name])
30
+ raise "Missing folder: #{@name}" if folder.nil?
31
+ folder
32
+ end
33
+
34
+ def find_or_create_sub_folder(folder)
35
+ parent_folder = folder
36
+ uuid = Bosh::Clouds::Config.uuid
37
+
38
+ sub_folder_name = [@name, uuid]
39
+ name_join = sub_folder_name.join("/")
40
+
41
+ @config.logger.debug("Search for folder #{name_join}")
42
+ sub_folder = @config.client.find_by_inventory_path([@config.datacenter_name, 'vm', sub_folder_name])
43
+ if sub_folder.nil?
44
+ @config.logger.debug("Creating folder #{name_join}")
45
+ sub_folder = parent_folder.create_folder(uuid)
46
+ end
47
+ @config.logger.debug("Found folder #{name_join}: #{sub_folder}")
48
+
49
+ [sub_folder_name, sub_folder]
50
+ end
51
+
52
52
  end
53
53
  end
54
54
  end
@@ -12,16 +12,16 @@ module VSphereCloud
12
12
  # @param [Cluster] cluster parent cluster.
13
13
  # @param [Vim::ResourcePool] root_resource_pool cluster's root resource
14
14
  # pool.
15
- def initialize(cluster, root_resource_pool)
16
- if cluster.config.resource_pool.nil?
15
+ def initialize(cloud_config, cluster_config, root_resource_pool)
16
+ if cluster_config.resource_pool.nil?
17
17
  @mob = root_resource_pool
18
18
  else
19
- client = Config.client
20
- logger = Config.logger
19
+ client = cloud_config.client
20
+ logger = cloud_config.logger
21
21
  @mob = client.get_managed_object(
22
22
  Vim::ResourcePool,
23
23
  :root => root_resource_pool,
24
- :name => cluster.config.resource_pool)
24
+ :name => cluster_config.resource_pool)
25
25
  logger.debug("Found requested resource pool: #@mob")
26
26
  end
27
27
  end
@@ -32,4 +32,4 @@ module VSphereCloud
32
32
  end
33
33
  end
34
34
  end
35
- end
35
+ end
@@ -13,8 +13,8 @@ module VSphereCloud
13
13
  # @param [Array<Integer>] ephemeral list of required ephemeral disk sizes.
14
14
  # @param [Array<Integer>] persistent list of required persistent disk
15
15
  # sizes.
16
- def initialize(cluster, memory, ephemeral, persistent)
17
- @logger = Config.logger
16
+ def initialize(config, cluster, memory, ephemeral, persistent)
17
+ @logger = config.logger
18
18
  @cluster = cluster
19
19
  @memory = memory
20
20
  @ephemeral = ephemeral
@@ -1,7 +1,7 @@
1
1
  module Bosh
2
2
  module Clouds
3
3
  class VSphere
4
- VERSION = '1.1868.0'
4
+ VERSION = '1.1975.0'
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,116 @@
1
+ require 'ruby_vim_sdk'
2
+
3
+ module VSphereCloud
4
+ class VmCreator
5
+ def initialize(memory, disk, cpu, placer, client, logger, cpi)
6
+ @placer = placer
7
+ @client = client
8
+ @logger = logger
9
+ @cpi = cpi
10
+ @memory = memory
11
+ @disk = disk
12
+ @cpu = cpu
13
+
14
+ @logger.debug("VM creator initialized with memory: #{@memory}, disk: #{@disk}, cpu: #{@cpu}, placer: #{@placer}")
15
+ end
16
+
17
+ def create(agent_id, stemcell_cid, networks, disk_cids, environment)
18
+ # Make sure number of cores is a power of 2. kb.vmware.com/kb/2003484
19
+ if @cpu & @cpu - 1 != 0
20
+ raise "Number of vCPUs: #{@cpu} is not a power of 2."
21
+ end
22
+
23
+ stemcell_vm = @cpi.stemcell_vm(stemcell_cid)
24
+ raise "Could not find stemcell: #{stemcell_cid}" if stemcell_vm.nil?
25
+
26
+ stemcell_size =
27
+ @client.get_property(stemcell_vm, VimSdk::Vim::VirtualMachine, 'summary.storage.committed', ensure_all: true)
28
+ stemcell_size /= 1024 * 1024
29
+
30
+ disks = @cpi.disk_spec(disk_cids)
31
+ # need to include swap and linked clone log
32
+ ephemeral = @disk + @memory + stemcell_size
33
+ cluster, datastore = @placer.place(@memory, ephemeral, disks)
34
+
35
+ name = "vm-#{@cpi.generate_unique_name}"
36
+ @logger.info("Creating vm: #{name} on #{cluster.mob} stored in #{datastore.mob}")
37
+
38
+ replicated_stemcell_vm = @cpi.replicate_stemcell(cluster, datastore, stemcell_cid)
39
+ replicated_stemcell_properties = @client.get_properties(replicated_stemcell_vm, VimSdk::Vim::VirtualMachine,
40
+ ['config.hardware.device', 'snapshot'],
41
+ ensure_all: true)
42
+
43
+ devices = replicated_stemcell_properties['config.hardware.device']
44
+ snapshot = replicated_stemcell_properties['snapshot']
45
+
46
+ config = VimSdk::Vim::Vm::ConfigSpec.new(memory_mb: @memory, num_cpus: @cpu)
47
+ config.device_change = []
48
+
49
+ system_disk = devices.find { |device| device.kind_of?(VimSdk::Vim::Vm::Device::VirtualDisk) }
50
+ pci_controller = devices.find { |device| device.kind_of?(VimSdk::Vim::Vm::Device::VirtualPCIController) }
51
+
52
+ file_name = "[#{datastore.name}] #{name}/ephemeral_disk.vmdk"
53
+ ephemeral_disk_config =
54
+ @cpi.create_disk_config_spec(datastore.mob, file_name, system_disk.controller_key, @disk, create: true)
55
+ config.device_change << ephemeral_disk_config
56
+
57
+ dvs_index = {}
58
+ networks.each_value do |network|
59
+ v_network_name = network['cloud_properties']['name']
60
+ network_mob = @client.find_by_inventory_path([cluster.datacenter.name, 'network', v_network_name])
61
+ nic_config = @cpi.create_nic_config_spec(v_network_name, network_mob, pci_controller.key, dvs_index)
62
+ config.device_change << nic_config
63
+ end
64
+
65
+ nics = devices.select { |device| device.kind_of?(VimSdk::Vim::Vm::Device::VirtualEthernetCard) }
66
+ nics.each do |nic|
67
+ nic_config = @cpi.create_delete_device_spec(nic)
68
+ config.device_change << nic_config
69
+ end
70
+
71
+ @cpi.fix_device_unit_numbers(devices, config.device_change)
72
+
73
+ @logger.info("Cloning vm: #{replicated_stemcell_vm} to #{name}")
74
+
75
+ task = @cpi.clone_vm(replicated_stemcell_vm,
76
+ name,
77
+ cluster.datacenter.vm_folder.mob,
78
+ cluster.resource_pool.mob,
79
+ datastore: datastore.mob, linked: true, snapshot: snapshot.current_snapshot, config: config)
80
+ vm = @client.wait_for_task(task)
81
+
82
+ begin
83
+ @cpi.upload_file(cluster.datacenter.name, datastore.name, "#{name}/env.iso", '')
84
+
85
+ vm_properties = @client.get_properties(vm, VimSdk::Vim::VirtualMachine, ['config.hardware.device'], ensure_all: true)
86
+ devices = vm_properties['config.hardware.device']
87
+
88
+ # Configure the ENV CDROM
89
+ config = VimSdk::Vim::Vm::ConfigSpec.new
90
+ config.device_change = []
91
+ file_name = "[#{datastore.name}] #{name}/env.iso"
92
+ cdrom_change = @cpi.configure_env_cdrom(datastore.mob, devices, file_name)
93
+ config.device_change << cdrom_change
94
+ @client.reconfig_vm(vm, config)
95
+
96
+ network_env = @cpi.generate_network_env(devices, networks, dvs_index)
97
+ disk_env = @cpi.generate_disk_env(system_disk, ephemeral_disk_config.device)
98
+ env = @cpi.generate_agent_env(name, vm, agent_id, network_env, disk_env)
99
+ env['env'] = environment
100
+ @logger.info("Setting VM env: #{env.pretty_inspect}")
101
+
102
+ location =
103
+ @cpi.get_vm_location(vm, datacenter: cluster.datacenter.name, datastore: datastore.name, vm: name)
104
+ @cpi.set_agent_env(vm, location, env)
105
+
106
+ @logger.info("Powering on VM: #{vm} (#{name})")
107
+ @client.power_on_vm(cluster.datacenter.mob, vm)
108
+ rescue => e
109
+ @logger.info("#{e} - #{e.backtrace.join("\n")}")
110
+ @cpi.delete_vm(name)
111
+ raise e
112
+ end
113
+ name
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,17 @@
1
+ require 'cloud/vsphere/vm_creator'
2
+
3
+ module VSphereCloud
4
+ class VmCreatorBuilder
5
+ def build(resources, cloud_properties, client, logger, cpi)
6
+ VmCreator.new(
7
+ cloud_properties.fetch('ram'),
8
+ cloud_properties.fetch('disk'),
9
+ cloud_properties.fetch('cpu'),
10
+ resources,
11
+ client,
12
+ logger,
13
+ cpi,
14
+ )
15
+ end
16
+ end
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh_vsphere_cpi
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1868.0
4
+ version: 1.1975.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-29 00:00:00.000000000 Z
12
+ date: 2014-02-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bosh_common
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 1.1868.0
21
+ version: 1.1975.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: 1.1868.0
29
+ version: 1.1975.0
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: bosh_cpi
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 1.1868.0
37
+ version: 1.1975.0
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 1.1868.0
45
+ version: 1.1975.0
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: membrane
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -93,7 +93,7 @@ dependencies:
93
93
  version: '0'
94
94
  description: ! 'BOSH VSphere CPI
95
95
 
96
- f69423'
96
+ 9c66c4'
97
97
  email: support@cloudfoundry.com
98
98
  executables:
99
99
  - vsphere_cpi_console
@@ -105,7 +105,9 @@ files:
105
105
  - lib/cloud/vsphere.rb
106
106
  - lib/cloud/vsphere/client.rb
107
107
  - lib/cloud/vsphere/cloud.rb
108
+ - lib/cloud/vsphere/cluster_config.rb
108
109
  - lib/cloud/vsphere/config.rb
110
+ - lib/cloud/vsphere/fixed_cluster_placer.rb
109
111
  - lib/cloud/vsphere/lease_obtainer.rb
110
112
  - lib/cloud/vsphere/lease_updater.rb
111
113
  - lib/cloud/vsphere/models/disk.rb
@@ -119,6 +121,8 @@ files:
119
121
  - lib/cloud/vsphere/resources/scorer.rb
120
122
  - lib/cloud/vsphere/resources/util.rb
121
123
  - lib/cloud/vsphere/version.rb
124
+ - lib/cloud/vsphere/vm_creator.rb
125
+ - lib/cloud/vsphere/vm_creator_builder.rb
122
126
  - lib/ruby_vim_sdk.rb
123
127
  - lib/ruby_vim_sdk/base_type.rb
124
128
  - lib/ruby_vim_sdk/const.rb
@@ -168,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
172
  version: '0'
169
173
  segments:
170
174
  - 0
171
- hash: 57486718049377902
175
+ hash: -1519667824114885807
172
176
  requirements: []
173
177
  rubyforge_project:
174
178
  rubygems_version: 1.8.23