Class: Vmpooler::PoolManager::Provider::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/vmpooler/providers/base.rb

Direct Known Subclasses

Dummy

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config, logger, metrics, redis_connection_pool, name, options) ⇒ Base

Returns a new instance of Base.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/vmpooler/providers/base.rb', line 21

def initialize(config, logger, metrics, redis_connection_pool, name, options)
  @config = config
  @logger = logger
  @metrics = metrics
  @redis = redis_connection_pool
  @provider_name = name

  # Ensure that there is not a nil provider configuration
  @config[:providers] = {} if @config[:providers].nil?
  @config[:providers][@provider_name] = {} if provider_config.nil?

  # Ensure that there is not a nil pool configuration
  @config[:pools] = {} if @config[:pools].nil?

  @provider_options = options
  logger.log('s', "[!] Creating provider '#{name}'")

  # Initialize circuit breaker if enabled
  initialize_circuit_breaker if circuit_breaker_enabled?
  # Initialize adaptive timeout if enabled
  initialize_adaptive_timeout if adaptive_timeout_enabled?
end

Instance Attribute Details

#adaptive_timeoutObject (readonly)

Adaptive timeout for connections



19
20
21
# File 'lib/vmpooler/providers/base.rb', line 19

def adaptive_timeout
  @adaptive_timeout
end

#circuit_breakerObject (readonly)

Circuit breaker for provider resilience



17
18
19
# File 'lib/vmpooler/providers/base.rb', line 17

def circuit_breaker
  @circuit_breaker
end

#loggerObject (readonly)

Helper Methods Global Logger object



11
12
13
# File 'lib/vmpooler/providers/base.rb', line 11

def logger
  @logger
end

#metricsObject (readonly)

Global Metrics object



13
14
15
# File 'lib/vmpooler/providers/base.rb', line 13

def metrics
  @metrics
end

#provider_optionsObject (readonly)

Provider options passed in during initialization



15
16
17
# File 'lib/vmpooler/providers/base.rb', line 15

def provider_options
  @provider_options
end

Instance Method Details

#create_disk(_pool_name, _vm_name, _disk_size) ⇒ Object

inputs

[String]  pool_name  : Name of the pool
[String]  vm_name    : Name of the VM to create the disk on
[Integer] disk_size  : Size of the disk to create in Gigabytes (GB)

returns

[Boolean] : true if success, false if disk could not be created
Raises RuntimeError if the Pool does not exist
Raises RuntimeError if the VM does not exist


181
182
183
# File 'lib/vmpooler/providers/base.rb', line 181

def create_disk(_pool_name, _vm_name, _disk_size)
  raise("#{self.class.name} does not implement create_disk")
end

#create_snapshot(_pool_name, _vm_name, _new_snapshot_name) ⇒ Object

inputs

[String] pool_name         : Name of the pool
[String] new_vmname        : Name of the VM to create the snapshot on
[String] new_snapshot_name : Name of the new snapshot to create

returns

[Boolean] : true if success, false if snapshot could not be created
Raises RuntimeError if the Pool does not exist
Raises RuntimeError if the VM does not exist


193
194
195
# File 'lib/vmpooler/providers/base.rb', line 193

def create_snapshot(_pool_name, _vm_name, _new_snapshot_name)
  raise("#{self.class.name} does not implement create_snapshot")
end

#create_template_delta_disks(_pool) ⇒ Object

inputs

[Hash] pool : Configuration for the pool

returns

nil when successful. Raises error when encountered


257
258
259
# File 'lib/vmpooler/providers/base.rb', line 257

def create_template_delta_disks(_pool)
  puts("#{self.class.name} does not implement create_template_delta_disks")
end

#create_vm(_pool_name, _new_vmname) ⇒ Object

inputs

[String] pool       : Name of the pool
[String] new_vmname : Name to give the new VM

returns

[Hashtable] of the VM as per get_vm
Raises RuntimeError if the pool_name is not supported by the Provider


169
170
171
# File 'lib/vmpooler/providers/base.rb', line 169

def create_vm(_pool_name, _new_vmname)
  raise("#{self.class.name} does not implement create_vm")
end

#destroy_vm(_pool_name, _vm_name) ⇒ Object

inputs

[String] pool_name : Name of the pool
[String] vm_name   : Name of the VM to destroy

returns

[Boolean] : true if success, false on error. Should returns true if the VM is missing


215
216
217
# File 'lib/vmpooler/providers/base.rb', line 215

