Keystone v3 support in VMTP

Change-Id: I13a0c757c199381b0c7501e080d37455843f708f
This commit is contained in:
Jinay Vora 2016-08-13 20:03:05 -04:00
parent 2ac7fbaec2
commit 2317a76b37
3 changed files with 72 additions and 48 deletions

View File

@ -14,7 +14,7 @@ python-glanceclient>=0.15.0
python-neutronclient<3,>=2.3.6 python-neutronclient<3,>=2.3.6
python-novaclient>=2.18.1 python-novaclient>=2.18.1
python-openstackclient>=0.4.1 python-openstackclient>=0.4.1
python-keystoneclient>=1.0.0 python-keystoneclient>=1.7.2
pytz>=2016.4 pytz>=2016.4
scp>=0.8.0 scp>=0.8.0
tabulate>=0.7.3 tabulate>=0.7.3

View File

@ -27,25 +27,12 @@ class Credentials(object):
dct['username'] = self.rc_username dct['username'] = self.rc_username
dct['password'] = self.rc_password dct['password'] = self.rc_password
dct['auth_url'] = self.rc_auth_url dct['auth_url'] = self.rc_auth_url
dct['tenant_name'] = self.rc_tenant_name if self.rc_identity_api_version == 3:
dct['cacert'] = self.rc_cacert dct['project_name'] = self.rc_project_name
dct['ca_cert'] = self.rc_cacert dct['project_domain_id'] = self.rc_project_domain_id
dct['region_name'] = self.rc_region_name dct['user_domain_id'] = self.rc_user_domain_id
return dct else:
dct['tenant_name'] = self.rc_tenant_name
def get_nova_credentials(self):
dct = {}
dct['username'] = self.rc_username
dct['api_key'] = self.rc_password
dct['auth_url'] = self.rc_auth_url
dct['project_id'] = self.rc_tenant_name
dct['cacert'] = self.rc_cacert
dct['region_name'] = self.rc_region_name
return dct
def get_nova_credentials_v2(self):
dct = self.get_nova_credentials()
dct['version'] = 2
return dct return dct
# #
@ -57,21 +44,23 @@ class Credentials(object):
self.rc_username = None self.rc_username = None
self.rc_tenant_name = None self.rc_tenant_name = None
self.rc_auth_url = None self.rc_auth_url = None
self.rc_cacert = None self.rc_cacert = False
self.rc_region_name = None self.rc_region_name = None
self.rc_project_name = None
self.rc_project_domain_id = None
self.rc_user_domain_id = None
self.rc_identity_api_version = 2
success = True success = True
if openrc_file: if openrc_file:
if os.path.exists(openrc_file): if os.path.exists(openrc_file):
export_re = re.compile('export OS_([A-Z_]*)="?(.*)') export_re = re.compile('export OS_([A-Z_]*)="?(.*)')
for line in open(openrc_file): for line in open(openrc_file):
line = line.strip() mstr = export_re.match(line.strip())
mstr = export_re.match(line)
if mstr: if mstr:
# get rif of posible trailing double quote # get rif of posible trailing double quote
# the first one was removed by the re # the first one was removed by the re
name = mstr.group(1) name, value = mstr.group(1), mstr.group(2)
value = mstr.group(2)
if value.endswith('"'): if value.endswith('"'):
value = value[:-1] value = value[:-1]
# get rid of password assignment # get rid of password assignment
@ -80,6 +69,11 @@ class Credentials(object):
# export OS_PASSWORD=$OS_PASSWORD_INPUT # export OS_PASSWORD=$OS_PASSWORD_INPUT
if value.startswith('$'): if value.startswith('$'):
continue continue
# Check if api version is provided
# Default is keystone v2
if name == 'IDENTITY_API_VERSION':
self.rc_identity_api_version = int(value)
# now match against wanted variable names # now match against wanted variable names
if name == 'USERNAME': if name == 'USERNAME':
self.rc_username = value self.rc_username = value
@ -93,6 +87,12 @@ class Credentials(object):
self.rc_region_name = value self.rc_region_name = value
elif name == "PASSWORD" and not pwd: elif name == "PASSWORD" and not pwd:
pwd = value pwd = value
elif name == "PROJECT_NAME":
self.rc_project_name = value
elif name == "PROJECT_DOMAIN_ID" or name == "PROJECT_DOMAIN_NAME":
self.rc_project_domain_id = value
elif name == "USER_DOMAIN_ID" or name == "USER_DOMAIN_ID":
self.rc_user_domain_id = value
else: else:
LOG.error('Error: rc file does not exist %s', openrc_file) LOG.error('Error: rc file does not exist %s', openrc_file)
success = False success = False
@ -100,18 +100,37 @@ class Credentials(object):
# no openrc file passed - we assume the variables have been # no openrc file passed - we assume the variables have been
# sourced by the calling shell # sourced by the calling shell
# just check that they are present # just check that they are present
for varname in ['OS_USERNAME', 'OS_AUTH_URL', 'OS_TENANT_NAME']: if 'OS_IDENTITY_API_VERSION' in os.environ:
if varname not in os.environ: self.rc_identity_api_version = int(os.environ['OS_IDENTITY_API_VERSION'])
LOG.warning('%s is missing', varname)
success = False if self.rc_identity_api_version == 2:
if success: for varname in ['OS_USERNAME', 'OS_AUTH_URL', 'OS_TENANT_NAME']:
self.rc_username = os.environ['OS_USERNAME'] if varname not in os.environ:
self.rc_auth_url = os.environ['OS_AUTH_URL'] LOG.warning('%s is missing', varname)
self.rc_tenant_name = os.environ['OS_TENANT_NAME'] success = False
if success:
self.rc_username = os.environ['OS_USERNAME']
self.rc_auth_url = os.environ['OS_AUTH_URL']
self.rc_tenant_name = os.environ['OS_TENANT_NAME']
if 'OS_REGION_NAME' in os.environ:
self.rc_region_name = os.environ['OS_REGION_NAME']
elif self.rc_identity_api_version == 3:
for varname in ['OS_USERNAME', 'OS_AUTH_URL', 'OS_PROJECT_NAME',
'OS_PROJECT_DOMAIN_ID', 'OS_USER_DOMAIN_ID']:
if varname not in os.environ:
LOG.warning('%s is missing', varname)
success = False
if success:
self.rc_username = os.environ['OS_USERNAME']
self.rc_auth_url = os.environ['OS_AUTH_URL']
self.rc_project_name = os.environ['OS_PROJECT_NAME']
self.rc_project_domain_id = os.environ['OS_PROJECT_DOMAIN_ID']
self.rc_user_domain_id = os.environ['OS_USER_DOMAIN_ID']
if 'OS_CACERT' in os.environ: if 'OS_CACERT' in os.environ:
self.rc_cacert = os.environ['OS_CACERT'] self.rc_cacert = os.environ['OS_CACERT']
if 'OS_REGION_NAME' in os.environ:
self.rc_region_name = os.environ['OS_REGION_NAME']
# always override with CLI argument if provided # always override with CLI argument if provided
if pwd: if pwd:

