Add support for administrative access (via X-Moniker-Sudo-Tenant-ID header)

Change-Id: Ia92f9c33cebb529333de72765371189ea11b72bc
This commit is contained in:
Davide Guerri 2013-02-24 16:47:50 +01:00
parent e824b5b470
commit c6a1f56ed6
4 changed files with 12 additions and 3 deletions

@ -22,13 +22,14 @@ from keystoneclient.v2_0.client import Client
class KeystoneAuth(AuthBase): class KeystoneAuth(AuthBase):
def __init__(self, auth_url, username=None, password=None, tenant_id=None, def __init__(self, auth_url, username=None, password=None, tenant_id=None,
tenant_name=None, token=None, service_type=None, tenant_name=None, token=None, service_type=None,
endpoint_type=None): endpoint_type=None, sudo_tenant_id=None):
self.auth_url = str(auth_url).rstrip('/') self.auth_url = str(auth_url).rstrip('/')
self.username = username self.username = username
self.password = password self.password = password
self.tenant_id = tenant_id self.tenant_id = tenant_id
self.tenant_name = tenant_name self.tenant_name = tenant_name
self.token = token self.token = token
self.sudo_tenant_id = sudo_tenant_id
if (not username and not password) and not token: if (not username and not password) and not token:
raise ValueError('A username and password, or token is required') raise ValueError('A username and password, or token is required')
@ -47,6 +48,9 @@ class KeystoneAuth(AuthBase):
request.headers['X-Auth-Token'] = self.token request.headers['X-Auth-Token'] = self.token
if self.sudo_tenant_id:
request.headers['X-Moniker-Sudo-Tenant-ID'] = self.sudo_tenant_id
return request return request
def get_ksclient(self): def get_ksclient(self):

@ -35,6 +35,7 @@ class Command(CliffCommand):
'token': self.app.options.os_token, 'token': self.app.options.os_token,
'service_type': self.app.options.os_service_type, 'service_type': self.app.options.os_service_type,
'region_name': self.app.options.os_region_name, 'region_name': self.app.options.os_region_name,
'sudo_tenant_id': self.app.options.sudo_tenant_id
} }
if client_args['endpoint'] is None and client_args['auth_url'] is None: if client_args['endpoint'] is None and client_args['auth_url'] is None:

@ -67,4 +67,8 @@ class MonikerShell(App):
default=os.environ.get('OS_REGION_NAME'), default=os.environ.get('OS_REGION_NAME'),
help="Defaults to env[OS_REGION_NAME]") help="Defaults to env[OS_REGION_NAME]")
parser.add_argument('--sudo-tenant-id',
default=os.environ.get('MONIKER_SUDO_TENANT_ID'),
help="Defaults to env[MONIKER_SUDO_TENANT_ID]")
return parser return parser

@ -28,7 +28,7 @@ class Client(object):
def __init__(self, endpoint=None, auth_url=None, username=None, def __init__(self, endpoint=None, auth_url=None, username=None,
password=None, tenant_id=None, tenant_name=None, token=None, password=None, tenant_id=None, tenant_name=None, token=None,
region_name=None, service_type='dns', region_name=None, service_type='dns',
endpoint_type='publicURL'): endpoint_type='publicURL', sudo_tenant_id=None):
""" """
:param endpoint: Endpoint URL :param endpoint: Endpoint URL
:param auth_url: Keystone auth_url :param auth_url: Keystone auth_url
@ -43,7 +43,7 @@ class Client(object):
if auth_url: if auth_url:
auth = KeystoneAuth(auth_url, username, password, tenant_id, auth = KeystoneAuth(auth_url, username, password, tenant_id,
tenant_name, token, service_type, tenant_name, token, service_type,
endpoint_type) endpoint_type, sudo_tenant_id)
self.endpoint = auth.get_url() self.endpoint = auth.get_url()
elif endpoint: elif endpoint:
auth = None auth = None