Commit graph

437 commits

Author SHA1 Message Date
kirby@puppetlabs.com
ea9deddd2d Identify when ESXi host quickstats do not return
This commit updates cpu_utilization_for and memory_utilization_for to detect when quickstats are not present. Without this change a nil result is transformed to 0, which is perceived as a host that has no utilization.
2018-01-10 12:17:16 -08:00
kirby@puppetlabs.com
6ab2e2ff8c Add tests for new vsphere functionality
This commit adds tests for the remaining new vsphere functionality.
2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
ecae6a1a58 reduce loop delay when waiting for host selection 2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
fedb3632f2 Simplify run_select_hosts 2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
021633cd49 Ensure vm is removed from migrations 2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
048ab4433a Remove unnecessary rescue
This commit removes an unnecessary rescue that results in duplicate clone error messages. Without this change clone failures due to unavailable host resources are logged twice. A log message is added to specify the host the VM is running on when migration_limit is not set and migration is disabled. Lastly, when a migration fails it reports the host the VM is running on in addition to the reason for the failed migration.
2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
82b9033e83 Document parameters added in vmpooler.yaml.example
This change documents new vshpere specific parameters introduced related
to host selection and folder creation. Without this change these paremeters are not
documented.
2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
67798ab892 Write check_time_finished whether host retrieval was successful or not
This commit updates host selection to write check_time_finished whether
host retrieval was successful or not. Without this change when host
selection fails threads waiting for host selection to complete will
stuck waiting because check_time_finished doesn't update. Additionally,
because it would leave checking => true it would not attempt to inspect
and run host selection again.

Host selection for clones and migrations now make clear that no hosts
are available and fail logging a message. Without this change both
migrations and clones would fail with cryptic error messages logged
indicating clone and migrations failed.

