From bdf4defdbe95eecdd0e6880b6e83ab78607a6d55 Mon Sep 17 00:00:00 2001 From: Elijah DeLee Date: Tue, 13 Aug 2019 14:24:27 -0400 Subject: [PATCH] Add approval node logic to awxkit Co-authored-by: --- awxkit/awxkit/api/pages/__init__.py | 1 + awxkit/awxkit/api/pages/workflow_approvals.py | 30 +++++++ .../api/pages/workflow_job_template_nodes.py | 83 +++++++++++++++---- awxkit/awxkit/api/resources.py | 2 + 4 files changed, 99 insertions(+), 17 deletions(-) create mode 100644 awxkit/awxkit/api/pages/workflow_approvals.py diff --git a/awxkit/awxkit/api/pages/__init__.py b/awxkit/awxkit/api/pages/__init__.py index 98dabd8681..19cf7323ca 100644 --- a/awxkit/awxkit/api/pages/__init__.py +++ b/awxkit/awxkit/api/pages/__init__.py @@ -32,6 +32,7 @@ from .workflow_job_templates import * # NOQA from .workflow_job_template_nodes import * # NOQA from .workflow_jobs import * # NOQA from .workflow_job_nodes import * # NOQA +from .workflow_approvals import * # NOQA from .settings import * # NOQA from .instances import * # NOQA from .instance_groups import * # NOQA diff --git a/awxkit/awxkit/api/pages/workflow_approvals.py b/awxkit/awxkit/api/pages/workflow_approvals.py new file mode 100644 index 0000000000..d4ededcdec --- /dev/null +++ b/awxkit/awxkit/api/pages/workflow_approvals.py @@ -0,0 +1,30 @@ +from awxkit.api.pages import UnifiedJob +from awxkit.api.resources import resources +from . import page +from awxkit import exceptions + + +class WorkflowApproval(UnifiedJob): + + def approve(self): + try: + self.related.approve.post() + except exceptions.NoContent: + pass + + def deny(self): + try: + self.related.deny.post() + except exceptions.NoContent: + pass + + +page.register_page(resources.workflow_approval, WorkflowApproval) + + +class WorkflowApprovals(page.PageList, WorkflowApproval): + + pass + + +page.register_page(resources.workflow_approvals, WorkflowApprovals) diff --git a/awxkit/awxkit/api/pages/workflow_job_template_nodes.py b/awxkit/awxkit/api/pages/workflow_job_template_nodes.py index 9c8f673ab7..94928abe16 100644 --- a/awxkit/awxkit/api/pages/workflow_job_template_nodes.py +++ b/awxkit/awxkit/api/pages/workflow_job_template_nodes.py @@ -3,7 +3,7 @@ import awxkit.exceptions as exc from awxkit.api.pages import base, WorkflowJobTemplate, UnifiedJobTemplate, JobTemplate from awxkit.api.mixins import HasCreate, DSAdapter from awxkit.api.resources import resources -from awxkit.utils import update_payload, PseudoNamespace, suppress +from awxkit.utils import update_payload, PseudoNamespace, suppress, random_title from . import page @@ -12,11 +12,24 @@ class WorkflowJobTemplateNode(HasCreate, base.Base): dependencies = [WorkflowJobTemplate, UnifiedJobTemplate] def payload(self, workflow_job_template, unified_job_template, **kwargs): - payload = PseudoNamespace(workflow_job_template=workflow_job_template.id, - unified_job_template=unified_job_template.id) + if not unified_job_template: + # May pass "None" to explicitly create an approval node + payload = PseudoNamespace( + workflow_job_template=workflow_job_template.id) + else: + payload = PseudoNamespace( + workflow_job_template=workflow_job_template.id, + unified_job_template=unified_job_template.id) - optional_fields = ('diff_mode', 'extra_data', 'limit', 'job_tags', 'job_type', 'skip_tags', 'verbosity', - 'extra_data') + optional_fields = ( + 'diff_mode', + 'extra_data', + 'limit', + 'job_tags', + 'job_type', + 'skip_tags', + 'verbosity', + 'extra_data') update_payload(payload, optional_fields, kwargs) @@ -25,21 +38,45 @@ class WorkflowJobTemplateNode(HasCreate, base.Base): return payload - def create_payload(self, workflow_job_template=WorkflowJobTemplate, unified_job_template=JobTemplate, **kwargs): - self.create_and_update_dependencies(workflow_job_template, unified_job_template) - payload = self.payload(workflow_job_template=self.ds.workflow_job_template, - unified_job_template=self.ds.unified_job_template, **kwargs) + def create_payload( + self, + workflow_job_template=WorkflowJobTemplate, + unified_job_template=JobTemplate, + **kwargs): + if not unified_job_template: + self.create_and_update_dependencies(workflow_job_template) + payload = self.payload( + workflow_job_template=self.ds.workflow_job_template, + unified_job_template=None, + **kwargs) + else: + self.create_and_update_dependencies( + workflow_job_template, unified_job_template) + payload = self.payload( + workflow_job_template=self.ds.workflow_job_template, + unified_job_template=self.ds.unified_job_template, + **kwargs) payload.ds = DSAdapter(self.__class__.__name__, self._dependency_store) return payload - def create(self, workflow_job_template=WorkflowJobTemplate, unified_job_template=JobTemplate, **kwargs): - payload = self.create_payload(workflow_job_template=workflow_job_template, - unified_job_template=unified_job_template, **kwargs) - return self.update_identity(WorkflowJobTemplateNodes(self.connection).post(payload)) + def create( + self, + workflow_job_template=WorkflowJobTemplate, + unified_job_template=JobTemplate, + **kwargs): + payload = self.create_payload( + workflow_job_template=workflow_job_template, + unified_job_template=unified_job_template, + **kwargs) + return self.update_identity( + WorkflowJobTemplateNodes( + self.connection).post(payload)) def _add_node(self, endpoint, unified_job_template): - node = endpoint.post(dict(unified_job_template=unified_job_template.id)) - node.create_and_update_dependencies(self.ds.workflow_job_template, unified_job_template) + node = endpoint.post( + dict(unified_job_template=unified_job_template.id)) + node.create_and_update_dependencies( + self.ds.workflow_job_template, unified_job_template) return node def add_always_node(self, unified_job_template): @@ -67,9 +104,20 @@ class WorkflowJobTemplateNode(HasCreate, base.Base): self.related.credentials.post( dict(id=cred.id, disassociate=True)) + def make_approval_node( + self, + **kwargs + ): + if 'name' not in kwargs: + kwargs['name'] = 'approval node {}'.format(random_title()) + self.related.create_approval_template.post(kwargs) + return self.get() + page.register_page([resources.workflow_job_template_node, - (resources.workflow_job_template_nodes, 'post')], WorkflowJobTemplateNode) + (resources.workflow_job_template_nodes, + 'post')], + WorkflowJobTemplateNode) class WorkflowJobTemplateNodes(page.PageList, WorkflowJobTemplateNode): @@ -81,4 +129,5 @@ page.register_page([resources.workflow_job_template_nodes, resources.workflow_job_template_workflow_nodes, resources.workflow_job_template_node_always_nodes, resources.workflow_job_template_node_failure_nodes, - resources.workflow_job_template_node_success_nodes], WorkflowJobTemplateNodes) + resources.workflow_job_template_node_success_nodes], + WorkflowJobTemplateNodes) diff --git a/awxkit/awxkit/api/resources.py b/awxkit/awxkit/api/resources.py index d07ce5d6a8..657a41b7f3 100644 --- a/awxkit/awxkit/api/resources.py +++ b/awxkit/awxkit/api/resources.py @@ -81,6 +81,8 @@ class Resources(object): _inventory_update_events = r'inventory_updates/\d+/events/' _inventory_updates = 'inventory_updates/' _inventory_variable_data = r'inventories/\d+/variable_data/' + _workflow_approval = r'workflow_approvals/\d+/' + _workflow_approvals = 'workflow_approvals/' _job = r'jobs/\d+/' _job_cancel = r'jobs/\d+/cancel/' _job_create_schedule = r'jobs/\d+/create_schedule/'