diff --git a/doc/source/api/autoindex.rst b/doc/source/api/autoindex.rst new file mode 100644 index 0000000..ecc5e8d --- /dev/null +++ b/doc/source/api/autoindex.rst @@ -0,0 +1,48 @@ +.. toctree:: + :maxdepth: 1 + + watcherclient.client.rst + watcherclient.common.apiclient.base.rst + watcherclient.common.apiclient.exceptions.rst + watcherclient.common.base.rst + watcherclient.common.cliutils.rst + watcherclient.common.http.rst + watcherclient.common.i18n.rst + watcherclient.common.utils.rst + watcherclient.exceptions.rst + watcherclient.shell.rst + watcherclient.tests.keystone_client_fixtures.rst + watcherclient.tests.test_client.rst + watcherclient.tests.test_http.rst + watcherclient.tests.test_import.rst + watcherclient.tests.test_shell.rst + watcherclient.tests.test_utils.rst + watcherclient.tests.utils.rst + watcherclient.tests.v1.test_action.rst + watcherclient.tests.v1.test_action_plan.rst + watcherclient.tests.v1.test_action_plan_shell.rst + watcherclient.tests.v1.test_action_shell.rst + watcherclient.tests.v1.test_audit.rst + watcherclient.tests.v1.test_audit_shell.rst + watcherclient.tests.v1.test_audit_template.rst + watcherclient.tests.v1.test_audit_template_shell.rst + watcherclient.tests.v1.test_goal.rst + watcherclient.tests.v1.test_goal_shell.rst + watcherclient.tests.v1.test_metric_collector.rst + watcherclient.tests.v1.test_metric_collector_shell.rst + watcherclient.v1.action.rst + watcherclient.v1.action_plan.rst + watcherclient.v1.action_plan_shell.rst + watcherclient.v1.action_shell.rst + watcherclient.v1.audit.rst + watcherclient.v1.audit_shell.rst + watcherclient.v1.audit_template.rst + watcherclient.v1.audit_template_shell.rst + watcherclient.v1.client.rst + watcherclient.v1.goal.rst + watcherclient.v1.goal_shell.rst + watcherclient.v1.metric_collector.rst + watcherclient.v1.metric_collector_shell.rst + watcherclient.v1.resource_fields.rst + watcherclient.v1.shell.rst + watcherclient.version.rst diff --git a/doc/source/api/watcherclient.client.rst b/doc/source/api/watcherclient.client.rst new file mode 100644 index 0000000..9e2dfca --- /dev/null +++ b/doc/source/api/watcherclient.client.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.client` Module +====================================== + +.. automodule:: watcherclient.client + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.common.apiclient.auth.rst b/doc/source/api/watcherclient.common.apiclient.auth.rst new file mode 100644 index 0000000..b9b5255 --- /dev/null +++ b/doc/source/api/watcherclient.common.apiclient.auth.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.common.apiclient.auth` Module +===================================================== + +.. automodule:: watcherclient.common.apiclient.auth + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.common.apiclient.base.rst b/doc/source/api/watcherclient.common.apiclient.base.rst new file mode 100644 index 0000000..78bd7ef --- /dev/null +++ b/doc/source/api/watcherclient.common.apiclient.base.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.common.apiclient.base` Module +===================================================== + +.. automodule:: watcherclient.common.apiclient.base + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.common.apiclient.client.rst b/doc/source/api/watcherclient.common.apiclient.client.rst new file mode 100644 index 0000000..021e198 --- /dev/null +++ b/doc/source/api/watcherclient.common.apiclient.client.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.common.apiclient.client` Module +======================================================= + +.. automodule:: watcherclient.common.apiclient.client + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.common.apiclient.exceptions.rst b/doc/source/api/watcherclient.common.apiclient.exceptions.rst new file mode 100644 index 0000000..b8118e7 --- /dev/null +++ b/doc/source/api/watcherclient.common.apiclient.exceptions.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.common.apiclient.exceptions` Module +=========================================================== + +.. automodule:: watcherclient.common.apiclient.exceptions + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.common.apiclient.utils.rst b/doc/source/api/watcherclient.common.apiclient.utils.rst new file mode 100644 index 0000000..1c2be79 --- /dev/null +++ b/doc/source/api/watcherclient.common.apiclient.utils.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.common.apiclient.utils` Module +====================================================== + +.. automodule:: watcherclient.common.apiclient.utils + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.common.base.rst b/doc/source/api/watcherclient.common.base.rst new file mode 100644 index 0000000..65b2520 --- /dev/null +++ b/doc/source/api/watcherclient.common.base.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.common.base` Module +=========================================== + +.. automodule:: watcherclient.common.base + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.common.cliutils.rst b/doc/source/api/watcherclient.common.cliutils.rst new file mode 100644 index 0000000..0fc9362 --- /dev/null +++ b/doc/source/api/watcherclient.common.cliutils.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.common.cliutils` Module +=============================================== + +.. automodule:: watcherclient.common.cliutils + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.common.http.rst b/doc/source/api/watcherclient.common.http.rst new file mode 100644 index 0000000..42a010f --- /dev/null +++ b/doc/source/api/watcherclient.common.http.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.common.http` Module +=========================================== + +.. automodule:: watcherclient.common.http + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.common.i18n.rst b/doc/source/api/watcherclient.common.i18n.rst new file mode 100644 index 0000000..2aa1054 --- /dev/null +++ b/doc/source/api/watcherclient.common.i18n.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.common.i18n` Module +=========================================== + +.. automodule:: watcherclient.common.i18n + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.common.utils.rst b/doc/source/api/watcherclient.common.utils.rst new file mode 100644 index 0000000..94550c9 --- /dev/null +++ b/doc/source/api/watcherclient.common.utils.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.common.utils` Module +============================================ + +.. automodule:: watcherclient.common.utils + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.exceptions.rst b/doc/source/api/watcherclient.exceptions.rst new file mode 100644 index 0000000..024f942 --- /dev/null +++ b/doc/source/api/watcherclient.exceptions.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.exceptions` Module +========================================== + +.. automodule:: watcherclient.exceptions + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.shell.rst b/doc/source/api/watcherclient.shell.rst new file mode 100644 index 0000000..ef9d8c6 --- /dev/null +++ b/doc/source/api/watcherclient.shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.shell` Module +===================================== + +.. automodule:: watcherclient.shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.keystone_client_fixtures.rst b/doc/source/api/watcherclient.tests.keystone_client_fixtures.rst new file mode 100644 index 0000000..1462ffd --- /dev/null +++ b/doc/source/api/watcherclient.tests.keystone_client_fixtures.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.keystone_client_fixtures` Module +============================================================== + +.. automodule:: watcherclient.tests.keystone_client_fixtures + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.test_client.rst b/doc/source/api/watcherclient.tests.test_client.rst new file mode 100644 index 0000000..571967b --- /dev/null +++ b/doc/source/api/watcherclient.tests.test_client.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.test_client` Module +================================================= + +.. automodule:: watcherclient.tests.test_client + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.test_http.rst b/doc/source/api/watcherclient.tests.test_http.rst new file mode 100644 index 0000000..1afd0d4 --- /dev/null +++ b/doc/source/api/watcherclient.tests.test_http.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.test_http` Module +=============================================== + +.. automodule:: watcherclient.tests.test_http + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.test_import.rst b/doc/source/api/watcherclient.tests.test_import.rst new file mode 100644 index 0000000..52e901c --- /dev/null +++ b/doc/source/api/watcherclient.tests.test_import.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.test_import` Module +================================================= + +.. automodule:: watcherclient.tests.test_import + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.test_shell.rst b/doc/source/api/watcherclient.tests.test_shell.rst new file mode 100644 index 0000000..fbb5caa --- /dev/null +++ b/doc/source/api/watcherclient.tests.test_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.test_shell` Module +================================================ + +.. automodule:: watcherclient.tests.test_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.test_utils.rst b/doc/source/api/watcherclient.tests.test_utils.rst new file mode 100644 index 0000000..9126aa1 --- /dev/null +++ b/doc/source/api/watcherclient.tests.test_utils.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.test_utils` Module +================================================ + +.. automodule:: watcherclient.tests.test_utils + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.utils.rst b/doc/source/api/watcherclient.tests.utils.rst new file mode 100644 index 0000000..6fcb3d8 --- /dev/null +++ b/doc/source/api/watcherclient.tests.utils.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.utils` Module +=========================================== + +.. automodule:: watcherclient.tests.utils + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_action.rst b/doc/source/api/watcherclient.tests.v1.test_action.rst new file mode 100644 index 0000000..c8a6fca --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_action.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_action` Module +==================================================== + +.. automodule:: watcherclient.tests.v1.test_action + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_action_plan.rst b/doc/source/api/watcherclient.tests.v1.test_action_plan.rst new file mode 100644 index 0000000..530c3ee --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_action_plan.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_action_plan` Module +========================================================= + +.. automodule:: watcherclient.tests.v1.test_action_plan + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_action_plan_shell.rst b/doc/source/api/watcherclient.tests.v1.test_action_plan_shell.rst new file mode 100644 index 0000000..c443c5b --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_action_plan_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_action_plan_shell` Module +=============================================================== + +.. automodule:: watcherclient.tests.v1.test_action_plan_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_action_shell.rst b/doc/source/api/watcherclient.tests.v1.test_action_shell.rst new file mode 100644 index 0000000..b17fa43 --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_action_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_action_shell` Module +========================================================== + +.. automodule:: watcherclient.tests.v1.test_action_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_audit.rst b/doc/source/api/watcherclient.tests.v1.test_audit.rst new file mode 100644 index 0000000..bf95718 --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_audit.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_audit` Module +=================================================== + +.. automodule:: watcherclient.tests.v1.test_audit + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_audit_shell.rst b/doc/source/api/watcherclient.tests.v1.test_audit_shell.rst new file mode 100644 index 0000000..76ec7c1 --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_audit_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_audit_shell` Module +========================================================= + +.. automodule:: watcherclient.tests.v1.test_audit_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_audit_template.rst b/doc/source/api/watcherclient.tests.v1.test_audit_template.rst new file mode 100644 index 0000000..72e4e79 --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_audit_template.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_audit_template` Module +============================================================ + +.. automodule:: watcherclient.tests.v1.test_audit_template + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_audit_template_shell.rst b/doc/source/api/watcherclient.tests.v1.test_audit_template_shell.rst new file mode 100644 index 0000000..b69051a --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_audit_template_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_audit_template_shell` Module +================================================================== + +.. automodule:: watcherclient.tests.v1.test_audit_template_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_goal.rst b/doc/source/api/watcherclient.tests.v1.test_goal.rst new file mode 100644 index 0000000..1cc12d8 --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_goal.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_goal` Module +================================================== + +.. automodule:: watcherclient.tests.v1.test_goal + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_goal_shell.rst b/doc/source/api/watcherclient.tests.v1.test_goal_shell.rst new file mode 100644 index 0000000..8cdc8d8 --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_goal_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_goal_shell` Module +======================================================== + +.. automodule:: watcherclient.tests.v1.test_goal_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_metric_collector.rst b/doc/source/api/watcherclient.tests.v1.test_metric_collector.rst new file mode 100644 index 0000000..01e5ab2 --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_metric_collector.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_metric_collector` Module +============================================================== + +.. automodule:: watcherclient.tests.v1.test_metric_collector + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.tests.v1.test_metric_collector_shell.rst b/doc/source/api/watcherclient.tests.v1.test_metric_collector_shell.rst new file mode 100644 index 0000000..113fa8c --- /dev/null +++ b/doc/source/api/watcherclient.tests.v1.test_metric_collector_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.tests.v1.test_metric_collector_shell` Module +==================================================================== + +.. automodule:: watcherclient.tests.v1.test_metric_collector_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.action.rst b/doc/source/api/watcherclient.v1.action.rst new file mode 100644 index 0000000..fbae324 --- /dev/null +++ b/doc/source/api/watcherclient.v1.action.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.action` Module +========================================= + +.. automodule:: watcherclient.v1.action + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.action_plan.rst b/doc/source/api/watcherclient.v1.action_plan.rst new file mode 100644 index 0000000..928d0e3 --- /dev/null +++ b/doc/source/api/watcherclient.v1.action_plan.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.action_plan` Module +============================================== + +.. automodule:: watcherclient.v1.action_plan + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.action_plan_shell.rst b/doc/source/api/watcherclient.v1.action_plan_shell.rst new file mode 100644 index 0000000..194ca8b --- /dev/null +++ b/doc/source/api/watcherclient.v1.action_plan_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.action_plan_shell` Module +==================================================== + +.. automodule:: watcherclient.v1.action_plan_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.action_shell.rst b/doc/source/api/watcherclient.v1.action_shell.rst new file mode 100644 index 0000000..7d8e005 --- /dev/null +++ b/doc/source/api/watcherclient.v1.action_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.action_shell` Module +=============================================== + +.. automodule:: watcherclient.v1.action_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.audit.rst b/doc/source/api/watcherclient.v1.audit.rst new file mode 100644 index 0000000..8cff998 --- /dev/null +++ b/doc/source/api/watcherclient.v1.audit.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.audit` Module +======================================== + +.. automodule:: watcherclient.v1.audit + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.audit_shell.rst b/doc/source/api/watcherclient.v1.audit_shell.rst new file mode 100644 index 0000000..a2e6bf0 --- /dev/null +++ b/doc/source/api/watcherclient.v1.audit_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.audit_shell` Module +============================================== + +.. automodule:: watcherclient.v1.audit_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.audit_template.rst b/doc/source/api/watcherclient.v1.audit_template.rst new file mode 100644 index 0000000..5069267 --- /dev/null +++ b/doc/source/api/watcherclient.v1.audit_template.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.audit_template` Module +================================================= + +.. automodule:: watcherclient.v1.audit_template + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.audit_template_shell.rst b/doc/source/api/watcherclient.v1.audit_template_shell.rst new file mode 100644 index 0000000..df75aca --- /dev/null +++ b/doc/source/api/watcherclient.v1.audit_template_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.audit_template_shell` Module +======================================================= + +.. automodule:: watcherclient.v1.audit_template_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.client.rst b/doc/source/api/watcherclient.v1.client.rst new file mode 100644 index 0000000..e72a79b --- /dev/null +++ b/doc/source/api/watcherclient.v1.client.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.client` Module +========================================= + +.. automodule:: watcherclient.v1.client + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.goal.rst b/doc/source/api/watcherclient.v1.goal.rst new file mode 100644 index 0000000..f5856e2 --- /dev/null +++ b/doc/source/api/watcherclient.v1.goal.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.goal` Module +======================================= + +.. automodule:: watcherclient.v1.goal + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.goal_shell.rst b/doc/source/api/watcherclient.v1.goal_shell.rst new file mode 100644 index 0000000..f6bfe11 --- /dev/null +++ b/doc/source/api/watcherclient.v1.goal_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.goal_shell` Module +============================================= + +.. automodule:: watcherclient.v1.goal_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.metric_collector.rst b/doc/source/api/watcherclient.v1.metric_collector.rst new file mode 100644 index 0000000..e8028df --- /dev/null +++ b/doc/source/api/watcherclient.v1.metric_collector.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.metric_collector` Module +=================================================== + +.. automodule:: watcherclient.v1.metric_collector + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.metric_collector_shell.rst b/doc/source/api/watcherclient.v1.metric_collector_shell.rst new file mode 100644 index 0000000..50e64aa --- /dev/null +++ b/doc/source/api/watcherclient.v1.metric_collector_shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.metric_collector_shell` Module +========================================================= + +.. automodule:: watcherclient.v1.metric_collector_shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.resource_fields.rst b/doc/source/api/watcherclient.v1.resource_fields.rst new file mode 100644 index 0000000..ddc846e --- /dev/null +++ b/doc/source/api/watcherclient.v1.resource_fields.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.resource_fields` Module +================================================== + +.. automodule:: watcherclient.v1.resource_fields + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.v1.shell.rst b/doc/source/api/watcherclient.v1.shell.rst new file mode 100644 index 0000000..3462b48 --- /dev/null +++ b/doc/source/api/watcherclient.v1.shell.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.v1.shell` Module +======================================== + +.. automodule:: watcherclient.v1.shell + :members: + :undoc-members: + :show-inheritance: diff --git a/doc/source/api/watcherclient.version.rst b/doc/source/api/watcherclient.version.rst new file mode 100644 index 0000000..f7f64e8 --- /dev/null +++ b/doc/source/api/watcherclient.version.rst @@ -0,0 +1,7 @@ +The :mod:`watcherclient.version` Module +======================================= + +.. automodule:: watcherclient.version + :members: + :undoc-members: + :show-inheritance: diff --git a/requirements.txt b/requirements.txt index f7eeb59..b902fce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,8 @@ argparse Babel>=1.3 -oslo.i18n>=1.5.0 # Apache-2.0 +oslo.i18n>=1.5.0 # Apache-2.0 +oslo.utils>=2.0.0,!=2.6.0 # Apache-2.0 pbr>=1.6 python-keystoneclient>=1.6.0,!=1.8.0 six>=1.9.0 diff --git a/tox.ini b/tox.ini index b99de9a..f97fbed 100644 --- a/tox.ini +++ b/tox.ini @@ -32,7 +32,7 @@ commands = oslo_debug_helper {posargs} show-source = True ignore = E123,E125 builtins = _ -exclude=.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build +exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build [testenv:pypi] commands = diff --git a/watcherclient/client.py b/watcherclient/client.py index 240ab23..b96fc69 100644 --- a/watcherclient/client.py +++ b/watcherclient/client.py @@ -13,13 +13,13 @@ # under the License. from keystoneclient.v2_0 import client as ksclient +import oslo_i18n +from watcherclient.common.i18n import _ from watcherclient.common import utils from watcherclient import exceptions as exc -from watcherclient.openstack.common._i18n import _ -from watcherclient.openstack.common import gettextutils -gettextutils.install('watcherclient') +oslo_i18n.install('watcherclient') def _get_ksclient(**kwargs): diff --git a/watcherclient/openstack/__init__.py b/watcherclient/common/apiclient/__init__.py similarity index 100% rename from watcherclient/openstack/__init__.py rename to watcherclient/common/apiclient/__init__.py diff --git a/watcherclient/openstack/common/apiclient/base.py b/watcherclient/common/apiclient/base.py similarity index 99% rename from watcherclient/openstack/common/apiclient/base.py rename to watcherclient/common/apiclient/base.py index 6d26695..056b43c 100644 --- a/watcherclient/openstack/common/apiclient/base.py +++ b/watcherclient/common/apiclient/base.py @@ -44,8 +44,8 @@ from oslo_utils import strutils import six from six.moves.urllib import parse -from watcherclient.openstack.common._i18n import _ -from watcherclient.openstack.common.apiclient import exceptions +from watcherclient.common.apiclient import exceptions +from watcherclient.common.i18n import _ def getid(obj): @@ -467,8 +467,7 @@ class Resource(object): @property def human_id(self): - """Human-readable ID which can be used for bash completion. - """ + """Human-readable ID which can be used for bash completion.""" if self.HUMAN_ID: name = getattr(self, self.NAME_ATTR, None) if name is not None: diff --git a/watcherclient/openstack/common/apiclient/exceptions.py b/watcherclient/common/apiclient/exceptions.py similarity index 98% rename from watcherclient/openstack/common/apiclient/exceptions.py rename to watcherclient/common/apiclient/exceptions.py index e5d9721..911ed58 100644 --- a/watcherclient/openstack/common/apiclient/exceptions.py +++ b/watcherclient/common/apiclient/exceptions.py @@ -38,12 +38,11 @@ import sys import six -from watcherclient.openstack.common._i18n import _ +from watcherclient.common.i18n import _ class ClientException(Exception): - """The base exception class for all exceptions this library raises. - """ + """The base exception class for all exceptions this library raises.""" pass @@ -118,8 +117,7 @@ class AmbiguousEndpoints(EndpointException): class HttpError(ClientException): - """The base exception class for all HTTP exceptions. - """ + """The base exception class for all HTTP exceptions.""" http_status = 0 message = _("HTTP Error") diff --git a/watcherclient/common/base.py b/watcherclient/common/base.py index 76aa143..2d23021 100644 --- a/watcherclient/common/base.py +++ b/watcherclient/common/base.py @@ -23,7 +23,7 @@ import copy import six.moves.urllib.parse as urlparse -from watcherclient.openstack.common.apiclient import base +from watcherclient.common.apiclient import base def getid(obj): diff --git a/watcherclient/openstack/common/cliutils.py b/watcherclient/common/cliutils.py similarity index 99% rename from watcherclient/openstack/common/cliutils.py rename to watcherclient/common/cliutils.py index 49b06bc..fd2100d 100644 --- a/watcherclient/openstack/common/cliutils.py +++ b/watcherclient/common/cliutils.py @@ -30,7 +30,7 @@ import prettytable import six from six import moves -from watcherclient.openstack.common._i18n import _ +from watcherclient.common.i18n import _ class MissingArgs(Exception): diff --git a/watcherclient/common/i18n.py b/watcherclient/common/i18n.py new file mode 100644 index 0000000..01d8620 --- /dev/null +++ b/watcherclient/common/i18n.py @@ -0,0 +1,31 @@ +# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import oslo_i18n + +_translators = oslo_i18n.TranslatorFactory(domain='watcherclient') + +# The primary translation function using the well-known name "_" +_ = _translators.primary + +# Translators for log levels. +# +# The abbreviated names are meant to reflect the usual use of a short +# name like '_'. The "L" is for "log" and the other letter comes from +# the level. +_LI = _translators.log_info +_LW = _translators.log_warning +_LE = _translators.log_error +_LC = _translators.log_critical diff --git a/watcherclient/common/utils.py b/watcherclient/common/utils.py index f16c909..d48f6bd 100644 --- a/watcherclient/common/utils.py +++ b/watcherclient/common/utils.py @@ -20,9 +20,10 @@ from __future__ import print_function import argparse import json +from oslo_utils import importutils + +from watcherclient.common.i18n import _ from watcherclient import exceptions as exc -from watcherclient.openstack.common._i18n import _ -from watcherclient.openstack.common import importutils class HelpFormatter(argparse.HelpFormatter): diff --git a/watcherclient/exceptions.py b/watcherclient/exceptions.py index 232f957..241e857 100644 --- a/watcherclient/exceptions.py +++ b/watcherclient/exceptions.py @@ -12,21 +12,49 @@ # License for the specific language governing permissions and limitations # under the License. -from watcherclient.openstack.common.apiclient import exceptions -from watcherclient.openstack.common.apiclient.exceptions import * # noqa +from watcherclient.common.apiclient import exceptions # NOTE(akurilin): This alias is left here since v.0.1.3 to support backwards # compatibility. -InvalidEndpoint = EndpointException -CommunicationError = ConnectionRefused -HTTPBadRequest = BadRequest -HTTPInternalServerError = InternalServerError -HTTPNotFound = NotFound -HTTPServiceUnavailable = ServiceUnavailable +InvalidEndpoint = exceptions.EndpointException +CommunicationError = exceptions.ConnectionRefused +HTTPBadRequest = exceptions.BadRequest +HTTPInternalServerError = exceptions.InternalServerError +HTTPNotFound = exceptions.NotFound +HTTPServiceUnavailable = exceptions.ServiceUnavailable -class AmbiguousAuthSystem(ClientException): +CommandError = exceptions.CommandError +"""Error in CLI tool. + +An alias of :py:exc:`watcherclient.common.apiclient.CommandError` +""" + +Unauthorized = exceptions.Unauthorized +"""HTTP 401 - Unauthorized. + +Similar to 403 Forbidden, but specifically for use when authentication +is required and has failed or has not yet been provided. +An alias of :py:exc:`watcherclient.common.apiclient.Unauthorized` +""" + +InternalServerError = exceptions.InternalServerError +"""HTTP 500 - Internal Server Error. + +A generic error message, given when no more specific message is suitable. +An alias of :py:exc:`watcherclient.common.apiclient.InternalServerError` +""" + +ValidationError = exceptions.ValidationError +"""Error in validation on API client side. + +A generic error message, given when no more specific message is suitable. +An alias of :py:exc:`watcherclient.common.apiclient.ValidationError` +""" + + +class AmbiguousAuthSystem(exceptions.ClientException): """Could not obtain token and endpoint using provided credentials.""" pass @@ -34,7 +62,7 @@ class AmbiguousAuthSystem(ClientException): AmbigiousAuthSystem = AmbiguousAuthSystem -class InvalidAttribute(ClientException): +class InvalidAttribute(exceptions.ClientException): pass @@ -65,7 +93,7 @@ def from_response(response, message=None, traceback=None, method=None, if (response.headers['Content-Type'].startswith('text/') and not hasattr(response, 'text')): # NOTE(clif_h): There seems to be a case in the - # openstack.common.apiclient.exceptions module where if the + # common.apiclient.exceptions module where if the # content-type of the response is text/* then it expects # the response to have a 'text' attribute, but that # doesn't always seem to necessarily be the case. diff --git a/watcherclient/openstack/common/__init__.py b/watcherclient/openstack/common/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/watcherclient/openstack/common/_i18n.py b/watcherclient/openstack/common/_i18n.py deleted file mode 100644 index b7c2946..0000000 --- a/watcherclient/openstack/common/_i18n.py +++ /dev/null @@ -1,45 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -"""oslo.i18n integration module. - -See http://docs.openstack.org/developer/oslo.i18n/usage.html - -""" - -try: - import oslo_i18n - - # NOTE(dhellmann): This reference to o-s-l-o will be replaced by the - # application name when this module is synced into the separate - # repository. It is OK to have more than one translation function - # using the same domain, since there will still only be one message - # catalog. - _translators = oslo_i18n.TranslatorFactory(domain='watcherclient') - - # The primary translation function using the well-known name "_" - _ = _translators.primary - - # Translators for log levels. - # - # The abbreviated names are meant to reflect the usual use of a short - # name like '_'. The "L" is for "log" and the other letter comes from - # the level. - _LI = _translators.log_info - _LW = _translators.log_warning - _LE = _translators.log_error - _LC = _translators.log_critical -except ImportError: - # NOTE(dims): Support for cases where a project wants to use - # code from oslo-incubator, but is not ready to be internationalized - # (like tempest) - _ = _LI = _LW = _LE = _LC = lambda x: x diff --git a/watcherclient/openstack/common/apiclient/__init__.py b/watcherclient/openstack/common/apiclient/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/watcherclient/openstack/common/apiclient/auth.py b/watcherclient/openstack/common/apiclient/auth.py deleted file mode 100644 index e6ecbe0..0000000 --- a/watcherclient/openstack/common/apiclient/auth.py +++ /dev/null @@ -1,234 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# Copyright 2013 Spanish National Research Council. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -# E0202: An attribute inherited from %s hide this method -# pylint: disable=E0202 - -######################################################################## -# -# THIS MODULE IS DEPRECATED -# -# Please refer to -# https://etherpad.openstack.org/p/kilo-watcherclient-library-proposals for -# the discussion leading to this deprecation. -# -# We recommend checking out the python-openstacksdk project -# (https://launchpad.net/python-openstacksdk) instead. -# -######################################################################## - -import abc -import argparse -import os - -import six -from stevedore import extension - -from watcherclient.openstack.common.apiclient import exceptions - - -_discovered_plugins = {} - - -def discover_auth_systems(): - """Discover the available auth-systems. - - This won't take into account the old style auth-systems. - """ - global _discovered_plugins - _discovered_plugins = {} - - def add_plugin(ext): - _discovered_plugins[ext.name] = ext.plugin - - ep_namespace = "watcherclient.openstack.common.apiclient.auth" - mgr = extension.ExtensionManager(ep_namespace) - mgr.map(add_plugin) - - -def load_auth_system_opts(parser): - """Load options needed by the available auth-systems into a parser. - - This function will try to populate the parser with options from the - available plugins. - """ - group = parser.add_argument_group("Common auth options") - BaseAuthPlugin.add_common_opts(group) - for name, auth_plugin in six.iteritems(_discovered_plugins): - group = parser.add_argument_group( - "Auth-system '%s' options" % name, - conflict_handler="resolve") - auth_plugin.add_opts(group) - - -def load_plugin(auth_system): - try: - plugin_class = _discovered_plugins[auth_system] - except KeyError: - raise exceptions.AuthSystemNotFound(auth_system) - return plugin_class(auth_system=auth_system) - - -def load_plugin_from_args(args): - """Load required plugin and populate it with options. - - Try to guess auth system if it is not specified. Systems are tried in - alphabetical order. - - :type args: argparse.Namespace - :raises: AuthPluginOptionsMissing - """ - auth_system = args.os_auth_system - if auth_system: - plugin = load_plugin(auth_system) - plugin.parse_opts(args) - plugin.sufficient_options() - return plugin - - for plugin_auth_system in sorted(six.iterkeys(_discovered_plugins)): - plugin_class = _discovered_plugins[plugin_auth_system] - plugin = plugin_class() - plugin.parse_opts(args) - try: - plugin.sufficient_options() - except exceptions.AuthPluginOptionsMissing: - continue - return plugin - raise exceptions.AuthPluginOptionsMissing(["auth_system"]) - - -@six.add_metaclass(abc.ABCMeta) -class BaseAuthPlugin(object): - """Base class for authentication plugins. - - An authentication plugin needs to override at least the authenticate - method to be a valid plugin. - """ - - auth_system = None - opt_names = [] - common_opt_names = [ - "auth_system", - "username", - "password", - "tenant_name", - "token", - "auth_url", - ] - - def __init__(self, auth_system=None, **kwargs): - self.auth_system = auth_system or self.auth_system - self.opts = dict((name, kwargs.get(name)) - for name in self.opt_names) - - @staticmethod - def _parser_add_opt(parser, opt): - """Add an option to parser in two variants. - - :param opt: option name (with underscores) - """ - dashed_opt = opt.replace("_", "-") - env_var = "OS_%s" % opt.upper() - arg_default = os.environ.get(env_var, "") - arg_help = "Defaults to env[%s]." % env_var - parser.add_argument( - "--os-%s" % dashed_opt, - metavar="<%s>" % dashed_opt, - default=arg_default, - help=arg_help) - parser.add_argument( - "--os_%s" % opt, - metavar="<%s>" % dashed_opt, - help=argparse.SUPPRESS) - - @classmethod - def add_opts(cls, parser): - """Populate the parser with the options for this plugin. - """ - for opt in cls.opt_names: - # use `BaseAuthPlugin.common_opt_names` since it is never - # changed in child classes - if opt not in BaseAuthPlugin.common_opt_names: - cls._parser_add_opt(parser, opt) - - @classmethod - def add_common_opts(cls, parser): - """Add options that are common for several plugins. - """ - for opt in cls.common_opt_names: - cls._parser_add_opt(parser, opt) - - @staticmethod - def get_opt(opt_name, args): - """Return option name and value. - - :param opt_name: name of the option, e.g., "username" - :param args: parsed arguments - """ - return (opt_name, getattr(args, "os_%s" % opt_name, None)) - - def parse_opts(self, args): - """Parse the actual auth-system options if any. - - This method is expected to populate the attribute `self.opts` with a - dict containing the options and values needed to make authentication. - """ - self.opts.update(dict(self.get_opt(opt_name, args) - for opt_name in self.opt_names)) - - def authenticate(self, http_client): - """Authenticate using plugin defined method. - - The method usually analyses `self.opts` and performs - a request to authentication server. - - :param http_client: client object that needs authentication - :type http_client: HTTPClient - :raises: AuthorizationFailure - """ - self.sufficient_options() - self._do_authenticate(http_client) - - @abc.abstractmethod - def _do_authenticate(self, http_client): - """Protected method for authentication. - """ - - def sufficient_options(self): - """Check if all required options are present. - - :raises: AuthPluginOptionsMissing - """ - missing = [opt - for opt in self.opt_names - if not self.opts.get(opt)] - if missing: - raise exceptions.AuthPluginOptionsMissing(missing) - - @abc.abstractmethod - def token_and_endpoint(self, endpoint_type, service_type): - """Return token and endpoint. - - :param service_type: Service type of the endpoint - :type service_type: string - :param endpoint_type: Type of endpoint. - Possible values: public or publicURL, - internal or internalURL, - admin or adminURL - :type endpoint_type: string - :returns: tuple of token and endpoint strings - :raises: EndpointException - """ diff --git a/watcherclient/openstack/common/apiclient/client.py b/watcherclient/openstack/common/apiclient/client.py deleted file mode 100644 index f32f2e2..0000000 --- a/watcherclient/openstack/common/apiclient/client.py +++ /dev/null @@ -1,388 +0,0 @@ -# Copyright 2010 Jacob Kaplan-Moss -# Copyright 2011 OpenStack Foundation -# Copyright 2011 Piston Cloud Computing, Inc. -# Copyright 2013 Alessio Ababilov -# Copyright 2013 Grid Dynamics -# Copyright 2013 OpenStack Foundation -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -OpenStack Client interface. Handles the REST calls and responses. -""" - -# E0202: An attribute inherited from %s hide this method -# pylint: disable=E0202 - -import hashlib -import logging -import time - -try: - import simplejson as json -except ImportError: - import json - -from oslo_utils import encodeutils -from oslo_utils import importutils -import requests - -from watcherclient.openstack.common._i18n import _ -from watcherclient.openstack.common.apiclient import exceptions - -_logger = logging.getLogger(__name__) -SENSITIVE_HEADERS = ('X-Auth-Token', 'X-Subject-Token',) - - -class HTTPClient(object): - """This client handles sending HTTP requests to OpenStack servers. - - Features: - - - share authentication information between several clients to different - services (e.g., for compute and image clients); - - reissue authentication request for expired tokens; - - encode/decode JSON bodies; - - raise exceptions on HTTP errors; - - pluggable authentication; - - store authentication information in a keyring; - - store time spent for requests; - - register clients for particular services, so one can use - `http_client.identity` or `http_client.compute`; - - log requests and responses in a format that is easy to copy-and-paste - into terminal and send the same request with curl. - """ - - user_agent = "watcherclient.openstack.common.apiclient" - - def __init__(self, - auth_plugin, - region_name=None, - endpoint_type="publicURL", - original_ip=None, - verify=True, - cert=None, - timeout=None, - timings=False, - keyring_saver=None, - debug=False, - user_agent=None, - http=None): - self.auth_plugin = auth_plugin - - self.endpoint_type = endpoint_type - self.region_name = region_name - - self.original_ip = original_ip - self.timeout = timeout - self.verify = verify - self.cert = cert - - self.keyring_saver = keyring_saver - self.debug = debug - self.user_agent = user_agent or self.user_agent - - self.times = [] # [("item", starttime, endtime), ...] - self.timings = timings - - # requests within the same session can reuse TCP connections from pool - self.http = http or requests.Session() - - self.cached_token = None - self.last_request_id = None - - def _safe_header(self, name, value): - if name in SENSITIVE_HEADERS: - # because in python3 byte string handling is ... ug - v = value.encode('utf-8') - h = hashlib.sha1(v) - d = h.hexdigest() - return encodeutils.safe_decode(name), "{SHA1}%s" % d - else: - return (encodeutils.safe_decode(name), - encodeutils.safe_decode(value)) - - def _http_log_req(self, method, url, kwargs): - if not self.debug: - return - - string_parts = [ - "curl -g -i", - "-X '%s'" % method, - "'%s'" % url, - ] - - for element in kwargs['headers']: - header = ("-H '%s: %s'" % - self._safe_header(element, kwargs['headers'][element])) - string_parts.append(header) - - _logger.debug("REQ: %s" % " ".join(string_parts)) - if 'data' in kwargs: - _logger.debug("REQ BODY: %s\n" % (kwargs['data'])) - - def _http_log_resp(self, resp): - if not self.debug: - return - _logger.debug( - "RESP: [%s] %s\n", - resp.status_code, - resp.headers) - if resp._content_consumed: - _logger.debug( - "RESP BODY: %s\n", - resp.text) - - def serialize(self, kwargs): - if kwargs.get('json') is not None: - kwargs['headers']['Content-Type'] = 'application/json' - kwargs['data'] = json.dumps(kwargs['json']) - try: - del kwargs['json'] - except KeyError: - pass - - def get_timings(self): - return self.times - - def reset_timings(self): - self.times = [] - - def request(self, method, url, **kwargs): - """Send an http request with the specified characteristics. - - Wrapper around `requests.Session.request` to handle tasks such as - setting headers, JSON encoding/decoding, and error handling. - - :param method: method of HTTP request - :param url: URL of HTTP request - :param kwargs: any other parameter that can be passed to - requests.Session.request (such as `headers`) or `json` - that will be encoded as JSON and used as `data` argument - """ - kwargs.setdefault("headers", {}) - kwargs["headers"]["User-Agent"] = self.user_agent - if self.original_ip: - kwargs["headers"]["Forwarded"] = "for=%s;by=%s" % ( - self.original_ip, self.user_agent) - if self.timeout is not None: - kwargs.setdefault("timeout", self.timeout) - kwargs.setdefault("verify", self.verify) - if self.cert is not None: - kwargs.setdefault("cert", self.cert) - self.serialize(kwargs) - - self._http_log_req(method, url, kwargs) - if self.timings: - start_time = time.time() - resp = self.http.request(method, url, **kwargs) - if self.timings: - self.times.append(("%s %s" % (method, url), - start_time, time.time())) - self._http_log_resp(resp) - - self.last_request_id = resp.headers.get('x-openstack-request-id') - - if resp.status_code >= 400: - _logger.debug( - "Request returned failure status: %s", - resp.status_code) - raise exceptions.from_response(resp, method, url) - - return resp - - @staticmethod - def concat_url(endpoint, url): - """Concatenate endpoint and final URL. - - E.g., "http://keystone/v2.0/" and "/tokens" are concatenated to - "http://keystone/v2.0/tokens". - - :param endpoint: the base URL - :param url: the final URL - """ - return "%s/%s" % (endpoint.rstrip("/"), url.strip("/")) - - def client_request(self, client, method, url, **kwargs): - """Send an http request using `client`'s endpoint and specified `url`. - - If request was rejected as unauthorized (possibly because the token is - expired), issue one authorization attempt and send the request once - again. - - :param client: instance of BaseClient descendant - :param method: method of HTTP request - :param url: URL of HTTP request - :param kwargs: any other parameter that can be passed to - `HTTPClient.request` - """ - - filter_args = { - "endpoint_type": client.endpoint_type or self.endpoint_type, - "service_type": client.service_type, - } - token, endpoint = (self.cached_token, client.cached_endpoint) - just_authenticated = False - if not (token and endpoint): - try: - token, endpoint = self.auth_plugin.token_and_endpoint( - **filter_args) - except exceptions.EndpointException: - pass - if not (token and endpoint): - self.authenticate() - just_authenticated = True - token, endpoint = self.auth_plugin.token_and_endpoint( - **filter_args) - if not (token and endpoint): - raise exceptions.AuthorizationFailure( - _("Cannot find endpoint or token for request")) - - old_token_endpoint = (token, endpoint) - kwargs.setdefault("headers", {})["X-Auth-Token"] = token - self.cached_token = token - client.cached_endpoint = endpoint - # Perform the request once. If we get Unauthorized, then it - # might be because the auth token expired, so try to - # re-authenticate and try again. If it still fails, bail. - try: - return self.request( - method, self.concat_url(endpoint, url), **kwargs) - except exceptions.Unauthorized as unauth_ex: - if just_authenticated: - raise - self.cached_token = None - client.cached_endpoint = None - if self.auth_plugin.opts.get('token'): - self.auth_plugin.opts['token'] = None - if self.auth_plugin.opts.get('endpoint'): - self.auth_plugin.opts['endpoint'] = None - self.authenticate() - try: - token, endpoint = self.auth_plugin.token_and_endpoint( - **filter_args) - except exceptions.EndpointException: - raise unauth_ex - if (not (token and endpoint) or - old_token_endpoint == (token, endpoint)): - raise unauth_ex - self.cached_token = token - client.cached_endpoint = endpoint - kwargs["headers"]["X-Auth-Token"] = token - return self.request( - method, self.concat_url(endpoint, url), **kwargs) - - def add_client(self, base_client_instance): - """Add a new instance of :class:`BaseClient` descendant. - - `self` will store a reference to `base_client_instance`. - - Example: - - >>> def test_clients(): - ... from keystoneclient.auth import keystone - ... from openstack.common.apiclient import client - ... auth = keystone.KeystoneAuthPlugin( - ... username="user", password="pass", tenant_name="tenant", - ... auth_url="http://auth:5000/v2.0") - ... openstack_client = client.HTTPClient(auth) - ... # create nova client - ... from novaclient.v1_1 import client - ... client.Client(openstack_client) - ... # create keystone client - ... from keystoneclient.v2_0 import client - ... client.Client(openstack_client) - ... # use them - ... openstack_client.identity.tenants.list() - ... openstack_client.compute.servers.list() - """ - service_type = base_client_instance.service_type - if service_type and not hasattr(self, service_type): - setattr(self, service_type, base_client_instance) - - def authenticate(self): - self.auth_plugin.authenticate(self) - # Store the authentication results in the keyring for later requests - if self.keyring_saver: - self.keyring_saver.save(self) - - -class BaseClient(object): - """Top-level object to access the OpenStack API. - - This client uses :class:`HTTPClient` to send requests. :class:`HTTPClient` - will handle a bunch of issues such as authentication. - """ - - service_type = None - endpoint_type = None # "publicURL" will be used - cached_endpoint = None - - def __init__(self, http_client, extensions=None): - self.http_client = http_client - http_client.add_client(self) - - # Add in any extensions... - if extensions: - for extension in extensions: - if extension.manager_class: - setattr(self, extension.name, - extension.manager_class(self)) - - def client_request(self, method, url, **kwargs): - return self.http_client.client_request( - self, method, url, **kwargs) - - @property - def last_request_id(self): - return self.http_client.last_request_id - - def head(self, url, **kwargs): - return self.client_request("HEAD", url, **kwargs) - - def get(self, url, **kwargs): - return self.client_request("GET", url, **kwargs) - - def post(self, url, **kwargs): - return self.client_request("POST", url, **kwargs) - - def put(self, url, **kwargs): - return self.client_request("PUT", url, **kwargs) - - def delete(self, url, **kwargs): - return self.client_request("DELETE", url, **kwargs) - - def patch(self, url, **kwargs): - return self.client_request("PATCH", url, **kwargs) - - @staticmethod - def get_class(api_name, version, version_map): - """Returns the client class for the requested API version - - :param api_name: the name of the API, e.g. 'compute', 'image', etc - :param version: the requested API version - :param version_map: a dict of client classes keyed by version - :rtype: a client class for the requested API version - """ - try: - client_path = version_map[str(version)] - except (KeyError, ValueError): - msg = _("Invalid %(api_name)s client version '%(version)s'. " - "Must be one of: %(version_map)s") % { - 'api_name': api_name, - 'version': version, - 'version_map': ', '.join(version_map.keys())} - raise exceptions.UnsupportedVersion(msg) - - return importutils.import_class(client_path) diff --git a/watcherclient/openstack/common/apiclient/fake_client.py b/watcherclient/openstack/common/apiclient/fake_client.py deleted file mode 100644 index 1bd23ba..0000000 --- a/watcherclient/openstack/common/apiclient/fake_client.py +++ /dev/null @@ -1,190 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -A fake server that "responds" to API methods with pre-canned responses. - -All of these responses come from the spec, so if for some reason the spec's -wrong the tests might raise AssertionError. I've indicated in comments the -places where actual behavior differs from the spec. -""" - -######################################################################## -# -# THIS MODULE IS DEPRECATED -# -# Please refer to -# https://etherpad.openstack.org/p/kilo-watcherclient-library-proposals for -# the discussion leading to this deprecation. -# -# We recommend checking out the python-openstacksdk project -# (https://launchpad.net/python-openstacksdk) instead. -# -######################################################################## - -# W0102: Dangerous default value %s as argument -# pylint: disable=W0102 - -import json - -import requests -import six -from six.moves.urllib import parse - -from watcherclient.openstack.common.apiclient import client - - -def assert_has_keys(dct, required=None, optional=None): - required = required or [] - optional = optional or [] - for k in required: - try: - assert k in dct - except AssertionError: - extra_keys = set(dct.keys()).difference(set(required + optional)) - raise AssertionError("found unexpected keys: %s" % - list(extra_keys)) - - -class TestResponse(requests.Response): - """Wrap requests.Response and provide a convenient initialization. - """ - - def __init__(self, data): - super(TestResponse, self).__init__() - self._content_consumed = True - if isinstance(data, dict): - self.status_code = data.get('status_code', 200) - # Fake the text attribute to streamline Response creation - text = data.get('text', "") - if isinstance(text, (dict, list)): - self._content = json.dumps(text) - default_headers = { - "Content-Type": "application/json", - } - else: - self._content = text - default_headers = {} - if six.PY3 and isinstance(self._content, six.string_types): - self._content = self._content.encode('utf-8', 'strict') - self.headers = data.get('headers') or default_headers - else: - self.status_code = data - - def __eq__(self, other): - return (self.status_code == other.status_code and - self.headers == other.headers and - self._content == other._content) - - -class FakeHTTPClient(client.HTTPClient): - - def __init__(self, *args, **kwargs): - self.callstack = [] - self.fixtures = kwargs.pop("fixtures", None) or {} - if not args and "auth_plugin" not in kwargs: - args = (None, ) - super(FakeHTTPClient, self).__init__(*args, **kwargs) - - def assert_called(self, method, url, body=None, pos=-1): - """Assert than an API method was just called. - """ - expected = (method, url) - called = self.callstack[pos][0:2] - assert self.callstack, \ - "Expected %s %s but no calls were made." % expected - - assert expected == called, 'Expected %s %s; got %s %s' % \ - (expected + called) - - if body is not None: - if self.callstack[pos][3] != body: - raise AssertionError('%r != %r' % - (self.callstack[pos][3], body)) - - def assert_called_anytime(self, method, url, body=None): - """Assert than an API method was called anytime in the test. - """ - expected = (method, url) - - assert self.callstack, \ - "Expected %s %s but no calls were made." % expected - - found = False - entry = None - for entry in self.callstack: - if expected == entry[0:2]: - found = True - break - - assert found, 'Expected %s %s; got %s' % \ - (method, url, self.callstack) - if body is not None: - assert entry[3] == body, "%s != %s" % (entry[3], body) - - self.callstack = [] - - def clear_callstack(self): - self.callstack = [] - - def authenticate(self): - pass - - def client_request(self, client, method, url, **kwargs): - # Check that certain things are called correctly - if method in ["GET", "DELETE"]: - assert "json" not in kwargs - - # Note the call - self.callstack.append( - (method, - url, - kwargs.get("headers") or {}, - kwargs.get("json") or kwargs.get("data"))) - try: - fixture = self.fixtures[url][method] - except KeyError: - pass - else: - return TestResponse({"headers": fixture[0], - "text": fixture[1]}) - - # Call the method - args = parse.parse_qsl(parse.urlparse(url)[4]) - kwargs.update(args) - munged_url = url.rsplit('?', 1)[0] - munged_url = munged_url.strip('/').replace('/', '_').replace('.', '_') - munged_url = munged_url.replace('-', '_') - - callback = "%s_%s" % (method.lower(), munged_url) - - if not hasattr(self, callback): - raise AssertionError('Called unknown API method: %s %s, ' - 'expected fakes method name: %s' % - (method, url, callback)) - - resp = getattr(self, callback)(**kwargs) - if len(resp) == 3: - status, headers, body = resp - else: - status, body = resp - headers = {} - self.last_request_id = headers.get('x-openstack-request-id', - 'req-test') - return TestResponse({ - "status_code": status, - "text": body, - "headers": headers, - }) diff --git a/watcherclient/openstack/common/apiclient/utils.py b/watcherclient/openstack/common/apiclient/utils.py deleted file mode 100644 index 397042a..0000000 --- a/watcherclient/openstack/common/apiclient/utils.py +++ /dev/null @@ -1,100 +0,0 @@ -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -######################################################################## -# -# THIS MODULE IS DEPRECATED -# -# Please refer to -# https://etherpad.openstack.org/p/kilo-watcherclient-library-proposals for -# the discussion leading to this deprecation. -# -# We recommend checking out the python-openstacksdk project -# (https://launchpad.net/python-openstacksdk) instead. -# -######################################################################## - -from oslo_utils import encodeutils -from oslo_utils import uuidutils -import six - -from watcherclient.openstack.common._i18n import _ -from watcherclient.openstack.common.apiclient import exceptions - - -def find_resource(manager, name_or_id, **find_args): - """Look for resource in a given manager. - - Used as a helper for the _find_* methods. - Example: - - .. code-block:: python - - def _find_hypervisor(cs, hypervisor): - #Get a hypervisor by name or ID. - return cliutils.find_resource(cs.hypervisors, hypervisor) - """ - # first try to get entity as integer id - try: - return manager.get(int(name_or_id)) - except (TypeError, ValueError, exceptions.NotFound): - pass - - # now try to get entity as uuid - try: - if six.PY2: - tmp_id = encodeutils.safe_encode(name_or_id) - else: - tmp_id = encodeutils.safe_decode(name_or_id) - - if uuidutils.is_uuid_like(tmp_id): - return manager.get(tmp_id) - except (TypeError, ValueError, exceptions.NotFound): - pass - - # for str id which is not uuid - if getattr(manager, 'is_alphanum_id_allowed', False): - try: - return manager.get(name_or_id) - except exceptions.NotFound: - pass - - try: - try: - return manager.find(human_id=name_or_id, **find_args) - except exceptions.NotFound: - pass - - # finally try to find entity by name - try: - resource = getattr(manager, 'resource_class', None) - name_attr = resource.NAME_ATTR if resource else 'name' - kwargs = {name_attr: name_or_id} - kwargs.update(find_args) - return manager.find(**kwargs) - except exceptions.NotFound: - msg = _("No %(name)s with a name or " - "ID of '%(name_or_id)s' exists.") % \ - { - "name": manager.resource_class.__name__.lower(), - "name_or_id": name_or_id - } - raise exceptions.CommandError(msg) - except exceptions.NoUniqueMatch: - msg = _("Multiple %(name)s matches found for " - "'%(name_or_id)s', use an ID to be more specific.") % \ - { - "name": manager.resource_class.__name__.lower(), - "name_or_id": name_or_id - } - raise exceptions.CommandError(msg) diff --git a/watcherclient/openstack/common/gettextutils.py b/watcherclient/openstack/common/gettextutils.py deleted file mode 100644 index f38d4b0..0000000 --- a/watcherclient/openstack/common/gettextutils.py +++ /dev/null @@ -1,479 +0,0 @@ -# Copyright 2012 Red Hat, Inc. -# Copyright 2013 IBM Corp. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -gettext for openstack-common modules. - -Usual usage in an openstack.common module: - - from watcherclient.openstack.common.gettextutils import _ -""" - -import copy -import gettext -import locale -from logging import handlers -import os - -from babel import localedata -import six - -_AVAILABLE_LANGUAGES = {} - -# FIXME(dhellmann): Remove this when moving to oslo.i18n. -USE_LAZY = False - - -class TranslatorFactory(object): - """Create translator functions - """ - - def __init__(self, domain, localedir=None): - """Establish a set of translation functions for the domain. - - :param domain: Name of translation domain, - specifying a message catalog. - :type domain: str - :param lazy: Delays translation until a message is emitted. - Defaults to False. - :type lazy: Boolean - :param localedir: Directory with translation catalogs. - :type localedir: str - """ - self.domain = domain - if localedir is None: - localedir = os.environ.get(domain.upper() + '_LOCALEDIR') - self.localedir = localedir - - def _make_translation_func(self, domain=None): - """Return a new translation function ready for use. - - Takes into account whether or not lazy translation is being - done. - - The domain can be specified to override the default from the - factory, but the localedir from the factory is always used - because we assume the log-level translation catalogs are - installed in the same directory as the main application - catalog. - - """ - if domain is None: - domain = self.domain - t = gettext.translation(domain, - localedir=self.localedir, - fallback=True) - # Use the appropriate method of the translation object based - # on the python version. - m = t.gettext if six.PY3 else t.ugettext - - def f(msg): - """oslo.i18n.gettextutils translation function.""" - if USE_LAZY: - return Message(msg, domain=domain) - return m(msg) - return f - - @property - def primary(self): - "The default translation function." - return self._make_translation_func() - - def _make_log_translation_func(self, level): - return self._make_translation_func(self.domain + '-log-' + level) - - @property - def log_info(self): - "Translate info-level log messages." - return self._make_log_translation_func('info') - - @property - def log_warning(self): - "Translate warning-level log messages." - return self._make_log_translation_func('warning') - - @property - def log_error(self): - "Translate error-level log messages." - return self._make_log_translation_func('error') - - @property - def log_critical(self): - "Translate critical-level log messages." - return self._make_log_translation_func('critical') - - -# NOTE(dhellmann): When this module moves out of the incubator into -# oslo.i18n, these global variables can be moved to an integration -# module within each application. - -# Create the global translation functions. -_translators = TranslatorFactory('watcherclient') - -# The primary translation function using the well-known name "_" -_ = _translators.primary - -# Translators for log levels. -# -# The abbreviated names are meant to reflect the usual use of a short -# name like '_'. The "L" is for "log" and the other letter comes from -# the level. -_LI = _translators.log_info -_LW = _translators.log_warning -_LE = _translators.log_error -_LC = _translators.log_critical - -# NOTE(dhellmann): End of globals that will move to the application's -# integration module. - - -def enable_lazy(): - """Convenience function for configuring _() to use lazy gettext - - Call this at the start of execution to enable the gettextutils._ - function to use lazy gettext functionality. This is useful if - your project is importing _ directly instead of using the - gettextutils.install() way of importing the _ function. - """ - global USE_LAZY - USE_LAZY = True - - -def install(domain): - """Install a _() function using the given translation domain. - - Given a translation domain, install a _() function using gettext's - install() function. - - The main difference from gettext.install() is that we allow - overriding the default localedir (e.g. /usr/share/locale) using - a translation-domain-specific environment variable (e.g. - NOVA_LOCALEDIR). - - Note that to enable lazy translation, enable_lazy must be - called. - - :param domain: the translation domain - """ - from six import moves - tf = TranslatorFactory(domain) - moves.builtins.__dict__['_'] = tf.primary - - -class Message(six.text_type): - """A Message object is a unicode object that can be translated. - - Translation of Message is done explicitly using the translate() method. - For all non-translation intents and purposes, a Message is simply unicode, - and can be treated as such. - """ - - def __new__(cls, msgid, msgtext=None, params=None, - domain='watcherclient', *args): - """Create a new Message object. - - In order for translation to work gettext requires a message ID, this - msgid will be used as the base unicode text. It is also possible - for the msgid and the base unicode text to be different by passing - the msgtext parameter. - """ - # If the base msgtext is not given, we use the default translation - # of the msgid (which is in English) just in case the system locale is - # not English, so that the base text will be in that locale by default. - if not msgtext: - msgtext = Message._translate_msgid(msgid, domain) - # We want to initialize the parent unicode with the actual object that - # would have been plain unicode if 'Message' was not enabled. - msg = super(Message, cls).__new__(cls, msgtext) - msg.msgid = msgid - msg.domain = domain - msg.params = params - return msg - - def translate(self, desired_locale=None): - """Translate this message to the desired locale. - - :param desired_locale: The desired locale to translate the message to, - if no locale is provided the message will be - translated to the system's default locale. - - :returns: the translated message in unicode - """ - - translated_message = Message._translate_msgid(self.msgid, - self.domain, - desired_locale) - if self.params is None: - # No need for more translation - return translated_message - - # This Message object may have been formatted with one or more - # Message objects as substitution arguments, given either as a single - # argument, part of a tuple, or as one or more values in a dictionary. - # When translating this Message we need to translate those Messages too - translated_params = _translate_args(self.params, desired_locale) - - translated_message = translated_message % translated_params - - return translated_message - - @staticmethod - def _translate_msgid(msgid, domain, desired_locale=None): - if not desired_locale: - system_locale = locale.getdefaultlocale() - # If the system locale is not available to the runtime use English - if not system_locale[0]: - desired_locale = 'en_US' - else: - desired_locale = system_locale[0] - - locale_dir = os.environ.get(domain.upper() + '_LOCALEDIR') - lang = gettext.translation(domain, - localedir=locale_dir, - languages=[desired_locale], - fallback=True) - if six.PY3: - translator = lang.gettext - else: - translator = lang.ugettext - - translated_message = translator(msgid) - return translated_message - - def __mod__(self, other): - # When we mod a Message we want the actual operation to be performed - # by the parent class (i.e. unicode()), the only thing we do here is - # save the original msgid and the parameters in case of a translation - params = self._sanitize_mod_params(other) - unicode_mod = super(Message, self).__mod__(params) - modded = Message(self.msgid, - msgtext=unicode_mod, - params=params, - domain=self.domain) - return modded - - def _sanitize_mod_params(self, other): - """Sanitize the object being modded with this Message. - - - Add support for modding 'None' so translation supports it - - Trim the modded object, which can be a large dictionary, to only - those keys that would actually be used in a translation - - Snapshot the object being modded, in case the message is - translated, it will be used as it was when the Message was created - """ - if other is None: - params = (other,) - elif isinstance(other, dict): - # Merge the dictionaries - # Copy each item in case one does not support deep copy. - params = {} - if isinstance(self.params, dict): - for key, val in self.params.items(): - params[key] = self._copy_param(val) - for key, val in other.items(): - params[key] = self._copy_param(val) - else: - params = self._copy_param(other) - return params - - def _copy_param(self, param): - try: - return copy.deepcopy(param) - except Exception: - # Fallback to casting to unicode this will handle the - # python code-like objects that can't be deep-copied - return six.text_type(param) - - def __add__(self, other): - msg = _('Message objects do not support addition.') - raise TypeError(msg) - - def __radd__(self, other): - return self.__add__(other) - - if six.PY2: - def __str__(self): - # NOTE(luisg): Logging in python 2.6 tries to str() log records, - # and it expects specifically a UnicodeError in order to proceed. - msg = _('Message objects do not support str() because they may ' - 'contain non-ascii characters. ' - 'Please use unicode() or translate() instead.') - raise UnicodeError(msg) - - -def get_available_languages(domain): - """Lists the available languages for the given translation domain. - - :param domain: the domain to get languages for - """ - if domain in _AVAILABLE_LANGUAGES: - return copy.copy(_AVAILABLE_LANGUAGES[domain]) - - localedir = '%s_LOCALEDIR' % domain.upper() - find = lambda x: gettext.find(domain, - localedir=os.environ.get(localedir), - languages=[x]) - - # NOTE(mrodden): en_US should always be available (and first in case - # order matters) since our in-line message strings are en_US - language_list = ['en_US'] - # NOTE(luisg): Babel <1.0 used a function called list(), which was - # renamed to locale_identifiers() in >=1.0, the requirements master list - # requires >=0.9.6, uncapped, so defensively work with both. We can remove - # this check when the master list updates to >=1.0, and update all projects - list_identifiers = (getattr(localedata, 'list', None) or - getattr(localedata, 'locale_identifiers')) - locale_identifiers = list_identifiers() - - for i in locale_identifiers: - if find(i) is not None: - language_list.append(i) - - # NOTE(luisg): Babel>=1.0,<1.3 has a bug where some OpenStack supported - # locales (e.g. 'zh_CN', and 'zh_TW') aren't supported even though they - # are perfectly legitimate locales: - # https://github.com/mitsuhiko/babel/issues/37 - # In Babel 1.3 they fixed the bug and they support these locales, but - # they are still not explicitly "listed" by locale_identifiers(). - # That is why we add the locales here explicitly if necessary so that - # they are listed as supported. - aliases = {'zh': 'zh_CN', - 'zh_Hant_HK': 'zh_HK', - 'zh_Hant': 'zh_TW', - 'fil': 'tl_PH'} - for (locale_, alias) in six.iteritems(aliases): - if locale_ in language_list and alias not in language_list: - language_list.append(alias) - - _AVAILABLE_LANGUAGES[domain] = language_list - return copy.copy(language_list) - - -def translate(obj, desired_locale=None): - """Gets the translated unicode representation of the given object. - - If the object is not translatable it is returned as-is. - If the locale is None the object is translated to the system locale. - - :param obj: the object to translate - :param desired_locale: the locale to translate the message to, if None the - default system locale will be used - :returns: the translated object in unicode, or the original object if - it could not be translated - """ - message = obj - if not isinstance(message, Message): - # If the object to translate is not already translatable, - # let's first get its unicode representation - message = six.text_type(obj) - if isinstance(message, Message): - # Even after unicoding() we still need to check if we are - # running with translatable unicode before translating - return message.translate(desired_locale) - return obj - - -def _translate_args(args, desired_locale=None): - """Translates all the translatable elements of the given arguments object. - - This method is used for translating the translatable values in method - arguments which include values of tuples or dictionaries. - If the object is not a tuple or a dictionary the object itself is - translated if it is translatable. - - If the locale is None the object is translated to the system locale. - - :param args: the args to translate - :param desired_locale: the locale to translate the args to, if None the - default system locale will be used - :returns: a new args object with the translated contents of the original - """ - if isinstance(args, tuple): - return tuple(translate(v, desired_locale) for v in args) - if isinstance(args, dict): - translated_dict = {} - for (k, v) in six.iteritems(args): - translated_v = translate(v, desired_locale) - translated_dict[k] = translated_v - return translated_dict - return translate(args, desired_locale) - - -class TranslationHandler(handlers.MemoryHandler): - """Handler that translates records before logging them. - - The TranslationHandler takes a locale and a target logging.Handler object - to forward LogRecord objects to after translating them. This handler - depends on Message objects being logged, instead of regular strings. - - The handler can be configured declaratively in the logging.conf as follows: - - [handlers] - keys = translatedlog, translator - - [handler_translatedlog] - class = handlers.WatchedFileHandler - args = ('/var/log/api-localized.log',) - formatter = context - - [handler_translator] - class = openstack.common.log.TranslationHandler - target = translatedlog - args = ('zh_CN',) - - If the specified locale is not available in the system, the handler will - log in the default locale. - """ - - def __init__(self, locale=None, target=None): - """Initialize a TranslationHandler - - :param locale: locale to use for translating messages - :param target: logging.Handler object to forward - LogRecord objects to after translation - """ - # NOTE(luisg): In order to allow this handler to be a wrapper for - # other handlers, such as a FileHandler, and still be able to - # configure it using logging.conf, this handler has to extend - # MemoryHandler because only the MemoryHandlers' logging.conf - # parsing is implemented such that it accepts a target handler. - handlers.MemoryHandler.__init__(self, capacity=0, target=target) - self.locale = locale - - def setFormatter(self, fmt): - self.target.setFormatter(fmt) - - def emit(self, record): - # We save the message from the original record to restore it - # after translation, so other handlers are not affected by this - original_msg = record.msg - original_args = record.args - - try: - self._translate_and_log_record(record) - finally: - record.msg = original_msg - record.args = original_args - - def _translate_and_log_record(self, record): - record.msg = translate(record.msg, self.locale) - - # In addition to translating the message, we also need to translate - # arguments that were passed to the log method that were not part - # of the main message e.g., log.info(_('Some message %s'), this_one)) - record.args = _translate_args(record.args, self.locale) - - self.target.emit(record) diff --git a/watcherclient/openstack/common/importutils.py b/watcherclient/openstack/common/importutils.py deleted file mode 100644 index ebbcff8..0000000 --- a/watcherclient/openstack/common/importutils.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright 2011 OpenStack Foundation. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -Import related utilities and helper functions. -""" - -import sys -import traceback - - -def import_class(import_str): - """Returns a class from a string including module and class.""" - mod_str, _sep, class_str = import_str.rpartition('.') - __import__(mod_str) - try: - return getattr(sys.modules[mod_str], class_str) - except AttributeError: - raise ImportError('Class %s cannot be found (%s)' % - (class_str, - traceback.format_exception(*sys.exc_info()))) - - -def import_object(import_str, *args, **kwargs): - """Import a class and return an instance of it.""" - return import_class(import_str)(*args, **kwargs) - - -def import_object_ns(name_space, import_str, *args, **kwargs): - """Tries to import object from default namespace. - - Imports a class and return an instance of it, first by trying - to find the class in a default namespace, then failing back to - a full path if not found in the default namespace. - """ - import_value = "%s.%s" % (name_space, import_str) - try: - return import_class(import_value)(*args, **kwargs) - except ImportError: - return import_class(import_str)(*args, **kwargs) - - -def import_module(import_str): - """Import a module.""" - __import__(import_str) - return sys.modules[import_str] - - -def import_versioned_module(version, submodule=None): - module = 'watcherclient.v%s' % version - if submodule: - module = '.'.join((module, submodule)) - return import_module(module) - - -def try_import(import_str, default=None): - """Try to import a module and if it fails return default.""" - try: - return import_module(import_str) - except ImportError: - return default diff --git a/watcherclient/openstack/common/strutils.py b/watcherclient/openstack/common/strutils.py deleted file mode 100644 index 9642edb..0000000 --- a/watcherclient/openstack/common/strutils.py +++ /dev/null @@ -1,316 +0,0 @@ -# Copyright 2011 OpenStack Foundation. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -System-level utilities and helper functions. -""" - -import math -import re -import sys -import unicodedata - -import six - -from watcherclient.openstack.common.gettextutils import _ - - -UNIT_PREFIX_EXPONENT = { - 'k': 1, - 'K': 1, - 'Ki': 1, - 'M': 2, - 'Mi': 2, - 'G': 3, - 'Gi': 3, - 'T': 4, - 'Ti': 4, -} -UNIT_SYSTEM_INFO = { - 'IEC': (1024, re.compile(r'(^[-+]?\d*\.?\d+)([KMGT]i?)?(b|bit|B)$')), - 'SI': (1000, re.compile(r'(^[-+]?\d*\.?\d+)([kMGT])?(b|bit|B)$')), -} - -TRUE_STRINGS = ('1', 't', 'true', 'on', 'y', 'yes') -FALSE_STRINGS = ('0', 'f', 'false', 'off', 'n', 'no') - -SLUGIFY_STRIP_RE = re.compile(r"[^\w\s-]") -SLUGIFY_HYPHENATE_RE = re.compile(r"[-\s]+") - - -# NOTE(flaper87): The following globals are used by `mask_password` -_SANITIZE_KEYS = ['adminPass', 'admin_pass', 'password', 'admin_password'] - -# NOTE(ldbragst): Let's build a list of regex objects using the list of -# _SANITIZE_KEYS we already have. This way, we only have to add the new key -# to the list of _SANITIZE_KEYS and we can generate regular expressions -# for XML and JSON automatically. -_SANITIZE_PATTERNS_2 = [] -_SANITIZE_PATTERNS_1 = [] - -# NOTE(amrith): Some regular expressions have only one parameter, some -# have two parameters. Use different lists of patterns here. -_FORMAT_PATTERNS_1 = [r'(%(key)s\s*[=]\s*)[^\s^\'^\"]+'] -_FORMAT_PATTERNS_2 = [r'(%(key)s\s*[=]\s*[\"\']).*?([\"\'])', - r'(%(key)s\s+[\"\']).*?([\"\'])', - r'([-]{2}%(key)s\s+)[^\'^\"^=^\s]+([\s]*)', - r'(<%(key)s>).*?(</%(key)s>)', - r'([\"\']%(key)s[\"\']\s*:\s*[\"\']).*?([\"\'])', - r'([\'"].*?%(key)s[\'"]\s*:\s*u?[\'"]).*?([\'"])', - r'([\'"].*?%(key)s[\'"]\s*,\s*\'--?[A-z]+\'\s*,\s*u?' - '[\'"]).*?([\'"])', - r'(%(key)s\s*--?[A-z]+\s*)\S+(\s*)'] - -for key in _SANITIZE_KEYS: - for pattern in _FORMAT_PATTERNS_2: - reg_ex = re.compile(pattern % {'key': key}, re.DOTALL) - _SANITIZE_PATTERNS_2.append(reg_ex) - - for pattern in _FORMAT_PATTERNS_1: - reg_ex = re.compile(pattern % {'key': key}, re.DOTALL) - _SANITIZE_PATTERNS_1.append(reg_ex) - - -def int_from_bool_as_string(subject): - """Interpret a string as a boolean and return either 1 or 0. - - Any string value in: - - ('True', 'true', 'On', 'on', '1') - - is interpreted as a boolean True. - - Useful for JSON-decoded stuff and config file parsing - """ - return bool_from_string(subject) and 1 or 0 - - -def bool_from_string(subject, strict=False, default=False): - """Interpret a string as a boolean. - - A case-insensitive match is performed such that strings matching 't', - 'true', 'on', 'y', 'yes', or '1' are considered True and, when - `strict=False`, anything else returns the value specified by 'default'. - - Useful for JSON-decoded stuff and config file parsing. - - If `strict=True`, unrecognized values, including None, will raise a - ValueError which is useful when parsing values passed in from an API call. - Strings yielding False are 'f', 'false', 'off', 'n', 'no', or '0'. - """ - if not isinstance(subject, six.string_types): - subject = six.text_type(subject) - - lowered = subject.strip().lower() - - if lowered in TRUE_STRINGS: - return True - elif lowered in FALSE_STRINGS: - return False - elif strict: - acceptable = ', '.join( - "'%s'" % s for s in sorted(TRUE_STRINGS + FALSE_STRINGS)) - msg = _("Unrecognized value '%(val)s', acceptable values are:" - " %(acceptable)s") % {'val': subject, - 'acceptable': acceptable} - raise ValueError(msg) - else: - return default - - -def safe_decode(text, incoming=None, errors='strict'): - """Decodes incoming text/bytes string using `incoming` if they're not - already unicode. - - :param incoming: Text's current encoding - :param errors: Errors handling policy. See here for valid - values http://docs.python.org/2/library/codecs.html - :returns: text or a unicode `incoming` encoded - representation of it. - :raises TypeError: If text is not an instance of str - """ - if not isinstance(text, (six.string_types, six.binary_type)): - raise TypeError("%s can't be decoded" % type(text)) - - if isinstance(text, six.text_type): - return text - - if not incoming: - incoming = (sys.stdin.encoding or - sys.getdefaultencoding()) - - try: - return text.decode(incoming, errors) - except UnicodeDecodeError: - # Note(flaper87) If we get here, it means that - # sys.stdin.encoding / sys.getdefaultencoding - # didn't return a suitable encoding to decode - # text. This happens mostly when global LANG - # var is not set correctly and there's no - # default encoding. In this case, most likely - # python will use ASCII or ANSI encoders as - # default encodings but they won't be capable - # of decoding non-ASCII characters. - # - # Also, UTF-8 is being used since it's an ASCII - # extension. - return text.decode('utf-8', errors) - - -def safe_encode(text, incoming=None, - encoding='utf-8', errors='strict'): - """Encodes incoming text/bytes string using `encoding`. - - If incoming is not specified, text is expected to be encoded with - current python's default encoding. (`sys.getdefaultencoding`) - - :param incoming: Text's current encoding - :param encoding: Expected encoding for text (Default UTF-8) - :param errors: Errors handling policy. See here for valid - values http://docs.python.org/2/library/codecs.html - :returns: text or a bytestring `encoding` encoded - representation of it. - :raises TypeError: If text is not an instance of str - """ - if not isinstance(text, (six.string_types, six.binary_type)): - raise TypeError("%s can't be encoded" % type(text)) - - if not incoming: - incoming = (sys.stdin.encoding or - sys.getdefaultencoding()) - - if isinstance(text, six.text_type): - return text.encode(encoding, errors) - elif text and encoding != incoming: - # Decode text before encoding it with `encoding` - text = safe_decode(text, incoming, errors) - return text.encode(encoding, errors) - else: - return text - - -def string_to_bytes(text, unit_system='IEC', return_int=False): - """Converts a string into an float representation of bytes. - - The units supported for IEC :: - - Kb(it), Kib(it), Mb(it), Mib(it), Gb(it), Gib(it), Tb(it), Tib(it) - KB, KiB, MB, MiB, GB, GiB, TB, TiB - - The units supported for SI :: - - kb(it), Mb(it), Gb(it), Tb(it) - kB, MB, GB, TB - - Note that the SI unit system does not support capital letter 'K' - - :param text: String input for bytes size conversion. - :param unit_system: Unit system for byte size conversion. - :param return_int: If True, returns integer representation of text - in bytes. (default: decimal) - :returns: Numerical representation of text in bytes. - :raises ValueError: If text has an invalid value. - - """ - try: - base, reg_ex = UNIT_SYSTEM_INFO[unit_system] - except KeyError: - msg = _('Invalid unit system: "%s"') % unit_system - raise ValueError(msg) - match = reg_ex.match(text) - if match: - magnitude = float(match.group(1)) - unit_prefix = match.group(2) - if match.group(3) in ['b', 'bit']: - magnitude /= 8 - else: - msg = _('Invalid string format: %s') % text - raise ValueError(msg) - if not unit_prefix: - res = magnitude - else: - res = magnitude * pow(base, UNIT_PREFIX_EXPONENT[unit_prefix]) - if return_int: - return int(math.ceil(res)) - return res - - -def to_slug(value, incoming=None, errors="strict"): - """Normalize string. - - Convert to lowercase, remove non-word characters, and convert spaces - to hyphens. - - Inspired by Django's `slugify` filter. - - :param value: Text to slugify - :param incoming: Text's current encoding - :param errors: Errors handling policy. See here for valid - values http://docs.python.org/2/library/codecs.html - :returns: slugified unicode representation of `value` - :raises TypeError: If text is not an instance of str - """ - value = safe_decode(value, incoming, errors) - # NOTE(aababilov): no need to use safe_(encode|decode) here: - # encodings are always "ascii", error handling is always "ignore" - # and types are always known (first: unicode; second: str) - value = unicodedata.normalize("NFKD", value).encode( - "ascii", "ignore").decode("ascii") - value = SLUGIFY_STRIP_RE.sub("", value).strip().lower() - return SLUGIFY_HYPHENATE_RE.sub("-", value) - - -def mask_password(message, secret="***"): - """Replace password with 'secret' in message. - - :param message: The string which includes security information. - :param secret: value with which to replace passwords. - :returns: The unicode value of message with the password fields masked. - - For example: - - >>> mask_password("'adminPass' : 'aaaaa'") - "'adminPass' : '***'" - >>> mask_password("'admin_pass' : 'aaaaa'") - "'admin_pass' : '***'" - >>> mask_password('"password" : "aaaaa"') - '"password" : "***"' - >>> mask_password("'original_password' : 'aaaaa'") - "'original_password' : '***'" - >>> mask_password("u'original_password' : u'aaaaa'") - "u'original_password' : u'***'" - """ - try: - message = six.text_type(message) - except UnicodeDecodeError: - # NOTE(jecarey): Temporary fix to handle cases where message is a - # byte string. A better solution will be provided in Kilo. - pass - - # NOTE(ldbragst): Check to see if anything in message contains any key - # specified in _SANITIZE_KEYS, if not then just return the message since - # we don't have to mask any passwords. - if not any(key in message for key in _SANITIZE_KEYS): - return message - - substitute = r'\g<1>' + secret + r'\g<2>' - for pattern in _SANITIZE_PATTERNS_2: - message = re.sub(pattern, substitute, message) - - substitute = r'\g<1>' + secret - for pattern in _SANITIZE_PATTERNS_1: - message = re.sub(pattern, substitute, message) - - return message diff --git a/watcherclient/shell.py b/watcherclient/shell.py index 72ea50c..e51cba6 100644 --- a/watcherclient/shell.py +++ b/watcherclient/shell.py @@ -30,16 +30,12 @@ from keystoneclient import exceptions as ks_exc from keystoneclient import session as kssession import six.moves.urllib.parse as urlparse - import watcherclient from watcherclient import client as watcher_client +from watcherclient.common import cliutils +from watcherclient.common.i18n import _ from watcherclient.common import utils from watcherclient import exceptions as exc -from watcherclient.openstack.common._i18n import _ -from watcherclient.openstack.common import cliutils -from watcherclient.openstack.common import gettextutils - -gettextutils.install('watcherclient') class WatcherShell(object): diff --git a/watcherclient/tests/test_utils.py b/watcherclient/tests/test_utils.py index d8fb170..fe7f55c 100644 --- a/watcherclient/tests/test_utils.py +++ b/watcherclient/tests/test_utils.py @@ -17,8 +17,8 @@ import mock +from watcherclient.common.apiclient import exceptions as exc from watcherclient.common import utils -from watcherclient import exceptions as exc from watcherclient.tests import utils as test_utils diff --git a/watcherclient/tests/v1/test_action_plan_shell.py b/watcherclient/tests/v1/test_action_plan_shell.py index f16b618..f667f91 100644 --- a/watcherclient/tests/v1/test_action_plan_shell.py +++ b/watcherclient/tests/v1/test_action_plan_shell.py @@ -16,9 +16,9 @@ import mock +from watcherclient.common import cliutils from watcherclient.common import utils as commonutils -from watcherclient.openstack.common.apiclient.exceptions import ValidationError -from watcherclient.openstack.common import cliutils +from watcherclient import exceptions from watcherclient.tests import utils import watcherclient.v1.action_plan_shell as ap_shell @@ -52,8 +52,9 @@ class ActionPlanShellTest(utils.BaseTestCase): args = mock.MagicMock() setattr(args, 'action-plan', 'not_uuid') - self.assertRaises(ValidationError, ap_shell.do_action_plan_show, - client_mock, args) + self.assertRaises( + exceptions.ValidationError, + ap_shell.do_action_plan_show, client_mock, args) def test_do_action_plan_delete(self): client_mock = mock.MagicMock() @@ -70,8 +71,9 @@ class ActionPlanShellTest(utils.BaseTestCase): args = mock.MagicMock() setattr(args, 'action-plan', ['not_uuid']) - self.assertRaises(ValidationError, ap_shell.do_action_plan_delete, - client_mock, args) + self.assertRaises( + exceptions.ValidationError, + ap_shell.do_action_plan_delete, client_mock, args) def test_do_action_plan_delete_multiple(self): client_mock = mock.MagicMock() @@ -93,8 +95,9 @@ class ActionPlanShellTest(utils.BaseTestCase): "not_uuid", "a5199d0e-0702-4613-9234-5ae2af8dafeb"]) - self.assertRaises(ValidationError, ap_shell.do_action_plan_delete, - client_mock, args) + self.assertRaises( + exceptions.ValidationError, + ap_shell.do_action_plan_delete, client_mock, args) client_mock.action_plan.delete.assert_has_calls( [mock.call('a5199d0e-0702-4613-9234-5ae2af8dafea')]) @@ -121,8 +124,9 @@ class ActionPlanShellTest(utils.BaseTestCase): args.op = 'add' args.attributes = [['arg1=val1', 'arg2=val2']] - self.assertRaises(ValidationError, ap_shell.do_action_plan_update, - client_mock, args) + self.assertRaises( + exceptions.ValidationError, + ap_shell.do_action_plan_update, client_mock, args) def test_do_action_plan_start(self): client_mock = mock.MagicMock() @@ -144,5 +148,6 @@ class ActionPlanShellTest(utils.BaseTestCase): action_plan = 'not_uuid' setattr(args, 'action-plan', action_plan) - self.assertRaises(ValidationError, ap_shell.do_action_plan_start, - client_mock, args) + self.assertRaises( + exceptions.ValidationError, + ap_shell.do_action_plan_start, client_mock, args) diff --git a/watcherclient/tests/v1/test_action_shell.py b/watcherclient/tests/v1/test_action_shell.py index 4af8b02..13a15d6 100644 --- a/watcherclient/tests/v1/test_action_shell.py +++ b/watcherclient/tests/v1/test_action_shell.py @@ -16,9 +16,9 @@ import mock +from watcherclient.common import cliutils from watcherclient.common import utils as commonutils -from watcherclient.openstack.common.apiclient.exceptions import ValidationError -from watcherclient.openstack.common import cliutils +from watcherclient import exceptions from watcherclient.tests import utils import watcherclient.v1.action_shell as a_shell @@ -64,7 +64,7 @@ class ActionShellTest(utils.BaseTestCase): args = mock.MagicMock() args.action = 'not_uuid' - self.assertRaises(ValidationError, a_shell.do_action_show, + self.assertRaises(exceptions.ValidationError, a_shell.do_action_show, client_mock, args) def test_do_action_delete(self): @@ -81,7 +81,7 @@ class ActionShellTest(utils.BaseTestCase): args = mock.MagicMock() args.action = ['not_uuid'] - self.assertRaises(ValidationError, a_shell.do_action_delete, + self.assertRaises(exceptions.ValidationError, a_shell.do_action_delete, client_mock, args) def test_do_action_delete_multiple(self): @@ -102,7 +102,7 @@ class ActionShellTest(utils.BaseTestCase): 'not_uuid' 'a5199d0e-0702-4613-9234-5ae2af8dafeb'] - self.assertRaises(ValidationError, a_shell.do_action_delete, + self.assertRaises(exceptions.ValidationError, a_shell.do_action_delete, client_mock, args) client_mock.action.delete.assert_has_calls( [mock.call('a5199d0e-0702-4613-9234-5ae2af8dafea')]) @@ -128,5 +128,5 @@ class ActionShellTest(utils.BaseTestCase): args.op = 'add' args.attributes = [['arg1=val1', 'arg2=val2']] - self.assertRaises(ValidationError, a_shell.do_action_update, + self.assertRaises(exceptions.ValidationError, a_shell.do_action_update, client_mock, args) diff --git a/watcherclient/tests/v1/test_audit_shell.py b/watcherclient/tests/v1/test_audit_shell.py index bc014d4..ba4fa81 100644 --- a/watcherclient/tests/v1/test_audit_shell.py +++ b/watcherclient/tests/v1/test_audit_shell.py @@ -16,9 +16,9 @@ import mock +from watcherclient.common import cliutils from watcherclient.common import utils as commonutils -from watcherclient.openstack.common.apiclient.exceptions import ValidationError -from watcherclient.openstack.common import cliutils +from watcherclient import exceptions from watcherclient.tests import utils import watcherclient.v1.audit_shell as a_shell @@ -53,7 +53,7 @@ class AuditShellTest(utils.BaseTestCase): args = mock.MagicMock() args.audit = 'not_uuid' - self.assertRaises(ValidationError, a_shell.do_audit_show, + self.assertRaises(exceptions.ValidationError, a_shell.do_audit_show, client_mock, args) def test_do_audit_delete(self): @@ -70,7 +70,7 @@ class AuditShellTest(utils.BaseTestCase): args = mock.MagicMock() args.audit = ['not_uuid'] - self.assertRaises(ValidationError, a_shell.do_audit_delete, + self.assertRaises(exceptions.ValidationError, a_shell.do_audit_delete, client_mock, args) def test_do_audit_delete_multiple(self): @@ -91,7 +91,7 @@ class AuditShellTest(utils.BaseTestCase): 'not_uuid', 'a5199d0e-0702-4613-9234-5ae2af8dafeb'] - self.assertRaises(ValidationError, a_shell.do_audit_delete, + self.assertRaises(exceptions.ValidationError, a_shell.do_audit_delete, client_mock, args) client_mock.audit.delete.assert_has_calls( [mock.call('a5199d0e-0702-4613-9234-5ae2af8dafea')]) @@ -117,7 +117,7 @@ class AuditShellTest(utils.BaseTestCase): args.op = 'add' args.attributes = [['arg1=val1', 'arg2=val2']] - self.assertRaises(ValidationError, a_shell.do_audit_update, + self.assertRaises(exceptions.ValidationError, a_shell.do_audit_update, client_mock, args) def test_do_audit_create(self): diff --git a/watcherclient/tests/v1/test_audit_template_shell.py b/watcherclient/tests/v1/test_audit_template_shell.py index f78ec0a..7b842d4 100644 --- a/watcherclient/tests/v1/test_audit_template_shell.py +++ b/watcherclient/tests/v1/test_audit_template_shell.py @@ -16,8 +16,8 @@ import mock +from watcherclient.common import cliutils from watcherclient.common import utils as commonutils -from watcherclient.openstack.common import cliutils from watcherclient.tests import utils import watcherclient.v1.audit_template_shell as at_shell diff --git a/watcherclient/tests/v1/test_goal_shell.py b/watcherclient/tests/v1/test_goal_shell.py index 8452057..2296369 100644 --- a/watcherclient/tests/v1/test_goal_shell.py +++ b/watcherclient/tests/v1/test_goal_shell.py @@ -15,7 +15,8 @@ # under the License. import mock -from watcherclient.openstack.common import cliutils + +from watcherclient.common import cliutils from watcherclient.tests import utils import watcherclient.v1.goal_shell as a_shell diff --git a/watcherclient/tests/v1/test_metric_collector_shell.py b/watcherclient/tests/v1/test_metric_collector_shell.py index cb75ff8..320aa59 100644 --- a/watcherclient/tests/v1/test_metric_collector_shell.py +++ b/watcherclient/tests/v1/test_metric_collector_shell.py @@ -16,8 +16,8 @@ import mock +from watcherclient.common import cliutils from watcherclient.common import utils as commonutils -from watcherclient.openstack.common import cliutils from watcherclient.tests import utils import watcherclient.v1.metric_collector_shell as mc_shell diff --git a/watcherclient/v1/action_plan_shell.py b/watcherclient/v1/action_plan_shell.py index 3371fe5..878a225 100644 --- a/watcherclient/v1/action_plan_shell.py +++ b/watcherclient/v1/action_plan_shell.py @@ -18,9 +18,10 @@ # import argparse from oslo_utils import uuidutils + +from watcherclient.common import cliutils from watcherclient.common import utils -from watcherclient.openstack.common.apiclient.exceptions import ValidationError -from watcherclient.openstack.common import cliutils +from watcherclient import exceptions from watcherclient.v1 import resource_fields as res_fields @@ -41,7 +42,7 @@ def do_action_plan_show(cc, args): action_plan = cc.action_plan.get(action_plan_uuid) _print_action_plan_show(action_plan) else: - raise ValidationError() + raise exceptions.ValidationError() @cliutils.arg( @@ -105,7 +106,7 @@ def do_action_plan_delete(cc, args): cc.action_plan.delete(p) print ('Deleted action plan %s' % p) else: - raise ValidationError() + raise exceptions.ValidationError() @cliutils.arg( @@ -133,7 +134,7 @@ def do_action_plan_update(cc, args): action_plan = cc.action_plan.update(action_plan_uuid, patch) _print_action_plan_show(action_plan) else: - raise ValidationError() + raise exceptions.ValidationError() @cliutils.arg('action-plan', @@ -153,4 +154,4 @@ def do_action_plan_start(cc, args): action_plan = cc.action_plan.update(action_plan_uuid, patch) _print_action_plan_show(action_plan) else: - raise ValidationError() + raise exceptions.ValidationError() diff --git a/watcherclient/v1/action_shell.py b/watcherclient/v1/action_shell.py index 379efe9..4049b0c 100644 --- a/watcherclient/v1/action_shell.py +++ b/watcherclient/v1/action_shell.py @@ -18,9 +18,10 @@ # import argparse from oslo_utils import uuidutils + +from watcherclient.common import cliutils from watcherclient.common import utils -from watcherclient.openstack.common.apiclient.exceptions import ValidationError -from watcherclient.openstack.common import cliutils +from watcherclient import exceptions from watcherclient.v1 import resource_fields as res_fields @@ -40,7 +41,7 @@ def do_action_show(cc, args): action = cc.action.get(args.action) _print_action_show(action) else: - raise ValidationError() + raise exceptions.ValidationError() @cliutils.arg( @@ -110,7 +111,7 @@ def do_action_delete(cc, args): cc.action.delete(p) print ('Deleted action %s' % p) else: - raise ValidationError() + raise exceptions.ValidationError() @cliutils.arg('action', metavar='<action>', help="UUID of the action.") @@ -134,4 +135,4 @@ def do_action_update(cc, args): action = cc.action.update(args.action, patch) _print_action_show(action) else: - raise ValidationError() + raise exceptions.ValidationError() diff --git a/watcherclient/v1/audit_shell.py b/watcherclient/v1/audit_shell.py index 482eeda..a882a1b 100644 --- a/watcherclient/v1/audit_shell.py +++ b/watcherclient/v1/audit_shell.py @@ -18,9 +18,10 @@ # import argparse from oslo_utils import uuidutils + +from watcherclient.common import cliutils from watcherclient.common import utils -from watcherclient.openstack.common.apiclient.exceptions import ValidationError -from watcherclient.openstack.common import cliutils +from watcherclient import exceptions from watcherclient.v1 import resource_fields as res_fields @@ -41,7 +42,7 @@ def do_audit_show(cc, args): audit = cc.audit.get(args.audit) _print_audit_show(audit) else: - raise ValidationError() + raise exceptions.ValidationError() @cliutils.arg( @@ -132,7 +133,7 @@ def do_audit_delete(cc, args): cc.audit.delete(p) print ('Deleted audit %s' % p) else: - raise ValidationError() + raise exceptions.ValidationError() @cliutils.arg( @@ -159,4 +160,4 @@ def do_audit_update(cc, args): audit = cc.audit.update(args.audit, patch) _print_audit_show(audit) else: - raise ValidationError() + raise exceptions.ValidationError() diff --git a/watcherclient/v1/audit_template_shell.py b/watcherclient/v1/audit_template_shell.py index b336ba0..e460a14 100644 --- a/watcherclient/v1/audit_template_shell.py +++ b/watcherclient/v1/audit_template_shell.py @@ -17,8 +17,8 @@ # import argparse +from watcherclient.common import cliutils from watcherclient.common import utils -from watcherclient.openstack.common import cliutils from watcherclient.v1 import resource_fields as res_fields diff --git a/watcherclient/v1/goal_shell.py b/watcherclient/v1/goal_shell.py index 985d704..a2eae88 100644 --- a/watcherclient/v1/goal_shell.py +++ b/watcherclient/v1/goal_shell.py @@ -15,8 +15,8 @@ # License for the specific language governing permissions and limitations # under the License. +from watcherclient.common import cliutils from watcherclient.common import utils -from watcherclient.openstack.common import cliutils from watcherclient.v1 import resource_fields as res_fields diff --git a/watcherclient/v1/metric_collector_shell.py b/watcherclient/v1/metric_collector_shell.py index 8006a1a..6d0061a 100644 --- a/watcherclient/v1/metric_collector_shell.py +++ b/watcherclient/v1/metric_collector_shell.py @@ -17,8 +17,8 @@ # import argparse +from watcherclient.common import cliutils from watcherclient.common import utils -from watcherclient.openstack.common import cliutils from watcherclient.v1 import resource_fields as res_fields