Additionally, this change makes max_age configurable so a user can
specify that host selection should happen more or less frequently, as
required for migrations or clone operations when host selection is
enabled.
2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
6175fd591f Remove attr_reader for provider_hosts 2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
0efb79a133 Move provider_hosts to vsphere provider
This commit updates the providers to move provider_hosts under the vsphere provider, which is the only place it's applicable. Methods where redis is passed through are updated to remove this pass through and use the globally available redis object, where applicable. Remove_vmpooler_migration_vm method is not needed and is removed.
2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
cd979fc24d Move migrate_vm logic to vsphere provider
This commit moves the migrate_vm logic to the vsphere provider. Without
this change migrate_vm has lots of vsphere specific logic in
pool_manager migrate_vm method.
2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
23242a7b1c Update pool_manager and vsphere tests to support changes in host selection 2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
3050a22d62 Return the least used set of hosts
This commit updates cluster host resource inspection to stop weighting memory as a part of the results. Additionally, instead of returning a single least used host a percentage of the eligible hosts with below average utilization are selected. Without this change host migration logic can cause cluster resource imbalances due to a single host being targeted for many migrations before the impacts of the migrations cause numbers to adjust.
2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
cd46eea13e Only specify cluster for clone operations
This commit updates create_vm to target a cluster instead of an individual host for clone operations. Without this change cluster host utilization needs to be inspected for everyone clone operation.
2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
2ffada72b6 Add capability to create folders
This commit adds the capability to create folders within an existing target folder. Without this change folders to support platforms targets need to be created manually.
2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
ada79e81f4 (QENG-5305) Check cluster utilization once at a time
This commit adds a global provider_hosts concept in order to allow checking cluster utilization once per interval for a given cluster and retain the results, reusing them for an interval, and tracking the least used set of hosts. Without this change each migration and clone operation inspect host utilization and state for each host in the cluster, which is computationally expensive for vsphere.
2018-01-10 12:02:58 -08:00
Samuel Beaulieu
96541729fb (POOLER-93) Extend API endpoint to provide just what is needed
The status endpoint provides a lot of statistics. This commit extends it
by supporting a query parameter called 'view' which may contain one or
multiple comma separated names for the top-level statistics returned
in the JSON response. status is always returned.
Optional elements are capacity,queue,clone,boot,pools
Everything is returned when 'view' is not specified, which is
backwards compatible with the current behavior.
2017-10-20 15:53:40 -05:00
Samuel Beaulieu
f10bcadf7e (POOLER-92) Add the alias information in the API status page for each pool
Before this change if a pool had an alias configured, the information would not be
made public in the API. This commit adds the alias key in the pool object for each
pool if configured. The alias key can be abscent, a string or an one or multiple
array of strings. The value of the alias is copied from the configuration and can
represent another name for the pool, or another configured pool.
2017-10-18 12:28:51 -05:00
Samuel
0b5abd9bd3 Fix no implicit conversion to rational from nil (#239)
* Fix no implicit conversion to rational from nil
Before this change if the boottime was nil, the check_ready
loop would exit on Time.now - host['boottime'] with a TypeError
in jruby. The boottime is nil when the power is Off so moving that check
earlier should catch that bug.

* set test data properly
2017-10-17 17:51:02 -05:00
Glenn Sarti
f209c2b830 (GH-226) Respond quickly to VMs being consumed
Previously in commit 9b0e55f959 the looping period was changed from a static
number to a dynamic one depending on load, however this meant that the operation
to refill a pool was slowed down somewhat.  While not a problem under normal
loads, when a pool was quickly consumed, the pool manager may not respond
quickly enough to refill the pool.  This commit:

- Changes the sleep method, to us a helper sleep method that will wakeup
  periodically and evaluate other wakeup events.  This could be used later to
  exist sleep loops when pooler is shutting down to stop blocking threads
- By default the wakeup_period is set to the minimum pool check loop time, thus
  emulating the behaviour prior to commit 9b0e55f959
- Adds tests for the behaviour
2017-09-05 21:41:32 -07:00
kirby@puppetlabs.com
2f5e43284d (POOLER-89) Identify when config issue is present
This commit adds vmpooler inspection of configuration issues to host
selection. Specifically, configIssue is checked, which should allow an
issue like quickstats not being reported to be identified even when the
alarm will not trigger. Without this change a host will continue to be
used if quickstats are not reported when alarms are not triggered
because of this condition, which results in a single host being the
target for all deploys and migrations, overloading the host and causing
its VMs to have degraded performance.
2017-08-15 10:58:37 -07:00
mattkirby
d789dfdfc8 Merge pull request #229 from glennsarti/fix-phantom-vms
(maint) Remove phantom VMs that are in Redis but don't exist in provider
2017-08-01 10:38:25 -07:00
Rob Braden
0e05163825 Merge pull request #231 from glennsarti/dynamically-load-providers
(GH-230) Dynamically load VM Providers
2017-07-25 15:08:55 -07:00
Glenn Sarti
b16a2e6e96 (GH-230) Dynamically load VM Providers
Previously, a static list was used to instantiate VM Pooler Provider objects.
This commit changes the loader to instead interrogate the available clases in
the Vmpooler::PoolManager::Provider namespace and then instantiate from there.

This means class names are not case sensitive and that VM Providers can now be
dynamically loaded from other sources such as gems in the LOADPATH.  No tests
were added as this behaviour is exercised in the execute! tests already.
2017-07-19 12:52:32 -07:00
Glenn Sarti
e55a8825af (maint) Remove phatom VMs and ensure inventory is successful
Previously, if inventory failed for some reason, it would return an incomplete
set of VMs which could then cause the pool to perform off behaviours such as
fill the pool high than it should, or remove VMs which exist.  Also, if the
redis cache of VMs in a pool had a VM but it did not actually exist in the
inventory it would never be removed.

This commit:
- Immediately exits the check_pool if an error occurs during inventory
  collection
- Will mark a VM as completed if it exists in Redis, but does not exist in
  inventory
- Adds tests for these behaviours
2017-07-18 16:53:16 -07:00
Glenn Sarti
9c93d2534f (maint) Fix rubocop offenses
This commit fixes the many rubocop offenses.  Also modifies the rubocop
settings:

- Set max method params higher than the default of 5
- Ignore Style/GuardClause. In some cases it's eaiser to read without the guard
- Renamed a cop
2017-07-18 15:26:27 -07:00
Rob Braden
9b0e55f959 Merge pull request #227 from glennsarti/add-check-skew
(GH-226) Use a dynamic pool_check loop period
2017-07-12 23:19:51 -07:00
Glenn Sarti
5e0aefc629 (maint) Fix minor rubocop violations
Fix minor rubocop violations
2017-07-12 17:13:21 -07:00
Glenn Sarti
30946fab8e (GH-226) Use a dynamic pool_check loop period
Previously the check_pool would always check the pool every 5 seconds, however
with a large number of pools, this can cause resource issues inside the
providers.  This commit:
- Introduces a dynamic check_pool period which increases during stability and
  decreases when the pool is being change in an important way
- Surfaces the settings as global config defaults but can also be set on a per
  pool basis
- Adds defaults to emulate the current behaviour
- Unit tests for the new behaviour
2017-07-12 17:13:21 -07:00
kirby@puppetlabs.com
c750657c6f Update find_least_used_compatible_host to specify pool
This commit updates find_least_used_compatible_host method to specify
the pool name when evaluating a VM for migration. Without this change VM
migration fails with a wrong number of arguments error. Pool_manager
test references are updated to reflect the change.
2017-06-28 08:01:47 -07:00
Samuel
5355d1cf03 Add find_folder method details
Specifically that the 3rd argument datacentername supports a 'nil' value, in which case the first datacenter is returned.
2017-06-20 15:48:30 -07:00
Glenn Sarti
7077eadc65 (POOLER-83) Add ability to specify a datacenter for vsphere
Previously the vsphere provider assumed that there was one and only one
datacenter (DC) in the vsphere instance.  However this is simply not true for
many vSphere installations.  This commit:
- Adds the ability to define a vSphere datacenter at the Pool or Provider level
  whereby the Pool setting takes precedence
- If no datacenter is specified the default behaviour of picking the first DC
  in the vSphere instance
- Updated all tests for the new setting
- Update the vmpooler configuration file example with relevant setting name
  and expected behaviour
- Fixed a bug in the rvmomi_helper whereby if no DC was found it would return
  all DCs.  This is opposite behaviour of the real RBVMOMI library as it returns
  nil
2017-06-20 15:48:30 -07:00
Rob Braden
cfc1b61f0e Merge pull request #224 from glennsarti/gh-213-remove-underscore-connection
(GH-213) Remove use of private _connection method
2017-06-20 15:11:02 -07:00
Rob Braden
b54b248d75 Merge pull request #221 from puppetlabs/sam-suppert-multiple-providers
Adding support for multiple vsphere providers
2017-06-20 15:08:32 -07:00
Glenn Sarti
3a4df791ff (GH-213) Remove use of private _connection method
Previosuly in find_vmdks in vsphere_helper it uses the call
vmdk_datastore._connection to get the underlying connection, however this is
already available as function parameter.  This commit removes this bad code and
the associated test fixtures.
2017-06-15 15:01:08 -07:00
Samuel Beaulieu
d93ab332f7 Adding support for multiple vsphere providers
Refactoring the vmpooler.yaml format to support multiple providers.
The second level key under :providers: is a unique key name that
represents a provider that can be refered in the pool's parameter
called provider. The code is still backward compatible to support
the :vsphere: and :dummy: keys but in reality if you have more than
one vsphere configuration you would give them a different name. For
example :vsphere-pdx: and :vsphere-bfs: and the actual provider
class would be specified as a parameter called 'provider_class'.
See tests and examples for more information.
2017-06-09 21:44:03 +01:00
Samuel Beaulieu
26d6cb28d9 Refactor the get_cluster_host_utilization method
The same method logic was being used in two places but only one was calling the method
get_cluster_host_utilization, so this refactors it to use the method for both.
The method could also return an empty array and the subsequent line would try
to .sort[0][1] which would return undefined method [] for nil:NilClass in that
case. The return value is now checked and an exception raised
2017-06-07 17:04:59 +01:00
Glenn Sarti
85b0f035aa (POOLER-52) Add recovery to vSphere connections
The generic connection pooler is only responsible for managing the connection
objects, however the providers themselves are responsible for ensuring that the
connection is alive/healthy etc.  Previously, the older vSphere helper would
reconnect however this was lost when the connection pooler was introduced.  This
commit adds a method that checks the connection before use, and then reconnects
if the connection is in a bad state.
2017-05-17 13:52:28 -07:00
Glenn Sarti
df783f0ed0 (POOLER-52) Use a Connection Pooler for vSphere connections
Previously the vSphere Provider would share a single vSphere connection for all
pools under management.  This would cause issues in large environments as this
would cause errors to be thrown or operations to slow down.  This commit
modifies the vSphere Provider to use a connection pool when communicating with
the vSphere API
- Uses the GenericConnectionPool object to manage the connection pool
- Uses a default connection pool size of:
	Whatever is biggest from:
	- How many pools this provider services
	- Maximum number of cloning tasks allowed
	- Need at least 2 connections so that a pool can have inventory functions
	  performed while cloning etc.
- A large connection_pool_timeout is used as a connection object is consumed
  during a VM clone, which can take up to 2 minutes
- Removes the `get_connection` method as that is now obsolete due to the
  connection pool
- Removes the `close` method as it is now obsolete
- Modified the spec tests slightly, to stop mocking get_connection as it no
  longer exists, and set a super low pool timeout so that if a test fails, it
  will fail quickly instead of taking the default time of 60+ seconds
2017-05-17 13:52:28 -07:00
Glenn Sarti
2f37c1e9b5 (POOLER-52) Modify dummy provider to use a connection pool
Previously a connection pooler class was added.  This commit modifies the Dummy
VM Provider to use a connection pooler.  While the Dummy provider strictly
speaking does not use connections, this allows testing to see what happens when
connection pools are stressed or exhausted.  This commit:
- Modifies functions to use a connection pool object for the public API
  functions
- Modifies the VMPooler YAML with new settings for connection pool size and
  timeout
2017-05-17 13:52:28 -07:00
Glenn Sarti
888ffc4afc (POOLER-52) Add a generic connection pool
Previously VMPooler had no concept of a connection pooler.  While there is an
up to date connection pooler Gem (connection_pool), that supports MRI and jRuby,
it lacked metrics which are useful to diagnose errors and judge pool size.
This commit:

- Brings in the connection_pool gem
- Creates a new class called generic_connection_pool which inherits from the
  ConnectionPool class in the connection_pool gem.
- Extends the connection pool object with a new function called `with_metrics`
  This copies the code from the original `with` method but emits metrics for
  how long it took to get an object from the pool, and then how many objects
  are left in the pool.  This is sent using VMPooler's metrics object.
  Extending the object was used instead of overriding as it was not possible to
  inject into the existing function and monkey patching did not seem the correct
  way.

  In order use the metics, the GenericConnectionPool object modifies the
  initialize method to use :metrics and :metrics_prefix options
- Also added tests for the GenericConnectionPool class to ensure the new
  functions are tested.  Note that the functionality that was not extended is
  not tested in VMPooler.
2017-05-17 13:52:28 -07:00
Glenn Sarti
0aa550f852 (POOLER-70) Remove vsphere_helper
In previous commits the code from vsphere_helper is now all moved to the vSphere
Provider.  This commit removes the vsphere_helper.rb file, spec tests and from
being loaded by vmpooler itself.
2017-05-17 13:52:28 -07:00
Glenn Sarti
ba686e3c0a (maint) Update VMPooler files with fixes for Rubocop violations
This commit updates vmpooler.rb, api.rb and providers.rb with style changes as
per rubocop style violations.

This commit also updates the rubocop configuration to always use LF line endings
even on Windows as rubocop was expecting CRLF even though git is configured
for LF.
2017-05-17 13:52:28 -07:00
Glenn Sarti
2e255a5a43 (POOLER-70) Move vSphere configuration into providers section
Previously the vSphere based configuration was in the root of the configuration
YAML.  As there is deprecation support to move the old configuration to the new
location, the vSphere provider can be updated.  This commit updates the vSphere
Provider and tests to use the new configuration location under:

:providers:
  :vsphere:
2017-05-17 13:52:28 -07:00
Glenn Sarti
57eba4a8e4 (POOLER-70) Update execute! for VM Provider
This commit modifies execute! to create the VM Providers on VMPooler startup
instead of check_pool creating a provider per pool.  This commit also adds
legacy support for old configuration files:
- Setting the default provider for pools to be vsphere
- Copying VSphere connection settings in the configuration file from the legacy
  location in the root, to under :providers/:vsphere which is new location for
  all provider configuration
2017-05-17 13:52:28 -07:00
Glenn Sarti
1a3ae86943 (POOLER-70) Add config for VM Provider
This commit adds a public function to access the internal variable holding the
VMPooler configuration.  This is required for later commits for the execute!
function testing.
2017-05-17 13:52:28 -07:00
Glenn Sarti
710b3808a5 (POOLER-70) Add create_provider_object for VM Provider
This commit adds a factory style function to create a VM provider object from
a provider name string.  This is used during VMPooler initialization to create
the various VM providers on startup.
2017-05-17 13:52:28 -07:00
Glenn Sarti
2ca1a39e8c (POOLER-70) Update _check_pool for VM Provider
Previously the Pool Manager would use vSphere objects directly.  This commit
- Modifies the pool_manager to use the VM provider methods instead
- Removes the MockFindFolder class as it is no longer required
- Minor update for rubocop violations
2017-05-17 13:52:28 -07:00
Glenn Sarti
7c3ad716af (POOLER-70) Update check_pool for VM Provider
Previously the Pool Manager would use a single VM provider per Pool.  This
commit changes Pool Manager to use a single provider that services multiple
pools.
2017-05-17 13:52:28 -07:00
Glenn Sarti
3f6ead8134 (POOLER-70) Update migrate_vm_and_record_timing for VM Provider
Previously the Pool Manager would use vSphere objects directly.  This commit
- Modifies the migrate_vm_and_record_timing method to use VM and Pool names
  instead of VM and Pool objects.
2017-05-17 13:52:28 -07:00