Use dedicated service credential config

The current admin credential config options are confusing

Change-Id: I92c15c065edf364b955f2243b3599e0b8cae8b4f
(cherry picked from commit f3bb46542b)
This commit is contained in:
Lingxian Kong 2019-10-02 21:58:46 +13:00
parent 38b6f5ef70
commit 775ec10c4f
51 changed files with 409 additions and 1046 deletions

View File

@ -195,16 +195,20 @@ function configure_trove {
# Create the trove conf dir and cache dirs if they don't exist
sudo install -d -o $STACK_USER ${TROVE_CONF_DIR}
# Copy api-paste file over to the trove conf dir
cp $TROVE_LOCAL_API_PASTE_INI $TROVE_API_PASTE_INI
# configure apache related files
if [[ "${TROVE_USE_MOD_WSGI}" == "TRUE" ]]; then
echo "Configuring Trove to use mod-wsgi and Apache"
config_trove_apache_wsgi
fi
# (Re)create trove conf files
rm -f $TROVE_CONF $TROVE_GUESTAGENT_CONF
TROVE_AUTH_ENDPOINT=$KEYSTONE_AUTH_URI/v$IDENTITY_API_VERSION
# Set common configuration values (but only if they're defined)
################################################################ trove conf
setup_trove_logging $TROVE_CONF
iniset_conditional $TROVE_CONF DEFAULT max_accepted_volume_size $TROVE_MAX_ACCEPTED_VOLUME_SIZE
iniset_conditional $TROVE_CONF DEFAULT max_instances_per_tenant $TROVE_MAX_INSTANCES_PER_TENANT
iniset_conditional $TROVE_CONF DEFAULT max_volumes_per_tenant $TROVE_MAX_VOLUMES_PER_TENANT
@ -214,33 +218,30 @@ function configure_trove {
iniset_conditional $TROVE_CONF DEFAULT usage_timeout $TROVE_USAGE_TIMEOUT
iniset_conditional $TROVE_CONF DEFAULT state_change_wait_time $TROVE_STATE_CHANGE_WAIT_TIME
# For message queue
configure_keystone_authtoken_middleware $TROVE_CONF trove
iniset $TROVE_CONF service_credentials username trove
iniset $TROVE_CONF service_credentials user_domain_name Default
iniset $TROVE_CONF service_credentials project_domain_name Default
iniset $TROVE_CONF service_credentials password $SERVICE_PASSWORD
iniset $TROVE_CONF service_credentials project_name $SERVICE_PROJECT_NAME
iniset $TROVE_CONF service_credentials region_name $REGION_NAME
iniset $TROVE_CONF service_credentials auth_url $TROVE_AUTH_ENDPOINT
iniset $TROVE_CONF database connection `database_connection_url trove`
iniset $TROVE_CONF DEFAULT rpc_backend "rabbit"
iniset $TROVE_CONF DEFAULT control_exchange trove
iniset $TROVE_CONF DEFAULT transport_url rabbit://$RABBIT_USERID:$RABBIT_PASSWORD@$RABBIT_HOST:5672/
# For database
iniset $TROVE_CONF database connection `database_connection_url trove`
# For logging
setup_trove_logging $TROVE_CONF
iniset $TROVE_CONF DEFAULT trove_api_workers "$API_WORKERS"
configure_keystone_authtoken_middleware $TROVE_CONF trove
iniset $TROVE_CONF DEFAULT taskmanager_manager trove.taskmanager.manager.Manager
iniset $TROVE_CONF DEFAULT trove_auth_url $TROVE_AUTH_ENDPOINT
iniset $TROVE_CONF DEFAULT nova_proxy_admin_user trove
iniset $TROVE_CONF DEFAULT nova_proxy_admin_tenant_name $SERVICE_PROJECT_NAME
iniset $TROVE_CONF DEFAULT nova_proxy_admin_pass $SERVICE_PASSWORD
iniset $TROVE_CONF DEFAULT nova_proxy_admin_user_domain_name default
iniset $TROVE_CONF DEFAULT nova_proxy_admin_project_domain_name default
iniset $TROVE_CONF DEFAULT os_region_name $REGION_NAME
iniset $TROVE_CONF DEFAULT remote_nova_client trove.common.single_tenant_remote.nova_client_trove_admin
iniset $TROVE_CONF DEFAULT remote_cinder_client trove.common.single_tenant_remote.cinder_client_trove_admin
iniset $TROVE_CONF DEFAULT remote_neutron_client trove.common.single_tenant_remote.neutron_client_trove_admin
iniset $TROVE_CONF DEFAULT remote_swift_client trove.common.single_tenant_remote.swift_client_trove_admin
iniset $TROVE_CONF DEFAULT default_datastore $TROVE_DATASTORE_TYPE
iniset $TROVE_CONF DEFAULT remote_nova_client trove.common.clients_admin.nova_client_trove_admin
iniset $TROVE_CONF DEFAULT remote_cinder_client trove.common.clients_admin.cinder_client_trove_admin
iniset $TROVE_CONF DEFAULT remote_neutron_client trove.common.clients_admin.neutron_client_trove_admin
iniset $TROVE_CONF DEFAULT remote_swift_client trove.common.clients_admin.swift_client_trove_admin
iniset $TROVE_CONF DEFAULT remote_glance_client trove.common.clients_admin.glance_client_trove_admin
iniset $TROVE_CONF cassandra tcp_ports 7000,7001,7199,9042,9160
iniset $TROVE_CONF couchbase tcp_ports 8091,8092,4369,11209-11211,21100-21199
iniset $TROVE_CONF couchdb tcp_ports 5984
@ -254,35 +255,31 @@ function configure_trove {
iniset $TROVE_CONF redis tcp_ports 6379,16379
iniset $TROVE_CONF vertica tcp_ports 5433,5434,5444,5450,4803
# configure apache related files
if [[ "${TROVE_USE_MOD_WSGI}" == "TRUE" ]]; then
echo "Configuring Trove to use mod-wsgi and Apache"
config_trove_apache_wsgi
fi
################################################################ trove guest agent conf
setup_trove_logging $TROVE_GUESTAGENT_CONF
# Use these values only if they're set
iniset_conditional $TROVE_GUESTAGENT_CONF DEFAULT state_change_wait_time $TROVE_STATE_CHANGE_WAIT_TIME
iniset_conditional $TROVE_GUESTAGENT_CONF DEFAULT command_process_timeout $TROVE_COMMAND_PROCESS_TIMEOUT
# Set up Guest Agent conf
iniset $TROVE_GUESTAGENT_CONF DEFAULT rpc_backend "rabbit"
iniset $TROVE_GUESTAGENT_CONF DEFAULT transport_url rabbit://$RABBIT_USERID:$RABBIT_PASSWORD@$TROVE_HOST_GATEWAY:5672/
iniset $TROVE_GUESTAGENT_CONF DEFAULT trove_auth_url $TROVE_AUTH_ENDPOINT
iniset $TROVE_GUESTAGENT_CONF DEFAULT control_exchange trove
iniset $TROVE_GUESTAGENT_CONF DEFAULT ignore_users os_admin
iniset $TROVE_GUESTAGENT_CONF DEFAULT log_dir /var/log/trove/
iniset $TROVE_GUESTAGENT_CONF DEFAULT log_file trove-guestagent.log
iniset $TROVE_GUESTAGENT_CONF DEFAULT nova_proxy_admin_user trove
iniset $TROVE_GUESTAGENT_CONF DEFAULT nova_proxy_admin_tenant_name $SERVICE_PROJECT_NAME
iniset $TROVE_GUESTAGENT_CONF DEFAULT nova_proxy_admin_pass $SERVICE_PASSWORD
iniset $TROVE_GUESTAGENT_CONF DEFAULT nova_proxy_admin_user_domain_name default
iniset $TROVE_GUESTAGENT_CONF DEFAULT nova_proxy_admin_project_domain_name default
iniset $TROVE_GUESTAGENT_CONF DEFAULT os_region_name $REGION_NAME
iniset $TROVE_GUESTAGENT_CONF DEFAULT remote_nova_client trove.common.single_tenant_remote.nova_client_trove_admin
iniset $TROVE_GUESTAGENT_CONF DEFAULT remote_cinder_client trove.common.single_tenant_remote.cinder_client_trove_admin
iniset $TROVE_GUESTAGENT_CONF DEFAULT remote_neutron_client trove.common.single_tenant_remote.neutron_client_trove_admin
iniset $TROVE_GUESTAGENT_CONF DEFAULT remote_swift_client trove.common.single_tenant_remote.swift_client_trove_admin
setup_trove_logging $TROVE_GUESTAGENT_CONF
iniset $TROVE_GUESTAGENT_CONF service_credentials username trove
iniset $TROVE_GUESTAGENT_CONF service_credentials user_domain_name Default
iniset $TROVE_GUESTAGENT_CONF service_credentials project_domain_name Default
iniset $TROVE_GUESTAGENT_CONF service_credentials password $SERVICE_PASSWORD
iniset $TROVE_GUESTAGENT_CONF service_credentials project_name $SERVICE_PROJECT_NAME
iniset $TROVE_GUESTAGENT_CONF service_credentials region_name $REGION_NAME
iniset $TROVE_GUESTAGENT_CONF service_credentials auth_url $TROVE_AUTH_ENDPOINT
iniset $TROVE_GUESTAGENT_CONF DEFAULT remote_nova_client trove.common.clients_admin.nova_client_trove_admin
iniset $TROVE_GUESTAGENT_CONF DEFAULT remote_cinder_client trove.common.clients_admin.cinder_client_trove_admin
iniset $TROVE_GUESTAGENT_CONF DEFAULT remote_neutron_client trove.common.clients_admin.neutron_client_trove_admin
iniset $TROVE_GUESTAGENT_CONF DEFAULT remote_swift_client trove.common.clients_admin.swift_client_trove_admin
iniset $TROVE_GUESTAGENT_CONF DEFAULT remote_glance_client trove.common.clients_admin.glance_client_trove_admin
# To avoid 'Connection timed out' error of sudo command inside the guest agent
CLOUDINIT_PATH=/etc/trove/cloudinit/${TROVE_DATASTORE_TYPE}.cloudinit

View File

@ -168,9 +168,9 @@ Options in trove.conf
nova_proxy_admin_tenant_id = f472127c03f6410899225e26a3c1d22c
nova_proxy_admin_user_domain_name = default
nova_proxy_admin_project_domain_name = default
remote_nova_client = trove.common.single_tenant_remote.nova_client_trove_admin
remote_cinder_client = trove.common.single_tenant_remote.cinder_client_trove_admin
remote_neutron_client = trove.common.single_tenant_remote.neutron_client_trove_admin
remote_nova_client = trove.common.clients_admin.nova_client_trove_admin
remote_cinder_client = trove.common.clients_admin.cinder_client_trove_admin
remote_neutron_client = trove.common.clients_admin.neutron_client_trove_admin
os_region_name = RegionOne
#. Management config options.

View File

@ -370,13 +370,13 @@
"ModelBase.__hash__"
],
[
"trove/common/single_tenant_remote.py",
"trove/common/clients_admin.py",
"E0611",
"No name 'v1_1' in module 'novaclient'",
null
],
[
"trove/common/single_tenant_remote.py",
"trove/common/clients_admin.py",
"no-name-in-module",
"No name 'v1_1' in module 'novaclient'",
null

View File

@ -21,9 +21,9 @@ from swiftclient.client import ClientException
from trove.backup.state import BackupState
from trove.common import cfg
from trove.common import clients
from trove.common import exception
from trove.common.i18n import _
from trove.common.remote import create_swift_client
from trove.common import utils
from trove.datastore import models as datastore_models
from trove.db.models import DatabaseModelBase
@ -285,7 +285,7 @@ class Backup(object):
@classmethod
def verify_swift_auth_token(cls, context):
try:
client = create_swift_client(context)
client = clients.create_swift_client(context)
client.get_account()
except ClientException:
raise exception.SwiftAuthError(tenant_id=context.project_id)
@ -348,7 +348,7 @@ class DBBackup(DatabaseModelBase):
parts = self.location.split('/')
obj = parts[-1]
container = parts[-2]
client = create_swift_client(context)
client = clients.create_swift_client(context)
LOG.debug("Checking if backup exists in %s", self.location)
resp = client.head_object(container, obj)
if verify_checksum:

View File

@ -22,6 +22,7 @@ from novaclient import exceptions as nova_exceptions
from trove.cluster.tasks import ClusterTask
from trove.cluster.tasks import ClusterTasks
from trove.common import cfg
from trove.common import clients
from trove.common import exception
from trove.common.i18n import _
from trove.common.notification import (
@ -36,7 +37,6 @@ from trove.common.notification import DBaaSInstanceAttachConfiguration
from trove.common.notification import DBaaSInstanceDetachConfiguration
from trove.common.notification import EndNotification
from trove.common.notification import StartNotification
from trove.common import remote
from trove.common import server_group as srv_grp
from trove.common.strategies.cluster import strategy
from trove.common import utils
@ -112,9 +112,9 @@ class Cluster(object):
@classmethod
def get_guest(cls, instance):
return remote.create_guest_client(instance.context,
instance.db_info.id,
instance.datastore_version.manager)
return clients.create_guest_client(instance.context,
instance.db_info.id,
instance.datastore_version.manager)
@classmethod
def load_all(cls, context, tenant_id):
@ -572,7 +572,7 @@ def validate_instance_flavors(context, instances,
if region_name in nova_cli_cache:
nova_client = nova_cli_cache[region_name]
else:
nova_client = remote.create_nova_client(
nova_client = clients.create_nova_client(
context, region_name)
nova_cli_cache[region_name] = nova_client
@ -670,7 +670,7 @@ def validate_instance_nics(context, instances):
return
instance_nic = instance_nics[0]
try:
neutron_client = remote.create_neutron_client(context)
neutron_client = clients.create_neutron_client(context)
neutron_client.find_resource('network', instance_nic)
except neutron_exceptions.NotFound:
raise exception.NetworkNotFound(uuid=instance_nic)

View File

@ -68,8 +68,6 @@ common_opts = [
help='Set the service and instance task statuses to ERROR '
'when an instance fails to become active within the '
'configured usage_timeout.'),
cfg.StrOpt('os_region_name', default='RegionOne',
help='Region name of this node. Used when searching catalog.'),
cfg.URIOpt('nova_compute_url', help='URL without the tenant segment.'),
cfg.StrOpt('nova_compute_service_type', default='compute',
help='Service type to use when searching catalog.'),
@ -111,8 +109,6 @@ common_opts = [
help='Service type to use when searching catalog.'),
cfg.StrOpt('glance_endpoint_type', default='publicURL',
help='Service endpoint type to use when searching catalog.'),
cfg.URIOpt('trove_auth_url', default='http://0.0.0.0/identity/v2.0',
help='Trove authentication URL.'),
cfg.StrOpt('trove_url', help='URL without the tenant segment.'),
cfg.StrOpt('trove_service_type', default='database',
help='Service type to use when searching catalog.'),
@ -332,28 +328,28 @@ common_opts = [
help='Maximum size (in bytes) of each segment of the backup '
'file.'),
cfg.StrOpt('remote_dns_client',
default='trove.common.remote.dns_client',
default='trove.common.clients.dns_client',
help='Client to send DNS calls to.'),
cfg.StrOpt('remote_guest_client',
default='trove.common.remote.guest_client',
default='trove.common.clients.guest_client',
help='Client to send Guest Agent calls to.'),
cfg.StrOpt('remote_nova_client',
default='trove.common.remote.nova_client',
default='trove.common.clients.nova_client',
help='Client to send Nova calls to.'),
cfg.StrOpt('remote_neutron_client',
default='trove.common.remote.neutron_client',
default='trove.common.clients.neutron_client',
help='Client to send Neutron calls to.'),
cfg.StrOpt('remote_cinder_client',
default='trove.common.remote.cinder_client',
default='trove.common.clients.cinder_client',
help='Client to send Cinder calls to.'),
cfg.StrOpt('remote_swift_client',
default='trove.common.remote.swift_client',
default='trove.common.clients.swift_client',
help='Client to send Swift calls to.'),
cfg.StrOpt('remote_trove_client',
default='trove.common.trove_remote.trove_client',
help='Client to send Trove calls to.'),
cfg.StrOpt('remote_glance_client',
default='trove.common.glance_remote.glance_client',
default='trove.common.clients.glance_client',
help='Client to send Glance calls to.'),
cfg.StrOpt('exists_notification_transformer',
help='Transformer for exists notifications.'),
@ -375,19 +371,6 @@ common_opts = [
'db2': 'e040cd37-263d-4869-aaa6-c62aa97523b5',
'mariadb': '7a4f82cc-10d2-4bc6-aadc-d9aacc2a3cb5'},
help='Unique ID to tag notification events.'),
cfg.StrOpt('nova_proxy_admin_user', default='',
help="Admin username used to connect to Nova.", secret=True),
cfg.StrOpt('nova_proxy_admin_pass', default='',
help="Admin password used to connect to Nova.", secret=True),
cfg.StrOpt('nova_proxy_admin_tenant_id', default='',
help="Admin tenant ID used to connect to Nova.", secret=True),
cfg.StrOpt('nova_proxy_admin_tenant_name', default='',
help="Admin tenant name used to connect to Nova.", secret=True),
cfg.StrOpt('nova_proxy_admin_user_domain_name', default='Default',
help="User domain of the admin user used to connect to Nova."),
cfg.StrOpt('nova_proxy_admin_project_domain_name', default='Default',
help="Project domain of the admin user used to connect to "
"Nova."),
cfg.StrOpt('network_label_regex', default='^private$',
help='Regular expression to match Trove network labels.'),
cfg.StrOpt('ip_regex', default=None,
@ -1572,6 +1555,45 @@ network_opts = [
)
]
service_credentials_group = cfg.OptGroup(
'service_credentials',
help="Options related to Trove service credentials."
)
service_credentials_opts = [
cfg.URIOpt('auth_url', default='https://0.0.0.0/identity/v3',
deprecated_name='trove_auth_url',
deprecated_group='DEFAULT',
help='Keystone authentication URL.'),
cfg.StrOpt('username', default='',
help="Trove service user name.",
deprecated_name='nova_proxy_admin_user',
deprecated_group='DEFAULT'),
cfg.StrOpt('password', default='', secret=True,
help="Trove service user password.",
deprecated_name='nova_proxy_admin_pass',
deprecated_group='DEFAULT'),
cfg.StrOpt('project_id', default='',
deprecated_name='nova_proxy_admin_tenant_id',
deprecated_group='DEFAULT',
help="Trove service project ID."),
cfg.StrOpt('project_name', default='',
deprecated_name='nova_proxy_admin_tenant_name',
deprecated_group='DEFAULT',
help="Trove service project name."),
cfg.StrOpt('user_domain_name', default='Default',
deprecated_name='nova_proxy_admin_user_domain_name',
deprecated_group='DEFAULT',
help="Keystone domain name of the Trove service user."),
cfg.StrOpt('project_domain_name', default='Default',
deprecated_name='nova_proxy_admin_project_domain_name',
deprecated_group='DEFAULT',
help="Keystone domain name of the Trove service project."),
cfg.StrOpt('region_name', default='RegionOne',
deprecated_name='os_region_name',
deprecated_group='DEFAULT',
help="Keystone region name of the Trove service project."),
]
CONF = cfg.CONF
CONF.register_opts(path_opts)
@ -1593,6 +1615,7 @@ CONF.register_group(vertica_group)
CONF.register_group(db2_group)
CONF.register_group(mariadb_group)
CONF.register_group(network_group)
CONF.register_group(service_credentials_group)
CONF.register_opts(mysql_opts, mysql_group)
CONF.register_opts(percona_opts, percona_group)
@ -1607,6 +1630,7 @@ CONF.register_opts(vertica_opts, vertica_group)
CONF.register_opts(db2_opts, db2_group)
CONF.register_opts(mariadb_opts, mariadb_group)
CONF.register_opts(network_opts, network_group)
CONF.register_opts(service_credentials_opts, service_credentials_group)
CONF.register_opts(rpcapi_cap_opts, upgrade_levels)

View File

@ -20,6 +20,9 @@ from trove.common import exception
from trove.common.strategies.cluster import strategy
from cinderclient.v2 import client as CinderClient
import glanceclient
from keystoneauth1.identity import v3
from keystoneauth1 import session as ka_session
from keystoneclient.service_catalog import ServiceCatalog
from neutronclient.v2_0 import client as NeutronClient
from novaclient.client import Client
@ -49,7 +52,7 @@ def get_endpoint(service_catalog, service_type=None,
Some parts copied from glance/common/auth.py.
"""
endpoint_region = endpoint_region or CONF.os_region_name
endpoint_region = endpoint_region or CONF.service_credentials.region_name
if not service_catalog:
raise exception.EmptyCatalog()
@ -90,10 +93,13 @@ def nova_client(context, region_name=None, password=None):
'nova_url': normalize_url(CONF.nova_compute_url),
'tenant': context.project_id}
else:
url = get_endpoint(context.service_catalog,
service_type=CONF.nova_compute_service_type,
endpoint_region=region_name or CONF.os_region_name,
endpoint_type=CONF.nova_compute_endpoint_type)
region = region_name or CONF.service_credentials.region_name
url = get_endpoint(
context.service_catalog,
service_type=CONF.nova_compute_service_type,
endpoint_region=region,
endpoint_type=CONF.nova_compute_endpoint_type
)
client = Client(CONF.nova_client_version,
username=context.user,
@ -102,7 +108,7 @@ def nova_client(context, region_name=None, password=None):
project_id=context.project_id,
project_domain_name=context.project_domain_name,
user_domain_name=context.user_domain_name,
auth_url=CONF.trove_auth_url,
auth_url=CONF.service_credentials.auth_url,
auth_token=context.auth_token,
insecure=CONF.nova_api_insecure)
client.client.auth_token = context.auth_token
@ -115,7 +121,9 @@ def create_admin_nova_client(context):
Creates client that uses trove admin credentials
:return: a client for nova for the trove admin
"""
client = create_nova_client(context, password=CONF.nova_proxy_admin_pass)
client = create_nova_client(
context, password=CONF.service_credentials.password
)
return client
@ -125,14 +133,17 @@ def cinder_client(context, region_name=None):
'cinder_url': normalize_url(CONF.cinder_url),
'tenant': context.project_id}
else:
url = get_endpoint(context.service_catalog,
service_type=CONF.cinder_service_type,
endpoint_region=region_name or CONF.os_region_name,
endpoint_type=CONF.cinder_endpoint_type)
region = region_name or CONF.service_credentials.region_name
url = get_endpoint(
context.service_catalog,
service_type=CONF.cinder_service_type,
endpoint_region=region,
endpoint_type=CONF.cinder_endpoint_type
)
client = CinderClient.Client(context.user, context.auth_token,
project_id=context.project_id,
auth_url=CONF.trove_auth_url,
auth_url=CONF.service_credentials.auth_url,
insecure=CONF.cinder_api_insecure)
client.client.auth_token = context.auth_token
client.client.management_url = url
@ -145,9 +156,10 @@ def swift_client(context, region_name=None):
url = '%(swift_url)s%(tenant)s' % {'swift_url': CONF.swift_url,
'tenant': context.project_id}
else:
region = region_name or CONF.service_credentials.region_name
url = get_endpoint(context.service_catalog,
service_type=CONF.swift_service_type,
endpoint_region=region_name or CONF.os_region_name,
endpoint_region=region,
endpoint_type=CONF.swift_endpoint_type)
client = Connection(preauthurl=url,
@ -163,9 +175,10 @@ def neutron_client(context, region_name=None):
# neutron endpoint url / publicURL does not include tenant segment
url = CONF.neutron_url
else:
region = region_name or CONF.service_credentials.region_name
url = get_endpoint(context.service_catalog,
service_type=CONF.neutron_service_type,
endpoint_region=region_name or CONF.os_region_name,
endpoint_region=region,
endpoint_type=CONF.neutron_endpoint_type)
client = NeutronClient.Client(token=context.auth_token,
@ -174,6 +187,34 @@ def neutron_client(context, region_name=None):
return client
def glance_client(context, region_name=None):
# We should allow glance to get the endpoint from the service
# catalog, but to do so we would need to be able to specify
# the endpoint_filter on the API calls, but glance
# doesn't currently allow that. As a result, we must
# specify the endpoint explicitly.
if CONF.glance_url:
endpoint_url = '%(url)s%(tenant)s' % {
'url': normalize_url(CONF.glance_url),
'tenant': context.project_id}
else:
region = region_name or CONF.service_credentials.region_name
endpoint_url = get_endpoint(
context.service_catalog, service_type=CONF.glance_service_type,
endpoint_region=region,
endpoint_type=CONF.glance_endpoint_type
)
auth = v3.Token(CONF.service_credentials.auth_url, context.auth_token)
session = ka_session.Session(auth=auth)
return glanceclient.Client(
CONF.glance_client_version, endpoint=endpoint_url,
session=session
)
def create_dns_client(*arg, **kwargs):
return import_class(CONF.remote_dns_client)(*arg, **kwargs)
@ -196,3 +237,7 @@ def create_cinder_client(*arg, **kwargs):
def create_neutron_client(*arg, **kwargs):
return import_class(CONF.remote_neutron_client)(*arg, **kwargs)
def create_glance_client(*arg, **kwargs):
return import_class(CONF.remote_glance_client)(*arg, **kwargs)

View File

@ -14,6 +14,7 @@
# limitations under the License.
from cinderclient.v2 import client as CinderClient
import glanceclient
from keystoneauth1 import loading
from keystoneauth1 import session
from neutronclient.v2_0 import client as NeutronClient
@ -21,24 +22,25 @@ from novaclient.client import Client as NovaClient
import swiftclient
from trove.common import cfg
from trove.common.remote import normalize_url
from trove.common.clients import normalize_url
CONF = cfg.CONF
_SESSION = None
def get_keystone_session():
"""Get trove service credential auth session."""
global _SESSION
if not _SESSION:
loader = loading.get_plugin_loader('password')
auth = loader.load_from_options(
username=CONF.nova_proxy_admin_user,
password=CONF.nova_proxy_admin_pass,
project_name=CONF.nova_proxy_admin_tenant_name,
user_domain_name=CONF.nova_proxy_admin_user_domain_name,
project_domain_name=CONF.nova_proxy_admin_project_domain_name,
auth_url=CONF.trove_auth_url)
username=CONF.service_credentials.username,
password=CONF.service_credentials.password,
project_name=CONF.service_credentials.project_name,
user_domain_name=CONF.service_credentials.user_domain_name,
project_domain_name=CONF.service_credentials.project_domain_name,
auth_url=CONF.service_credentials.auth_url)
_SESSION = session.Session(auth=auth)
return _SESSION
@ -58,14 +60,14 @@ def nova_client_trove_admin(context, region_name=None, password=None):
CONF.nova_client_version,
session=ks_session,
service_type=CONF.nova_compute_service_type,
region_name=region_name or CONF.os_region_name,
region_name=region_name or CONF.service_credentials.region_name,
insecure=CONF.nova_api_insecure,
endpoint_type=CONF.nova_compute_endpoint_type)
if CONF.nova_compute_url and CONF.nova_proxy_admin_tenant_id:
if CONF.nova_compute_url and CONF.service_credentials.project_id:
client.client.endpoint_override = "%s/%s/" % (
normalize_url(CONF.nova_compute_url),
CONF.nova_proxy_admin_tenant_id)
CONF.service_credentials.project_id)
return client
@ -81,13 +83,14 @@ def cinder_client_trove_admin(context, region_name=None):
client = CinderClient.Client(
session=ks_session,
service_type=CONF.cinder_service_type,
region_name=region_name or CONF.os_region_name,
region_name=region_name or CONF.service_credentials.region_name,
insecure=CONF.cinder_api_insecure,
endpoint_type=CONF.cinder_endpoint_type)
if CONF.cinder_url and CONF.nova_proxy_admin_tenant_id:
if CONF.cinder_url and CONF.service_credentials.project_id:
client.client.management_url = "%s/%s/" % (
normalize_url(CONF.cinder_url), CONF.nova_proxy_admin_tenant_id)
normalize_url(CONF.cinder_url),
CONF.service_credentials.project_id)
return client
@ -103,7 +106,7 @@ def neutron_client_trove_admin(context, region_name=None):
client = NeutronClient.Client(
session=ks_session,
service_type=CONF.neutron_service_type,
region_name=region_name or CONF.os_region_name,
region_name=region_name or CONF.service_credentials.region_name,
insecure=CONF.neutron_api_insecure,
endpoint_type=CONF.neutron_endpoint_type)
@ -119,10 +122,23 @@ def swift_client_trove_admin(context, region_name=None):
session=ks_session,
insecure=CONF.swift_api_insecure,
os_options={
'region_name': region_name or CONF.os_region_name,
'region_name': region_name or CONF.service_credentials.region_name,
'service_type': CONF.swift_service_type,
'endpoint_type': CONF.swift_endpoint_type
}
)
return client
def glance_client_trove_admin(context, region_name=None):
ks_session = get_keystone_session()
client = glanceclient.Client(
version=CONF.glance_client_version,
session=ks_session,
region_name=region_name or CONF.service_credentials.region_name,
service_type=CONF.glance_service_type,
interface=CONF.glance_endpoint_type
)
return client

View File

@ -1,55 +0,0 @@
# Copyright 2016 Tesora Inc.
# 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.
from keystoneauth1.identity import v3
from keystoneauth1 import session as ka_session
from oslo_utils.importutils import import_class
from trove.common import cfg
from trove.common.remote import get_endpoint
from trove.common.remote import normalize_url
from glanceclient import Client
CONF = cfg.CONF
def glance_client(context, region_name=None):
# We should allow glance to get the endpoint from the service
# catalog, but to do so we would need to be able to specify
# the endpoint_filter on the API calls, but glance
# doesn't currently allow that. As a result, we must
# specify the endpoint explicitly.
if CONF.glance_url:
endpoint_url = '%(url)s%(tenant)s' % {
'url': normalize_url(CONF.glance_url),
'tenant': context.project_id}
else:
endpoint_url = get_endpoint(
context.service_catalog, service_type=CONF.glance_service_type,
endpoint_region=region_name or CONF.os_region_name,
endpoint_type=CONF.glance_endpoint_type)
auth = v3.Token(CONF.trove_auth_url, context.auth_token)
session = ka_session.Session(auth=auth)
return Client(CONF.glance_client_version, endpoint=endpoint_url,
session=session)
def create_glance_client(*arg, **kwargs):
return import_class(CONF.remote_glance_client)(*arg, **kwargs)

View File

@ -18,8 +18,8 @@
from oslo_utils.importutils import import_class
from trove.common import cfg
from trove.common import clients
from trove.common.i18n import _
from trove.common import remote
CONF = cfg.CONF
@ -114,18 +114,18 @@ class NovaRemoteModelBase(RemoteModelBase):
@classmethod
def get_client(cls, context, region_name):
return remote.create_nova_client(context, region_name)
return clients.create_nova_client(context, region_name)
class SwiftRemoteModelBase(RemoteModelBase):
@classmethod
def get_client(cls, context, region_name):
return remote.create_swift_client(context, region_name)
return clients.create_swift_client(context, region_name)
class CinderRemoteModelBase(RemoteModelBase):
@classmethod
def get_client(cls, context):
return remote.create_cinder_client(context)
return clients.create_cinder_client(context)

View File

@ -15,8 +15,8 @@ import netaddr
from oslo_log import log as logging
from trove.common import cfg
from trove.common import clients
from trove.common import exception
from trove.common import remote
CONF = cfg.CONF
LOG = logging.getLogger(__name__)
@ -36,7 +36,7 @@ def get_management_networks(context):
MGMT_NETWORKS = []
if len(CONF.management_networks) > 0:
neutron_client = remote.create_neutron_client(context)
neutron_client = clients.create_neutron_client(context)
for net_id in CONF.management_networks:
MGMT_NETWORKS.append(

View File

@ -18,7 +18,7 @@ import six
from oslo_log import log as logging
from trove.common.remote import create_nova_client
from trove.common.clients import create_nova_client
LOG = logging.getLogger(__name__)

View File

@ -16,10 +16,10 @@ from eventlet.timeout import Timeout
from oslo_log import log as logging
from trove.common import cfg
from trove.common.clients import create_nova_client
from trove.common.exception import PollTimeOut
from trove.common.exception import TroveError
from trove.common.i18n import _
from trove.common.remote import create_nova_client
from trove.common.strategies.cluster import base as cluster_base
from trove.common.template import ClusterConfigTemplate
from trove.common import utils

View File

@ -20,11 +20,11 @@ from trove.cluster import models
from trove.cluster.tasks import ClusterTasks
from trove.cluster.views import ClusterView
from trove.common import cfg
from trove.common import clients
from trove.common import exception
from trove.common.i18n import _
from trove.common.notification import DBaaSClusterGrow
from trove.common.notification import StartNotification
from trove.common import remote
from trove.common import server_group as srv_grp
from trove.common.strategies.cluster import base
from trove.common import utils
@ -637,7 +637,7 @@ class MongoDbCluster(models.Cluster):
if len(set(flavor_ids)) != 1:
raise exception.ClusterFlavorsNotEqual()
flavor_id = flavor_ids[0]
nova_client = remote.create_nova_client(context)
nova_client = clients.create_nova_client(context)
try:
flavor = nova_client.flavors.get(flavor_id)
except nova_exceptions.NotFound:

View File

@ -21,8 +21,8 @@ from oslo_log import log as logging
import six
from trove.common import cfg
from trove.common.clients import create_swift_client
from trove.common.i18n import _
from trove.common.remote import create_swift_client
from trove.common.strategies.storage import base
LOG = logging.getLogger(__name__)

View File

@ -16,8 +16,8 @@
from oslo_utils.importutils import import_class
from trove.common import cfg
from trove.common.remote import get_endpoint
from trove.common.remote import normalize_url
from trove.common.clients import get_endpoint
from trove.common.clients import normalize_url
from troveclient.v1 import client as TroveClient
@ -26,7 +26,7 @@ CONF = cfg.CONF
"""
NOTE(mwj, Apr 2016):
This module is separated from remote.py because remote.py is used
This module is separated from clients.py because clients.py is used
on the Trove guest, but the trove client is not installed on the guest,
so the imports here would fail.
"""
@ -38,14 +38,15 @@ def trove_client(context, region_name=None):
'url': normalize_url(CONF.trove_url),
'tenant': context.project_id}
else:
region = region_name or CONF.service_credentials.region_name
url = get_endpoint(context.service_catalog,
service_type=CONF.trove_service_type,
endpoint_region=region_name or CONF.os_region_name,
endpoint_region=region,
endpoint_type=CONF.trove_endpoint_type)
client = TroveClient.Client(context.user, context.auth_token,
project_id=context.project_id,
auth_url=CONF.trove_auth_url)
auth_url=CONF.service_credentials.auth_url)
client.client.auth_token = context.auth_token
client.client.management_url = url
return client

View File

@ -18,9 +18,9 @@
from oslo_log import log as logging
from trove.common import cfg
from trove.common.clients import create_nova_client
from trove.common import exception
from trove.common.i18n import _
from trove.common.remote import create_nova_client
from trove.common import timeutils
from trove.common import utils
from trove.db import get_db_api

View File

@ -32,4 +32,5 @@ def upgrade(migrate_engine):
meta.bind = migrate_engine
instances = Table('instances', meta, autoload=True)
instances.create_column(Column('region_id', String(255)))
instances.update().values(region_id=CONF.os_region_name).execute()
instances.update().values(
region_id=CONF.service_credentials.region_name).execute()

View File

@ -15,9 +15,9 @@
from oslo_log import log as logging
from trove.common.clients import create_guest_client
from trove.common.db import models as guest_models
from trove.common import exception
from trove.common.remote import create_guest_client
from trove.common import timeutils
from trove.db import get_db_api
from trove.instance import models as base_models

View File

@ -18,8 +18,8 @@ from oslo_log import log as logging
from trove.common import apischema
from trove.common.auth import admin_context
from trove.common import clients
from trove.common import exception
from trove.common import glance_remote
from trove.common import utils
from trove.common import wsgi
from trove.datastore import models
@ -52,7 +52,7 @@ class DatastoreVersionController(wsgi.Controller):
{'tenant': tenant_id, 'version': version_name,
'datastore': datastore_name})
client = glance_remote.create_glance_client(context)
client = clients.create_glance_client(context)
try:
client.images.get(image_id)
except glance_exceptions.HTTPNotFound:
@ -118,7 +118,7 @@ class DatastoreVersionController(wsgi.Controller):
if type(packages) is list:
packages = ','.join(packages)
client = glance_remote.create_glance_client(context)
client = clients.create_glance_client(context)
try:
client.images.get(image_id)
except glance_exceptions.HTTPNotFound:

