Merge "Baseclass for ModelBuilder with audit scope"

This commit is contained in:
Zuul
2019-07-19 13:34:42 +00:00
committed by Gerrit Code Review
7 changed files with 241 additions and 248 deletions

View File

@@ -126,9 +126,9 @@ class BaseClusterDataModelCollector(loadable.LoadableSingleton):
def __init__(self, config, osc=None):
super(BaseClusterDataModelCollector, self).__init__(config)
self.osc = osc if osc else clients.OpenStackClients()
self._cluster_data_model = None
self.lock = threading.RLock()
self._audit_scope_handler = None
self._cluster_data_model = None
self._data_model_scope = None
@property
@@ -190,3 +190,15 @@ class BaseClusterDataModelCollector(loadable.LoadableSingleton):
with the existing cluster data model
"""
self.cluster_data_model = self.execute()
class BaseModelBuilder(object):
@abc.abstractmethod
def execute(self, model_scope):
"""Build the cluster data model limited to the scope and return it
Builds the cluster data model with respect to the supplied scope. The
schema of this scope will depend on the type of ModelBuilder.
"""
raise NotImplementedError()

View File

@@ -137,17 +137,27 @@ class CinderClusterDataModelCollector(base.BaseClusterDataModelCollector):
def get_audit_scope_handler(self, audit_scope):
self._audit_scope_handler = storage_scope.StorageScope(
audit_scope, self.config)
if self._data_model_scope is None or (
len(self._data_model_scope) > 0 and (
self._data_model_scope != audit_scope)):
self._data_model_scope = audit_scope
self._cluster_data_model = None
LOG.debug("audit scope %s", audit_scope)
return self._audit_scope_handler
def execute(self):
"""Build the storage cluster data model"""
LOG.debug("Building latest Cinder cluster data model")
builder = ModelBuilder(self.osc)
return builder.execute()
if self._audit_scope_handler is None:
LOG.debug("No audit, Don't Build storage data model")
return
builder = CinderModelBuilder(self.osc)
return builder.execute(self._data_model_scope)
class ModelBuilder(object):
class CinderModelBuilder(base.BaseModelBuilder):
"""Build the graph-based model
This model builder adds the following data"
@@ -292,12 +302,13 @@ class ModelBuilder(object):
return element.Volume(**volume_attributes)
def execute(self):
def execute(self, model_scope):
"""Instantiates the graph with the openstack cluster data.
The graph is populated along 2 layers: virtual and physical. As each
new layer is built connections are made back to previous layers.
"""
# TODO(Dantali0n): Use scope to limit size of model
self._add_physical_layer()
self._add_virtual_layer()
return self.model

View File

@@ -48,17 +48,27 @@ class BaremetalClusterDataModelCollector(base.BaseClusterDataModelCollector):
def get_audit_scope_handler(self, audit_scope):
self._audit_scope_handler = baremetal_scope.BaremetalScope(
audit_scope, self.config)
if self._data_model_scope is None or (
len(self._data_model_scope) > 0 and (
self._data_model_scope != audit_scope)):
self._data_model_scope = audit_scope
self._cluster_data_model = None
LOG.debug("audit scope %s", audit_scope)
return self._audit_scope_handler
def execute(self):
"""Build the baremetal cluster data model"""
LOG.debug("Building latest Baremetal cluster data model")
builder = ModelBuilder(self.osc)
return builder.execute()
if self._audit_scope_handler is None:
LOG.debug("No audit, Don't Build Baremetal data model")
return
builder = BareMetalModelBuilder(self.osc)
return builder.execute(self._data_model_scope)
class ModelBuilder(object):
class BareMetalModelBuilder(base.BaseModelBuilder):
"""Build the graph-based model
This model builder adds the following data"
@@ -93,8 +103,8 @@ class ModelBuilder(object):
ironic_node = element.IronicNode(**node_attributes)
return ironic_node
def execute(self):
def execute(self, model_scope):
# TODO(Dantali0n): Use scope to limit size of model
for node in self.ironic_helper.get_ironic_node_list():
self.add_ironic_node(node)
return self.model

View File

@@ -180,17 +180,16 @@ class NovaClusterDataModelCollector(base.BaseClusterDataModelCollector):
LOG.debug("No audit, Don't Build compute data model")
return
builder = ModelBuilder(self.osc)
builder = NovaModelBuilder(self.osc)
return builder.execute(self._data_model_scope)
class ModelBuilder(object):
class NovaModelBuilder(base.BaseModelBuilder):
"""Build the graph-based model
This model builder adds the following data"
- Compute-related knowledge (Nova)
- TODO(v-francoise): Storage-related knowledge (Cinder)
- TODO(v-francoise): Network-related knowledge (Neutron)
NOTE(v-francoise): This model builder is meant to be extended in the future