fog-vsphere 0.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 +7 -0
- data/.gitignore +23 -0
- data/.travis.yml +32 -0
- data/CONTRIBUTING.md +18 -0
- data/CONTRIBUTORS.md +59 -0
- data/Gemfile +5 -0
- data/LICENSE.md +20 -0
- data/README.md +31 -0
- data/Rakefile +8 -0
- data/fog-vsphere.gemspec +32 -0
- data/gemfiles/Gemfile.1.9.2+ +8 -0
- data/gemfiles/Gemfile.1.9.2- +11 -0
- data/lib/fog/vsphere.rb +41 -0
- data/lib/fog/vsphere/compute.rb +473 -0
- data/lib/fog/vsphere/models/compute/cluster.rb +28 -0
- data/lib/fog/vsphere/models/compute/clusters.rb +22 -0
- data/lib/fog/vsphere/models/compute/customfield.rb +16 -0
- data/lib/fog/vsphere/models/compute/customfields.rb +23 -0
- data/lib/fog/vsphere/models/compute/customvalue.rb +14 -0
- data/lib/fog/vsphere/models/compute/customvalues.rb +33 -0
- data/lib/fog/vsphere/models/compute/datacenter.rb +44 -0
- data/lib/fog/vsphere/models/compute/datacenters.rb +19 -0
- data/lib/fog/vsphere/models/compute/datastore.rb +21 -0
- data/lib/fog/vsphere/models/compute/datastores.rb +21 -0
- data/lib/fog/vsphere/models/compute/folder.rb +24 -0
- data/lib/fog/vsphere/models/compute/folders.rb +23 -0
- data/lib/fog/vsphere/models/compute/interface.rb +91 -0
- data/lib/fog/vsphere/models/compute/interfaces.rb +66 -0
- data/lib/fog/vsphere/models/compute/interfacetype.rb +22 -0
- data/lib/fog/vsphere/models/compute/interfacetypes.rb +34 -0
- data/lib/fog/vsphere/models/compute/network.rb +18 -0
- data/lib/fog/vsphere/models/compute/networks.rb +22 -0
- data/lib/fog/vsphere/models/compute/process.rb +17 -0
- data/lib/fog/vsphere/models/compute/resource_pool.rb +19 -0
- data/lib/fog/vsphere/models/compute/resource_pools.rb +22 -0
- data/lib/fog/vsphere/models/compute/scsicontroller.rb +16 -0
- data/lib/fog/vsphere/models/compute/server.rb +325 -0
- data/lib/fog/vsphere/models/compute/servers.rb +36 -0
- data/lib/fog/vsphere/models/compute/servertype.rb +36 -0
- data/lib/fog/vsphere/models/compute/servertypes.rb +23 -0
- data/lib/fog/vsphere/models/compute/snapshot.rb +35 -0
- data/lib/fog/vsphere/models/compute/snapshots.rb +27 -0
- data/lib/fog/vsphere/models/compute/template.rb +11 -0
- data/lib/fog/vsphere/models/compute/templates.rb +19 -0
- data/lib/fog/vsphere/models/compute/volume.rb +99 -0
- data/lib/fog/vsphere/models/compute/volumes.rb +53 -0
- data/lib/fog/vsphere/requests/compute/cloudinit_to_customspec.rb +65 -0
- data/lib/fog/vsphere/requests/compute/create_folder.rb +22 -0
- data/lib/fog/vsphere/requests/compute/create_vm.rb +169 -0
- data/lib/fog/vsphere/requests/compute/current_time.rb +18 -0
- data/lib/fog/vsphere/requests/compute/get_cluster.rb +25 -0
- data/lib/fog/vsphere/requests/compute/get_compute_resource.rb +41 -0
- data/lib/fog/vsphere/requests/compute/get_datacenter.rb +31 -0
- data/lib/fog/vsphere/requests/compute/get_datastore.rb +30 -0
- data/lib/fog/vsphere/requests/compute/get_folder.rb +74 -0
- data/lib/fog/vsphere/requests/compute/get_interface_type.rb +15 -0
- data/lib/fog/vsphere/requests/compute/get_network.rb +59 -0
- data/lib/fog/vsphere/requests/compute/get_resource_pool.rb +26 -0
- data/lib/fog/vsphere/requests/compute/get_server_type.rb +32 -0
- data/lib/fog/vsphere/requests/compute/get_template.rb +16 -0
- data/lib/fog/vsphere/requests/compute/get_virtual_machine.rb +57 -0
- data/lib/fog/vsphere/requests/compute/get_vm_first_scsi_controller.rb +26 -0
- data/lib/fog/vsphere/requests/compute/list_child_snapshots.rb +71 -0
- data/lib/fog/vsphere/requests/compute/list_clusters.rb +72 -0
- data/lib/fog/vsphere/requests/compute/list_compute_resources.rb +92 -0
- data/lib/fog/vsphere/requests/compute/list_customfields.rb +21 -0
- data/lib/fog/vsphere/requests/compute/list_datacenters.rb +53 -0
- data/lib/fog/vsphere/requests/compute/list_datastores.rb +40 -0
- data/lib/fog/vsphere/requests/compute/list_folders.rb +44 -0
- data/lib/fog/vsphere/requests/compute/list_interface_types.rb +25 -0
- data/lib/fog/vsphere/requests/compute/list_networks.rb +38 -0
- data/lib/fog/vsphere/requests/compute/list_processes.rb +40 -0
- data/lib/fog/vsphere/requests/compute/list_resource_pools.rb +38 -0
- data/lib/fog/vsphere/requests/compute/list_server_types.rb +54 -0
- data/lib/fog/vsphere/requests/compute/list_templates.rb +48 -0
- data/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +80 -0
- data/lib/fog/vsphere/requests/compute/list_vm_customvalues.rb +20 -0
- data/lib/fog/vsphere/requests/compute/list_vm_interfaces.rb +63 -0
- data/lib/fog/vsphere/requests/compute/list_vm_snapshots.rb +66 -0
- data/lib/fog/vsphere/requests/compute/list_vm_volumes.rb +52 -0
- data/lib/fog/vsphere/requests/compute/modify_vm_interface.rb +59 -0
- data/lib/fog/vsphere/requests/compute/modify_vm_volume.rb +25 -0
- data/lib/fog/vsphere/requests/compute/revert_to_snapshot.rb +30 -0
- data/lib/fog/vsphere/requests/compute/set_vm_customvalue.rb +17 -0
- data/lib/fog/vsphere/requests/compute/vm_clone.rb +727 -0
- data/lib/fog/vsphere/requests/compute/vm_config_vnc.rb +45 -0
- data/lib/fog/vsphere/requests/compute/vm_destroy.rb +23 -0
- data/lib/fog/vsphere/requests/compute/vm_execute.rb +47 -0
- data/lib/fog/vsphere/requests/compute/vm_migrate.rb +33 -0
- data/lib/fog/vsphere/requests/compute/vm_power_off.rb +39 -0
- data/lib/fog/vsphere/requests/compute/vm_power_on.rb +26 -0
- data/lib/fog/vsphere/requests/compute/vm_reboot.rb +31 -0
- data/lib/fog/vsphere/requests/compute/vm_reconfig_cpus.rb +23 -0
- data/lib/fog/vsphere/requests/compute/vm_reconfig_hardware.rb +24 -0
- data/lib/fog/vsphere/requests/compute/vm_reconfig_memory.rb +23 -0
- data/lib/fog/vsphere/requests/compute/vm_take_snapshot.rb +37 -0
- data/lib/fog/vsphere/version.rb +5 -0
- data/tests/compute_tests.rb +53 -0
- data/tests/helper.rb +8 -0
- data/tests/helpers/mock_helper.rb +9 -0
- data/tests/helpers/succeeds_helper.rb +9 -0
- data/tests/models/compute/server_tests.rb +70 -0
- data/tests/models/compute/servers_tests.rb +15 -0
- data/tests/requests/compute/current_time_tests.rb +12 -0
- data/tests/requests/compute/get_network_tests.rb +50 -0
- data/tests/requests/compute/list_child_snapshots_tests.rb +10 -0
- data/tests/requests/compute/list_clusters_tests.rb +11 -0
- data/tests/requests/compute/list_virtual_machines_tests.rb +38 -0
- data/tests/requests/compute/list_vm_snapshots_tests.rb +10 -0
- data/tests/requests/compute/revert_to_snapshot_tests.rb +15 -0
- data/tests/requests/compute/set_vm_customvalue_tests.rb +20 -0
- data/tests/requests/compute/vm_clone_tests.rb +50 -0
- data/tests/requests/compute/vm_config_vnc_tests.rb +19 -0
- data/tests/requests/compute/vm_destroy_tests.rb +17 -0
- data/tests/requests/compute/vm_migrate_tests.rb +16 -0
- data/tests/requests/compute/vm_power_off_tests.rb +26 -0
- data/tests/requests/compute/vm_power_on_tests.rb +17 -0
- data/tests/requests/compute/vm_reboot_tests.rb +26 -0
- data/tests/requests/compute/vm_reconfig_cpus_tests.rb +19 -0
- data/tests/requests/compute/vm_reconfig_hardware_tests.rb +19 -0
- data/tests/requests/compute/vm_reconfig_memory_tests.rb +19 -0
- data/tests/requests/compute/vm_take_snapshot_tests.rb +19 -0
- metadata +289 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Vsphere
|
|
4
|
+
class Interfacetype < Fog::Model
|
|
5
|
+
identity :id
|
|
6
|
+
|
|
7
|
+
# attribute :class
|
|
8
|
+
attribute :name
|
|
9
|
+
attribute :datacenter
|
|
10
|
+
attribute :servertype
|
|
11
|
+
|
|
12
|
+
def initialize(attributes={} )
|
|
13
|
+
super attributes
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to_s
|
|
17
|
+
name
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Vsphere
|
|
4
|
+
class Interfacetypes < Fog::Collection
|
|
5
|
+
autoload :Interfacetype, File.expand_path('../interfacetype', __FILE__)
|
|
6
|
+
|
|
7
|
+
model Fog::Compute::Vsphere::Interfacetype
|
|
8
|
+
attr_accessor :datacenter
|
|
9
|
+
attr_accessor :servertype
|
|
10
|
+
|
|
11
|
+
def all(filters = { })
|
|
12
|
+
requires :servertype
|
|
13
|
+
case servertype
|
|
14
|
+
when Fog::Compute::Vsphere::Servertype
|
|
15
|
+
load service.list_interface_types(filters.merge({
|
|
16
|
+
:datacenter => datacenter,
|
|
17
|
+
:servertype => servertype.id
|
|
18
|
+
}))
|
|
19
|
+
else
|
|
20
|
+
raise 'interfacetypes should have a servertype'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def get(id)
|
|
25
|
+
requires :servertype
|
|
26
|
+
requires :datacenter
|
|
27
|
+
new service.get_interface_type id, servertype, datacenter
|
|
28
|
+
rescue Fog::Compute::Vsphere::NotFound
|
|
29
|
+
nil
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Vsphere
|
|
4
|
+
class Network < Fog::Model
|
|
5
|
+
identity :id
|
|
6
|
+
|
|
7
|
+
attribute :name
|
|
8
|
+
attribute :datacenter
|
|
9
|
+
attribute :accessible # reachable by at least one hypervisor
|
|
10
|
+
attribute :virtualswitch
|
|
11
|
+
|
|
12
|
+
def to_s
|
|
13
|
+
name
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Vsphere
|
|
4
|
+
class Networks < Fog::Collection
|
|
5
|
+
autoload :Network, File.expand_path('../network', __FILE__)
|
|
6
|
+
|
|
7
|
+
model Fog::Compute::Vsphere::Network
|
|
8
|
+
attr_accessor :datacenter
|
|
9
|
+
|
|
10
|
+
def all(filters = {})
|
|
11
|
+
f = { :datacenter => datacenter }.merge(filters)
|
|
12
|
+
load service.list_networks(f)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def get(id)
|
|
16
|
+
requires :datacenter
|
|
17
|
+
new service.get_network(id, datacenter)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'fog/compute/models/server'
|
|
2
|
+
|
|
3
|
+
module Fog
|
|
4
|
+
module Compute
|
|
5
|
+
class Vsphere
|
|
6
|
+
class Process < Fog::Model
|
|
7
|
+
attribute :cmd_line
|
|
8
|
+
attribute :end_time
|
|
9
|
+
attribute :exit_code
|
|
10
|
+
attribute :name
|
|
11
|
+
attribute :owner
|
|
12
|
+
attribute :pid
|
|
13
|
+
attribute :start_time
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Vsphere
|
|
4
|
+
class ResourcePool < Fog::Model
|
|
5
|
+
identity :id
|
|
6
|
+
|
|
7
|
+
attribute :name
|
|
8
|
+
attribute :cluster
|
|
9
|
+
attribute :datacenter
|
|
10
|
+
attribute :configured_memory_mb
|
|
11
|
+
attribute :overall_status
|
|
12
|
+
|
|
13
|
+
def to_s
|
|
14
|
+
name
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Vsphere
|
|
4
|
+
class ResourcePools < Fog::Collection
|
|
5
|
+
autoload :ResourcePool, File.expand_path('../resource_pool', __FILE__)
|
|
6
|
+
|
|
7
|
+
model Fog::Compute::Vsphere::ResourcePool
|
|
8
|
+
attr_accessor :datacenter, :cluster
|
|
9
|
+
|
|
10
|
+
def all(filters = {})
|
|
11
|
+
load service.list_resource_pools(filters.merge(:datacenter => datacenter, :cluster => cluster))
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def get(id)
|
|
15
|
+
requires :datacenter
|
|
16
|
+
requires :cluster
|
|
17
|
+
new service.get_resource_pool(id, cluster, datacenter)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Vsphere
|
|
4
|
+
class SCSIController < Fog::Model
|
|
5
|
+
attribute :shared_bus
|
|
6
|
+
attribute :type
|
|
7
|
+
attribute :unit_number
|
|
8
|
+
attribute :key
|
|
9
|
+
|
|
10
|
+
def to_s
|
|
11
|
+
"#{type} ##{key}: shared: #{shared_bus}, unit_number: #{unit_number}"
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
require 'fog/compute/models/server'
|
|
2
|
+
|
|
3
|
+
module Fog
|
|
4
|
+
module Compute
|
|
5
|
+
class Vsphere
|
|
6
|
+
class Server < Fog::Compute::Server
|
|
7
|
+
extend Fog::Deprecation
|
|
8
|
+
deprecate(:ipaddress, :public_ip_address)
|
|
9
|
+
|
|
10
|
+
# This will be the instance uuid which is globally unique across
|
|
11
|
+
# a vSphere deployment.
|
|
12
|
+
identity :id
|
|
13
|
+
|
|
14
|
+
# JJM REVISIT (Extend the model of a vmware server)
|
|
15
|
+
# SEE: http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.VirtualMachine.html
|
|
16
|
+
# (Take note of the See also section.)
|
|
17
|
+
# In particular:
|
|
18
|
+
# GuestInfo: information about the guest operating system
|
|
19
|
+
# VirtualMachineConfigInfo: Access to the VMX file and configuration
|
|
20
|
+
|
|
21
|
+
attribute :name
|
|
22
|
+
# UUID may be the same from VM to VM if the user does not select (I copied it)
|
|
23
|
+
attribute :uuid
|
|
24
|
+
attribute :hostname
|
|
25
|
+
attribute :operatingsystem
|
|
26
|
+
attribute :public_ip_address, :aliases => 'ipaddress'
|
|
27
|
+
attribute :power_state, :aliases => 'power'
|
|
28
|
+
attribute :tools_state, :aliases => 'tools'
|
|
29
|
+
attribute :tools_version
|
|
30
|
+
attribute :mac_addresses, :aliases => 'macs'
|
|
31
|
+
attribute :hypervisor, :aliases => 'host'
|
|
32
|
+
attribute :connection_state
|
|
33
|
+
attribute :mo_ref
|
|
34
|
+
attribute :path
|
|
35
|
+
attribute :memory_mb
|
|
36
|
+
attribute :cpus
|
|
37
|
+
attribute :corespersocket
|
|
38
|
+
attribute :interfaces
|
|
39
|
+
attribute :volumes
|
|
40
|
+
attribute :customvalues
|
|
41
|
+
attribute :overall_status, :aliases => 'status'
|
|
42
|
+
attribute :cluster
|
|
43
|
+
attribute :datacenter
|
|
44
|
+
attribute :resource_pool
|
|
45
|
+
attribute :instance_uuid # move this --> id
|
|
46
|
+
attribute :guest_id
|
|
47
|
+
attribute :hardware_version
|
|
48
|
+
attribute :scsi_controller # this is the first scsi controller. Right now no more of them can be used.
|
|
49
|
+
attribute :cpuHotAddEnabled
|
|
50
|
+
attribute :memoryHotAddEnabled
|
|
51
|
+
attribute :firmware
|
|
52
|
+
|
|
53
|
+
def initialize(attributes={} )
|
|
54
|
+
super defaults.merge(attributes)
|
|
55
|
+
self.instance_uuid ||= id # TODO: remvoe instance_uuid as it can be replaced with simple id
|
|
56
|
+
initialize_interfaces
|
|
57
|
+
initialize_volumes
|
|
58
|
+
initialize_customvalues
|
|
59
|
+
initialize_scsi_controller
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Lazy Loaded Attributes
|
|
63
|
+
[:datacenter, :cluster, :hypervisor, :resource_pool, :mac_addresses].each do |attr|
|
|
64
|
+
define_method attr do
|
|
65
|
+
attributes[attr] = attributes[attr].call if attributes[attr].is_a?(Proc)
|
|
66
|
+
attributes[attr]
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
# End Lazy Loaded Attributes
|
|
70
|
+
|
|
71
|
+
def vm_reconfig_memory(options = {})
|
|
72
|
+
requires :instance_uuid, :memory
|
|
73
|
+
service.vm_reconfig_memory('instance_uuid' => instance_uuid, 'memory' => memory_mb)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def vm_reconfig_cpus(options = {})
|
|
77
|
+
requires :instance_uuid, :cpus, :corespersocket
|
|
78
|
+
service.vm_reconfig_cpus('instance_uuid' => instance_uuid, 'cpus' => cpus, 'corespersocket' => corespersocket)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def vm_reconfig_hardware(hardware_spec, options = {})
|
|
82
|
+
requires :instance_uuid
|
|
83
|
+
service.vm_reconfig_hardware('instance_uuid' => instance_uuid, 'hardware_spec' => hardware_spec)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def start(options = {})
|
|
87
|
+
requires :instance_uuid
|
|
88
|
+
service.vm_power_on('instance_uuid' => instance_uuid)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def stop(options = {})
|
|
92
|
+
options = { :force => !tools_installed? || !tools_running? }.merge(options)
|
|
93
|
+
requires :instance_uuid
|
|
94
|
+
service.vm_power_off('instance_uuid' => instance_uuid, 'force' => options[:force])
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def reboot(options = {})
|
|
98
|
+
options = { :force => false }.merge(options)
|
|
99
|
+
requires :instance_uuid
|
|
100
|
+
service.vm_reboot('instance_uuid' => instance_uuid, 'force' => options[:force])
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def destroy(options = {})
|
|
104
|
+
requires :instance_uuid
|
|
105
|
+
if ready?
|
|
106
|
+
# need to turn it off before destroying
|
|
107
|
+
stop(options)
|
|
108
|
+
wait_for { !ready? }
|
|
109
|
+
end
|
|
110
|
+
service.vm_destroy('instance_uuid' => instance_uuid)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def migrate(options = {})
|
|
114
|
+
options = { :priority => 'defaultPriority' }.merge(options)
|
|
115
|
+
requires :instance_uuid
|
|
116
|
+
service.vm_migrate('instance_uuid' => instance_uuid, 'priority' => options[:priority])
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Clone from a server object
|
|
120
|
+
#
|
|
121
|
+
# ==== Parameters
|
|
122
|
+
# *<~Hash>:
|
|
123
|
+
# * 'name'<~String> - *REQUIRED* Name of the _new_ VirtualMachine
|
|
124
|
+
# * See more options in vm_clone request/compute/vm_clone.rb
|
|
125
|
+
#
|
|
126
|
+
def clone(options = {})
|
|
127
|
+
requires :name, :datacenter, :path
|
|
128
|
+
|
|
129
|
+
# Convert symbols to strings
|
|
130
|
+
req_options = options.reduce({}) { |hsh, (k,v)| hsh[k.to_s] = v; hsh }
|
|
131
|
+
|
|
132
|
+
# Give our path to the request
|
|
133
|
+
req_options['template_path'] ="#{relative_path}/#{name}"
|
|
134
|
+
req_options['datacenter'] = "#{datacenter}"
|
|
135
|
+
|
|
136
|
+
# Perform the actual clone
|
|
137
|
+
clone_results = service.vm_clone(req_options)
|
|
138
|
+
|
|
139
|
+
# We need to assign the service, otherwise we can't reload the model
|
|
140
|
+
# Create the new VM model. TODO This only works when "wait=true"
|
|
141
|
+
new_vm = self.class.new(clone_results['new_vm'].merge(:service => self.service))
|
|
142
|
+
|
|
143
|
+
# We need to assign the collection otherwise we
|
|
144
|
+
# cannot reload the model.
|
|
145
|
+
new_vm.collection = self.collection
|
|
146
|
+
|
|
147
|
+
# Return the new VM model.
|
|
148
|
+
new_vm
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def take_snapshot(options = {})
|
|
152
|
+
requires :instance_uuid
|
|
153
|
+
service.vm_take_snapshot(options.merge('instance_uuid' => instance_uuid))
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def ready?
|
|
157
|
+
power_state == "poweredOn"
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def tools_installed?
|
|
161
|
+
tools_state != "toolsNotInstalled"
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def tools_running?
|
|
165
|
+
["toolsOk","toolsOld"].include? tools_state
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# defines VNC attributes on the hypervisor
|
|
169
|
+
def config_vnc(options = {})
|
|
170
|
+
requires :instance_uuid
|
|
171
|
+
service.vm_config_vnc(options.merge('instance_uuid' => instance_uuid))
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# returns a hash of VNC attributes required for service
|
|
175
|
+
def vnc
|
|
176
|
+
requires :instance_uuid
|
|
177
|
+
service.vm_get_vnc(instance_uuid)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def memory
|
|
181
|
+
memory_mb * 1024 * 1024
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def sockets
|
|
185
|
+
cpus / corespersocket
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def mac
|
|
189
|
+
interfaces.first.mac unless interfaces.empty?
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def interfaces
|
|
193
|
+
attributes[:interfaces] ||= id.nil? ? [] : service.interfaces( :server_id => self.id )
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def interface_ready? attrs
|
|
197
|
+
(attrs.is_a? Hash and attrs[:blocking]) or attrs.is_a? Fog::Compute::Vsphere::Interface
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def add_interface attrs
|
|
201
|
+
Fog::Logger.deprecation("<server>.add_interface is deprecated. Call <server>.interfaces.create instead.")
|
|
202
|
+
|
|
203
|
+
interfaces.create(attrs)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def update_interface attrs
|
|
207
|
+
wait_for { not ready? } if interface_ready? attrs
|
|
208
|
+
service.update_vm_interface(id, attrs)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def destroy_interface attrs
|
|
212
|
+
Fog::Logger.deprecation("<server>.destroy_vm_interface is deprecated. Call <server>.interfaces.get(:key => <nic_key>).destroy instead.")
|
|
213
|
+
|
|
214
|
+
interfaces.get(attrs[:key] || attrs['key']).destroy
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def volumes
|
|
218
|
+
attributes[:volumes] ||= id.nil? ? [] : service.volumes(:server_id => self.id)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def snapshots(opts = {})
|
|
222
|
+
service.snapshots(:server_id => self.id).all(opts)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def find_snapshot(snapshot_ref)
|
|
226
|
+
snapshots.get(snapshot_ref)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def revert_snapshot(snapshot)
|
|
230
|
+
case snapshot
|
|
231
|
+
when Snapshot
|
|
232
|
+
service.revert_to_snapshot(snapshot)
|
|
233
|
+
when String
|
|
234
|
+
service.revert_to_snapshot(find_snapshot(snapshot))
|
|
235
|
+
else
|
|
236
|
+
fail ArgumentError, "snapshot has to be kind of Snapshot or String class"
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def guest_processes(opts = {})
|
|
241
|
+
fail 'VM tools must be running' unless tools_running?
|
|
242
|
+
service.list_processes(self.id, opts)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def customvalues
|
|
246
|
+
attributes[:customvalues] ||= id.nil? ? [] : service.customvalues( :vm => self )
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def scsi_controller
|
|
250
|
+
self.attributes[:scsi_controller] ||= service.get_vm_first_scsi_controller(id)
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def folder
|
|
254
|
+
return nil unless datacenter and path
|
|
255
|
+
attributes[:folder] ||= service.folders(:datacenter => datacenter, :type => :vm).get(path)
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def save
|
|
259
|
+
requires :name, :cluster, :datacenter
|
|
260
|
+
if persisted?
|
|
261
|
+
raise "update is not supported yet"
|
|
262
|
+
# service.update_vm(attributes)
|
|
263
|
+
else
|
|
264
|
+
self.id = service.create_vm(attributes)
|
|
265
|
+
end
|
|
266
|
+
reload
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def new?
|
|
270
|
+
id.nil?
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def reload
|
|
274
|
+
# reload does not re-read assoiciated attributes, so we clear it manually
|
|
275
|
+
[:interfaces, :volumes].each do |attr|
|
|
276
|
+
self.attributes.delete(attr)
|
|
277
|
+
end
|
|
278
|
+
super
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def relative_path
|
|
282
|
+
requires :path, :datacenter
|
|
283
|
+
|
|
284
|
+
(path.split('/').reject {|e| e.empty?} - ["Datacenters", datacenter, "vm"]).join("/")
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
private
|
|
288
|
+
|
|
289
|
+
def defaults
|
|
290
|
+
{
|
|
291
|
+
:cpus => 1,
|
|
292
|
+
# :corespersocket => 1,
|
|
293
|
+
:memory_mb => 512,
|
|
294
|
+
:guest_id => 'otherGuest',
|
|
295
|
+
:path => '/'
|
|
296
|
+
}
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def initialize_interfaces
|
|
300
|
+
if attributes[:interfaces] and attributes[:interfaces].is_a?(Array)
|
|
301
|
+
self.attributes[:interfaces].map! { |nic| nic.is_a?(Hash) ? service.interfaces.new(nic) : nic }
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
def initialize_volumes
|
|
306
|
+
if attributes[:volumes] and attributes[:volumes].is_a?(Array)
|
|
307
|
+
self.attributes[:volumes].map! { |vol| vol.is_a?(Hash) ? service.volumes.new(vol) : vol }
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def initialize_customvalues
|
|
312
|
+
if attributes[:customvalues] and attributes[:customvalues].is_a?(Array)
|
|
313
|
+
self.attributes[:customvalues].map { |cfield| cfield.is_a?(Hash) ? service.customvalue.new(cfield) : cfield}
|
|
314
|
+
end
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
def initialize_scsi_controller
|
|
318
|
+
if attributes[:scsi_controller] and attributes[:scsi_controller].is_a?(Hash)
|
|
319
|
+
Fog::Compute::Vsphere::SCSIController.new(self.attributes[:scsi_controller])
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
end
|
|
325
|
+
end
|