From ee47e98c5089b4b77dac2e35ca86a8125815cc16 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Mon, 9 Sep 2019 19:30:31 -0400 Subject: [PATCH] cli: make "detail" actions actually respect Allow: headers --- awxkit/awxkit/cli/client.py | 9 +++++---- awxkit/awxkit/cli/options.py | 13 ++++++++++++- awxkit/test/cli/test_options.py | 6 ++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/awxkit/awxkit/cli/client.py b/awxkit/awxkit/cli/client.py index e1df8709c2..a5bd9e3348 100755 --- a/awxkit/awxkit/cli/client.py +++ b/awxkit/awxkit/cli/client.py @@ -244,10 +244,11 @@ class CLI(object): # parse any action arguments if self.resource != 'settings': for method in ('list', 'modify', 'create'): - parser.build_query_arguments( - method, - 'GET' if method == 'list' else 'POST' - ) + if method in parser.parser.choices: + parser.build_query_arguments( + method, + 'GET' if method == 'list' else 'POST' + ) if from_sphinx: parsed, extra = self.parser.parse_known_args(self.argv) else: diff --git a/awxkit/awxkit/cli/options.py b/awxkit/awxkit/cli/options.py index d30c86e742..16fd014d73 100644 --- a/awxkit/awxkit/cli/options.py +++ b/awxkit/awxkit/cli/options.py @@ -83,6 +83,7 @@ class ResourceOptionsParser(object): self.options = getattr( self.page.options().json, 'actions', {'GET': {}} ) + self.get_allowed_options() if self.resource != 'settings': # /api/v2/settings is a special resource that doesn't have # traditional list/detail endpoints @@ -91,6 +92,11 @@ class ResourceOptionsParser(object): self.handle_custom_actions() + def get_allowed_options(self): + self.allowed_options = self.page.connection.options( + self.page.endpoint + '1' + ).headers['Allow'].split(', ') + def build_list_actions(self): action_map = { 'GET': 'list', @@ -110,7 +116,12 @@ class ResourceOptionsParser(object): add_output_formatting_arguments(parser, {}) def build_detail_actions(self): - for method in ('get', 'modify', 'delete'): + allowed = ['get'] + if 'PUT' in self.allowed_options: + allowed.append('modify') + if 'DELETE' in self.allowed_options: + allowed.append('delete') + for method in allowed: parser = self.parser.add_parser(method, help='') self.parser.choices[method].add_argument( 'id', diff --git a/awxkit/test/cli/test_options.py b/awxkit/test/cli/test_options.py index ce65e94be3..3b10ea677b 100644 --- a/awxkit/test/cli/test_options.py +++ b/awxkit/test/cli/test_options.py @@ -13,6 +13,12 @@ from awxkit.api.pages import Page from awxkit.cli.options import ResourceOptionsParser +class ResourceOptionsParser(ResourceOptionsParser): + + def get_allowed_options(self): + self.allowed_options = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] + + class OptionsPage(Page): def options(self):