Merge pull request #4624 from ryanpetrello/cli-association

cli: implement support for credential and notification association

Reviewed-by: Elijah DeLee <kdelee@redhat.com>
             https://github.com/kdelee
This commit is contained in:
softwarefactory-project-zuul[bot] 2019-09-03 14:53:44 +00:00 committed by GitHub
commit f21c6dc330
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 109 additions and 1 deletions

View File

@ -163,7 +163,9 @@ class CLI(object):
response,
fmt=self.get_config('format'),
filter=self.get_config('filter'),
changed=self.original_action in ('modify', 'create')
changed=self.original_action in (
'modify', 'create', 'associate', 'disassociate'
)
)
if formatted:
print(utils.to_str(formatted), file=self.stdout)

View File

@ -2,6 +2,7 @@ from six import with_metaclass
from .stdout import monitor, monitor_workflow
from .utils import CustomRegistryMeta, color_enabled
from awxkit.exceptions import NoContent
def handle_custom_actions(resource, action, page):
@ -182,6 +183,111 @@ class AdhocCommandStdout(HasStdout, CustomAction):
resource = 'ad_hoc_commands'
class AssociationMixin(object):
action = 'associate'
def add_arguments(self, parser):
parser.choices[self.action].add_argument('id', type=int, help='')
group = parser.choices[self.action].add_mutually_exclusive_group(required=True)
for param, endpoint in self.targets.items():
field, model_name = endpoint
if not model_name:
model_name = param
help_text = 'The ID of the {} to {}'.format(model_name, self.action)
group.add_argument('--{}'.format(param), metavar='', type=int, help=help_text)
def perform(self, **kwargs):
for k, v in kwargs.items():
endpoint, _ = self.targets[k]
try:
self.page.get().related[endpoint].post(
{'id': v, self.action: True}
)
except NoContent:
# we expect to enter this block because these endpoints return
# HTTP 204 on success
pass
return self.page.get().related[endpoint].get()
class NotificationAssociateMixin(AssociationMixin):
targets = {
'start_notification': [
'notification_templates_started',
'notification_template'
],
'success_notification': [
'notification_templates_success',
'notification_template'
],
'failure_notification': [
'notification_templates_error',
'notification_template'
],
}
class JobTemplateNotificationAssociation(NotificationAssociateMixin, CustomAction):
resource = 'job_templates'
action = 'associate'
targets = NotificationAssociateMixin.targets.copy()
class JobTemplateNotificationDisAssociation(NotificationAssociateMixin, CustomAction):
resource = 'job_templates'
action = 'disassociate'
targets = NotificationAssociateMixin.targets.copy()
JobTemplateNotificationAssociation.targets.update({
'credential': ['credentials', None],
})
JobTemplateNotificationDisAssociation.targets.update({
'credential': ['credentials', None],
})
class WorkflowJobTemplateNotificationAssociation(NotificationAssociateMixin, CustomAction):
resource = 'workflow_job_templates'
action = 'associate'
class WorkflowJobTemplateNotificationDisAssociation(NotificationAssociateMixin, CustomAction):
resource = 'workflow_job_templates'
action = 'disassociate'
class ProjectNotificationAssociation(NotificationAssociateMixin, CustomAction):
resource = 'projects'
action = 'associate'
class ProjectNotificationDisAssociation(NotificationAssociateMixin, CustomAction):
resource = 'projects'
action = 'disassociate'
class InventorySourceNotificationAssociation(NotificationAssociateMixin, CustomAction):
resource = 'inventory_sources'
action = 'associate'
class InventorySourceNotificationDisAssociation(NotificationAssociateMixin, CustomAction):
resource = 'inventory_sources'
action = 'disassociate'
class OrganizationNotificationAssociation(NotificationAssociateMixin, CustomAction):
resource = 'organizations'
action = 'associate'
class OrganizationNotificationDisAssociation(NotificationAssociateMixin, CustomAction):
resource = 'organizations'
action = 'disassociate'
class SettingsList(CustomAction):
action = 'list'
resource = 'settings'