Skip to content

Commit 11c7de8

Browse files
author
cmart
committed
Support for Keystone domains, using Keystone's session API
1 parent 9796b40 commit 11c7de8

2 files changed

Lines changed: 50 additions & 24 deletions

File tree

cinderback.py

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
import sys
2828
import time
2929

30-
import keystoneauth1
30+
from keystoneauth1 import loading
31+
from keystoneauth1 import session
3132
from cinderclient import client
3233
from cinderclient import v2
3334
from cinderclient import __version__ as cinder_version
@@ -138,6 +139,20 @@ def error(self, message):
138139
default=os.environ.get('OS_AUTH_URL', ''),
139140
help='URL for the authentication service. '
140141
'Default=env[OS_AUTH_URL]')
142+
parser.add_argument('--os-project-domain-name',
143+
metavar='<project-domain-name>',
144+
dest='project_domain_name',
145+
default=os.environ.get('OS_PROJECT_DOMAIN_NAME',
146+
'Default'),
147+
help='Domain name for OpenStack project. '
148+
'Default=env[OS_PROJECT_DOMAIN_NAME]')
149+
parser.add_argument('--os-user-domain-name',
150+
metavar='<user-domain-name>',
151+
dest='user_domain_name',
152+
default=os.environ.get('OS_USER_DOMAIN_NAME',
153+
'Default'),
154+
help='Domain name for OpenStack user. '
155+
'Default=env[OS_USER_DOMAIN_NAME]')
141156
parser.add_argument('-q', '--quiet', dest='quiet',
142157
default=False, action='store_true',
143158
help='No output except warnings or errors')
@@ -324,23 +339,30 @@ class BackupService(object):
324339
WANT_V = '1.1.1'
325340
HAS_SEARCH_OPTS = LooseVersion(cinder_version) >= LooseVersion(WANT_V)
326341

327-
def __init__(self, username, api_key, project_id, auth_url,
328-
poll_delay=None, name_prefix='auto_backup_',
329-
max_secs_gbi=None):
342+
def __init__(self, username, api_key, project_name, auth_url,
343+
project_domain_name, user_domain_name, poll_delay=None,
344+
name_prefix='auto_backup_', max_secs_gbi=None):
330345
super(BackupService, self).__init__()
331346
self.username = username
332347
self.api_key = api_key
333-
self.project_id = project_id
348+
self.project_name = project_name
334349
self.auth_url = auth_url
350+
self.project_domain_name = project_domain_name
351+
self.user_domain_name = user_domain_name
335352
self.poll_delay = poll_delay or self.default_poll_deplay
336353
self.name_prefix = name_prefix
337354

355+
loader = loading.get_plugin_loader('password')
356+
auth = loader.load_from_options(auth_url=auth_url,
357+
username=username,
358+
password=api_key,
359+
project_name=project_name,
360+
project_domain_name=
361+
project_domain_name,
362+
user_domain_name=user_domain_name)
363+
sess = session.Session(auth=auth)
338364
# Some functionality requires API version 2
339-
self.client = client.Client(version=2,
340-
username=username,
341-
api_key=api_key,
342-
project_id=project_id,
343-
auth_url=auth_url)
365+
self.client = client.Client(2, session=sess)
344366

345367
self.status_msg = ''
346368
self.max_secs_gbi = max_secs_gbi or 300
@@ -782,25 +804,26 @@ def get_client(self, tenant_id, keep_tenant=True):
782804
if not keep_tenant:
783805
return self.client
784806

785-
auth_ref = self.client.client.auth_ref
786-
787-
# Get project ID for Keystone V3
788-
if isinstance(auth_ref, keystoneauth1.access.access.AccessInfoV3):
789-
auth_project_id = auth_ref.project_id
790-
# Get project ID for Keystone v2
791-
else:
792-
auth_project_id = auth_ref['token']['tenant']['id']
807+
auth_project_id = self.client.client.get_project_id()
793808

794809
if auth_project_id == tenant_id:
795810
return self.client
796811
else:
797812

798813
_LI("Using tenant id %s", tenant_id)
799-
return client.Client(version=2,
800-
username=self.username,
801-
api_key=self.api_key,
802-
tenant_id=tenant_id,
803-
auth_url=self.auth_url)
814+
815+
loader = loading.get_plugin_loader('password')
816+
auth = loader.load_from_options(auth_url=self.auth_url,
817+
username=self.username,
818+
password=self.api_key,
819+
project_id=tenant_id,
820+
project_domain_name=
821+
self.project_domain_name,
822+
user_domain_name=
823+
self.user_domain_name)
824+
sess = session.Session(auth=auth)
825+
# Some functionality requires API version 2
826+
return client.Client(2, session=sess)
804827

805828
def import_metadata(self, filename):
806829
"""Import backup metadata to DB from file."""
@@ -849,8 +872,10 @@ def _separator(separator):
849872
def main(args):
850873
backup = BackupService(username=args.username,
851874
api_key=args.password,
852-
project_id=args.tenant_name,
875+
project_name=args.tenant_name,
853876
auth_url=args.auth_url,
877+
project_domain_name=args.project_domain_name,
878+
user_domain_name=args.user_domain_name,
854879
max_secs_gbi=getattr(args, 'max_secs_gbi', None))
855880

856881
if not backup.is_up:

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
python-cinderclient>=1.1.1
2+
keystoneauth1

0 commit comments

Comments
 (0)