forked from ungleich-public/cdist
		
	Merge remote-tracking branch 'steven/master'
This commit is contained in:
		
				commit
				
					
						32f1e2efb6
					
				
			
		
					 2 changed files with 57 additions and 139 deletions
				
			
		| 
						 | 
					@ -31,7 +31,8 @@ log = logging.getLogger(__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DOT_CDIST = '.cdist'
 | 
					DOT_CDIST = '.cdist'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# FIXME: i should not have to care about prefix directory, local, remote and such.
 | 
				
			||||||
 | 
					#  I know what my internals look like, the outside is none of my business.
 | 
				
			||||||
class Object(object):
 | 
					class Object(object):
 | 
				
			||||||
    """Represents a cdist object.
 | 
					    """Represents a cdist object.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -63,6 +64,21 @@ class Object(object):
 | 
				
			||||||
        return base_dir
 | 
					        return base_dir
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
 | 
					    def remote_base_dir():
 | 
				
			||||||
 | 
					        """Return the absolute path to the top level directory where objects
 | 
				
			||||||
 | 
					        are kept on the remote/target host.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Requires the environment variable '__cdist_remote_out_dir' to be set.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            return os.path.join(
 | 
				
			||||||
 | 
					                os.environ['__cdist_remote_out_dir'],
 | 
				
			||||||
 | 
					                'object',
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        except KeyError as e:
 | 
				
			||||||
 | 
					            raise cdist.MissingEnvironmentVariableError(e.args[0])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def list_objects(cls):
 | 
					    def list_objects(cls):
 | 
				
			||||||
        """Return a list of object instances"""
 | 
					        """Return a list of object instances"""
 | 
				
			||||||
        for object_name in cls.list_object_names():
 | 
					        for object_name in cls.list_object_names():
 | 
				
			||||||
| 
						 | 
					@ -79,7 +95,6 @@ class Object(object):
 | 
				
			||||||
    def list_object_names(cls):
 | 
					    def list_object_names(cls):
 | 
				
			||||||
        """Return a list of object names"""
 | 
					        """Return a list of object names"""
 | 
				
			||||||
        for path, dirs, files in os.walk(cls.base_dir()):
 | 
					        for path, dirs, files in os.walk(cls.base_dir()):
 | 
				
			||||||
            # FIXME: use constant instead of string
 | 
					 | 
				
			||||||
            if DOT_CDIST in dirs:
 | 
					            if DOT_CDIST in dirs:
 | 
				
			||||||
                yield os.path.relpath(path, cls.base_dir())
 | 
					                yield os.path.relpath(path, cls.base_dir())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -123,6 +138,19 @@ class Object(object):
 | 
				
			||||||
            os.mkdir(path)
 | 
					            os.mkdir(path)
 | 
				
			||||||
        return path
 | 
					        return path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # FIXME: prefix directory should not leak into me
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def remote_path(self):
 | 
				
			||||||
 | 
					        return os.path.join(
 | 
				
			||||||
 | 
					            self.remote_base_dir(),
 | 
				
			||||||
 | 
					            self.name,
 | 
				
			||||||
 | 
					            DOT_CDIST
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def remote_code_remote(self):
 | 
				
			||||||
 | 
					        return os.path.join(self.remote_path, "code-remote")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ### requirements
 | 
					    ### requirements
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def requirements(self):
 | 
					    def requirements(self):
 | 
				
			||||||
| 
						 | 
					@ -175,23 +203,7 @@ class Object(object):
 | 
				
			||||||
                pass
 | 
					                pass
 | 
				
			||||||
    ### /changed
 | 
					    ### /changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # FIXME: implement other properties/methods 
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # FIXME: check following methods: implement or revoke / delete
 | 
					 | 
				
			||||||
    # FIXME: Object
 | 
					 | 
				
			||||||
    def get_object_id_from_object(self, cdist_object):
 | 
					 | 
				
			||||||
        """Returns everything but the first part (i.e. object_id) of an object"""
 | 
					 | 
				
			||||||
        return os.sep.join(cdist_object.split(os.sep)[1:])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # FIXME: Object
 | 
					 | 
				
			||||||
    def object_dir(self, cdist_object):
 | 
					 | 
				
			||||||
        """Returns the full path to the object (including .cdist)"""
 | 
					 | 
				
			||||||
        return os.path.join(self.object_base_dir, cdist_object, DOT_CDIST)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # FIXME: Object
 | 
					 | 
				
			||||||
    def remote_object_dir(self, cdist_object):
 | 
					 | 
				
			||||||
        """Returns the remote full path to the object (including .cdist)"""
 | 
					 | 
				
			||||||
        return os.path.join(REMOTE_OBJECT_DIR, cdist_object, DOT_CDIST)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # FIXME: Object
 | 
					    # FIXME: Object
 | 
				
			||||||
    def object_parameter_dir(self, cdist_object):
 | 
					    def object_parameter_dir(self, cdist_object):
 | 
				
			||||||
| 
						 | 
					@ -209,41 +221,3 @@ class Object(object):
 | 
				
			||||||
        return [os.path.join(self.object_dir(cdist_object), "code-local"),
 | 
					        return [os.path.join(self.object_dir(cdist_object), "code-local"),
 | 
				
			||||||
                  os.path.join(self.object_dir(cdist_object), "code-remote")]
 | 
					                  os.path.join(self.object_dir(cdist_object), "code-remote")]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Stays here
 | 
					 | 
				
			||||||
    def list_object_paths(self, starting_point):
 | 
					 | 
				
			||||||
        """Return list of paths of existing objects"""
 | 
					 | 
				
			||||||
        object_paths = []
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        for content in os.listdir(starting_point):
 | 
					 | 
				
			||||||
            full_path = os.path.join(starting_point, content)
 | 
					 | 
				
			||||||
            if os.path.isdir(full_path):
 | 
					 | 
				
			||||||
                object_paths.extend(self.list_object_paths(starting_point = full_path))
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
            # Directory contains .cdist -> is an object
 | 
					 | 
				
			||||||
            if content == DOT_CDIST:
 | 
					 | 
				
			||||||
                object_paths.append(starting_point)
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
        return object_paths
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Stays here
 | 
					 | 
				
			||||||
    def list_objects(self):
 | 
					 | 
				
			||||||
        """Return list of existing objects"""
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        objects = []
 | 
					 | 
				
			||||||
        if os.path.isdir(self.object_base_dir):
 | 
					 | 
				
			||||||
            object_paths = self.list_object_paths(self.object_base_dir)
 | 
					 | 
				
			||||||
            
 | 
					 | 
				
			||||||
            for path in object_paths:
 | 
					 | 
				
			||||||
                objects.append(os.path.relpath(path, self.object_base_dir))
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
        return objects
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # FIXME: object
 | 
					 | 
				
			||||||
    def type_explorer_output_dir(self, cdist_object):
 | 
					 | 
				
			||||||
        """Returns and creates dir of the output for a type explorer"""
 | 
					 | 
				
			||||||
        dir = os.path.join(self.object_dir(cdist_object), "explorer")
 | 
					 | 
				
			||||||
        if not os.path.isdir(dir):
 | 
					 | 
				
			||||||
            os.mkdir(dir)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return dir
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,8 +25,6 @@ import os
 | 
				
			||||||
import cdist
 | 
					import cdist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# FIXME: i should not have to care about prefix directory, local, remote and such.
 | 
					 | 
				
			||||||
#  I know what my internals look like, the outside is none of my business.
 | 
					 | 
				
			||||||
class Type(object):
 | 
					class Type(object):
 | 
				
			||||||
    """Represents a cdist type.
 | 
					    """Represents a cdist type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,111 +34,57 @@ class Type(object):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @staticmethod
 | 
					 | 
				
			||||||
    def base_dir():
 | 
					 | 
				
			||||||
        """Return the absolute path to the top level directory where types
 | 
					 | 
				
			||||||
        are defined.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Requires the environment variable '__cdist_base_dir' to be set.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            return os.path.join(
 | 
					 | 
				
			||||||
                os.environ['__cdist_base_dir'],
 | 
					 | 
				
			||||||
                'conf',
 | 
					 | 
				
			||||||
                'type'
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
        except KeyError as e:
 | 
					 | 
				
			||||||
            raise cdist.MissingEnvironmentVariableError(e.args[0])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @staticmethod
 | 
					 | 
				
			||||||
    def remote_base_dir():
 | 
					 | 
				
			||||||
        """Return the absolute path to the top level directory where types
 | 
					 | 
				
			||||||
        are kept on the remote/target host.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Requires the environment variable '__cdist_remote_base_dir' to be set.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        """
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            return os.path.join(
 | 
					 | 
				
			||||||
                os.environ['__cdist_remote_base_dir'],
 | 
					 | 
				
			||||||
                'conf',
 | 
					 | 
				
			||||||
                'type'
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
        except KeyError as e:
 | 
					 | 
				
			||||||
            raise cdist.MissingEnvironmentVariableError(e.args[0])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def list_types(cls):
 | 
					    def list_types(cls, base_path):
 | 
				
			||||||
        """Return a list of type instances"""
 | 
					        """Return a list of type instances"""
 | 
				
			||||||
        for type_name in cls.list_type_names():
 | 
					        for name in cls.list_type_names(base_path):
 | 
				
			||||||
            yield cls(type_name)
 | 
					            yield cls(base_path, name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def list_type_names(cls):
 | 
					    def list_type_names(cls, base_path):
 | 
				
			||||||
        """Return a list of type names"""
 | 
					        """Return a list of type names"""
 | 
				
			||||||
        return os.listdir(cls.base_dir())
 | 
					        return os.listdir(base_path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, name):
 | 
					    def __init__(self, base_path, name):
 | 
				
			||||||
 | 
					        self._base_path = base_path
 | 
				
			||||||
        self.name = name
 | 
					        self.name = name
 | 
				
			||||||
 | 
					        self.path = self.name
 | 
				
			||||||
 | 
					        self.absolute_path = os.path.join(self._base_path, self.path)
 | 
				
			||||||
 | 
					        self.manifest_path = os.path.join(self.name, "manifest")
 | 
				
			||||||
 | 
					        self.explorer_path = os.path.join(self.name, "explorer")
 | 
				
			||||||
 | 
					        self.manifest_path = os.path.join(self.name, "manifest")
 | 
				
			||||||
 | 
					        self.gencode_local_path = os.path.join(self.name, "gencode-local")
 | 
				
			||||||
 | 
					        self.gencode_remote_path = os.path.join(self.name, "gencode-remote")
 | 
				
			||||||
 | 
					        self.manifest_path = os.path.join(self.name, "manifest")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.transferred_explorers = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.__explorers = None
 | 
					        self.__explorers = None
 | 
				
			||||||
        self.__required_parameters = None
 | 
					        self.__required_parameters = None
 | 
				
			||||||
        self.__optional_parameters = None
 | 
					        self.__optional_parameters = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.transferred_explorers = False
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __repr__(self):
 | 
					    def __repr__(self):
 | 
				
			||||||
        return '<Type name=%s>' % self.name
 | 
					        return '<Type %s>' % self.name
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def path(self):
 | 
					 | 
				
			||||||
        return os.path.join(
 | 
					 | 
				
			||||||
            self.base_dir(),
 | 
					 | 
				
			||||||
            self.name
 | 
					 | 
				
			||||||
        ) 
 | 
					 | 
				
			||||||
    # FIXME: prefix directory should not leak into me
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def remote_path(self):
 | 
					 | 
				
			||||||
        return os.path.join(
 | 
					 | 
				
			||||||
            self.remote_base_dir(),
 | 
					 | 
				
			||||||
            self.name
 | 
					 | 
				
			||||||
        ) 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # FIXME: probably wrong place for this
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def remote_explorer_dir(self):
 | 
					 | 
				
			||||||
        return os.path.join(self.remote_path, "explorer")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def manifest_path(self):
 | 
					 | 
				
			||||||
        return os.path.join(self.path, "manifest")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def gencode_local(self):
 | 
					 | 
				
			||||||
        return os.path.join(self.path, "gencode-local")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @property
 | 
					 | 
				
			||||||
    def gencode_remote(self):
 | 
					 | 
				
			||||||
        return os.path.join(self.path, "gencode-remote")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def is_singleton(self):
 | 
					    def is_singleton(self):
 | 
				
			||||||
        """Check whether a type is a singleton."""
 | 
					        """Check whether a type is a singleton."""
 | 
				
			||||||
        return os.path.isfile(os.path.join(self.path, "singleton"))
 | 
					        return os.path.isfile(os.path.join(self.absolute_path, "singleton"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def is_install(self):
 | 
					    def is_install(self):
 | 
				
			||||||
        """Check whether a type is used for installation (if not: for configuration)"""
 | 
					        """Check whether a type is used for installation (if not: for configuration)"""
 | 
				
			||||||
        return os.path.isfile(os.path.join(self.path, "install"))
 | 
					        return os.path.isfile(os.path.join(self.absolute_path, "install"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def explorers(self):
 | 
					    def explorers(self):
 | 
				
			||||||
        """Return a list of available explorers"""
 | 
					        """Return a list of available explorers"""
 | 
				
			||||||
        if not self.__explorers:
 | 
					        if not self.__explorers:
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                self.__explorers = os.listdir(os.path.join(self.path, "explorer"))
 | 
					                self.__explorers = os.listdir(os.path.join(self.absolute_path, "explorer"))
 | 
				
			||||||
            except EnvironmentError as e:
 | 
					            except EnvironmentError:
 | 
				
			||||||
                # error ignored
 | 
					                # error ignored
 | 
				
			||||||
                self.__explorers = []
 | 
					                self.__explorers = []
 | 
				
			||||||
        return self.__explorers
 | 
					        return self.__explorers
 | 
				
			||||||
| 
						 | 
					@ -151,10 +95,10 @@ class Type(object):
 | 
				
			||||||
        if not self.__required_parameters:
 | 
					        if not self.__required_parameters:
 | 
				
			||||||
            parameters = []
 | 
					            parameters = []
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                with open(os.path.join(self.path, "parameter", "required")) as fd:
 | 
					                with open(os.path.join(self.absolute_path, "parameter", "required")) as fd:
 | 
				
			||||||
                    for line in fd:
 | 
					                    for line in fd:
 | 
				
			||||||
                        parameters.append(line.strip())
 | 
					                        parameters.append(line.strip())
 | 
				
			||||||
            except EnvironmentError as e:
 | 
					            except EnvironmentError:
 | 
				
			||||||
                # error ignored
 | 
					                # error ignored
 | 
				
			||||||
                pass
 | 
					                pass
 | 
				
			||||||
            finally:
 | 
					            finally:
 | 
				
			||||||
| 
						 | 
					@ -167,10 +111,10 @@ class Type(object):
 | 
				
			||||||
        if not self.__optional_parameters:
 | 
					        if not self.__optional_parameters:
 | 
				
			||||||
            parameters = []
 | 
					            parameters = []
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                with open(os.path.join(self.path, "parameter", "optional")) as fd:
 | 
					                with open(os.path.join(self.absolute_path, "parameter", "optional")) as fd:
 | 
				
			||||||
                    for line in fd:
 | 
					                    for line in fd:
 | 
				
			||||||
                        parameters.append(line.strip())
 | 
					                        parameters.append(line.strip())
 | 
				
			||||||
            except EnvironmentError as e:
 | 
					            except EnvironmentError:
 | 
				
			||||||
                # error ignored
 | 
					                # error ignored
 | 
				
			||||||
                pass
 | 
					                pass
 | 
				
			||||||
            finally:
 | 
					            finally:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue