From 0aa3c206a38b681e106ca8bfd82cab27cd7e1861 Mon Sep 17 00:00:00 2001
From: Dean Troyer <dtroyer@gmail.com>
Date: Mon, 29 Jul 2013 11:11:11 -0500
Subject: [PATCH] Remove tenant round 1 - global options

Change the global auth options to use 'project', leave the original
tenant options in place but silent for compatability with the existing
project CLI auth options.  This is the only compatibility for tenant
usage in this changeover.

Change-Id: I3cce6e552f18822cc9f445ec5f301b0f5d9003f8
---
 README.rst                              |  6 +--
 openstackclient/common/clientmanager.py |  8 +--
 openstackclient/compute/client.py       |  2 +-
 openstackclient/identity/client.py      |  4 +-
 openstackclient/shell.py                | 34 +++++++++----
 openstackclient/tests/test_shell.py     | 68 +++++++++++++++++--------
 openstackclient/volume/client.py        |  2 +-
 7 files changed, 82 insertions(+), 42 deletions(-)

diff --git a/README.rst b/README.rst
index 292e05258b..8f5b0ab76e 100644
--- a/README.rst
+++ b/README.rst
@@ -52,12 +52,12 @@ Configuration
 =============
 
 The CLI is configured via environment variables and command-line
-options as listed in http://wiki.openstack.org/UnifiedCLI/Authentication.
+options as listed in https://wiki.openstack.org/wiki/OpenStackClient/Authentication.
 
 The 'password flow' variation is most commonly used::
 
    export OS_AUTH_URL=<url-to-openstack-identity>
-   export OS_TENANT_NAME=<tenant-name>
+   export OS_PROJECT_NAME=<project-name>
    export OS_USERNAME=<user-name>
    export OS_PASSWORD=<password>  # (optional)
    export OS_USE_KEYRING=true  # (optional)
@@ -65,7 +65,7 @@ The 'password flow' variation is most commonly used::
 The corresponding command-line options look very similar::
 
    --os-auth-url <url>
-   --os-tenant-name <tenant-name>
+   --os-project-name <project-name>
    --os-username <user-name>
    [--os-password <password>]
    [--os-use-keyring]
diff --git a/openstackclient/common/clientmanager.py b/openstackclient/common/clientmanager.py
index a1b838a22e..fdeca139ec 100644
--- a/openstackclient/common/clientmanager.py
+++ b/openstackclient/common/clientmanager.py
@@ -46,14 +46,14 @@ class ClientManager(object):
     image = ClientCache(image_client.make_client)
     volume = ClientCache(volume_client.make_client)
 
-    def __init__(self, token=None, url=None, auth_url=None, tenant_name=None,
-                 tenant_id=None, username=None, password=None,
+    def __init__(self, token=None, url=None, auth_url=None, project_name=None,
+                 project_id=None, username=None, password=None,
                  region_name=None, api_version=None):
         self._token = token
         self._url = url
         self._auth_url = auth_url
-        self._tenant_name = tenant_name
-        self._tenant_id = tenant_id
+        self._project_name = project_name
+        self._project_id = project_id
         self._username = username
         self._password = password
         self._region_name = region_name
diff --git a/openstackclient/compute/client.py b/openstackclient/compute/client.py
index f7ebfe3e8e..9bd40a4fc5 100644
--- a/openstackclient/compute/client.py
+++ b/openstackclient/compute/client.py
@@ -36,7 +36,7 @@ def make_client(instance):
     client = compute_client(
         username=instance._username,
         api_key=instance._password,
-        project_id=instance._tenant_name,
+        project_id=instance._project_name,
         auth_url=instance._auth_url,
         # FIXME(dhellmann): add constructor argument for this
         insecure=False,
diff --git a/openstackclient/identity/client.py b/openstackclient/identity/client.py
index 748d166683..ed4882aab8 100644
--- a/openstackclient/identity/client.py
+++ b/openstackclient/identity/client.py
@@ -43,8 +43,8 @@ def make_client(instance):
         client = identity_client(
             username=instance._username,
             password=instance._password,
-            tenant_name=instance._tenant_name,
-            tenant_id=instance._tenant_id,
+            tenant_name=instance._project_name,
+            tenant_id=instance._project_id,
             auth_url=instance._auth_url,
             region_name=instance._region_name)
     return client
diff --git a/openstackclient/shell.py b/openstackclient/shell.py
index dad4a693a1..7bc0a44a04 100644
--- a/openstackclient/shell.py
+++ b/openstackclient/shell.py
@@ -15,6 +15,7 @@
 
 """Command-line interface to the OpenStack APIs"""
 
+import argparse
 import getpass
 import logging
 import os
@@ -110,16 +111,30 @@ class OpenStackShell(app.App):
             metavar='<auth-url>',
             default=env('OS_AUTH_URL'),
             help='Authentication URL (Env: OS_AUTH_URL)')
+        parser.add_argument(
+            '--os-project-name',
+            metavar='<auth-project-name>',
+            default=env('OS_PROJECT_NAME', default=env('OS_TENANT_NAME')),
+            help='Authentication project name (Env: OS_PROJECT_NAME)',
+        )
         parser.add_argument(
             '--os-tenant-name',
             metavar='<auth-tenant-name>',
-            default=env('OS_TENANT_NAME'),
-            help='Authentication tenant name (Env: OS_TENANT_NAME)')
+            dest='os_project_name',
+            help=argparse.SUPPRESS,
+        )
+        parser.add_argument(
+            '--os-project-id',
+            metavar='<auth-project-id>',
+            default=env('OS_PROJECT_ID', default=env('OS_TENANT_ID')),
+            help='Authentication project ID (Env: OS_PROJECT_ID)',
+        )
         parser.add_argument(
             '--os-tenant-id',
             metavar='<auth-tenant-id>',
-            default=env('OS_TENANT_ID'),
-            help='Authentication tenant ID (Env: OS_TENANT_ID)')
+            dest='os_project_id',
+            help=argparse.SUPPRESS,
+        )
         parser.add_argument(
             '--os-username',
             metavar='<auth-username>',
@@ -247,10 +262,11 @@ class OpenStackShell(app.App):
                         " either --os-password, or env[OS_PASSWORD], "
                         " or prompted response")
 
-            if not (self.options.os_tenant_id or self.options.os_tenant_name):
+            if not (self.options.os_project_id
+                    or self.options.os_project_name):
                 raise exc.CommandError(
-                    "You must provide a tenant_id via"
-                    " either --os-tenant-id or via env[OS_TENANT_ID]")
+                    "You must provide a project id via"
+                    " either --os-project-id or via env[OS_PROJECT_ID]")
 
             if not self.options.os_auth_url:
                 raise exc.CommandError(
@@ -261,8 +277,8 @@ class OpenStackShell(app.App):
             token=self.options.os_token,
             url=self.options.os_url,
             auth_url=self.options.os_auth_url,
-            tenant_name=self.options.os_tenant_name,
-            tenant_id=self.options.os_tenant_id,
+            project_name=self.options.os_project_name,
+            project_id=self.options.os_project_id,
             username=self.options.os_username,
             password=self.options.os_password,
             region_name=self.options.os_region_name,
diff --git a/openstackclient/tests/test_shell.py b/openstackclient/tests/test_shell.py
index ca87997f67..be9c5d49b1 100644
--- a/openstackclient/tests/test_shell.py
+++ b/openstackclient/tests/test_shell.py
@@ -22,8 +22,8 @@ from openstackclient.tests import utils
 
 DEFAULT_USERNAME = "username"
 DEFAULT_PASSWORD = "password"
-DEFAULT_TENANT_ID = "xxxx-yyyy-zzzz"
-DEFAULT_TENANT_NAME = "tenant"
+DEFAULT_PROJECT_ID = "xxxx-yyyy-zzzz"
+DEFAULT_PROJECT_NAME = "project"
 DEFAULT_TOKEN = "token"
 DEFAULT_REGION_NAME = "ZZ9_Plural_Z_Alpha"
 DEFAULT_AUTH_URL = "http://127.0.0.1:5000/v2.0/"
@@ -68,16 +68,16 @@ class TestShell(utils.TestCase):
     def _assert_password_auth(self, cmd_options, default_args):
         with mock.patch("openstackclient.shell.OpenStackShell.initialize_app",
                         self.app):
-            _shell, _cmd = make_shell(), cmd_options + " list tenant"
+            _shell, _cmd = make_shell(), cmd_options + " list project"
             fake_execute(_shell, _cmd)
 
-            self.app.assert_called_with(["list", "tenant"])
+            self.app.assert_called_with(["list", "project"])
             self.assertEqual(_shell.options.os_auth_url,
                              default_args["auth_url"])
-            self.assertEqual(_shell.options.os_tenant_id,
-                             default_args["tenant_id"])
-            self.assertEqual(_shell.options.os_tenant_name,
-                             default_args["tenant_name"])
+            self.assertEqual(_shell.options.os_project_id,
+                             default_args["project_id"])
+            self.assertEqual(_shell.options.os_project_name,
+                             default_args["project_name"])
             self.assertEqual(_shell.options.os_username,
                              default_args["username"])
             self.assertEqual(_shell.options.os_password,
@@ -149,8 +149,32 @@ class TestShellPasswordAuth(TestShell):
         flag = "--os-auth-url " + DEFAULT_AUTH_URL
         kwargs = {
             "auth_url": DEFAULT_AUTH_URL,
-            "tenant_id": "",
-            "tenant_name": "",
+            "project_id": "",
+            "project_name": "",
+            "username": "",
+            "password": "",
+            "region_name": ""
+        }
+        self._assert_password_auth(flag, kwargs)
+
+    def test_only_project_id_flow(self):
+        flag = "--os-project-id " + DEFAULT_PROJECT_ID
+        kwargs = {
+            "auth_url": "",
+            "project_id": DEFAULT_PROJECT_ID,
+            "project_name": "",
+            "username": "",
+            "password": "",
+            "region_name": ""
+        }
+        self._assert_password_auth(flag, kwargs)
+
+    def test_only_project_name_flow(self):
+        flag = "--os-project-name " + DEFAULT_PROJECT_NAME
+        kwargs = {
+            "auth_url": "",
+            "project_id": "",
+            "project_name": DEFAULT_PROJECT_NAME,
             "username": "",
             "password": "",
             "region_name": ""
@@ -158,11 +182,11 @@ class TestShellPasswordAuth(TestShell):
         self._assert_password_auth(flag, kwargs)
 
     def test_only_tenant_id_flow(self):
-        flag = "--os-tenant-id " + DEFAULT_TENANT_ID
+        flag = "--os-tenant-id " + DEFAULT_PROJECT_ID
         kwargs = {
             "auth_url": "",
-            "tenant_id": DEFAULT_TENANT_ID,
-            "tenant_name": "",
+            "project_id": DEFAULT_PROJECT_ID,
+            "project_name": "",
             "username": "",
             "password": "",
             "region_name": ""
@@ -170,11 +194,11 @@ class TestShellPasswordAuth(TestShell):
         self._assert_password_auth(flag, kwargs)
 
     def test_only_tenant_name_flow(self):
-        flag = "--os-tenant-name " + DEFAULT_TENANT_NAME
+        flag = "--os-tenant-name " + DEFAULT_PROJECT_NAME
         kwargs = {
             "auth_url": "",
-            "tenant_id": "",
-            "tenant_name": DEFAULT_TENANT_NAME,
+            "project_id": "",
+            "project_name": DEFAULT_PROJECT_NAME,
             "username": "",
             "password": "",
             "region_name": ""
@@ -185,8 +209,8 @@ class TestShellPasswordAuth(TestShell):
         flag = "--os-username " + DEFAULT_USERNAME
         kwargs = {
             "auth_url": "",
-            "tenant_id": "",
-            "tenant_name": "",
+            "project_id": "",
+            "project_name": "",
             "username": DEFAULT_USERNAME,
             "password": "",
             "region_name": ""
@@ -197,8 +221,8 @@ class TestShellPasswordAuth(TestShell):
         flag = "--os-password " + DEFAULT_PASSWORD
         kwargs = {
             "auth_url": "",
-            "tenant_id": "",
-            "tenant_name": "",
+            "project_id": "",
+            "project_name": "",
             "username": "",
             "password": DEFAULT_PASSWORD,
             "region_name": ""
@@ -209,8 +233,8 @@ class TestShellPasswordAuth(TestShell):
         flag = "--os-region-name " + DEFAULT_REGION_NAME
         kwargs = {
             "auth_url": "",
-            "tenant_id": "",
-            "tenant_name": "",
+            "project_id": "",
+            "project_name": "",
             "username": "",
             "password": "",
             "region_name": DEFAULT_REGION_NAME
diff --git a/openstackclient/volume/client.py b/openstackclient/volume/client.py
index c1acff2fe6..92f3b14a48 100644
--- a/openstackclient/volume/client.py
+++ b/openstackclient/volume/client.py
@@ -38,7 +38,7 @@ def make_client(instance):
     client = volume_client(
         username=instance._username,
         api_key=instance._password,
-        project_id=instance._tenant_name,
+        project_id=instance._project_name,
         auth_url=instance._auth_url,
     )