diff --git a/mistral_extra/resources/openstack/workflows/create_instance.yaml b/mistral_extra/resources/openstack/workflows/create_instance.yaml new file mode 100644 index 0000000..40a2a3c --- /dev/null +++ b/mistral_extra/resources/openstack/workflows/create_instance.yaml @@ -0,0 +1,88 @@ +--- +version: '2.0' + +create_instance: + type: direct + + description: | + Creates VM and waits till VM OS is up and running. + + input: + - name + - image_id + - flavor_id + - ssh_username: null + - ssh_password: null + + # Name of previously created keypair to inject into the instance. + # Either ssh credentials or keypair must be provided. + - key_name: null + + # Security_groups: A list of security group names + - security_groups: null + + # An ordered list of nics to be added to this server, with information about connected networks, fixed IPs, port etc. + # Example: nics: [{"net-id": "27aa8c1c-d6b8-4474-b7f7-6cdcf63ac856"}] + - nics: null + + task-defaults: + on-error: + - delete_vm + + output: + ip: <% $.vm_ip %> + id: <% $.vm_id %> + name: <% $.name %> + status: <% $.status %> + + tasks: + create_vm: + description: Initial request to create a VM. + action: nova.servers_create name=<% $.name %> image=<% $.image_id %> flavor=<% $.flavor_id %> + input: + key_name: <% $.key_name %> + security_groups: <% $.security_groups %> + nics: <% $.nics %> + publish: + vm_id: <% task(create_vm).result.id %> + on-success: + - search_for_ip + + search_for_ip: + description: Gets first free ip from Nova floating IPs. + action: nova.floating_ips_findall instance_id=null + publish: + vm_ip: <% task(search_for_ip).result[0].ip %> + on-success: + - wait_vm_active + + wait_vm_active: + description: Waits till VM is ACTIVE. + action: nova.servers_find id=<% $.vm_id %> status="ACTIVE" + retry: + count: 10 + delay: 10 + publish: + status: <% task(wait_vm_active).result.status %> + on-success: + - associate_ip + + associate_ip: + description: Associate server with one of floating IPs. + action: nova.servers_add_floating_ip server=<% $.vm_id %> address=<% $.vm_ip %> + wait-after: 5 + on-success: + - wait_ssh + + wait_ssh: + description: Wait till operating system on the VM is up (SSH command). + action: std.wait_ssh username=<% $.ssh_username %> password=<% $.ssh_password %> host=<% $.vm_ip %> + retry: + count: 10 + delay: 10 + + delete_vm: + description: Destroy VM. + workflow: delete_instance instance_id=<% $.vm_id %> + on-complete: + - fail diff --git a/mistral_extra/resources/openstack/workflows/delete_instance.yaml b/mistral_extra/resources/openstack/workflows/delete_instance.yaml new file mode 100644 index 0000000..e78e107 --- /dev/null +++ b/mistral_extra/resources/openstack/workflows/delete_instance.yaml @@ -0,0 +1,25 @@ +--- +version: "2.0" + +delete_instance: + type: direct + + input: + - instance_id + + description: Deletes VM. + + tasks: + delete_vm: + description: Destroy VM. + action: nova.servers_delete server=<% $.instance_id %> + wait-after: 10 + on-success: + - find_given_vm + + find_given_vm: + description: Checks that VM is already deleted. + action: nova.servers_find id=<% $.instance_id %> + on-error: + - succeed + diff --git a/mistral_extra/workflows.py b/mistral_extra/workflows.py new file mode 100644 index 0000000..1f8a736 --- /dev/null +++ b/mistral_extra/workflows.py @@ -0,0 +1,21 @@ +# Copyright 2020 - Nokia Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from mistral_lib import utils + +PRE_INSTALLED_WF_PATH = 'resources/openstack/workflows' + + +def get_preinstalled_workflows(): + return utils.get_file_list(PRE_INSTALLED_WF_PATH, package='mistral_extra') diff --git a/setup.cfg b/setup.cfg index e8ec7bd..18719ff 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,6 +26,9 @@ packages = mistral.generators = generators = mistral_extra.actions.generator_factory:all_generators +mistral.preinstalled_workflows = + workflows = mistral_extra.workflows:get_preinstalled_workflows + [build_sphinx] source-dir = doc/source build-dir = doc/build