mirror of
https://github.com/gryf/mistral-evacuate.git
synced 2026-02-07 08:45:48 +01:00
This commit adds evacuate_vm_action which is a wrapper for nova.evacuate API call, but it checks the result of filtering from previous step, before executing evacuation. Also change a little bit workflow and filter action, so they suit new approach Signed-off-by: Dawid Deja <dawid.deja@intel.com>
56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
"""
|
|
FilterVmAction - custom action.
|
|
|
|
Simple action for filtering VM on the presence of metadata/extra spec
|
|
"evacuate" flag
|
|
"""
|
|
from mistral.actions.openstack.actions import NovaAction
|
|
from mistral.workflow.utils import Result
|
|
|
|
|
|
class FilterVmException(Exception):
|
|
pass
|
|
|
|
|
|
class FilterVmAction(NovaAction):
|
|
"""
|
|
Filter and return VMs whith the flag 'evacuate' either on vm metadtata
|
|
or flavor extra spec.
|
|
"""
|
|
|
|
def __init__(self, metadata, flavor, uuid):
|
|
"""init."""
|
|
self._metadata = metadata
|
|
self._flavor = flavor
|
|
self._uuid = uuid
|
|
|
|
def run(self):
|
|
"""Entry point for the action execution."""
|
|
client = self._get_client()
|
|
metadata = self._metadata
|
|
|
|
if str(metadata.get('evacuate')).upper() == 'TRUE':
|
|
return Result(data={'evacuate': True, 'uuid': self._uuid})
|
|
elif str(metadata.get('evacuate')).upper() == 'FALSE':
|
|
return Result(data={'evacuate': False, 'uuid': self._uuid})
|
|
|
|
# Ether is no metadata for vm - check flavor.
|
|
try:
|
|
# Maybe this should be done in different action
|
|
# only once per whole workflow.
|
|
# In case there is ~100 VMs to evacuate, there will be
|
|
# the same amount of calls to nova API.
|
|
flavor = filter(
|
|
lambda f: f.id == self._flavor,
|
|
client.flavors.list()
|
|
)[0]
|
|
except IndexError:
|
|
raise FilterVmException('Flavor not found')
|
|
|
|
evacuate = flavor.get_keys().get('evacuation:evacuate')
|
|
|
|
if str(evacuate).upper() == 'TRUE':
|
|
return Result(data={'evacuate': True, 'uuid': self._uuid})
|
|
|
|
return Result(data={'evacuate': False, 'uuid': self._uuid})
|