From 503c35c43561bbce3b35e43a33886572156e49f0 Mon Sep 17 00:00:00 2001 From: Dawid Deja Date: Tue, 2 Feb 2016 15:13:46 +0100 Subject: [PATCH] Add new action so it can use filtered data 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 --- .gitignore | 1 + evacuate_vm_action.py | 17 +++++++++++++++++ filter_vm_action.py | 19 +++++++++++++------ host-evacuate.yaml | 11 ++++------- 4 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 .gitignore create mode 100644 evacuate_vm_action.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f11b75 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ diff --git a/evacuate_vm_action.py b/evacuate_vm_action.py new file mode 100644 index 0000000..55bd1d4 --- /dev/null +++ b/evacuate_vm_action.py @@ -0,0 +1,17 @@ +from mistral.actions.openstack.actions import NovaAction +from mistral.workflow.utils import Result + + +class EvacuateVmAction(NovaAction): + + def __init__(self, uuid, on_shared_storage, evacuate): + self._uuid = uuid + self._on_shared_storage = on_shared_storage + self._evacuate = evacuate + + def run(self): + client = self._get_client() + + if self._evacuate: + client.servers.evacuate(self._uuid, + on_shared_storage=self._on_shared_storage) diff --git a/filter_vm_action.py b/filter_vm_action.py index 6a8d778..e7a7510 100644 --- a/filter_vm_action.py +++ b/filter_vm_action.py @@ -30,19 +30,26 @@ class FilterVmAction(NovaAction): metadata = self._metadata if str(metadata.get('evacuate')).upper() == 'TRUE': - return Result(data={'status': 0, 'uuid': self._uuid}) + return Result(data={'evacuate': True, 'uuid': self._uuid}) elif str(metadata.get('evacuate')).upper() == 'FALSE': - return Result(error='evacuate for vm %s is disabled' % self._uuid) + return Result(data={'evacuate': False, 'uuid': self._uuid}) - # ether is no metadata for vm - check flavor + # Ether is no metadata for vm - check flavor. try: - flavor = [x for x in client.flavors.list() if x.id == '1'][0] + # 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={'status': 0, 'uuid': self._uuid}) + return Result(data={'evacuate': True, 'uuid': self._uuid}) - return Result(error='evacuate for vm %s is disabled' % self._uuid) + return Result(data={'evacuate': False, 'uuid': self._uuid}) diff --git a/host-evacuate.yaml b/host-evacuate.yaml index 8ecdba9..500b0e6 100644 --- a/host-evacuate.yaml +++ b/host-evacuate.yaml @@ -8,9 +8,6 @@ host-evacuate: input: - search_opts - output: - vm_list: <% $.list_vms %> - tasks: list_vms: action: nova.servers_list search_opts=<% $.search_opts %> @@ -20,11 +17,11 @@ host-evacuate: filter_vms: with-items: vm in <% $.vms %> - action: custom.filter_vm flavor=<% $.vm.flavor.id %> metadata=<% $.vm.metadata %> uuid=<% $.vm.id %> + action: custom.filter flavor=<% $.vm.flavor.id %> metadata=<% $.vm.metadata %> uuid=<% $.vm.id %> publish: - filtered_vms: <% $.filter_vms.uuid %> + filtered_vms: <% $.filter_vms %> on-success: evacuate_vms evacuate_vms: - with-items: vm_uuid in <% $.filtered_vms %> - action: nova.servers_evacuate server=<% $.vm_uuid %> on_shared_storage=false + with-items: vm in <% $.filtered_vms %> + action: custom.evacuate uuid=<% $.vm.uuid %> evacuate=<% $.vm.evacuate %> on_shared_storage=false