fog-vsphere 2.0.1 → 2.1.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/fog/vsphere/compute.rb +12 -0
- data/lib/fog/vsphere/models/compute/host.rb +8 -2
- data/lib/fog/vsphere/models/compute/network.rb +1 -0
- data/lib/fog/vsphere/requests/compute/list_hosts.rb +60 -19
- data/lib/fog/vsphere/requests/compute/list_networks.rb +21 -6
- data/lib/fog/vsphere/requests/compute/list_vm_scsi_controllers.rb +7 -0
- data/lib/fog/vsphere/requests/compute/vm_clone.rb +9 -6
- data/lib/fog/vsphere/version.rb +1 -1
- data/tests/models/compute/server_tests.rb +3 -1
- data/tests/models/compute/ticket_tests.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f79b2fda04ea3983ad8eb745f642e7b94d10790dfe23d63348aba52dceb1e5bc
|
|
4
|
+
data.tar.gz: aa888887668bf44fec6f238629592174d94d979fa8c986af17adf70a0ce14667
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: db0e26ac2e3417ce2a8c39369c8f01aba9474200684f07d3392d79a9a589a938daf673fcb54d1f7f710aec8043db856459ebe57d5de96c5232d627b467c5d767
|
|
7
|
+
data.tar.gz: d7304c9307b5eb405e21195c56cbf35c8106be6cfdd00cc91bc2bcaa941f3097867d1b14757420b37a5a81d6b6acf1643263cd492b5e1b78d099e081e40e5957
|
data/CHANGELOG.md
CHANGED
data/lib/fog/vsphere/compute.rb
CHANGED
|
@@ -268,6 +268,12 @@ module Fog
|
|
|
268
268
|
"filename" => "[Storage1] rhel6-mfojtik/rhel6-mfojtik.vmdk",
|
|
269
269
|
"size_gb" => 8
|
|
270
270
|
}],
|
|
271
|
+
"scsi_controllers" =>
|
|
272
|
+
[{"shared_bus" => "noSharing",
|
|
273
|
+
"type" => "VirtualLsiLogicController",
|
|
274
|
+
"unit_number" => 7,
|
|
275
|
+
"key" => 1000
|
|
276
|
+
}],
|
|
271
277
|
"interfaces" =>
|
|
272
278
|
[{"mac" => "00:50:56:a9:00:28",
|
|
273
279
|
"network" => "dvportgroup-123456",
|
|
@@ -320,6 +326,12 @@ module Fog
|
|
|
320
326
|
"name" => "Hard disk 1",
|
|
321
327
|
"mode" => "persistent",
|
|
322
328
|
"id" => "6000C29b-f364-d073-8316-8e98ac0a0eae" }],
|
|
329
|
+
"scsi_controllers" =>
|
|
330
|
+
[{"shared_bus" => "noSharing",
|
|
331
|
+
"type" => "VirtualLsiLogicController",
|
|
332
|
+
"unit_number" => 7,
|
|
333
|
+
"key" => 1000
|
|
334
|
+
}],
|
|
323
335
|
"interfaces" =>
|
|
324
336
|
[{ "summary" => "VM Network",
|
|
325
337
|
"mac" => "00:50:56:a9:00:00",
|
|
@@ -6,13 +6,19 @@ module Fog
|
|
|
6
6
|
|
|
7
7
|
attribute :datacenter
|
|
8
8
|
attribute :cluster
|
|
9
|
-
attribute :name
|
|
10
|
-
attribute :vm_ids
|
|
11
9
|
attribute :cpu_cores
|
|
12
10
|
attribute :cpu_sockets
|
|
13
11
|
attribute :cpu_threads
|
|
14
12
|
attribute :memory
|
|
15
13
|
attribute :uuid
|
|
14
|
+
attribute :ipaddress
|
|
15
|
+
attribute :ipaddress6
|
|
16
|
+
attribute :model
|
|
17
|
+
attribute :vendor
|
|
18
|
+
attribute :product_name
|
|
19
|
+
attribute :product_version
|
|
20
|
+
attribute :hostname
|
|
21
|
+
attribute :domainname
|
|
16
22
|
|
|
17
23
|
# Lazy Loaded Attributes
|
|
18
24
|
[:vm_ids].each do |attr|
|
|
@@ -4,30 +4,71 @@ module Fog
|
|
|
4
4
|
class Real
|
|
5
5
|
def list_hosts(filters = {})
|
|
6
6
|
cluster = get_raw_cluster(filters[:cluster], filters[:datacenter])
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
results = property_collector_results(host_system_filter_spec(cluster))
|
|
9
|
+
|
|
10
|
+
results.map do |host|
|
|
11
|
+
hsh = map_attrs_to_hash(host, host_system_attribute_mapping)
|
|
12
|
+
hsh.merge(
|
|
13
|
+
datacenter: filters[:datacenter],
|
|
14
|
+
cluster: filters[:cluster],
|
|
15
|
+
ipaddress: (host['config.network.vnic'].first.spec.ip.ipAddress rescue nil),
|
|
16
|
+
ipaddress6: (host['config.network.vnic'].first.spec.ip.ipV6Config.ipV6Address.first.ipAddress rescue nil),
|
|
17
|
+
vm_ids: Proc.new { host['vm'].map {|vm| vm.config.instanceUuid rescue nil} }
|
|
18
|
+
)
|
|
19
|
+
end
|
|
8
20
|
end
|
|
9
21
|
|
|
10
22
|
protected
|
|
11
23
|
|
|
12
|
-
def
|
|
24
|
+
def map_attrs_to_hash(obj, attribute_mapping)
|
|
25
|
+
attribute_mapping.each_with_object({}) do |(k, v), hsh|
|
|
26
|
+
hsh[k] = obj[v]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def property_collector_results(filter_spec)
|
|
31
|
+
property_collector = connection.serviceContent.propertyCollector
|
|
32
|
+
property_collector.RetrieveProperties(:specSet => [filter_spec])
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def compute_resource_host_traversal_spec
|
|
36
|
+
RbVmomi::VIM.TraversalSpec(
|
|
37
|
+
:name => 'computeResourceHostTraversalSpec',
|
|
38
|
+
:type => 'ComputeResource',
|
|
39
|
+
:path => 'host',
|
|
40
|
+
:skip => false
|
|
41
|
+
)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def host_system_filter_spec(obj)
|
|
45
|
+
RbVmomi::VIM.PropertyFilterSpec(
|
|
46
|
+
:objectSet => [
|
|
47
|
+
:obj => obj,
|
|
48
|
+
:selectSet => [
|
|
49
|
+
compute_resource_host_traversal_spec
|
|
50
|
+
]
|
|
51
|
+
],
|
|
52
|
+
:propSet => [
|
|
53
|
+
{ :type => 'HostSystem', :pathSet => host_system_attribute_mapping.values + ['config.network.vnic', 'vm'] }
|
|
54
|
+
]
|
|
55
|
+
)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def host_system_attribute_mapping
|
|
13
59
|
{
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
product_name: host.summary.config.product.name,
|
|
27
|
-
product_version: host.summary.config.product.version,
|
|
28
|
-
hostname: (host.config.network.dnsConfig.hostName rescue nil),
|
|
29
|
-
domainname: (host.config.network.dnsConfig.domainName rescue nil),
|
|
30
|
-
vm_ids: Proc.new { host[:vm].map {|vm| vm.config.instanceUuid rescue nil} }
|
|
60
|
+
name: 'name',
|
|
61
|
+
cpu_cores: 'hardware.cpuInfo.numCpuCores',
|
|
62
|
+
cpu_sockets: 'hardware.cpuInfo.numCpuPackages',
|
|
63
|
+
cpu_threads: 'hardware.cpuInfo.numCpuThreads',
|
|
64
|
+
memory: 'hardware.memorySize',
|
|
65
|
+
uuid: 'hardware.systemInfo.uuid',
|
|
66
|
+
model: 'hardware.systemInfo.model',
|
|
67
|
+
vendor: 'hardware.systemInfo.vendor',
|
|
68
|
+
product_name: 'summary.config.product.name',
|
|
69
|
+
product_version: 'summary.config.product.version',
|
|
70
|
+
hostname: 'config.network.dnsConfig.hostName',
|
|
71
|
+
domainname: 'config.network.dnsConfig.domainName'
|
|
31
72
|
}
|
|
32
73
|
end
|
|
33
74
|
end
|
|
@@ -8,7 +8,7 @@ module Fog
|
|
|
8
8
|
# default to show all networks
|
|
9
9
|
only_active = filters[:accessible] || false
|
|
10
10
|
raw_networks(datacenter_name, cluster_name).map do |network|
|
|
11
|
-
next if only_active
|
|
11
|
+
next if only_active && !network.summary.accessible
|
|
12
12
|
network_attributes(network, datacenter_name)
|
|
13
13
|
end.compact
|
|
14
14
|
end
|
|
@@ -23,21 +23,36 @@ module Fog
|
|
|
23
23
|
|
|
24
24
|
protected
|
|
25
25
|
|
|
26
|
-
def network_attributes
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
def network_attributes(network, datacenter)
|
|
27
|
+
if network.kind_of?(RbVmomi::VIM::DistributedVirtualPortgroup)
|
|
28
|
+
id = network.key
|
|
29
|
+
virtualswitch = network.config.distributedVirtualSwitch.name
|
|
30
|
+
vlanid = raw_network_vlan_id(network.config.defaultPortConfig.vlan)
|
|
30
31
|
else
|
|
31
32
|
id = managed_obj_id(network)
|
|
33
|
+
virtualswitch = nil
|
|
34
|
+
vlanid = nil
|
|
32
35
|
end
|
|
33
36
|
{
|
|
34
37
|
:id => id,
|
|
35
38
|
:name => network.name,
|
|
36
39
|
:accessible => network.summary.accessible,
|
|
37
40
|
:datacenter => datacenter,
|
|
38
|
-
:virtualswitch =>
|
|
41
|
+
:virtualswitch => virtualswitch,
|
|
42
|
+
:vlanid => vlanid
|
|
39
43
|
}
|
|
40
44
|
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def raw_network_vlan_id(vlan)
|
|
49
|
+
case vlan
|
|
50
|
+
when RbVmomi::VIM::VmwareDistributedVirtualSwitchVlanIdSpec
|
|
51
|
+
vlan.vlanId
|
|
52
|
+
else
|
|
53
|
+
nil
|
|
54
|
+
end
|
|
55
|
+
end
|
|
41
56
|
end
|
|
42
57
|
class Mock
|
|
43
58
|
def list_networks(filters)
|
|
@@ -19,6 +19,13 @@ module Fog
|
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
|
+
class Mock
|
|
23
|
+
def list_vm_scsi_controllers(vm_id)
|
|
24
|
+
raise Fog::Compute::Vsphere::NotFound, 'VM not Found' unless self.data[:servers].key?(vm_id)
|
|
25
|
+
return [] unless self.data[:servers][vm_id].key?('scsi_controllers')
|
|
26
|
+
self.data[:servers][vm_id]['scsi_controllers'].map {|h| h.merge(:server_id => vm_id) }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
22
29
|
end
|
|
23
30
|
end
|
|
24
31
|
end
|
|
@@ -629,7 +629,10 @@ module Fog
|
|
|
629
629
|
relocation_spec[:datastore] = datastore_obj
|
|
630
630
|
end
|
|
631
631
|
end
|
|
632
|
-
|
|
632
|
+
# relocate templates is not supported by fog-vsphere when vm is cloned on a storage pod
|
|
633
|
+
unless options.key?('storage_pod')
|
|
634
|
+
relocation_spec[:disk] = relocate_template_volumes_specs(vm_mob_ref, options['volumes'], options['datacenter'])
|
|
635
|
+
end
|
|
633
636
|
# And the clone specification
|
|
634
637
|
clone_spec = RbVmomi::VIM.VirtualMachineCloneSpec(:location => relocation_spec,
|
|
635
638
|
:config => virtual_machine_config_spec,
|
|
@@ -751,7 +754,7 @@ module Fog
|
|
|
751
754
|
|
|
752
755
|
template_nics.zip(modified_nics).each do |template_nic, new_nic|
|
|
753
756
|
if new_nic
|
|
754
|
-
backing = create_nic_backing(new_nic, {})
|
|
757
|
+
backing = create_nic_backing(new_nic, {datacenter: datacenter})
|
|
755
758
|
template_nic.backing = backing
|
|
756
759
|
template_nic.addressType = 'generated'
|
|
757
760
|
template_nic.macAddress = nil
|
|
@@ -801,7 +804,7 @@ module Fog
|
|
|
801
804
|
end
|
|
802
805
|
end
|
|
803
806
|
specs.concat(new_volumes.map { |volume| create_disk(volume) })
|
|
804
|
-
|
|
807
|
+
specs
|
|
805
808
|
end
|
|
806
809
|
|
|
807
810
|
def relocate_template_volumes_specs(vm_mob_ref, volumes, datacenter)
|
|
@@ -810,11 +813,11 @@ module Fog
|
|
|
810
813
|
|
|
811
814
|
specs = []
|
|
812
815
|
template_volumes.zip(modified_volumes).each do |template_volume, new_volume|
|
|
813
|
-
if new_volume && new_volume.datastore != template_volume.backing.datastore.name
|
|
814
|
-
specs << { :diskId =>
|
|
816
|
+
if new_volume && new_volume.datastore && new_volume.datastore != template_volume.backing.datastore.name
|
|
817
|
+
specs << { :diskId => template_volume.key, :datastore => get_raw_datastore(new_volume.datastore, datacenter) }
|
|
815
818
|
end
|
|
816
819
|
end
|
|
817
|
-
|
|
820
|
+
specs
|
|
818
821
|
end
|
|
819
822
|
end
|
|
820
823
|
|
data/lib/fog/vsphere/version.rb
CHANGED
|
@@ -5,10 +5,12 @@ Shindo.tests('Fog::Compute[:vsphere] | server model', ['vsphere']) do
|
|
|
5
5
|
tests('The server model should') do
|
|
6
6
|
tests('have the action') do
|
|
7
7
|
test('reload') { server.respond_to? 'reload' }
|
|
8
|
-
%w(stop
|
|
8
|
+
%w(stop suspend destroy reboot).each do |action|
|
|
9
9
|
test(action) { server.respond_to? action }
|
|
10
10
|
test("#{action} returns successfully") { server.send(action.to_sym) ? true : false }
|
|
11
11
|
end
|
|
12
|
+
test('start') { server.respond_to?('start') }
|
|
13
|
+
test("start returns false, because it is already poweredOn") { server.start ? true : false }
|
|
12
14
|
test('guest_processes') { server.respond_to? 'guest_processes' }
|
|
13
15
|
test('take_snapshot') do
|
|
14
16
|
test('responds') { server.respond_to? 'take_snapshot'}
|
|
@@ -7,7 +7,7 @@ Shindo.tests('Fog::Compute[:vsphere] | hosts collection', ['vsphere']) do
|
|
|
7
7
|
tests('A ticket') do
|
|
8
8
|
test('should have a ticket') { not ticket.ticket.empty? }
|
|
9
9
|
test('should have a host') { not ticket.host.empty? }
|
|
10
|
-
test('should have a port') { ticket.port.kind_of?
|
|
10
|
+
test('should have a port') { ticket.port.kind_of?(Integer) }
|
|
11
11
|
test('should have a ssl ssl_thumbprint') { not ticket.ssl_thumbprint.empty? }
|
|
12
12
|
end
|
|
13
13
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fog-vsphere
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0
|
|
4
|
+
version: 2.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- J.R. Garcia
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-
|
|
11
|
+
date: 2018-04-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: fog-core
|