Merge branch 'feature/type-relationship-graph' into 'master'

Implement maintaining object relationship graph

See merge request ungleich-public/cdist!986
This commit is contained in:
poljakowski 2021-03-31 07:52:42 +02:00
commit 28c13bd29b
3 changed files with 43 additions and 0 deletions

View file

@ -247,6 +247,13 @@ class CdistObject:
lambda obj: os.path.join(obj.absolute_path, 'typeorder')) lambda obj: os.path.join(obj.absolute_path, 'typeorder'))
typeorder_dep = fsproperty.FileListProperty( typeorder_dep = fsproperty.FileListProperty(
lambda obj: os.path.join(obj.absolute_path, 'typeorder_dep')) lambda obj: os.path.join(obj.absolute_path, 'typeorder_dep'))
# objects without parents are objects specified in init manifest
parents = fsproperty.FileListProperty(
lambda obj: os.path.join(obj.absolute_path, 'parents'))
# objects without children are object of types that do not reuse other
# types
children = fsproperty.FileListProperty(
lambda obj: os.path.join(obj.absolute_path, 'children'))
def cleanup(self): def cleanup(self):
try: try:

View file

@ -106,6 +106,7 @@ class Emulator:
self.save_stdin() self.save_stdin()
self.record_requirements() self.record_requirements()
self.record_auto_requirements() self.record_auto_requirements()
self.record_parent_child_relationships()
self.log.trace("Finished %s %s" % ( self.log.trace("Finished %s %s" % (
self.cdist_object.path, self.parameters)) self.cdist_object.path, self.parameters))
@ -420,3 +421,21 @@ class Emulator:
self.log.debug("Recording autorequirement %s for %s", self.log.debug("Recording autorequirement %s for %s",
current_object.name, parent.name) current_object.name, parent.name)
parent.autorequire.append(current_object.name) parent.autorequire.append(current_object.name)
def record_parent_child_relationships(self):
# __object_name is the name of the object whose type manifest is
# currently executed
__object_name = self.env.get('__object_name', None)
if __object_name:
# The object whose type manifest is currently run
parent = self.cdist_object.object_from_name(__object_name)
# The object currently being defined
current_object = self.cdist_object
if current_object.name not in parent.children:
self.log.debug("Recording child %s for %s",
current_object.name, parent.name)
parent.children.append(current_object.name)
if parent.name not in current_object.parents:
self.log.debug("Recording parent %s for %s",
parent.name, current_object.name)
current_object.parents.append(parent.name)

View file

@ -61,6 +61,14 @@ Object cache overview
~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~
Each object under :strong:`object` directory has its own structure. Each object under :strong:`object` directory has its own structure.
autorequire
file containing a list of object auto requirements
children
file containing a list of object children, i.e. objects of types that this
type reuses (along with 'parents' it is used for maintaining parent-child
relationship graph)
code-local code-local
code generated from gencode-local, present only if something is code generated from gencode-local, present only if something is
generated generated
@ -80,6 +88,15 @@ parameter
directory containing type parameter named files containing parameter directory containing type parameter named files containing parameter
values values
parents
file containing a list of object parents, i.e. objects of types that reuse
this type (along with 'children' it is used for maintaining parent-child
relationship graph); objects without parents are objects specified in init
manifest
require
file containing a list of object requirements
source source
this type's source (init manifest) this type's source (init manifest)