Add approval node logic to awxkit

Co-authored-by: <Apurva bakshiapurva93@gmail.com>
This commit is contained in:
Elijah DeLee
2019-08-13 14:24:27 -04:00
committed by Ryan Petrello
parent adf621d2cf
commit bdf4defdbe
4 changed files with 99 additions and 17 deletions

View File

@@ -32,6 +32,7 @@ from .workflow_job_templates import * # NOQA
from .workflow_job_template_nodes import * # NOQA from .workflow_job_template_nodes import * # NOQA
from .workflow_jobs import * # NOQA from .workflow_jobs import * # NOQA
from .workflow_job_nodes import * # NOQA from .workflow_job_nodes import * # NOQA
from .workflow_approvals import * # NOQA
from .settings import * # NOQA from .settings import * # NOQA
from .instances import * # NOQA from .instances import * # NOQA
from .instance_groups import * # NOQA from .instance_groups import * # NOQA

View File

@@ -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)

View File

@@ -3,7 +3,7 @@ import awxkit.exceptions as exc
from awxkit.api.pages import base, WorkflowJobTemplate, UnifiedJobTemplate, JobTemplate from awxkit.api.pages import base, WorkflowJobTemplate, UnifiedJobTemplate, JobTemplate
from awxkit.api.mixins import HasCreate, DSAdapter from awxkit.api.mixins import HasCreate, DSAdapter
from awxkit.api.resources import resources 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 from . import page
@@ -12,11 +12,24 @@ class WorkflowJobTemplateNode(HasCreate, base.Base):
dependencies = [WorkflowJobTemplate, UnifiedJobTemplate] dependencies = [WorkflowJobTemplate, UnifiedJobTemplate]
def payload(self, workflow_job_template, unified_job_template, **kwargs): def payload(self, workflow_job_template, unified_job_template, **kwargs):
payload = PseudoNamespace(workflow_job_template=workflow_job_template.id, if not unified_job_template:
unified_job_template=unified_job_template.id) # 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', optional_fields = (
'extra_data') 'diff_mode',
'extra_data',
'limit',
'job_tags',
'job_type',
'skip_tags',
'verbosity',
'extra_data')
update_payload(payload, optional_fields, kwargs) update_payload(payload, optional_fields, kwargs)
@@ -25,21 +38,45 @@ class WorkflowJobTemplateNode(HasCreate, base.Base):
return payload return payload
def create_payload(self, workflow_job_template=WorkflowJobTemplate, unified_job_template=JobTemplate, **kwargs): def create_payload(
self.create_and_update_dependencies(workflow_job_template, unified_job_template) self,
payload = self.payload(workflow_job_template=self.ds.workflow_job_template, workflow_job_template=WorkflowJobTemplate,
unified_job_template=self.ds.unified_job_template, **kwargs) 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) payload.ds = DSAdapter(self.__class__.__name__, self._dependency_store)
return payload return payload
def create(self, workflow_job_template=WorkflowJobTemplate, unified_job_template=JobTemplate, **kwargs): def create(
payload = self.create_payload(workflow_job_template=workflow_job_template, self,
unified_job_template=unified_job_template, **kwargs) workflow_job_template=WorkflowJobTemplate,
return self.update_identity(WorkflowJobTemplateNodes(self.connection).post(payload)) 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): def _add_node(self, endpoint, unified_job_template):
node = endpoint.post(dict(unified_job_template=unified_job_template.id)) node = endpoint.post(
node.create_and_update_dependencies(self.ds.workflow_job_template, unified_job_template) dict(unified_job_template=unified_job_template.id))
node.create_and_update_dependencies(
self.ds.workflow_job_template, unified_job_template)
return node return node
def add_always_node(self, unified_job_template): def add_always_node(self, unified_job_template):
@@ -67,9 +104,20 @@ class WorkflowJobTemplateNode(HasCreate, base.Base):
self.related.credentials.post( self.related.credentials.post(
dict(id=cred.id, disassociate=True)) 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, 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): 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_workflow_nodes,
resources.workflow_job_template_node_always_nodes, resources.workflow_job_template_node_always_nodes,
resources.workflow_job_template_node_failure_nodes, resources.workflow_job_template_node_failure_nodes,
resources.workflow_job_template_node_success_nodes], WorkflowJobTemplateNodes) resources.workflow_job_template_node_success_nodes],
WorkflowJobTemplateNodes)

View File

@@ -81,6 +81,8 @@ class Resources(object):
_inventory_update_events = r'inventory_updates/\d+/events/' _inventory_update_events = r'inventory_updates/\d+/events/'
_inventory_updates = 'inventory_updates/' _inventory_updates = 'inventory_updates/'
_inventory_variable_data = r'inventories/\d+/variable_data/' _inventory_variable_data = r'inventories/\d+/variable_data/'
_workflow_approval = r'workflow_approvals/\d+/'
_workflow_approvals = 'workflow_approvals/'
_job = r'jobs/\d+/' _job = r'jobs/\d+/'
_job_cancel = r'jobs/\d+/cancel/' _job_cancel = r'jobs/\d+/cancel/'
_job_create_schedule = r'jobs/\d+/create_schedule/' _job_create_schedule = r'jobs/\d+/create_schedule/'