View File

@ -30,15 +30,18 @@ import compute
from config import config_load from config import config_load
from config import config_loads from config import config_loads
import credentials import credentials
from glanceclient.v1 import client as glanceclient from glanceclient import client as glanceclient
import iperf_tool import iperf_tool
from keystoneclient.v2_0 import client as keystoneclient from keystoneclient.auth.identity import v2 as keystone_v2
from keystoneclient.auth.identity import v3 as keystone_v3
from keystoneclient import client as keystoneclient
from keystoneclient import session
from log import CONLOG from log import CONLOG
from log import FILELOG from log import FILELOG
from log import LOG from log import LOG
import network import network
from neutronclient.v2_0 import client as neutronclient from neutronclient.neutron import client as neutronclient
from novaclient.client import Client from novaclient import client as novaclient
from novaclient.exceptions import ClientException from novaclient.exceptions import ClientException
import nuttcp_tool import nuttcp_tool
from perf_instance import PerfInstance as PerfInstance from perf_instance import PerfInstance as PerfInstance
@ -195,10 +198,15 @@ class VmtpTest(object):
# If we need to reuse existing vms just return without setup # If we need to reuse existing vms just return without setup
if not self.config.reuse_existing_vm: if not self.config.reuse_existing_vm:
creds = self.cred.get_credentials() creds = self.cred.get_credentials()
creds_nova = self.cred.get_nova_credentials_v2() if self.cred.rc_identity_api_version == 3:
auth = keystone_v3.Password(**creds)
else:
auth = keystone_v2.Password(**creds)
sess = session.Session(auth=auth, verify=self.cred.rc_cacert)
# Create the nova and neutron instances # Create the nova and neutron instances
nova_client = Client(**creds_nova) nova_client = novaclient.Client('2', session=sess)
neutron = neutronclient.Client(**creds) neutron = neutronclient.Client('2.0', session=sess)
self.comp = compute.Compute(nova_client, self.config) self.comp = compute.Compute(nova_client, self.config)
@ -210,12 +218,9 @@ class VmtpTest(object):
if self.config.vm_image_url != "": if self.config.vm_image_url != "":
LOG.info('%s: image for VM not found, trying to upload it ...', LOG.info('%s: image for VM not found, trying to upload it ...',
self.config.image_name) self.config.image_name)
keystone = keystoneclient.Client(**creds) keystoneclient.Client(self.cred.rc_identity_api_version,
glance_endpoint = keystone.service_catalog.url_for( session=sess, auth_url=creds['auth_url'])
service_type='image', endpoint_type='publicURL') self.glance_client = glanceclient.Client('1', session=sess)
self.glance_client = glanceclient.Client(
glance_endpoint, token=keystone.auth_token,
cacert=creds['cacert'])
self.comp.upload_image_via_url( self.comp.upload_image_via_url(
self.glance_client, self.glance_client,
self.config.image_name, self.config.image_name,