Add support for default project_id and user_id

The user_id and project_id fields for our volumes and snapshots had a
very poor default value, they were defaulting to None.  And the only way
we had to change them was to provide an override for these fields when
creating the resource.

This patch adds a better default for these values ("cinderlib") and also
supports setting a different default on the setup process passing
project_id and user_id parameters to the "setup" method.
This commit is contained in:
Gorka Eguileor
2018-03-13 19:51:26 +01:00
parent 0b608f85e9
commit 7dde24e6cc
3 changed files with 53 additions and 13 deletions

View File

@@ -9,6 +9,7 @@ History
- Modify fields on connect method.
- Support setting custom root_helper.
- Setting default project_id and user_id.
- Bug fixes:

View File

@@ -41,12 +41,31 @@ import six
__all__ = ['setup', 'load', 'json', 'jsons', 'Backend', 'Volume', 'Snapshot',
'Connection']
'Connection', 'DEFAULT_PROJECT_ID', 'DEFAULT_USER_ID']
DEFAULT_PROJECT_ID = 'cinderlib'
DEFAULT_USER_ID = 'cinderlib'
CONTEXT = context.RequestContext(user_id=DEFAULT_USER_ID,
project_id=DEFAULT_PROJECT_ID,
is_admin=True,
overwrite=False)
volume_cmd.objects.register_all()
def set_context(project_id=None, user_id=None):
global CONTEXT
project_id = project_id or DEFAULT_PROJECT_ID
user_id = user_id or DEFAULT_USER_ID
if project_id != CONTEXT.project_id or user_id != CONTEXT.user_id:
CONTEXT.user_id = user_id
CONTEXT.project_id = project_id
Volume.DEFAULT_FIELDS_VALUES['user_id'] = user_id
Volume.DEFAULT_FIELDS_VALUES['project_id'] = project_id
class Backend(object):
"""Representation of a Cinder Driver.
@@ -63,7 +82,6 @@ class Backend(object):
"""
backends = {}
global_initialization = False
context = context.get_admin_context()
def __init__(self, volume_backend_name, **driver_cfg):
if not self.global_initialization:
@@ -79,7 +97,7 @@ class Backend(object):
host=volume_cmd.CONF.host,
cluster_name=None, # No clusters for now: volume_cmd.CONF.cluster,
active_backend_id=None) # No failover for now
self.driver.do_setup(self.context)
self.driver.do_setup(CONTEXT)
self.driver.check_for_setup_error()
self.driver.init_capabilities()
self.driver.set_throttle()
@@ -156,11 +174,13 @@ class Backend(object):
def global_setup(cls, file_locks_path=None, root_helper='sudo',
suppress_requests_ssl_warnings=True, disable_logs=True,
non_uuid_ids=False, output_all_backend_info=False,
**log_params):
project_id=None, user_id=None, **log_params):
# Global setup can only be set once
if cls.global_initialization:
raise Exception('Already setup')
set_context(project_id, user_id)
# Prevent driver dynamic loading clearing configuration options
volume_cmd.CONF._ConfigOpts__cache = MyDict()
@@ -271,7 +291,6 @@ class Object(object):
"""Base class for our resource representation objects."""
DEFAULT_FIELDS_VALUES = {}
objects = collections.defaultdict(dict)
context = context.get_admin_context()
def __init__(self, backend, **fields_data):
self.backend = backend
@@ -310,7 +329,7 @@ class Object(object):
elif field.nullable:
fields_values.setdefault(field_name, None)
return self.OVO_CLASS(context=self.context, **fields_values)
return self.OVO_CLASS(context=CONTEXT, **fields_values)
@property
def json(self):
@@ -342,7 +361,7 @@ class Object(object):
backend = Backend(**json_src['backend'])
ovo = cinder_base_ovo.CinderObject.obj_from_primitive(json_src['ovo'],
cls.context)
CONTEXT)
return cls._load(backend, ovo)
def _replace_ovo(self, ovo):
@@ -362,8 +381,8 @@ class Volume(Object):
OVO_CLASS = volume_cmd.objects.Volume
DEFAULT_FIELDS_VALUES = {
'size': 1,
'user_id': Object.context.user_id,
'project_id': Object.context.project_id,
'user_id': CONTEXT.user_id,
'project_id': CONTEXT.project_id,
'host': volume_cmd.CONF.host,
'status': 'creating',
'attach_status': 'detached',
@@ -390,10 +409,10 @@ class Volume(Object):
kwargs['display_name'] = kwargs.pop('name')
kwargs.setdefault(
'volume_attachment',
volume_cmd.objects.VolumeAttachmentList(context=self.context))
volume_cmd.objects.VolumeAttachmentList(context=CONTEXT))
kwargs.setdefault(
'snapshots',
volume_cmd.objects.SnapshotList(context=self.context))
volume_cmd.objects.SnapshotList(context=CONTEXT))
super(Volume, self).__init__(backend_or_vol, **kwargs)
self.snapshots = set()
@@ -556,7 +575,7 @@ class Volume(Object):
def connect(self, connector_dict, **ovo_fields):
if not self.exported:
model_update = self.backend.driver.create_export(self.context,
model_update = self.backend.driver.create_export(CONTEXT,
self._ovo,
connector_dict)
if model_update:

View File

@@ -23,7 +23,7 @@ The method definition is as follows:
def global_setup(cls, file_locks_path=None, root_helpers='sudo',
suppress_requests_ssl_warnings=True, disable_logs=True,
non_uuid_ids=False, output_all_backend_info=False,
**log_params):
project_id=None, user_id=None, **log_params):
The meaning of the library's configuration options are:
@@ -102,6 +102,26 @@ default.
Defaults to `True`.
project_id
----------
*Cinder* is a multi-tenant service, and when resources are created they belong
to a specific tenant/project. With this parameter we can define, using a
string, an identifier for our project that will be assigned to the resources we
create.
Defaults to `cinderlib`.
user_id
-------
Within each project/tenant the *Cinder* project supports multiple users, so
when it creates a resource a reference to the user that created it is stored
in the resource. Using this this parameter we can define, using a string, an
identifier for the user of cinderlib to be recorded in the resources.
Defaults to `cinderlib`.
other keyword arguments
-----------------------