Merge "Baseclass for ModelBuilder with audit scope"
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