def destroy_vm(_pool_name, _vm_name)
  raise("#{self.class.name} does not implement destroy_vm")
end

#dns_config(dns_config_name) ⇒ Object



70
71
72
# File 'lib/vmpooler/providers/base.rb', line 70

def dns_config(dns_config_name)
  Vmpooler::Dns.get_dns_plugin_domain_by_name(@config, dns_config_name)
end

#find_least_used_compatible_host(_pool_name, _vm_name) ⇒ Object

inputs

[String] pool_name : Name of the pool
[String] vm_name   : Name of the VM

returns

[String] : Name of the most appropriate host computer to run this VM.  Useful for load balancing VMs in a cluster
             If this is not a Virtual Machine, it returns the vm_name


124
125
126
# File 'lib/vmpooler/providers/base.rb', line 124

def find_least_used_compatible_host(_pool_name, _vm_name)
  raise("#{self.class.name} does not implement find_least_used_compatible_host")
end

#get_target_datacenter_from_config(_provider_name) ⇒ Object

inputs

[String] provider_name : Name of the provider

returns

Hash of folders


265
266
267
# File 'lib/vmpooler/providers/base.rb', line 265

def get_target_datacenter_from_config(_provider_name)
  raise("#{self.class.name} does not implement get_target_datacenter_from_config")
end

#get_vm(_pool_name, _vm_name) ⇒ Object

inputs

[String] pool_name : Name of the pool
[String] vm_name   : Name of the VM to find

returns

nil if VM doesn't exist
[Hastable] of the VM
 [String] name       : Name of the VM
 [String] hostname   : Name reported by Vmware tools (host.summary.guest.hostName)
 [String] template   : This is the name of template exposed by the API.  It must _match_ the poolname
 [String] poolname   : Name of the pool the VM is located
 [Time]   boottime   : Time when the VM was created/booted
 [String] powerstate : Current power state of a VM.  Valid values (as per vCenter API)
                         - 'PoweredOn','PoweredOff'


159
160
161
# File 'lib/vmpooler/providers/base.rb', line 159

def get_vm(_pool_name, _vm_name)
  raise("#{self.class.name} does not implement get_vm")
end

#get_vm_host(_pool_name, _vm_name) ⇒ Object

inputs

[String]pool_name : Name of the pool
[String] vm_name  : Name of the VM

returns

[String] : Name of the host computer running the vm.  If this is not a Virtual Machine, it returns the vm_name


114
115
116
# File 'lib/vmpooler/providers/base.rb', line 114

def get_vm_host(_pool_name, _vm_name)
  raise("#{self.class.name} does not implement get_vm_host")
end

#get_vm_ip_address(vm_name, pool_name) ⇒ Object



273
274
275
# File 'lib/vmpooler/providers/base.rb', line 273

def get_vm_ip_address(vm_name, pool_name)
  raise("#{self.class.name} does not implement get_vm_ip_address for vm #{vm_name} in pool #{pool_name}")
end

#global_configObject

returns

[Hashtable] : The entire VMPooler configuration


76
77
78
79
# File 'lib/vmpooler/providers/base.rb', line 76

def global_config
  # This entire VM Pooler config
  @config
end

#migrate_vm(_pool_name, _vm_name, _redis) ⇒ Object

inputs

[String] pool_name      : Name of the pool
[String] vm_name        : Name of the VM to migrate
[Class] redis           : Redis object


142
143
144
# File 'lib/vmpooler/providers/base.rb', line 142

def migrate_vm(_pool_name, _vm_name, _redis)
  raise("#{self.class.name} does not implement migrate_vm")
end

#migrate_vm_to_host(_pool_name, _vm_name, _dest_host_name) ⇒ Object

inputs

[String] pool_name      : Name of the pool
[String] vm_name        : Name of the VM to migrate
[String] dest_host_name : Name of the host to migrate `vm_name` to

returns

[Boolean] : true on success or false on failure


134
135
136
# File 'lib/vmpooler/providers/base.rb', line 134

def migrate_vm_to_host(_pool_name, _vm_name, _dest_host_name)
  raise("#{self.class.name} does not implement migrate_vm_to_host")
end

#nameObject

returns

[String] : Name of the provider service


83
84
85
# File 'lib/vmpooler/providers/base.rb', line 83

def name
  @provider_name
end

#pool_config(pool_name) ⇒ Object

inputs

[String] pool_name : Name of the pool to get the configuration

returns

[Hashtable] : The pools configuration from the config file.  Returns nil if the pool does not exist


50
51
52
53
54
55
56
57
# File 'lib/vmpooler/providers/base.rb', line 50