View File

@ -16,9 +16,9 @@ import datetime
from oslo_log import log as logging
from trove.common import cfg
from trove.common import clients
from trove.common import exception
from trove.common.i18n import _
from trove.common import remote
from trove.common import timeutils
from trove.extensions.mysql import models as mysql_models
from trove.instance import models as instance_models
@ -31,7 +31,9 @@ CONF = cfg.CONF
def load_mgmt_instances(context, deleted=None, client=None,
include_clustered=None):
if not client:
client = remote.create_nova_client(context, CONF.os_region_name)
client = clients.create_nova_client(
context, CONF.service_credentials.region_name
)
try:
mgmt_servers = client.rdservers.list()
except AttributeError:
@ -55,7 +57,9 @@ def load_mgmt_instance(cls, context, id, include_deleted):
instance = instance_models.load_instance(
cls, context, id, needs_server=True,
include_deleted=include_deleted)
client = remote.create_nova_client(context, CONF.os_region_name)
client = clients.create_nova_client(
context, CONF.service_credentials.region_name
)
try:
server = client.rdservers.get(instance.server_id)
except AttributeError:
@ -118,7 +122,7 @@ class DetailedMgmtInstance(SimpleMgmtInstance):
@classmethod
def load(cls, context, id, include_deleted=False):
instance = load_mgmt_instance(cls, context, id, include_deleted)
client = remote.create_cinder_client(context)
client = clients.create_cinder_client(context)
try:
instance.volume = client.volumes.get(instance.volume_id)
except Exception:
@ -249,7 +253,7 @@ class NovaNotificationTransformer(NotificationTransformer):
def __init__(self, **kwargs):
super(NovaNotificationTransformer, self).__init__(**kwargs)
self.context = kwargs['context']
self.nova_client = remote.create_admin_nova_client(self.context)
self.nova_client = clients.create_admin_nova_client(self.context)
self._flavor_cache = {}
def _lookup_flavor(self, flavor_id):

