Commit graph

141 commits

Author SHA1 Message Date
Samuel Beaulieu
3aac95d5b9 (POOLER-114) Refactor check_pool in pool_manager
This commit refactorss the check_pool method in pool_manager.
Specifically, each commented section describing a stage of check_pool is
broken out into a separate method and check_pool is simplified by
calling these methods. Without this change it is difficult to follow the
intent for or make changes to check_pool.

Additionally, a docker-compose file is added to make it simple to launch
an all-in-one vmpooler instance along with a separate redis server with
docker.
2018-08-23 14:04:52 -07:00
Corey Osman
2daa5244b8 Adds a new mechanism to load providers from any gem or file path. (#263)
* Adds ability to load only providers used in config file
2018-07-24 16:35:18 -07:00
kirby@puppetlabs.com
490e5c1938 (POOLER-128) Remove references to VM mutex when destroying
This commit updates destroy_vm to remove references to its mutex tracking object when destroyed. Without this change a VM that is destroyed will leave its mutex tracking object forever causing the pool manager memory footprint to increase.
2018-07-23 16:53:53 -07:00
Steve Axthelm
c3d90dbfa6 (maint) change domain to example.com
Prior to this commit the docs and examples used 'company.com'
(a real domain). This commit changes those occurrences to
'example.com', which is a IANA-managed reserved domain.
2018-07-19 15:23:30 -07:00
Kevin Imber
099b53f348
Merge pull request #274 from mattkirby/cleanup_unused_folders_and_vms
(POOLER-66) Purge vms and folders no longer configured
2018-07-19 13:19:13 -07:00
kirby@puppetlabs.com
a34c8dd11b (POOLER-66) Purge vms and folders no longer configured
This commit enables optional purging for vms and folders when they are
not configured in the vmpooler provided configuration. Base folders are
determined from folders specified in the pool configuration. Then,
anything not configured in that folder for that provider and is not a
whitelisted folder title will be destroyed. Without this change vmpooler
will leave unconfigured vms and folders behind and any vms will be left
running forever without manual intervention. Additionally, any
associated redis data will never be expired.
2018-07-13 12:09:28 -07:00
mattkirby
070199e877 Eliminate duplicate VM object lookups where possible (#269)
* Minimize duplicate checking of VMs

This commit updates check_pool pending, running and ready methods to greatly reduce instances in which the VM object is retrieved. Without this change get_vm is run for each of these check_pool steps even though the VM is already validated as being in inventory being running the check. This is left for checking running VMs when the VM is no longer ready. Without this change there is an unnecessarily large volume of VM object checks.

* Make hostname mismatch checking optional

This commit makes hostname mismatch checking optional on a pool and global config level. The default behavior of checking this is preserved. When disabled _check_ready_vm will not run get_vm, which allows for ready VMs to be checked without retrieving an object from vsphere and waiting for a free provider connection. Without this change it is not possible to disable VM object retrieval in _check_vm_ready.

* Check if a hostname return is empty string

This commit checks whether a hostname returned is an empty string.
Without this change a VM that returns a hostname with a empty string
will report as having a hostname mismatch, which may happen before all
VM data is updated.

* Only check hostname for mismatch after time since ready has past

Configure hostname checking so it is not checked until a VM has been
ready for greater than one minute. Without this change hostname checking
will often fail because the configured value has not propogated to the
VM on some platforms before this check is run.
2018-07-13 12:06:44 -05:00
Spencer McElmurry
a865e6bd2f (POOLER-34) Ship clone request to ready time to metrics (#277)
* (POOLER-34) Ship clone request to ready time to metrics

Before, we were already capturing this metric but we failed to ship
it anywhere. This ships the appropriate metric as `time_to_ready_state`
Dashboards can be found in grafana.

* Add spec test to ensure metric is being shipped properly on
move_pending_vm_to_ready call.
2018-07-09 16:22:49 -07:00
mchllweeks
2f98b1bd7a
Merge pull request #271 from mattkirby/less_delta_disks
Ensure template deltas are created once
2018-07-09 12:49:08 -07:00
mchllweeks
69f8b21ca8
Merge pull request #270 from mattkirby/no_duplicate_vms_in_pool
Do not run duplicate instances of inventory check for a pool
2018-07-09 12:48:41 -07:00
kirby@puppetlabs.com
70156ba7f7 Do not prepare template when config_template is set 2018-07-02 14:12:17 -07:00
kirby@puppetlabs.com
1b17cceb01 Ensure template deltas are created once
This commit updates how template delta disk creation is evaluated. Without this change template deltas are created for every template on each applicatoin startup. This change updates this behavior to instead run template delta disk creation only once per template configured for a pool. Without this change it is possible to get a template to a state where the XML depth is too great to be read with default settings and the template requires a new clone to resolve.
2018-07-02 09:53:41 -07:00
kirby@puppetlabs.com
df89617fdc Do not run duplicate instances of inventory check for a pool
This commit updates check_pool inventory check to prevent multiple instances from running at once. Without this change the inventory check may run in multiple threads simultaneously.
2018-06-28 20:32:44 -07:00
kirby@puppetlabs.com
3a6e2a5cac (POOLER-31) Expire redis vm key when clone fails
This commit updates pool_manager to expire a redis VM key when a clone fails. Without this change VMs that fail to clone have their metadata left forever.
2018-06-20 17:27:31 -07:00
kirby@puppetlabs.com
3a0f0880e7 (POOLER-112) Ensure a VM is only destroyed once
This commit implements a vm_mutex hash to allow synchronizing VM operations that should only happen once across threads. Without this change pool_manager will try to evaluate or destroy a VM multiple times, which results in an error being thrown by one of the destroy attempts as only one can succeed and a duplication of resources unnecessarily when there are no errors.
2018-06-20 13:40:49 -07:00
kirby@puppetlabs.com
9bb4df7d8e (POOLER-107) Add configuration API endpoint
This commit adds a configuration endpoint to the vmpooler API. Pool
size, and pool template, can be adjusted for pools that are configured
at vmpooler application start time. Pool template changes trigger a pool
refresh, and the new template has delta disks created automatically by
vmpooler.

Additionally, the capability to create template delta disks is added to
the vsphere provider, and this is implemented to ensure that templates
have delta disks created at application start time.

The mechanism used to find template VM objects is simplified to make the flow of logic easier to understand. As an additional benefit, performance of this lookup is improved by using FindByInventoryPath.

A table of contents is added to API.md to ease navigation. Without this change API.md has no table of contents and is difficult to navigate.

Add mutex object for managing pool configuration updates

This commit adds a mutex object for ensuring that pool configuration changes are synchronized across multiple running threads, removing the possibility of two threads attempting to update something at once, without relying on redis data. Without this change this is managed crudely by specifying in redis that a configuration update is taking place. This redis data is left so the REPOPULATE section of _check_pool can still identify when a configuration change is in progress, and prevent a pool from repopulating at that time.

Add wake up event for pool template changes

This commit adds a wake up event to detect pool template changes.
Additionally, GET /config has a template_ready section added to the
output for each pool, which makes clear when a pool is ready to populate
itself.
2018-06-15 10:15:47 -07:00
Samuel Beaulieu
10245321bf (maint) Add the last boot time for each pool
This commit add a redis hash where there is one key per pool, and the
stored value is the last time a VM was booted e.g. the last time
a VM went from 'pending' to 'ready'. This is also displayed in the
API as lastBoot:'2018-03-23 17:43:39 +0000'. The data can then be
used by any external system, in this case our alarming system.
2018-03-28 11:11:49 -07:00
kirby@puppetlabs.com
021633cd49 Ensure vm is removed from migrations 2018-01-10 12:02:58 -08:00
kirby@puppetlabs.com
e92ae559f5 Remove references to redis in migrate_vm 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
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
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
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
b500814c69 (maint) Update flaky test
Sometimes this test would fail if the computer running the tests was under a
bit of load.  This commit changes the expected output to be up to 1.99 seconds
instead of the previous 0.99 seconds.
2017-07-18 15:28:39 -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
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 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
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
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
Glenn Sarti
cf15829f05 (POOLER-70) Remove get_vm_host_info from pool_manager
Previously the Pool Manager would use vSphere objects directly.  This commit
removes get_vm_host_info as this functionality is now in the vSphere VM
Provider.
2017-05-17 13:52:28 -07:00
Glenn Sarti
2974eac371 (POOLER-70) Update migrate_vm 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
2017-05-17 13:52:28 -07:00
Glenn Sarti
acf32a3f7b (POOLER-70) Update check_snapshot_queue 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
2017-05-17 13:52:28 -07:00
Glenn Sarti
41f9d7b3c4 (POOLER-70) Update check_disk_queue 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
2017-05-17 13:52:28 -07:00
Glenn Sarti
e01b96c6d0 (POOLER-70) Add get_provider_for_pool for VM Provider
This commit adds a helper method which retrieves the associated Provider object
for a pool by name
2017-05-17 13:52:28 -07:00
Glenn Sarti
c09035cfcb (POOLER-70) Add get_pool_name_for_vm for VM Provider
Previously there was no simple way to calculate which pool a VM was a member of.
This commit adds a helper method which queries redis for the pool name for a
given VM.
2017-05-17 13:52:27 -07:00
Glenn Sarti
c7b37dec75 (POOLER-70) Update revert_vm_snapshot 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
2017-05-17 13:52:27 -07:00
Glenn Sarti
a56d61c8bf (POOLER-70) Update create_vm_snapshot 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
2017-05-17 13:52:27 -07:00
Glenn Sarti
fd54c4ca18 (POOLER-70) Update create_vm_disk 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
2017-05-17 13:52:27 -07:00
Glenn Sarti
64bca33d45 (POOLER-70) Update destroy_vm 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
- Splits the destroy_vm function into two.  One function spawns the thread
  while the other actually does the work.  This makes testing much easier.
2017-05-17 13:52:27 -07:00
Glenn Sarti
b21d78fa49 (POOLER-70) Update _clone_vm 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
2017-05-17 13:52:27 -07:00
Glenn Sarti
cc1910fd76 (POOLER-70) Update check_running_vm 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
2017-05-17 13:52:27 -07:00
Glenn Sarti
8c421aa3bd (POOLER-70) Update check_ready_vm 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
- Splits the check_ready_vm function into two.  One function spawns the thread
  while the other actually does the work.  This makes testing much easier.
2017-05-17 13:52:27 -07:00
Glenn Sarti
760dc1c67e (POOLER-70) Update move_pending_vm_to_ready 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
2017-05-17 13:52:27 -07:00
Glenn Sarti
9f4fc903b9 (POOLER-70) Update fail_pending_vm 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
- Modified to return true or false to indicate that the VM was failed
2017-05-17 13:52:27 -07:00