Class: Vmpooler::PoolManager::Provider::Base
- Inherits:
-
Object
- Object
- Vmpooler::PoolManager::Provider::Base
- Defined in:
- lib/vmpooler/providers/base.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#adaptive_timeout ⇒ Object
readonly
Adaptive timeout for connections.
-
#circuit_breaker ⇒ Object
readonly
Circuit breaker for provider resilience.
-
#logger ⇒ Object
readonly
Helper Methods Global Logger object.
-
#metrics ⇒ Object
readonly
Global Metrics object.
-
#provider_options ⇒ Object
readonly
Provider options passed in during initialization.
Instance Method Summary collapse
-
#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.
-
#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.
-
#create_template_delta_disks(_pool) ⇒ Object
inputs [Hash] pool : Configuration for the pool returns nil when successful.
-
#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.
-
#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.
- #dns_config(dns_config_name) ⇒ Object
-
#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.
-
#get_target_datacenter_from_config(_provider_name) ⇒ Object
inputs [String] provider_name : Name of the provider returns Hash of folders.
-
#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.
-
#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.
- #get_vm_ip_address(vm_name, pool_name) ⇒ Object
-
#global_config ⇒ Object
returns [Hashtable] : The entire VMPooler configuration.
-
#initialize(config, logger, metrics, redis_connection_pool, name, options) ⇒ Base
constructor
A new instance of Base.
-
#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.
-
#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_nameto returns [Boolean] : true on success or false on failure. -
#name ⇒ Object
returns [String] : Name of the provider service.
-
#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.
-
#provided_pools ⇒ Object
returns Array : Array of pool names this provider services.
-
#provider_config ⇒ Object
returns [Hashtable] : This provider’s configuration from the config file.
-
#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.
- #purge_unconfigured_resources(_allowlist) ⇒ Object
-
#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.
-
#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).
-
#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.
-
#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.
-
#vms_in_pool(_pool_name) ⇒ Object
inputs [String] pool_name : Name of the pool returns Array Hash contains: ‘name’ => [String] Name of VM.
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, ) @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 = 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_timeout ⇒ Object (readonly)
Adaptive timeout for connections
19 20 21 |
# File 'lib/vmpooler/providers/base.rb', line 19 def adaptive_timeout @adaptive_timeout end |
#circuit_breaker ⇒ Object (readonly)
Circuit breaker for provider resilience
17 18 19 |
# File 'lib/vmpooler/providers/base.rb', line 17 def circuit_breaker @circuit_breaker end |
#logger ⇒ Object (readonly)
Helper Methods Global Logger object
11 12 13 |
# File 'lib/vmpooler/providers/base.rb', line 11 def logger @logger end |
#metrics ⇒ Object (readonly)
Global Metrics object
13 14 15 |
# File 'lib/vmpooler/providers/base.rb', line 13 def metrics @metrics end |
#provider_options ⇒ Object (readonly)
Provider options passed in during initialization
15 16 17 |
# File 'lib/vmpooler/providers/base.rb', line 15 def @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_config ⇒ Object
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 |
#name ⇒ Object
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_pools ⇒ Object
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_config ⇒ Object
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
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
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 |