View File

@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from trove.common.remote import guest_client
from trove.common.clients import guest_client
class UpgradeMessageSender(object):

View File

@ -18,10 +18,10 @@ Model classes that extend the instances functionality for MySQL instances.
"""
from trove.common import cfg
from trove.common.clients import create_guest_client
from trove.common.db.mysql import models as guest_models
from trove.common import exception
from trove.common.notification import StartNotification
from trove.common.remote import create_guest_client
from trove.common import utils
from trove.extensions.common.models import load_and_verify
from trove.extensions.common.models import RootHistory

View File

@ -14,7 +14,7 @@
# under the License.
#
from trove.common.remote import create_guest_client
from trove.common.clients import create_guest_client
from trove.extensions.common.models import load_and_verify
from trove.extensions.common.models import Root

View File

@ -148,8 +148,8 @@ class RemoteSecurityGroup(NetworkRemoteModelBase):
msg = _("Security Group does not have id defined!")
raise exception.InvalidModelError(msg)
elif security_group is None:
driver = self.get_driver(context,
region_name or CONF.os_region_name)
region = region_name or CONF.service_credentials.region_name
driver = self.get_driver(context, region)
self._data_object = driver.get_sec_group_by_id(group_id=id)
else:
self._data_object = security_group

View File

@ -17,9 +17,9 @@
from novaclient import exceptions as nova_exceptions
from trove.common.clients import create_nova_client
from trove.common import exception
from trove.common.models import NovaRemoteModelBase
from trove.common.remote import create_nova_client
class Flavor(object):

View File

@ -21,9 +21,9 @@ from oslo_log import log as logging
from swiftclient.client import ClientException
from trove.common import cfg
from trove.common import clients
from trove.common import exception
from trove.common.i18n import _
from trove.common import remote
from trove.common import stream_codecs
from trove.common import timeutils
from trove.guestagent.common import operating_system
@ -130,7 +130,7 @@ class GuestLog(object):
def swift_client(self):
if not self._cached_swift_client or (
self._cached_context != self.context):
self._cached_swift_client = remote.swift_client(self.context)
self._cached_swift_client = clients.swift_client(self.context)
self._cached_context = self.context
return self._cached_swift_client

View File

@ -28,18 +28,18 @@ from sqlalchemy import func
from trove.backup.models import Backup
from trove.common import cfg
from trove.common.clients import create_cinder_client
from trove.common.clients import create_dns_client
from trove.common.clients import create_glance_client
from trove.common.clients import create_guest_client
from trove.common.clients import create_neutron_client
from trove.common.clients import create_nova_client
from trove.common import crypto_utils as cu
from trove.common import exception
from trove.common.glance_remote import create_glance_client
from trove.common.i18n import _
from trove.common import instance as tr_instance
from trove.common import neutron
from trove.common import notification
from trove.common.remote import create_cinder_client
from trove.common.remote import create_dns_client
from trove.common.remote import create_guest_client
from trove.common.remote import create_neutron_client
from trove.common.remote import create_nova_client
from trove.common import server_group as srv_grp
from trove.common import template
from trove.common import timeutils
@ -858,8 +858,6 @@ class BaseInstance(SimpleInstance):
return self._neutron_client
def reset_task_status(self):
LOG.info("Resetting task status to NONE on instance %s.",
self.id)
self.update_db(task_status=InstanceTasks.NONE)
@property
@ -958,7 +956,9 @@ class Instance(BuiltInstance):
raise exception.TroveError(
"Flavors differ between regions"
" %(local)s and %(remote)s." %
{'local': CONF.os_region_name, 'remote': region_name})
{'local': CONF.service_credentials.region_name,
'remote': region_name}
)
except nova_exceptions.NotFound:
raise exception.TroveError(
"Flavors %(flavor)s not found in region %(remote)s."
@ -973,7 +973,9 @@ class Instance(BuiltInstance):
raise exception.TroveError(
"Datastore versions differ between regions "
"%(local)s and %(remote)s." %
{'local': CONF.os_region_name, 'remote': region_name})
{'local': CONF.service_credentials.region_name,
'remote': region_name}
)
except exception.NotFound:
raise exception.TroveError(
"Datastore Version %(dsv)s not found in region %(remote)s."
@ -989,7 +991,8 @@ class Instance(BuiltInstance):
raise exception.TroveError(
"Images for Datastore %(ds)s do not match "
"between regions %(local)s and %(remote)s." %
{'ds': datastore.name, 'local': CONF.os_region_name,
{'ds': datastore.name,
'local': CONF.service_credentials.region_name,
'remote': region_name})
@classmethod
@ -1000,7 +1003,7 @@ class Instance(BuiltInstance):
replica_count=None, volume_type=None, modules=None,
locality=None, region_name=None, access=None):
region_name = region_name or CONF.os_region_name
region_name = region_name or CONF.service_credentials.region_name
call_args = {
'name': name,
@ -1036,7 +1039,7 @@ class Instance(BuiltInstance):
# If a different region is specified for the instance, ensure
# that the flavor and image are the same in both regions
if region_name and region_name != CONF.os_region_name:
if region_name and region_name != CONF.service_credentials.region_name:
cls._validate_remote_datastore(context, region_name, flavor,
datastore, datastore_version)
@ -1695,8 +1698,8 @@ class Instances(object):
db.addresses = {}
else:
try:
if (not db.region_id
or db.region_id == CONF.os_region_name):
region = CONF.service_credentials.region_name
if (not db.region_id or db.region_id == region):
server = find_server(db.id, db.compute_instance_id)
else:
nova_client = create_nova_client(

View File

@ -20,13 +20,13 @@ from trove.backup.models import Backup as backup_model
from trove.backup import views as backup_views
import trove.common.apischema as apischema
from trove.common import cfg
from trove.common.clients import create_guest_client
from trove.common import exception
from trove.common.i18n import _
from trove.common import notification
from trove.common.notification import StartNotification
from trove.common import pagination
from trove.common import policy
from trove.common.remote import create_guest_client
from trove.common import utils
from trove.common import wsgi
from trove.datastore import models as datastore_models
@ -362,7 +362,9 @@ class InstanceController(wsgi.Controller):
'master.')
raise exception.BadRequest(message=dupe_locality_msg)
region_name = body['instance'].get('region_name', CONF.os_region_name)
region_name = body['instance'].get(
'region_name', CONF.service_credentials.region_name
)
access = body['instance'].get('access', None)
instance = models.Instance.create(context, name, flavor_id,

View File

@ -15,8 +15,8 @@
from neutronclient.common import exceptions as neutron_exceptions
from oslo_log import log as logging
from trove.common import clients
from trove.common import exception
from trove.common import remote
from trove.network import base
LOG = logging.getLogger(__name__)
@ -26,7 +26,7 @@ class NeutronDriver(base.NetworkDriver):
def __init__(self, context, region_name):
try:
self.client = remote.create_neutron_client(context, region_name)
self.client = clients.create_neutron_client(context, region_name)
except neutron_exceptions.NeutronClientException as e:
raise exception.TroveError(str(e))

View File

@ -17,8 +17,8 @@
from novaclient import exceptions as nova_exceptions
from oslo_log import log as logging
from trove.common import clients
from trove.common import exception
from trove.common import remote
from trove.network import base
LOG = logging.getLogger(__name__)
@ -28,7 +28,7 @@ class NovaNetwork(base.NetworkDriver):
def __init__(self, context, region_name):
try:
self.client = remote.create_nova_client(
self.client = clients.create_nova_client(
context, region_name)
except nova_exceptions.ClientException as e:
raise exception.TroveError(str(e))

View File

@ -19,13 +19,13 @@ from oslo_utils import importutils
from trove.backup.models import Backup
import trove.common.cfg as cfg
from trove.common import clients
from trove.common.context import TroveContext
from trove.common import exception
from trove.common.exception import ReplicationSlaveAttachError
from trove.common.exception import TroveError
from trove.common.i18n import _
from trove.common.notification import DBaaSQuotas, EndNotification
from trove.common import remote
from trove.common import server_group as srv_grp
from trove.common.strategies.cluster import strategy
from trove.datastore.models import DatastoreVersion
@ -44,9 +44,9 @@ class Manager(periodic_task.PeriodicTasks):
def __init__(self):
super(Manager, self).__init__(CONF)
self.admin_context = TroveContext(
user=CONF.nova_proxy_admin_user,
tenant=CONF.nova_proxy_admin_tenant_id,
user_domain_name=CONF.nova_proxy_admin_user_domain_name)
user=CONF.service_credentials.username,
tenant=CONF.service_credentials.project_id,
user_domain_name=CONF.service_credentials.user_domain_name)
if CONF.exists_notification_transformer:
self.exists_transformer = importutils.import_object(
CONF.exists_notification_transformer,
@ -482,7 +482,7 @@ class Manager(periodic_task.PeriodicTasks):
if CONF.quota_notification_interval:
@periodic_task.periodic_task(spacing=CONF.quota_notification_interval)
def publish_quota_notifications(self, context):
nova_client = remote.create_nova_client(self.admin_context)
nova_client = clients.create_nova_client(self.admin_context)
for tenant in nova_client.tenants.list():
for quota in QUOTAS.get_all_quotas_by_tenant(tenant.id):
usage = QUOTAS.get_quota_usage(quota)

View File

@ -32,6 +32,10 @@ from trove.cluster.models import Cluster
from trove.cluster.models import DBCluster
from trove.cluster import tasks
from trove.common import cfg
from trove.common import clients
from trove.common.clients import create_cinder_client
from trove.common.clients import create_dns_client
from trove.common.clients import create_guest_client
from trove.common import crypto_utils as cu
from trove.common import exception
from trove.common.exception import BackupCreationError
@ -53,10 +57,6 @@ from trove.common.notification import (
TroveInstanceCreate,
TroveInstanceModifyVolume,
TroveInstanceModifyFlavor)
import trove.common.remote as remote
from trove.common.remote import create_cinder_client
from trove.common.remote import create_dns_client
from trove.common.remote import create_guest_client
from trove.common.strategies.cluster import strategy
from trove.common import template
from trove.common import timeutils
@ -424,6 +424,7 @@ class FreshInstanceTasks(FreshInstance, NotifyMixin, ConfigurationMixin):
error_message = ''
error_details = ''
try:
LOG.info("Waiting for instance %s up and running", self.id)
utils.poll_until(self._service_is_active,
sleep_time=CONF.usage_sleep_time,
time_out=timeout)
@ -1417,7 +1418,7 @@ class BackupTasks(object):
@classmethod
def delete_files_from_swift(cls, context, filename):
container = CONF.backup_swift_container
client = remote.create_swift_client(context)
client = clients.create_swift_client(context)
obj = client.head_object(container, filename)
if 'x-static-large-object' in obj:
# Static large object

View File

@ -1083,10 +1083,11 @@ class TestInstanceListing(object):
assert_equal(200, self.other_client.last_http_code)
admin_ids = [instance.id for instance in dbaas.instances.list()]
assert_equal(200, dbaas.last_http_code)
assert_equal(len(daffy_ids), 0)
assert_not_equal(sorted(admin_ids), sorted(daffy_ids))
assert_raises(exceptions.NotFound,
self.other_client.instances.get, instance_info.id)
for id in admin_ids:
assert_equal(daffy_ids.count(id), 0)

View File

@ -22,7 +22,6 @@ from trove.backup import models
from trove.backup import state
from trove.common import context
from trove.common import exception
from trove.common import remote
from trove.common import timeutils
from trove.common import utils
from trove.db.models import DatabaseModelBase
@ -401,48 +400,50 @@ class BackupORMTest(trove_testtools.TestCase):
self.assertRaises(ValueError, _set_bad_filename)
def test_check_swift_object_exist_integrity_error(self):
mock_client = MagicMock()
mock_client.head_object.return_value = {'etag': ''}
with patch.object(remote, 'get_endpoint', return_value=None),\
patch.object(remote, 'Connection',
return_value=mock_client):
self.assertRaises(exception.RestoreBackupIntegrityError,
self.backup.check_swift_object_exist,
self.context, True)
@patch('trove.common.clients.create_swift_client')
def test_check_swift_object_exist_integrity_error(self, mock_swift_client):
mock_swift_client.return_value.head_object.return_value = {'etag': ''}
def test_check_swift_object_exist_client_exception(self):
with patch.object(remote, 'get_endpoint', return_value=None),\
patch.object(remote, 'Connection',
side_effect=ClientException(self.context.project_id)):
self.assertRaises(exception.SwiftAuthError,
self.backup.check_swift_object_exist,
self.context)
self.assertRaises(exception.RestoreBackupIntegrityError,
self.backup.check_swift_object_exist,
self.context, True)
def test_check_swift_object_exist_client_exception_404(self):
@patch('trove.common.clients.create_swift_client')
def test_check_swift_object_exist_client_exception(self,
mock_swift_client):
mock_swift_client.side_effect = ClientException(
self.context.project_id
)
self.assertRaises(exception.SwiftAuthError,
self.backup.check_swift_object_exist,
self.context)
@patch('trove.common.clients.create_swift_client')
def test_check_swift_object_exist_client_exception_404(self,
mock_swift_client):
e = ClientException(self.context.project_id)
e.http_status = 404
with patch.object(remote, 'get_endpoint', return_value=None),\
patch.object(remote, 'Connection',
side_effect=e):
self.assertFalse(
self.backup.check_swift_object_exist(self.context))
mock_swift_client.side_effect = e
def test_swift_auth_token_client_exception(self):
with patch.object(remote, 'get_endpoint', return_value=None),\
patch.object(remote, 'Connection',
side_effect=ClientException(self.context.project_id)):
self.assertRaises(exception.SwiftAuthError,
models.Backup.verify_swift_auth_token,
self.context)
self.assertFalse(self.backup.check_swift_object_exist(self.context))
def test_swift_auth_token_no_service_endpoint(self):
with patch.object(remote, 'get_endpoint', return_value=None),\
patch.object(remote, 'Connection',
side_effect=exception.NoServiceEndpoint):
self.assertRaises(exception.SwiftNotFound,
models.Backup.verify_swift_auth_token,
self.context)
@patch('trove.common.clients.create_swift_client')
def test_swift_auth_token_client_exception(self, mock_swift_client):
mock_swift_client.side_effect = ClientException(
self.context.project_id
)
self.assertRaises(exception.SwiftAuthError,
models.Backup.verify_swift_auth_token,
self.context)
@patch('trove.common.clients.create_swift_client')
def test_swift_auth_token_no_service_endpoint(self, mock_swift_client):
mock_swift_client.side_effect = exception.NoServiceEndpoint
self.assertRaises(exception.SwiftNotFound,
models.Backup.verify_swift_auth_token,
self.context)
class PaginationTests(trove_testtools.TestCase):

View File

@ -21,8 +21,8 @@ from trove.cluster.models import Cluster
from trove.cluster.models import ClusterTasks
from trove.cluster.models import DBCluster
from trove.common import cfg
from trove.common import clients
from trove.common import exception
from trove.common import remote
from trove.common.strategies.cluster.experimental.mongodb import (
api as mongodb_api)
from trove.common import utils
@ -66,12 +66,12 @@ class ClusterTest(trove_testtools.TestCase):
{'volume_size': 1, 'flavor_id': '1234'},
{'volume_size': 1, 'flavor_id': '1234'}]
self.volume_support = CONF.get(self.dv.manager).volume_support
self.remote_nova = remote.create_nova_client
self.remote_nova = clients.create_nova_client
def tearDown(self):
super(ClusterTest, self).tearDown()
CONF.get(self.dv.manager).volume_support = self.volume_support
remote.create_nova_client = self.remote_nova
clients.create_nova_client = self.remote_nova
def test_create_empty_instances(self):
self.assertRaises(exception.ClusterNumInstancesNotSupported,
@ -83,7 +83,7 @@ class ClusterTest(trove_testtools.TestCase):
[],
{}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_unequal_flavors(self, mock_client):
instances = self.instances
instances[0]['flavor_id'] = '4567'
@ -96,7 +96,7 @@ class ClusterTest(trove_testtools.TestCase):
instances,
{}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_unequal_volumes(self,
mock_client):
instances = self.instances
@ -112,7 +112,7 @@ class ClusterTest(trove_testtools.TestCase):
instances,
{}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_storage_not_specified(self,
mock_client):
class FakeFlavor(object):

View File

@ -21,8 +21,8 @@ from novaclient import exceptions as nova_exceptions
from trove.cluster.models import Cluster
from trove.cluster.models import ClusterTasks
from trove.cluster.models import DBCluster
from trove.common import clients
from trove.common import exception
from trove.common import remote
from trove.common.strategies.cluster.experimental.galera_common import (
api as galera_api)
from trove.common.strategies.cluster.experimental.galera_common import (
@ -85,7 +85,7 @@ class ClusterTest(trove_testtools.TestCase):
self.datastore_version,
[], {}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_flavor_not_specified(self, mock_client):
instances = self.instances
instances[0]['flavor_id'] = None
@ -97,7 +97,7 @@ class ClusterTest(trove_testtools.TestCase):
self.datastore_version,
instances, {}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_invalid_flavor_specified(self,
mock_client):
instances = [{'flavor_id': '1234'},
@ -116,7 +116,7 @@ class ClusterTest(trove_testtools.TestCase):
self.datastore_version,
instances, {}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_volume_no_specified(self,
mock_client):
instances = self.instances
@ -131,7 +131,7 @@ class ClusterTest(trove_testtools.TestCase):
self.datastore_version,
instances, {}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
@patch.object(galera_api, 'CONF')
def test_create_storage_specified_with_no_volume_support(self,
mock_conf,
@ -150,7 +150,7 @@ class ClusterTest(trove_testtools.TestCase):
self.datastore_version,
instances, {}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
@patch.object(galera_api, 'CONF')
def test_create_storage_not_specified_and_no_ephemeral_flavor(self,
mock_conf,
@ -181,7 +181,7 @@ class ClusterTest(trove_testtools.TestCase):
self.datastore_version,
instances, {}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_volume_not_equal(self, mock_client):
instances = self.instances
instances[0]['volume_size'] = 2
@ -200,8 +200,8 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(task_api, 'load')
@patch.object(QUOTAS, 'check_quotas')
@patch.object(remote, 'create_nova_client')
@patch.object(remote, 'create_neutron_client')
@patch.object(clients, 'create_nova_client')
@patch.object(clients, 'create_neutron_client')
def test_create(self, mock_neutron_client, mock_nova_client,
mock_check_quotas, mock_task_api, mock_db_create,
mock_ins_create, mock_find_all):
@ -223,7 +223,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(task_api, 'load')
@patch.object(QUOTAS, 'check_quotas')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_over_limit(self, mock_client, mock_check_quotas,
mock_task_api, mock_db_create, mock_ins_create):
instances = [{'volume_size': 1, 'flavor_id': '1234'},
@ -247,7 +247,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(task_api, 'load')
@patch.object(QUOTAS, 'check_quotas')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_with_ephemeral_flavor(self, mock_client, mock_check_quotas,
mock_task_api, mock_db_create,
mock_ins_create, mock_conf,
@ -312,8 +312,8 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(inst_models.Instance, 'create')
@patch.object(task_api, 'load')
@patch.object(QUOTAS, 'check_quotas')
@patch.object(remote, 'create_nova_client')
@patch.object(remote, 'create_neutron_client')
@patch.object(clients, 'create_nova_client')
@patch.object(clients, 'create_neutron_client')
def test_grow(self, mock_neutron_client, mock_nova_client,
mock_check_quotas, mock_task_api,
mock_inst_create, mock_conf, mock_update):
@ -331,8 +331,8 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(galera_api, 'CONF')
@patch.object(inst_models.Instance, 'create')
@patch.object(QUOTAS, 'check_quotas')
@patch.object(remote, 'create_nova_client')
@patch.object(remote, 'create_neutron_client')
@patch.object(clients, 'create_nova_client')
@patch.object(clients, 'create_neutron_client')
def test_grow_exception(self, mock_neutron_client, mock_nova_client,
mock_check_quotas, mock_inst_create,
mock_conf, mock_update):

View File

@ -24,14 +24,14 @@ from mock import PropertyMock
from neutronclient.common import exceptions as neutron_exceptions
from trove.cluster import models
from trove.common import clients
from trove.common import exception
from trove.common import remote
from trove.tests.unittests import trove_testtools
class TestModels(trove_testtools.TestCase):
@patch.object(remote, 'create_nova_client', return_value=MagicMock())
@patch.object(clients, 'create_nova_client', return_value=MagicMock())
def test_validate_instance_flavors(self, create_nova_cli_mock):
patch.object(
create_nova_cli_mock.return_value, 'flavors',
@ -173,7 +173,7 @@ class TestModels(trove_testtools.TestCase):
assert_same_instance_volumes.assert_called_once_with(
test_instances, required_size=required_volume_size)
@patch.object(remote, 'create_neutron_client', return_value=MagicMock())
@patch.object(clients, 'create_neutron_client', return_value=MagicMock())
def test_validate_instance_nics(self, create_neutron_cli_mock):
test_instances = [

View File

@ -21,8 +21,8 @@ from novaclient import exceptions as nova_exceptions
from trove.cluster import models
from trove.cluster import tasks
from trove.common import cfg
from trove.common import clients
from trove.common import exception
from trove.common import remote
from trove.common.strategies.cluster.experimental.mongodb import api
from trove.instance import models as inst_models
from trove.instance import tasks as inst_tasks
@ -75,7 +75,7 @@ class MongoDBClusterTest(trove_testtools.TestCase):
self.manager = mock.Mock()
self.cluster.manager = self.manager
self.volume_support = CONF.get('mongodb').volume_support
self.remote_nova = remote.create_nova_client
self.remote_nova = clients.create_nova_client
self.instances = [
{'volume_size': 1, 'flavor_id': '1234',
'nics': [{"net-id": "foo-bar"}],
@ -114,7 +114,7 @@ class MongoDBClusterTest(trove_testtools.TestCase):
self.datastore_version,
instance, {}, None, None)
@mock.patch.object(remote, 'create_nova_client')
@mock.patch.object(clients, 'create_nova_client')
def test_create_invalid_flavor_specified(self, mock_client):
(mock_client.return_value.flavors.get) = mock.Mock(
side_effect=nova_exceptions.NotFound(
@ -127,7 +127,7 @@ class MongoDBClusterTest(trove_testtools.TestCase):
self.datastore_version,
self.instances, {}, None, None)
@mock.patch.object(remote, 'create_nova_client')
@mock.patch.object(clients, 'create_nova_client')
def test_create_flavor_not_equal(self, mock_client):
instances = self.instances
instances[0]['flavor_id'] = '4321'
@ -141,7 +141,7 @@ class MongoDBClusterTest(trove_testtools.TestCase):
self.datastore_version,
instances, {}, None, None)
@mock.patch.object(remote, 'create_nova_client')
@mock.patch.object(clients, 'create_nova_client')
def test_create_volume_not_equal(self, mock_client):
instances = self.instances
instances[0]['volume_size'] = 2
@ -155,7 +155,7 @@ class MongoDBClusterTest(trove_testtools.TestCase):
self.datastore_version,
instances, {}, None, None)
@mock.patch.object(remote, 'create_nova_client')
@mock.patch.object(clients, 'create_nova_client')
def test_create_volume_not_specified(self, mock_client):
instances = [
{'flavor_id': '1234',
@ -177,7 +177,7 @@ class MongoDBClusterTest(trove_testtools.TestCase):
self.datastore_version,
instances, {}, None, None)
@mock.patch.object(remote, 'create_nova_client')
@mock.patch.object(clients, 'create_nova_client')
@mock.patch.object(api, 'CONF')
def test_create_storage_specified_with_no_volume_support(self,
mock_conf,
@ -197,8 +197,8 @@ class MongoDBClusterTest(trove_testtools.TestCase):
@mock.patch.object(task_api, 'load')
@mock.patch.object(inst_models.Instance, 'create')
@mock.patch.object(models.DBCluster, 'create')
@mock.patch.object(remote, 'create_neutron_client')
@mock.patch.object(remote, 'create_nova_client')
@mock.patch.object(clients, 'create_neutron_client')
@mock.patch.object(clients, 'create_nova_client')
@mock.patch.object(api, 'check_quotas')
def test_create_validate_volumes_deltas(self, mock_check_quotas, *args):
extended_properties = {
@ -217,8 +217,8 @@ class MongoDBClusterTest(trove_testtools.TestCase):
@mock.patch.object(inst_models.Instance, 'create')
@mock.patch.object(models.DBCluster, 'create')
@mock.patch.object(QUOTAS, 'check_quotas')
@mock.patch.object(remote, 'create_nova_client')
@mock.patch.object(remote, 'create_neutron_client')
@mock.patch.object(clients, 'create_nova_client')
@mock.patch.object(clients, 'create_neutron_client')
def test_create(self, mock_neutron_client, mock_nova_client,
mock_check_quotas, mock_db_create,
mock_ins_create, mock_task_api):
@ -284,8 +284,8 @@ class MongoDBClusterTest(trove_testtools.TestCase):
@mock.patch.object(inst_models.Instance, 'create')
@mock.patch.object(models.DBCluster, 'create')
@mock.patch.object(QUOTAS, 'check_quotas')
@mock.patch.object(remote, 'create_nova_client')
@mock.patch.object(remote, 'create_neutron_client')
@mock.patch.object(clients, 'create_nova_client')
@mock.patch.object(clients, 'create_neutron_client')
@mock.patch.object(api, 'CONF')
def test_create_with_lower_configsvr(self, mock_conf, mock_neutron_client,
mock_nova_client, ock_check_quotas,
@ -311,8 +311,8 @@ class MongoDBClusterTest(trove_testtools.TestCase):
@mock.patch.object(inst_models.Instance, 'create')
@mock.patch.object(models.DBCluster, 'create')
@mock.patch.object(QUOTAS, 'check_quotas')
@mock.patch.object(remote, 'create_nova_client')
@mock.patch.object(remote, 'create_neutron_client')
@mock.patch.object(clients, 'create_nova_client')
@mock.patch.object(clients, 'create_neutron_client')
@mock.patch.object(api, 'CONF')
def test_create_with_higher_configsvr(self, mock_conf, mock_neutron_client,
mock_nova_client, mock_check_quotas,
@ -338,8 +338,8 @@ class MongoDBClusterTest(trove_testtools.TestCase):
@mock.patch.object(inst_models.Instance, 'create')
@mock.patch.object(models.DBCluster, 'create')
@mock.patch.object(QUOTAS, 'check_quotas')
@mock.patch.object(remote, 'create_nova_client')
@mock.patch.object(remote, 'create_neutron_client')
@mock.patch.object(clients, 'create_nova_client')
@mock.patch.object(clients, 'create_neutron_client')
@mock.patch.object(api, 'CONF')
def test_create_with_higher_mongos(self, mock_conf, mock_neutron_client,
mock_nova_client, mock_check_quotas,

View File

@ -19,8 +19,8 @@ from novaclient import exceptions as nova_exceptions
from trove.cluster.models import Cluster
from trove.cluster.models import ClusterTasks
from trove.cluster.models import DBCluster
from trove.common import clients
from trove.common import exception
from trove.common import remote
from trove.common.strategies.cluster.experimental.redis import api as redis_api
from trove.instance import models as inst_models
from trove.instance.models import DBInstance
@ -77,7 +77,7 @@ class ClusterTest(trove_testtools.TestCase):
def tearDown(self):
super(ClusterTest, self).tearDown()
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_invalid_flavor_specified(self,
mock_client):
(mock_client.return_value.flavors.get) = Mock(
@ -93,7 +93,7 @@ class ClusterTest(trove_testtools.TestCase):
self.instances_w_volumes,
{}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
@patch.object(redis_api, 'CONF')
def test_create_volume_no_specified(self, mock_conf, mock_client):
mock_conf.get = Mock(
@ -107,7 +107,7 @@ class ClusterTest(trove_testtools.TestCase):
self.instances_no_volumes,
{}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
@patch.object(redis_api, 'CONF')
def test_create_storage_specified_with_no_volume_support(self,
mock_conf,
@ -124,7 +124,7 @@ class ClusterTest(trove_testtools.TestCase):
self.instances_w_volumes,
{}, None, None)
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
@patch.object(redis_api, 'CONF')
def test_create_storage_not_specified_and_no_ephemeral_flavor(self,
mock_conf,
@ -157,7 +157,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(inst_models.Instance, 'create')
@patch.object(task_api, 'load')
@patch.object(QUOTAS, 'check_quotas')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create(self, mock_client, mock_check_quotas, mock_task_api,
mock_ins_create, mock_conf):
mock_conf.get = Mock(
@ -176,7 +176,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(inst_models.Instance, 'create')
@patch.object(task_api, 'load')
@patch.object(QUOTAS, 'check_quotas')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_with_ephemeral_flavor(self, mock_client, mock_check_quotas,
mock_task_api, mock_ins_create,
mock_conf):
@ -209,7 +209,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(inst_models.Instance, 'create')
@patch.object(task_api, 'load')
@patch.object(QUOTAS, 'check_quotas')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_grow(self, mock_client, mock_check_quotas, mock_task_api,
mock_ins_create, mock_conf, mock_update):
mock_conf.get = Mock(

View File

@ -19,8 +19,8 @@ from novaclient import exceptions as nova_exceptions
from trove.cluster.models import Cluster
from trove.cluster.models import ClusterTasks
from trove.cluster.models import DBCluster
from trove.common import clients
from trove.common import exception
from trove.common import remote
from trove.common.strategies.cluster.experimental.vertica import (
api as vertica_api)
from trove.instance import models as inst_models
@ -84,7 +84,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(inst_models.DBInstance, 'find_all')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_flavor_not_specified(self, *args):
instances = self.instances
instances[0]['flavor_id'] = None
@ -99,7 +99,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(inst_models.DBInstance, 'find_all')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_invalid_flavor_specified(self, mock_client,
mock_find_all, mock_create):
instances = [{'flavor_id': '1234'},
@ -121,7 +121,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(inst_models.DBInstance, 'find_all')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_volume_no_specified(self, mock_client, mock_find_all,
mock_create):
instances = self.instances
@ -139,7 +139,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(inst_models.DBInstance, 'find_all')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
@patch.object(vertica_api, 'CONF')
def test_create_storage_specified_with_no_volume_support(self,
mock_conf,
@ -163,7 +163,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(inst_models.DBInstance, 'find_all')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
@patch.object(vertica_api, 'CONF')
def test_create_storage_not_specified_and_no_ephemeral_flavor(self,
mock_conf,
@ -199,7 +199,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(inst_models.DBInstance, 'find_all')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_volume_not_equal(self, mock_client, mock_find_all,
mock_create):
instances = self.instances
@ -220,7 +220,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(task_api, 'load')
@patch.object(QUOTAS, 'check_quotas')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create(self, mock_client, mock_check_quotas, mock_task_api,
mock_db_create, mock_ins_create, mock_find_all):
instances = self.instances
@ -242,7 +242,7 @@ class ClusterTest(trove_testtools.TestCase):
@patch.object(DBCluster, 'create')
@patch.object(task_api, 'load')
@patch.object(QUOTAS, 'check_quotas')
@patch.object(remote, 'create_nova_client')
@patch.object(clients, 'create_nova_client')
def test_create_with_ephemeral_flavor(self, mock_client, mock_check_quotas,
mock_task_api, mock_db_create,
mock_ins_create, mock_conf,

View File

@ -1,650 +0,0 @@
# Copyright 2013 OpenStack Foundation
# Copyright 2013 Rackspace Hosting
# Copyright 2013 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 uuid
from mock import ANY, patch, MagicMock
import swiftclient.client
from testtools import ExpectedException, matchers
from trove.common import cfg
from trove.common.context import TroveContext
from trove.common import exception
from trove.common import glance_remote
from trove.common import remote
from trove.tests.fakes.swift import SwiftClientStub
from trove.tests.unittests import trove_testtools
class TestRemote(trove_testtools.TestCase):
def setUp(self):
super(TestRemote, self).setUp()
def tearDown(self):
super(TestRemote, self).tearDown()
@patch.object(swiftclient.client.Connection, 'get_auth')
def test_creation(self, get_auth_mock):
self.assertIsNotNone(swiftclient.client.Connection())
def test_create_swift_client(self):
mock_resp = MagicMock()
with patch.object(swiftclient.client.Connection, 'get_container',
MagicMock(return_value=["text", mock_resp])):
service_catalog = [{'endpoints': [{'region': 'RegionOne',
'publicURL': 'example.com'}],
'type': 'object-store'}]
client = remote.create_swift_client(TroveContext(
tenant=uuid.uuid4().hex,
service_catalog=service_catalog))
headers, container = client.get_container('bob')
self.assertIs(headers, "text")
self.assertIs(container, mock_resp)
def test_empty_account(self):
"""
this is an account with no containers and no objects
"""
# setup expectation
with SwiftClientStub() as swift_stub:
swift_stub.with_account('123223')
# interact
conn = swiftclient.client.Connection()
account_info = conn.get_account()
self.assertThat(account_info, matchers.Not(matchers.Is(None)))
self.assertThat(len(account_info), matchers.Is(2))
self.assertThat(account_info, matchers.IsInstance(tuple))
self.assertThat(account_info[0], matchers.IsInstance(dict))
self.assertThat(
account_info[0],
matchers.KeysEqual('content-length', 'accept-ranges',
'x-timestamp', 'x-trans-id', 'date',
'x-account-bytes-used',
'x-account-container-count',
'content-type',
'x-account-object-count'))
self.assertThat(account_info[1], matchers.IsInstance(list))
self.assertThat(len(account_info[1]), matchers.Is(0))
def test_one_container(self):
"""
tests to ensure behavior is normal with one container
"""
# setup expectation
with SwiftClientStub() as swift_stub:
swift_stub.with_account('123223')
cont_name = 'a-container-name'
swift_stub.with_container(cont_name)
# interact
conn = swiftclient.client.Connection()
conn.get_auth()
conn.put_container(cont_name)
# get headers plus container metadata
self.assertThat(len(conn.get_account()), matchers.Is(2))
# verify container details
account_containers = conn.get_account()[1]
self.assertThat(len(account_containers), matchers.Is(1))
self.assertThat(account_containers[0],
matchers.KeysEqual('count', 'bytes', 'name'))
self.assertThat(account_containers[0]['name'],
matchers.Is(cont_name))
# get container details
cont_info = conn.get_container(cont_name)
self.assertIsNotNone(cont_info)
self.assertThat(
cont_info[0],
matchers.KeysEqual('content-length',
'x-container-object-count', 'accept-ranges',
'x-container-bytes-used', 'x-timestamp',
'x-trans-id', 'date', 'content-type'))
self.assertThat(len(cont_info[1]), matchers.Equals(0))
# remove container
swift_stub.without_container(cont_name)
with ExpectedException(swiftclient.ClientException):
conn.get_container(cont_name)
# ensure there are no more containers in account
self.assertThat(len(conn.get_account()[1]), matchers.Is(0))
def test_one_object(self):
with SwiftClientStub() as swift_stub:
swift_stub.with_account('123223')
swift_stub.with_container('bob')
swift_stub.with_object('bob', 'test', 'test_contents')
# create connection
conn = swiftclient.client.Connection()
# test container lightly
cont_info = conn.get_container('bob')
self.assertIsNotNone(cont_info)
self.assertThat(cont_info[0],
matchers.KeysEqual('content-length',
'x-container-object-count',
'accept-ranges',
'x-container-bytes-used',
'x-timestamp',
'x-trans-id',
'date',
'content-type'))
cont_objects = cont_info[1]
self.assertThat(len(cont_objects), matchers.Equals(1))
obj_1 = cont_objects[0]
self.assertThat(obj_1, matchers.Equals(
{'bytes': 13, 'last_modified': '2013-03-15T22:10:49.361950',
'hash': 'ccc55aefbf92aa66f42b638802c5e7f6', 'name': 'test',
'content_type': 'application/octet-stream',
'contents': 'test_contents'}))
# test object api - not much to do here
self.assertThat(conn.get_object('bob', 'test')[1],
matchers.Is('test_contents'))
# test remove object
swift_stub.without_object('bob', 'test')
# interact
with ExpectedException(swiftclient.ClientException):
conn.delete_object('bob', 'test')
self.assertThat(len(conn.get_container('bob')[1]), matchers.Is(0))
def test_two_objects(self):
with SwiftClientStub() as swift_stub:
swift_stub.with_account('123223')
swift_stub.with_container('bob')
swift_stub.with_container('bob2')
swift_stub.with_object('bob', 'test', 'test_contents')
swift_stub.with_object('bob', 'test2', 'test_contents2')
conn = swiftclient.client.Connection()
self.assertIs(len(conn.get_account()), 2)
cont_info = conn.get_container('bob')
self.assertIsNotNone(cont_info)
self.assertThat(cont_info[0],
matchers.KeysEqual('content-length',
'x-container-object-count',
'accept-ranges',
'x-container-bytes-used',
'x-timestamp',
'x-trans-id',
'date',
'content-type'))
self.assertThat(len(cont_info[1]), matchers.Equals(2))
self.assertThat(cont_info[1][0], matchers.Equals(
{'bytes': 13, 'last_modified': '2013-03-15T22:10:49.361950',
'hash': 'ccc55aefbf92aa66f42b638802c5e7f6', 'name': 'test',
'content_type': 'application/octet-stream',
'contents': 'test_contents'}))
self.assertThat(conn.get_object('bob', 'test')[1],
matchers.Is('test_contents'))
self.assertThat(conn.get_object('bob', 'test2')[1],
matchers.Is('test_contents2'))
swift_stub.without_object('bob', 'test')
with ExpectedException(swiftclient.ClientException):
conn.delete_object('bob', 'test')
self.assertThat(len(conn.get_container('bob')[1]), matchers.Is(1))
swift_stub.without_container('bob')
with ExpectedException(swiftclient.ClientException):
conn.get_container('bob')
self.assertThat(len(conn.get_account()), matchers.Is(2))
def test_nonexisting_container(self):
"""
when a container does not exist and is accessed then a 404 is returned
"""
with SwiftClientStub() as swift_stub:
swift_stub.with_account('123223')
swift_stub.with_container('existing')
conn = swiftclient.client.Connection()
with ExpectedException(swiftclient.ClientException):
conn.get_container('nonexisting')
def test_replace_object(self):
"""
Test to ensure that if an object is updated the container object
count is the same and the contents of the object are updated
"""
with SwiftClientStub() as swift_stub:
swift_stub.with_account('1223df2')
swift_stub.with_container('new-container')
swift_stub.with_object('new-container', 'new-object',
'new-object-contents')
conn = swiftclient.client.Connection()
conn.put_object('new-container', 'new-object',
'new-object-contents')
obj_resp = conn.get_object('new-container', 'new-object')
self.assertThat(obj_resp, matchers.Not(matchers.Is(None)))
self.assertThat(len(obj_resp), matchers.Is(2))
self.assertThat(obj_resp[1], matchers.Is('new-object-contents'))
# set expected behavior - trivial here since it is the intended
# behavior however keep in mind this is just to support testing of
# trove components
swift_stub.with_object('new-container', 'new-object',
'updated-object-contents')
conn.put_object('new-container', 'new-object',
'updated-object-contents')
obj_resp = conn.get_object('new-container', 'new-object')
self.assertThat(obj_resp, matchers.Not(matchers.Is(None)))
self.assertThat(len(obj_resp), matchers.Is(2))
self.assertThat(obj_resp[1], matchers.Is(
'updated-object-contents'))
# ensure object count has not increased
self.assertThat(len(conn.get_container('new-container')[1]),
matchers.Is(1))
class TestCreateCinderClient(trove_testtools.TestCase):
def setUp(self):
super(TestCreateCinderClient, self).setUp()
self.volumev2_public_url = 'http://publicURL/v2'
self.volume_public_url_region_two = 'http://publicURL-r2/v1'
self.service_catalog = [
{
'endpoints': [
{
'region': 'RegionOne',
'publicURL': self.volumev2_public_url,
}
],
'type': 'volumev2'
},
{
'endpoints': [
{
'region': 'RegionOne',
'publicURL': 'http://publicURL-r1/v1',
},
{
'region': 'RegionTwo',
'publicURL': self.volume_public_url_region_two,
}
],
'type': 'volume'
}
]
def tearDown(self):
super(TestCreateCinderClient, self).tearDown()
cfg.CONF.clear_override('cinder_url')
cfg.CONF.clear_override('cinder_service_type')
cfg.CONF.clear_override('os_region_name')
def test_create_with_no_conf_no_catalog(self):
self.assertRaises(exception.EmptyCatalog,
remote.create_cinder_client,
TroveContext())
def test_create_with_conf_override(self):
cinder_url_from_conf = 'http://example.com'
tenant_from_ctx = uuid.uuid4().hex
cfg.CONF.set_override('cinder_url', cinder_url_from_conf)
client = remote.create_cinder_client(
TroveContext(tenant=tenant_from_ctx))
self.assertEqual('%s/%s' % (cinder_url_from_conf, tenant_from_ctx),
client.client.management_url)
def test_create_with_conf_override_trailing_slash(self):
cinder_url_from_conf = 'http://example.com/'
tenant_from_ctx = uuid.uuid4().hex
cfg.CONF.set_override('cinder_url', cinder_url_from_conf)
client = remote.create_cinder_client(
TroveContext(tenant=tenant_from_ctx))
self.assertEqual('%s%s' % (cinder_url_from_conf, tenant_from_ctx),
client.client.management_url)
def test_create_with_catalog_and_default_service_type(self):
client = remote.create_cinder_client(
TroveContext(service_catalog=self.service_catalog))
self.assertEqual(self.volumev2_public_url,
client.client.management_url)
def test_create_with_catalog_all_opts(self):
cfg.CONF.set_override('cinder_service_type', 'volume')
cfg.CONF.set_override('os_region_name', 'RegionTwo')
client = remote.create_cinder_client(
TroveContext(service_catalog=self.service_catalog))
self.assertEqual(self.volume_public_url_region_two,
client.client.management_url)
class TestCreateNovaClient(trove_testtools.TestCase):
def setUp(self):
super(TestCreateNovaClient, self).setUp()
self.compute_public_url = 'http://publicURL/v2'
self.computev3_public_url_region_two = 'http://publicURL-r2/v3'
self.service_catalog = [
{
'endpoints': [
{
'region': 'RegionOne',
'publicURL': self.compute_public_url,
}
],
'type': 'compute'
},
{
'endpoints': [
{
'region': 'RegionOne',
'publicURL': 'http://publicURL-r1/v1',
},
{
'region': 'RegionTwo',
'publicURL': self.computev3_public_url_region_two,
}
],
'type': 'computev3'
}
]
def tearDown(self):
super(TestCreateNovaClient, self).tearDown()
cfg.CONF.clear_override('nova_compute_url')
cfg.CONF.clear_override('nova_compute_service_type')
cfg.CONF.clear_override('os_region_name')
cfg.CONF.clear_override('nova_proxy_admin_pass')
def test_create_with_no_conf_no_catalog(self):
self.assertRaises(exception.EmptyCatalog,
remote.create_nova_client,
TroveContext())
def test_create_with_conf_override(self):
nova_url_from_conf = 'http://example.com'
tenant_from_ctx = uuid.uuid4().hex
cfg.CONF.set_override('nova_compute_url', nova_url_from_conf)
client = remote.create_nova_client(
TroveContext(tenant=tenant_from_ctx))
self.assertEqual('%s/%s' % (nova_url_from_conf, tenant_from_ctx),
client.client.endpoint_override)
def test_create_with_conf_override_trailing_slash(self):
nova_url_from_conf = 'http://example.com/'
tenant_from_ctx = uuid.uuid4().hex
cfg.CONF.set_override('nova_compute_url', nova_url_from_conf)
client = remote.create_nova_client(
TroveContext(tenant=tenant_from_ctx))
self.assertEqual('%s%s' % (nova_url_from_conf, tenant_from_ctx),
client.client.endpoint_override)
def test_create_with_catalog_and_default_service_type(self):
client = remote.create_nova_client(
TroveContext(service_catalog=self.service_catalog))
self.assertEqual(self.compute_public_url,
client.client.endpoint_override)
def test_create_with_catalog_all_opts(self):
cfg.CONF.set_override('nova_compute_service_type', 'computev3')
cfg.CONF.set_override('os_region_name', 'RegionTwo')
client = remote.create_nova_client(
TroveContext(service_catalog=self.service_catalog))
self.assertEqual(self.computev3_public_url_region_two,
client.client.endpoint_override)
def test_create_admin_client(self):
nova_url_from_conf = 'http://adminexample.com/'
cfg.CONF.set_override('nova_compute_url', nova_url_from_conf)
admin_user = 'admin1'
admin_pass = 'adminpwd'
admin_tenant_id = uuid.uuid4().hex
admin_client = remote.create_admin_nova_client(
TroveContext(user=admin_user,
auth_token=admin_pass,
tenant=admin_tenant_id))
# self.assertEqual(admin_user, admin_client.client.user)
# self.assertEqual(admin_pass, admin_client.client.password)
self.assertEqual('%s%s' % (nova_url_from_conf, admin_tenant_id),
admin_client.client.endpoint_override)
@patch('trove.common.remote.Client', autospec=True)
def test_nova_client_password_passthrough(self, nova_mock):
test_domain = 'test_domain_name'
ctx = TroveContext(user='admin1',
project_id='project_id',
user_domain_name=test_domain,
service_catalog=self.service_catalog)
remote.nova_client(ctx, password='adminpass')
nova_mock.assert_called_with(ANY, username='admin1',
password='adminpass',
user_domain_name=test_domain,
project_id='project_id',
auth_token=None,
auth_url=ANY,
endpoint_override=ANY,
project_domain_name=ANY,
insecure=False)
@patch('trove.common.remote.create_nova_client', autospec=True)
def test_admin_client_password(self, nc_mock):
cfg.CONF.set_override('nova_proxy_admin_pass', 's3cr3t3')
remote.create_admin_nova_client('mycontext')
nc_mock.assert_called_with('mycontext', password='s3cr3t3')
class TestCreateSwiftClient(trove_testtools.TestCase):
def setUp(self):
super(TestCreateSwiftClient, self).setUp()
self.swift_public_url = 'http://publicURL/v2'
self.swiftv3_public_url_region_two = 'http://publicURL-r2/v3'
self.service_catalog = [
{
'endpoints': [
{
'region': 'RegionOne',
'publicURL': self.swift_public_url,
}
],
'type': 'object-store'
},
{
'endpoints': [
{
'region': 'RegionOne',
'publicURL': 'http://publicURL-r1/v1',
},
{
'region': 'RegionTwo',
'publicURL': self.swiftv3_public_url_region_two,
}
],
'type': 'object-storev3'
}
]
def tearDown(self):
super(TestCreateSwiftClient, self).tearDown()
cfg.CONF.clear_override('swift_url')
cfg.CONF.clear_override('swift_service_type')
cfg.CONF.clear_override('os_region_name')
def test_create_with_no_conf_no_catalog(self):
self.assertRaises(exception.EmptyCatalog,
remote.create_swift_client,
TroveContext())
def test_create_with_conf_override(self):
swift_url_from_conf = 'http://example.com/AUTH_'
tenant_from_ctx = uuid.uuid4().hex
cfg.CONF.set_override('swift_url', swift_url_from_conf)
client = remote.create_swift_client(
TroveContext(tenant=tenant_from_ctx))
self.assertEqual('%s%s' % (swift_url_from_conf, tenant_from_ctx),
client.url)
def test_create_with_catalog_and_default_service_type(self):
client = remote.create_swift_client(
TroveContext(service_catalog=self.service_catalog))
self.assertEqual(self.swift_public_url,
client.url)
def test_create_with_catalog_all_opts(self):
cfg.CONF.set_override('swift_service_type', 'object-storev3')
cfg.CONF.set_override('os_region_name', 'RegionTwo')
client = remote.create_swift_client(
TroveContext(service_catalog=self.service_catalog))
self.assertEqual(self.swiftv3_public_url_region_two,
client.url)
class TestCreateGlanceClient(trove_testtools.TestCase):
def setUp(self):
super(TestCreateGlanceClient, self).setUp()
self.glance_public_url = 'http://publicURL/v2'
self.glancev3_public_url_region_two = 'http://publicURL-r2/v3'
self.service_catalog = [
{
'endpoints': [
{
'region': 'RegionOne',
'publicURL': self.glance_public_url,
}
],
'type': 'image'
},
{
'endpoints': [
{
'region': 'RegionOne',
'publicURL': 'http://publicURL-r1/v1',
},
{
'region': 'RegionTwo',
'publicURL': self.glancev3_public_url_region_two,
}
],
'type': 'imagev3'
}
]
def test_create_with_no_conf_no_catalog(self):
self.assertRaises(exception.EmptyCatalog,
glance_remote.create_glance_client,
TroveContext())
def test_create(self):
client = glance_remote.create_glance_client(
TroveContext(service_catalog=self.service_catalog))
self.assertIsNotNone(client)
class TestEndpoints(trove_testtools.TestCase):
"""
Copied from glance/tests/unit/test_auth.py.
"""
def setUp(self):
super(TestEndpoints, self).setUp()
self.service_catalog = [
{
'endpoint_links': [],
'endpoints': [
{
'adminURL': 'http://localhost:8080/',
'region': 'RegionOne',
'internalURL': 'http://internalURL/',
'publicURL': 'http://publicURL/',
},
{
'adminURL': 'http://localhost:8081/',
'region': 'RegionTwo',
'internalURL': 'http://internalURL2/',
'publicURL': 'http://publicURL2/',
},
],
'type': 'object-store',
'name': 'Object Storage Service',
}
]
def test_get_endpoint_empty_catalog(self):
self.assertRaises(exception.EmptyCatalog,
remote.get_endpoint,
None)
def test_get_endpoint_with_custom_server_type(self):
endpoint = remote.get_endpoint(self.service_catalog,
service_type='object-store',
endpoint_region='RegionOne')
self.assertEqual('http://publicURL/', endpoint)
def test_get_endpoint_with_custom_endpoint_type(self):
endpoint = remote.get_endpoint(self.service_catalog,
service_type='object-store',
endpoint_type='internalURL',
endpoint_region='RegionOne')
self.assertEqual('http://internalURL/', endpoint)
def test_get_endpoint_raises_with_invalid_service_type(self):
self.assertRaises(exception.NoServiceEndpoint,
remote.get_endpoint,
self.service_catalog,
service_type='foo')
def test_get_endpoint_raises_with_invalid_endpoint_type(self):
self.assertRaises(exception.NoServiceEndpoint,
remote.get_endpoint,
self.service_catalog,
service_type='object-store',
endpoint_type='foo',
endpoint_region='RegionOne')
def test_get_endpoint_raises_with_invalid_endpoint_region(self):
self.assertRaises(exception.NoServiceEndpoint,
remote.get_endpoint,
self.service_catalog,
service_type='object-store',
endpoint_region='foo',
endpoint_type='internalURL')
def test_get_endpoint_ignores_missing_type(self):
service_catalog = [
{
'name': 'Other Service',
},
{
'endpoint_links': [],
'endpoints': [
{
'adminURL': 'http://localhost:8080/',
'region': 'RegionOne',
'internalURL': 'http://internalURL/',
'publicURL': 'http://publicURL/',
},
{
'adminURL': 'http://localhost:8081/',
'region': 'RegionTwo',
'internalURL': 'http://internalURL2/',
'publicURL': 'http://publicURL2/',
},
],
'type': 'object-store',
'name': 'Object Storage Service',
}
]
endpoint = remote.get_endpoint(service_catalog,
service_type='object-store',
endpoint_region='RegionOne')
self.assertEqual('http://publicURL/', endpoint)

View File

@ -14,8 +14,8 @@
import mock
from trove.common import clients
from trove.common import exception
from trove.common import remote
from trove.datastore import models as datastore_models
from trove.tests.unittests.datastore.base import TestDatastoreBase
@ -150,7 +150,7 @@ class TestDatastoreVersionMetadata(TestDatastoreBase):
'_datastore_version_find')
@mock.patch.object(datastore_models.DatastoreVersionMetadata,
'list_datastore_version_volume_type_associations')
@mock.patch.object(remote, 'create_cinder_client')
@mock.patch.object(clients, 'create_cinder_client')
def _mocked_allowed_datastore_version_volume_types(self,
trove_volume_types,
mock_cinder_client,

View File

@ -17,9 +17,9 @@ import oslo_messaging as messaging
from oslo_messaging.rpc.client import RemoteError
from testtools.matchers import Is
from trove.common.clients import guest_client
import trove.common.context as context
from trove.common import exception
from trove.common.remote import guest_client
from trove.guestagent import api
from trove import rpc
from trove.tests.unittests import trove_testtools

View File

@ -113,7 +113,7 @@ class SimpleInstanceTest(trove_testtools.TestCase):
self.assertIn('123.123.123.123', ip)
self.assertIn('15.123.123.123', ip)
@patch('trove.common.remote.create_neutron_client')
@patch('trove.common.clients.create_neutron_client')
def test_filter_management_ip_addresses(self, mock_neutron_client):
CONF.network_label_regex = ''
CONF.management_networks = ['fake-net-id']

View File

@ -17,8 +17,8 @@ import jsonschema
from mock import Mock, patch, MagicMock, PropertyMock
from testtools.matchers import Is, Equals
from trove.common import clients
from trove.common import exception
from trove.common import glance_remote
from trove.datastore import models as datastore_models
from trove.extensions.mgmt.datastores.service import DatastoreVersionController
from trove.tests.unittests import trove_testtools
@ -81,7 +81,7 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
self.assertIn("'' is too short", error_messages)
self.assertIn("'' does not match '^.*[0-9a-zA-Z]+.*$'", error_messages)
@patch.object(glance_remote, 'create_glance_client')
@patch.object(clients, 'create_glance_client')
@patch.object(datastore_models.Datastore, 'load')
@patch.object(datastore_models.DatastoreVersion, 'load',
side_effect=exception.DatastoreVersionNotFound)
@ -127,7 +127,7 @@ class TestDatastoreVersionController(trove_testtools.TestCase):
mock_ds_version_load_all.assert_called_with(only_active=False)
mock_ds_version_load_by_uuid.assert_called_with(mock_id)
@patch.object(glance_remote, 'create_glance_client')
@patch.object(clients, 'create_glance_client')
@patch.object(datastore_models.DatastoreVersion, 'load_by_uuid')
@patch.object(datastore_models, 'update_datastore_version')
def test_edit_datastore_versions(self, mock_ds_version_update,

View File

@ -15,8 +15,8 @@
from mock import Mock, patch
from glanceclient import exc as glance_exceptions
from trove.common import clients
from trove.common import exception
from trove.common import glance_remote
from trove.datastore import models
from trove.extensions.mgmt.datastores.service import DatastoreVersionController
from trove.tests.unittests import trove_testtools
@ -48,7 +48,7 @@ class TestDatastoreVersion(trove_testtools.TestCase):
def tearDown(self):
super(TestDatastoreVersion, self).tearDown()
@patch.object(glance_remote, 'create_glance_client')
@patch.object(clients, 'create_glance_client')
def test_version_create(self, mock_glance_client):
body = {"version": {
"datastore_name": "test_ds",
@ -62,7 +62,7 @@ class TestDatastoreVersion(trove_testtools.TestCase):
self.req, body, self.tenant_id)
self.assertEqual(202, output.status)
@patch.object(glance_remote, 'create_glance_client')
@patch.object(clients, 'create_glance_client')
@patch.object(models.DatastoreVersion, 'load')
def test_fail_already_exists_version_create(self, mock_load,
mock_glance_client):
@ -79,7 +79,7 @@ class TestDatastoreVersion(trove_testtools.TestCase):
"A datastore version with the name 'test_new_vr' already exists",
self.version_controller.create, self.req, body, self.tenant_id)
@patch.object(glance_remote, 'create_glance_client')
@patch.object(clients, 'create_glance_client')
def test_fail_image_not_found_version_create(self, mock_glance_client):
mock_glance_client.return_value.images.get = Mock(
side_effect=glance_exceptions.HTTPNotFound())
@ -112,7 +112,7 @@ class TestDatastoreVersion(trove_testtools.TestCase):
exception.DatastoreVersionNotFound,
err_msg, models.DatastoreVersion.load_by_uuid, ds_version1.id)
@patch.object(glance_remote, 'create_glance_client')
@patch.object(clients, 'create_glance_client')
def test_version_update(self, mock_client):
body = {"image": "c022f4dc-76ed-4e3f-a25e-33e031f43f8b"}
output = self.version_controller.edit(self.req, body,
@ -125,7 +125,7 @@ class TestDatastoreVersion(trove_testtools.TestCase):
self.ds_version2.id)
self.assertEqual(body['image'], test_ds_version.image_id)
@patch.object(glance_remote, 'create_glance_client')
@patch.object(clients, 'create_glance_client')
def test_version_update_fail_image_not_found(self, mock_glance_client):
mock_glance_client.return_value.images.get = Mock(
side_effect=glance_exceptions.HTTPNotFound())

View File

@ -23,9 +23,9 @@ from oslo_config import cfg
from testtools.matchers import Equals, Is, Not
from trove.backup.models import Backup
from trove.common import clients
from trove.common import exception
from trove.common import instance as rd_instance
from trove.common import remote
from trove.datastore import models as datastore_models
import trove.extensions.mgmt.instances.models as mgmtmodels
from trove.guestagent.api import API
@ -76,7 +76,7 @@ class MockMgmtInstanceTest(trove_testtools.TestCase):
self.flavor_mgr = MagicMock(spec=FlavorManager)
self.client.flavors = self.flavor_mgr
self.admin_client_patch = patch.object(
remote, 'create_admin_nova_client', return_value=self.client)
clients, 'create_admin_nova_client', return_value=self.client)
self.addCleanup(self.admin_client_patch.stop)
self.admin_client_patch.start()
CONF.set_override('host', '127.0.0.1')

View File

@ -36,7 +36,6 @@ from trove.common.exception import PollTimeOut
from trove.common.exception import TroveError
from trove.common.instance import ServiceStatuses
from trove.common.notification import TroveInstanceModifyVolume
from trove.common import remote
import trove.common.template as template
from trove.common import timeutils
from trove.common import utils
@ -396,7 +395,7 @@ class FreshInstanceTasksTest(BaseFreshInstanceTasksTest):
@patch.object(taskmanager_models.FreshInstanceTasks, '_build_volume_info')
@patch.object(taskmanager_models.FreshInstanceTasks, '_guest_prepare')
@patch.object(template, 'SingleInstanceConfigTemplate')
@patch('trove.common.remote.neutron_client')
@patch('trove.common.clients.neutron_client')
def test_create_instance_with_mgmt_port(self,
mock_neutron_client,
mock_single_instance_template,
@ -1050,10 +1049,6 @@ class BackupTasksTest(trove_testtools.TestCase):
self.backup.updated = 'today'
self.backup.size = 2.0
self.backup.state = state.BackupState.NEW
self.container_content = (None,
[{'name': 'first'},
{'name': 'second'},
{'name': 'third'}])
self.bm_backup_patches = patch.multiple(
backup_models.Backup,
delete=MagicMock(return_value=None),
@ -1066,21 +1061,6 @@ class BackupTasksTest(trove_testtools.TestCase):
self.bm_DBBackup_mock = self.bm_DBBackup_patch.start()
self.addCleanup(self.bm_DBBackup_patch.stop)
self.backup.delete = MagicMock(return_value=None)
self.swift_client = MagicMock()
self.create_swift_client_patch = patch.object(
remote, 'create_swift_client',
MagicMock(return_value=self.swift_client))
self.create_swift_client_mock = self.create_swift_client_patch.start()
self.addCleanup(self.create_swift_client_patch.stop)
self.swift_client.head_container = MagicMock(
side_effect=ClientException("foo"))
self.swift_client.head_object = MagicMock(
side_effect=ClientException("foo"))
self.swift_client.get_container = MagicMock(
return_value=self.container_content)
self.swift_client.delete_object = MagicMock(return_value=None)
self.swift_client.delete_container = MagicMock(return_value=None)
def tearDown(self):
super(BackupTasksTest, self).tearDown()
@ -1092,34 +1072,25 @@ class BackupTasksTest(trove_testtools.TestCase):
self.backup.delete.assert_any_call()
@patch('trove.taskmanager.models.LOG')
def test_delete_backup_fail_delete_manifest(self, mock_logging):
with patch.object(self.swift_client, 'delete_object',
side_effect=ClientException("foo")):
with patch.object(self.swift_client, 'head_object',
return_value={}):
self.assertRaises(
TroveError,
taskmanager_models.BackupTasks.delete_backup,
'dummy context', self.backup.id)
self.assertFalse(backup_models.Backup.delete.called)
self.assertEqual(
state.BackupState.DELETE_FAILED,
self.backup.state,
"backup should be in DELETE_FAILED status")
@patch('trove.common.clients.create_swift_client')
def test_delete_backup_fail_delete_manifest(self, mock_swift_client,
mock_logging):
client_mock = MagicMock()
client_mock.head_object.return_value = {}
client_mock.delete_object.side_effect = ClientException("foo")
mock_swift_client.return_value = client_mock
@patch('trove.taskmanager.models.LOG')
def test_delete_backup_fail_delete_segment(self, mock_logging):
with patch.object(self.swift_client, 'delete_object',
side_effect=ClientException("foo")):
self.assertRaises(
TroveError,
taskmanager_models.BackupTasks.delete_backup,
'dummy context', self.backup.id)
self.assertFalse(backup_models.Backup.delete.called)
self.assertEqual(
state.BackupState.DELETE_FAILED,
self.backup.state,
"backup should be in DELETE_FAILED status")
self.assertRaises(
TroveError,
taskmanager_models.BackupTasks.delete_backup,
'dummy context', self.backup.id
)
self.assertFalse(backup_models.Backup.delete.called)
self.assertEqual(
state.BackupState.DELETE_FAILED,
self.backup.state,
"backup should be in DELETE_FAILED status"
)
def test_parse_manifest(self):
manifest = 'container/prefix'

View File

@ -16,7 +16,7 @@
import mock
from trove.common import remote
from trove.common import clients
from trove.tests.unittests import trove_testtools
from trove.volume_type import models
@ -38,7 +38,7 @@ class TestVolumeType(trove_testtools.TestCase):
self.assertEqual(cinder_volume_type.description,
volume_type.description)
@mock.patch.object(remote, 'create_cinder_client')
@mock.patch.object(clients, 'create_cinder_client')
def test_volume_types(self, mock_client):
mock_context = mock.MagicMock()
mock_types = [mock.MagicMock(), mock.MagicMock()]

View File

@ -17,9 +17,9 @@
"""Model classes that form the core of volume-support functionality"""
from cinderclient import exceptions as cinder_exception
from trove.common import clients
from trove.common import exception as trove_exception
from trove.common import models
from trove.common import remote
class VolumeType(object):
@ -36,7 +36,7 @@ class VolumeType(object):
raise trove_exception.InvalidModelError(
"client or context must be provided to load a volume_type")
if not client:
client = remote.create_cinder_client(context)
client = clients.create_cinder_client(context)
try:
volume_type = client.volume_types.get(volume_type_id)
except cinder_exception.NotFound:
@ -65,7 +65,8 @@ class VolumeType(object):
class VolumeTypes(models.CinderRemoteModelBase):
def __init__(self, context):
volume_types = remote.create_cinder_client(context).volume_types.list()
volume_types = clients.create_cinder_client(
context).volume_types.list()
self.volume_types = [VolumeType(volume_type=item)
for item in volume_types]