From f2103f165106c12fd56d8a9b24b751cbf5e02025 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Tue, 12 Jul 2022 02:45:37 -0700 Subject: [PATCH 1/5] Defect 1428582: [Tabcmd WAM] Create site doesn't work Not fully tested but fixed the issue with trying to log in to the non-existent site. output: DEBUG: CreateSiteCommand: 41: Create site ''zzgroup'' on the server... DEBUG: CreateSiteCommand: 45: Unexpected response from the server: {0} DEBUG: CreateSiteCommand: 53: 403000: Forbidden Only system administrators can create sites. (cherry picked from commit f0d74f786061194ba2de8aa2458b5c1bd3298e84) --- src/commands/site/create_site_command.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/commands/site/create_site_command.py b/src/commands/site/create_site_command.py index 1e7489e8..36bd29ad 100644 --- a/src/commands/site/create_site_command.py +++ b/src/commands/site/create_site_command.py @@ -18,7 +18,7 @@ class CreateSiteCommand(Server): @staticmethod def define_args(create_site_parser): - create_site_parser.add_argument("site_name", metavar="site-name", help=_("editsite.options.site-name")) + create_site_parser.add_argument("new_site_name", metavar="site-name", help=_("editsite.options.site-name")) set_common_site_args(create_site_parser) @staticmethod @@ -27,15 +27,18 @@ def run_command(args): logger.debug(_("tabcmd.launching")) session = Session() server = session.create_session(args) + admin_mode = "ContentAndUsers" # default: allow site admins to manage users + if not args.site_admin_user_management: + admin_mode = "ContentOnly" new_site = TSC.SiteItem( - name=args.site_name, - content_url=args.url, - admin_mode=args.admin_mode, + name=args.new_site_name, + content_url=args.url or args.new_site_name, + admin_mode=admin_mode, user_quota=args.user_quota, storage_quota=args.storage_quota, ) try: - logger.info(_("createsite.status").format(args.site_name)) + logger.info(_("createsite.status").format(args.new_site_name)) server.sites.create(new_site) logger.info(_("common.output.succeeded")) except TSC.ServerResponseError as e: From 74e2397213140e7bb75fa6184d9bc90451f8ac41 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Tue, 12 Jul 2022 17:41:07 -0700 Subject: [PATCH 2/5] refactor the get_site method --- .../extracts/decrypt_extracts_command.py | 2 +- .../extracts/encrypt_extracts_command.py | 2 +- .../extracts/reencrypt_extracts_command.py | 2 +- src/commands/server.py | 17 +++++++++++------ src/commands/site/create_site_command.py | 2 +- src/commands/site/delete_site_command.py | 6 ++---- src/commands/site/edit_site_command.py | 2 +- 7 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/commands/extracts/decrypt_extracts_command.py b/src/commands/extracts/decrypt_extracts_command.py index 61605bc5..2f02ec7a 100644 --- a/src/commands/extracts/decrypt_extracts_command.py +++ b/src/commands/extracts/decrypt_extracts_command.py @@ -24,7 +24,7 @@ def run_command(args): logger.debug(_("tabcmd.launching")) session = Session() server = session.create_session(args) - site_item = Server.get_site_for_command_or_throw(logger, server, args) + site_item = Server.get_site_for_command_or_throw(logger, server, args.site_name) try: logger.info(_("decryptextracts.status").format(args.site_name)) job = server.sites.decrypt_extracts(site_item.id) diff --git a/src/commands/extracts/encrypt_extracts_command.py b/src/commands/extracts/encrypt_extracts_command.py index 8cf32057..96d18422 100644 --- a/src/commands/extracts/encrypt_extracts_command.py +++ b/src/commands/extracts/encrypt_extracts_command.py @@ -26,7 +26,7 @@ def run_command(args): logger.debug(_("tabcmd.launching")) session = Session() server = session.create_session(args) - site_item = Server.get_site_for_command_or_throw(logger, server, args) + site_item = Server.get_site_for_command_or_throw(logger, server, args.site_name) try: logger.info(_("encryptextracts.status").format(site_item.name)) job = server.sites.encrypt_extracts(site_item.id) diff --git a/src/commands/extracts/reencrypt_extracts_command.py b/src/commands/extracts/reencrypt_extracts_command.py index 3071757b..42021a10 100644 --- a/src/commands/extracts/reencrypt_extracts_command.py +++ b/src/commands/extracts/reencrypt_extracts_command.py @@ -26,7 +26,7 @@ def run_command(args): logger.debug(_("tabcmd.launching")) session = Session() server = session.create_session(args) - site_item = Server.get_site_for_command_or_throw(logger, server, args) + site_item = Server.get_site_for_command_or_throw(logger, server, args.site_name) try: logger.info(_("reencryptextracts.status").format(site_item.name)) job = server.sites.encrypt_extracts(site_item.id) diff --git a/src/commands/server.py b/src/commands/server.py index dee5dd0b..3bec44ec 100644 --- a/src/commands/server.py +++ b/src/commands/server.py @@ -73,12 +73,9 @@ def get_items_by_name(logger, item_endpoint, item_name, container=None): # Get site by name or get currently logged in site @staticmethod - def get_site_for_command_or_throw(logger, server, args): - if args.site_name: - try: - site_item = Server.get_items_by_name(logger, server.sites, args.site_name)[0] - except Exception as e: - Errors.exit_with_error(logger, exception=e) + def get_site_for_command_or_throw(logger, server, site_name): + if site_name: + site_item = Server.get_site_by_name(logger, server, site_name) else: logger.debug("Use logged in site") site_item = server.sites.get_by_id(server.site_id) @@ -86,6 +83,14 @@ def get_site_for_command_or_throw(logger, server, args): raise ResourceWarning("Could not get site from server") return site_item + @staticmethod + def get_site_by_name(logger, server, site_name): + try: + site_item = Server.get_items_by_name(logger, server.sites, site_name)[0] + except Exception as e: + Errors.exit_with_error(logger, exception=e) + return site_item + @staticmethod def get_filename_extension_if_tableau_type(logger, filename): logger.debug("Filename given: {}".format(filename)) diff --git a/src/commands/site/create_site_command.py b/src/commands/site/create_site_command.py index 36bd29ad..ef44b56d 100644 --- a/src/commands/site/create_site_command.py +++ b/src/commands/site/create_site_command.py @@ -44,7 +44,7 @@ def run_command(args): except TSC.ServerResponseError as e: if Errors.is_resource_conflict(e): if args.continue_if_exists: - logger.info(_("createsite.errors.site_name_already_exists").format(args.site_name)) + logger.info(_("createsite.errors.site_name_already_exists").format(args.new_site_name)) return else: Errors.exit_with_error( diff --git a/src/commands/site/delete_site_command.py b/src/commands/site/delete_site_command.py index 1e6622c0..df2be143 100644 --- a/src/commands/site/delete_site_command.py +++ b/src/commands/site/delete_site_command.py @@ -17,7 +17,7 @@ class DeleteSiteCommand(Server): @staticmethod def define_args(delete_site_parser): - delete_site_parser.add_argument("site_name", help="name of site to delete") + delete_site_parser.add_argument("site_name_to_delete", metavar="site-name", help="name of site to delete") @staticmethod def run_command(args): @@ -25,9 +25,7 @@ def run_command(args): logger.debug(_("tabcmd.launching")) session = Session() server = session.create_session(args) - site_id = server.sites.get_by_name(args.site_name) - if site_id == session.site_id: - Errors.exit_with_error(logger, "Cannot delete the site you are logged in to") + site_id = Server.get_site_by_name(logger, server, args.site_name_to_delete) try: server.sites.delete(site_id) logger.info("Successfully deleted the site") diff --git a/src/commands/site/edit_site_command.py b/src/commands/site/edit_site_command.py index d384f34d..a055a45f 100644 --- a/src/commands/site/edit_site_command.py +++ b/src/commands/site/edit_site_command.py @@ -34,7 +34,7 @@ def run_command(args): session = Session() server = session.create_session(args) - site_item = Server.get_site_for_command_or_throw(logger, server, args) + site_item = Server.get_site_for_command_or_throw(logger, server, args.site_name) if args.url: site_item.content_url = args.url if args.user_quota: From d6e97fa09baa15a4230aede1f0eca2352b146c01 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Tue, 12 Jul 2022 22:38:35 -0700 Subject: [PATCH 3/5] delete site by content_url, not id --- src/commands/site/delete_site_command.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands/site/delete_site_command.py b/src/commands/site/delete_site_command.py index df2be143..2f9ea640 100644 --- a/src/commands/site/delete_site_command.py +++ b/src/commands/site/delete_site_command.py @@ -25,9 +25,9 @@ def run_command(args): logger.debug(_("tabcmd.launching")) session = Session() server = session.create_session(args) - site_id = Server.get_site_by_name(logger, server, args.site_name_to_delete) + site_url = Server.get_site_by_name(logger, server, args.site_name_to_delete).content_url try: - server.sites.delete(site_id) + server.sites.delete(site_url) logger.info("Successfully deleted the site") except TSC.ServerResponseError as e: Errors.exit_with_error(logger, "Error deleting site", e) From bbe35260ad27edfa08906f92845b39de779ab6d5 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Tue, 12 Jul 2022 22:40:40 -0700 Subject: [PATCH 4/5] move success message out of catch handler --- src/commands/auth/session.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/auth/session.py b/src/commands/auth/session.py index 3deecb49..aaef41b6 100644 --- a/src/commands/auth/session.py +++ b/src/commands/auth/session.py @@ -190,10 +190,10 @@ def _sign_in(self, tableau_auth): self.auth_token = self.tableau_server._auth_token if not self.username: self.username = self.tableau_server.users.get_by_id(self.user_id).name - self.logger.debug("Signed into {0}{1} as {2}".format(self.server_url, self.site_name, self.username)) self.logger.info(_("common.output.succeeded")) except TSC.ServerResponseError as e: Errors.exit_with_error(self.logger, _("publish.errors.unexpected_server_response"), e) + self.logger.debug("Signed into {0}{1} as {2}".format(self.server_url, self.site_name, self.username)) return self.tableau_server From d3a83b360df7d46356b3bee1e37d4444be5502d3 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Wed, 13 Jul 2022 13:04:56 -0700 Subject: [PATCH 5/5] update tests with renamed parameters --- tests/commands/test_run_commands.py | 10 +++++----- tests/parsers/test_parser_create_site.py | 4 ++-- tests/parsers/test_parser_delete_site.py | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/commands/test_run_commands.py b/tests/commands/test_run_commands.py index 7ffd9e2c..f654598b 100644 --- a/tests/commands/test_run_commands.py +++ b/tests/commands/test_run_commands.py @@ -224,9 +224,9 @@ def test_create_project_already_exists(self, mock_session, mock_server): def test_create_site_already_exists(self, mock_session, mock_server): RunCommandsTest._set_up_session(mock_session, mock_server) mock_args.continue_if_exists = True - mock_args.site_name = "duplicate" + mock_args.new_site_name = "duplicate" mock_args.url = "dplct" - mock_args.admin_mode = None + mock_args.site_admin_user_management = None mock_args.user_quota = None mock_args.storage_quota = None mock_server.sites.create.return_value = TSC.ServerResponseError(409, "already exists", "detail") @@ -278,9 +278,9 @@ def test_publish_samples(self, mock_session, mock_server): # site def test_create_site(self, mock_session, mock_server): RunCommandsTest._set_up_session(mock_session, mock_server) - mock_args.site_name = "site-name" + mock_args.new_site_name = "site-name" mock_args.url = "site-content-url" - mock_args.admin_mode = None + mock_args.site_admin_user_management = None mock_args.user_quota = (None,) mock_args.storage_quota = None create_site_command.CreateSiteCommand.run_command(mock_args) @@ -289,7 +289,7 @@ def test_create_site(self, mock_session, mock_server): def test_delete_site(self, mock_session, mock_server): RunCommandsTest._set_up_session(mock_session, mock_server) mock_server.sites = getter - mock_args.site_name = "site-name" + mock_args.site_name_to_delete = "site-name" delete_site_command.DeleteSiteCommand.run_command(mock_args) mock_session.assert_called() diff --git a/tests/parsers/test_parser_create_site.py b/tests/parsers/test_parser_create_site.py index 1cffbb88..68f40b7d 100644 --- a/tests/parsers/test_parser_create_site.py +++ b/tests/parsers/test_parser_create_site.py @@ -14,7 +14,7 @@ def setUpClass(cls): def test_create_site_parser_just_a_name(self): mock_args = [commandname, "site-name"] args = self.parser_under_test.parse_args(mock_args) - assert args.site_name == "site-name", args + assert args.new_site_name == "site-name", args def test_create_site_parser_missing_required_name(self): mock_args = [commandname] @@ -37,6 +37,6 @@ def test_create_site_parser_with_all_args(self): ] # what else? args = self.parser_under_test.parse_args(mock_args) print(args) - assert args.site_name == "site-name", args + assert args.new_site_name == "site-name", args assert args.user_quota == 12, args assert args.storage_quota == 12, args diff --git a/tests/parsers/test_parser_delete_site.py b/tests/parsers/test_parser_delete_site.py index 00332236..843e9c82 100644 --- a/tests/parsers/test_parser_delete_site.py +++ b/tests/parsers/test_parser_delete_site.py @@ -14,7 +14,7 @@ def setUpClass(cls): def test_delete_site(self): mock_args = [commandname, "site-name"] args = self.parser_under_test.parse_args(mock_args) - assert args.site_name == "site-name", args + assert args.site_name_to_delete == "site-name", args def test_delete_site_required_name_none(self): mock_args = [commandname]