Baseclass for ModelBuilder with audit scope
This lets all the ModelBuilder classes use one baseclass and forces ClusterDataModelCollector's to pass the scope. The scopes are still unused in the case of Ironic and Cinder. The idea is to do several follow ups to this and in the end have a similar method to query_retry in the datasources baseclass. Change-Id: Ibbdedd3087fef5298d7f4c9d3abdba05d1fbb2f0
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user