def pool_config(pool_name)
  # Get the configuration of a specific pool
  @config[:pools].each do |pool|
    return pool if pool['name'] == pool_name
  end

  nil
end

#provided_poolsObject

returns

Array[String] : Array of pool names this provider services


89
90
91
92
93
94
95
# File 'lib/vmpooler/providers/base.rb', line 89

def provided_pools
  list = []
  @config[:pools].each do |pool|
    list << pool['name'] if pool['provider'] == name
  end
  list
end

#provider_configObject

returns

[Hashtable] : This provider's configuration from the config file.  Returns nil if the provider does not exist


61
62
63
64
65
66
67
68
# File 'lib/vmpooler/providers/base.rb', line 61

def provider_config
  @config[:providers].each do |provider|
    # Convert the symbol from the config into a string for comparison
    return (provider[1].nil? ? {} : provider[1]) if provider[0].to_s == @provider_name
  end

  nil
end

#purge_unconfigured_folders(_deprecated, _deprecated2, allowlist) ⇒ Object

DEPRECATED if a provider does not implement the new method, it will hit this base class method and return a deprecation message



279
280
281
282
# File 'lib/vmpooler/providers/base.rb', line 279

def purge_unconfigured_folders(_deprecated, _deprecated2, allowlist)
  logger.log('s', '[!] purge_unconfigured_folders was renamed to purge_unconfigured_resources, please update your provider implementation')
  purge_unconfigured_resources(allowlist)
end

#purge_unconfigured_resources(_allowlist) ⇒ Object



269
270
271
# File 'lib/vmpooler/providers/base.rb', line 269

def purge_unconfigured_resources(_allowlist)
  raise("#{self.class.name} does not implement purge_unconfigured_resources")
end

#revert_snapshot(_pool_name, _vm_name, _snapshot_name) ⇒ Object

inputs

[String] pool_name     : Name of the pool
[String] new_vmname    : Name of the VM to restore
[String] snapshot_name : Name of the snapshot to restore to

returns

[Boolean] : true if success, false if snapshot could not be revertted
Raises RuntimeError if the Pool does not exist
Raises RuntimeError if the VM does not exist
Raises RuntimeError if the snapshot does not exist


206
207
208
# File 'lib/vmpooler/providers/base.rb', line 206

def revert_snapshot(_pool_name, _vm_name, _snapshot_name)
  raise("#{self.class.name} does not implement revert_snapshot")
end

#tag_vm_user(_pool_name, _vm_name) ⇒ Object

tag_vm_user This method is called once we know who is using the VM (it is running). This method enables seeing who is using what in the provider pools. This method should be implemented in the providers, if it is not implemented, this base method will be called and should be a noop. The implementation should check if the vm has a user (as per redis) and add a new tag with the information. inputs

[String] pool_name : Name of the pool
[String] vm_name   : Name of the VM to check if ready

returns

[Boolean] : true if successful, false if an error occurred and it should retry


238
239
240
241
242
# File 'lib/vmpooler/providers/base.rb', line 238

def tag_vm_user(_pool_name, _vm_name)
  # noop by design. If the provider does not implement this method, this base method is called (because inherited)
  # and should basically do nothing.
  true
end

#vm_exists?(pool_name, vm_name) ⇒ Boolean

inputs

[String] pool_name : Name of the pool
[String] vm_name   : Name of the VM to check if it exists

returns

[Boolean] : true if it exists, false if not

Returns:

  • (Boolean)


249
250
251
# File 'lib/vmpooler/providers/base.rb', line 249

def vm_exists?(pool_name, vm_name)
  !get_vm(pool_name, vm_name).nil?
end

#vm_ready?(_pool_name, _vm_name) ⇒ Boolean

inputs

[String] pool_name : Name of the pool
[String] vm_name   : Name of the VM to check if ready

returns

[Boolean] : true if ready, false if not

Returns:

  • (Boolean)


224
225
226
# File 'lib/vmpooler/providers/base.rb', line 224

def vm_ready?(_pool_name, _vm_name)
  raise("#{self.class.name} does not implement vm_ready?")
end

#vms_in_pool(_pool_name) ⇒ Object

inputs

[String] pool_name : Name of the pool

returns

Array[Hashtable]
  Hash contains:
    'name' => [String] Name of VM


105
106
107
# File 'lib/vmpooler/providers/base.rb', line 105

def vms_in_pool(_pool_name)
  raise("#{self.class.name} does not implement vms_in_pool")
end