forked from ungleich-public/cdist
		
	proof of concept object oriented aproach
Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch>
This commit is contained in:
		
					parent
					
						
							
								82f548bafd
							
						
					
				
			
			
				commit
				
					
						50a3ad7993
					
				
			
		
					 1 changed files with 242 additions and 0 deletions
				
			
		
							
								
								
									
										242
									
								
								oo.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								oo.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,242 @@ | ||||||
|  | import os | ||||||
|  | import tempfile | ||||||
|  | 
 | ||||||
|  | # FIXME: change these to match your environment | ||||||
|  | os.environ['__cdist_base_dir'] = '/home/sar/vcs/cdist' | ||||||
|  | # FIXME: testing against the cache, change path | ||||||
|  | os.environ['__cdist_out_dir'] = '/home/sar/vcs/cdist/cache/sans-asteven-02.ethz.ch/out' | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ''' | ||||||
|  | cd /path/to/dir/with/this/file | ||||||
|  | ipython | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | In [1]: import oo | ||||||
|  | 
 | ||||||
|  | In [2]: t = oo.Type('__mkfs') | ||||||
|  | 
 | ||||||
|  | In [3]: t. | ||||||
|  | t.base_dir             t.is_install           t.list_type_names      t.name                 t.path                  | ||||||
|  | t.explorers            t.is_singleton         t.list_types           t.optional_parameters  t.required_parameters   | ||||||
|  | 
 | ||||||
|  | In [3]: t.path | ||||||
|  | Out[3]: '/home/sar/vcs/cdist/conf/type/__mkfs' | ||||||
|  | 
 | ||||||
|  | In [4]: t.required_parameters | ||||||
|  | Out[4]: ['type'] | ||||||
|  | 
 | ||||||
|  | In [5]: t.optional_parameters | ||||||
|  | Out[5]: ['device', 'options', 'blocks'] | ||||||
|  | 
 | ||||||
|  | In [6]: t.is | ||||||
|  | t.is_install    t.is_singleton   | ||||||
|  | 
 | ||||||
|  | In [6]: t.is_singleton | ||||||
|  | Out[6]: False | ||||||
|  | 
 | ||||||
|  | In [7]: o = oo.Object(t, 'dev/sda1') | ||||||
|  | 
 | ||||||
|  | In [8]: o. | ||||||
|  | o.base_dir           o.list_object_names  o.list_type_names    o.parameter          o.qualified_name     o.type | ||||||
|  | o.changed            o.list_objects       o.object_id          o.path               o.requirements        | ||||||
|  | 
 | ||||||
|  | In [8]: o.pa | ||||||
|  | o.parameter  o.path        | ||||||
|  | 
 | ||||||
|  | In [8]: o.path | ||||||
|  | Out[8]: '/home/sar/vcs/cdist/cache/sans-asteven-02.ethz.ch/out/object/__mkfs/dev/sda1/.cdist' | ||||||
|  | 
 | ||||||
|  | In [9]: o.changed | ||||||
|  | Out[9]: False | ||||||
|  | 
 | ||||||
|  | In [10]: o.changed = True | ||||||
|  | 
 | ||||||
|  | In [11]: # creates /home/sar/vcs/cdist/cache/sans-asteven-02.ethz.ch/out/object/__mkfs/dev/sda1/.cdist/changed | ||||||
|  | 
 | ||||||
|  | In [12]: o.changed | ||||||
|  | Out[12]: True | ||||||
|  | 
 | ||||||
|  | In [13]: o.changed = False | ||||||
|  | 
 | ||||||
|  | In [14]: # removes /home/sar/vcs/cdist/cache/sans-asteven-02.ethz.ch/out/object/__mkfs/dev/sda1/.cdist/changed | ||||||
|  | 
 | ||||||
|  | In [15]: | ||||||
|  | 
 | ||||||
|  | ''' | ||||||
|  | 
 | ||||||
|  | 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. | ||||||
|  | 
 | ||||||
|  |         """ | ||||||
|  |         return os.path.join( | ||||||
|  |             os.environ['__cdist_base_dir'], | ||||||
|  |             'conf', | ||||||
|  |             'type' | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     @classmethod | ||||||
|  |     def list_types(cls): | ||||||
|  |         """Return a list of type instances""" | ||||||
|  |         for type_name in cls.list_type_names(): | ||||||
|  |             yield cls(type_name) | ||||||
|  | 
 | ||||||
|  |     @classmethod | ||||||
|  |     def list_type_names(cls): | ||||||
|  |         """Return a list of type names""" | ||||||
|  |         return os.listdir(cls.base_dir()) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     def __init__(self, name): | ||||||
|  |         self.name = name | ||||||
|  |         self.__explorers = None | ||||||
|  |         self.__required_parameters = None | ||||||
|  |         self.__optional_parameters = None | ||||||
|  | 
 | ||||||
|  |     def __repr__(self): | ||||||
|  |         return '<Type name=%s>' % self.name | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def path(self): | ||||||
|  |         return os.path.join( | ||||||
|  |             self.base_dir(), | ||||||
|  |             self.name | ||||||
|  |         )  | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def is_singleton(self): | ||||||
|  |         """Check whether a type is a singleton.""" | ||||||
|  |         return os.path.isfile(os.path.join(self.path, "singleton")) | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def is_install(self): | ||||||
|  |         """Check whether a type is used for installation (if not: for configuration)""" | ||||||
|  |         return os.path.isfile(os.path.join(self.path, "install")) | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def explorers(self): | ||||||
|  |         """Return a list of available explorers""" | ||||||
|  |         if not self.__explorers: | ||||||
|  |             try: | ||||||
|  |                 self.__explorers = os.listdir(os.path.join(self.path, "explorer")) | ||||||
|  |             except EnvironmentError as e: | ||||||
|  |                 # error ignored | ||||||
|  |                 self.__explorers = [] | ||||||
|  |         return self.__explorers | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def required_parameters(self): | ||||||
|  |         """Return a list of required parameters""" | ||||||
|  |         if not self.__required_parameters: | ||||||
|  |             parameters = [] | ||||||
|  |             try: | ||||||
|  |                 with open(os.path.join(self.path, "parameter", "required")) as fd: | ||||||
|  |                     for line in fd: | ||||||
|  |                         parameters.append(line.strip()) | ||||||
|  |             except EnvironmentError as e: | ||||||
|  |                 # error ignored | ||||||
|  |                 pass | ||||||
|  |             finally: | ||||||
|  |                 self.__required_parameters = parameters | ||||||
|  |         return self.__required_parameters | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def optional_parameters(self): | ||||||
|  |         """Return a list of optional parameters""" | ||||||
|  |         if not self.__optional_parameters: | ||||||
|  |             parameters = [] | ||||||
|  |             try: | ||||||
|  |                 with open(os.path.join(self.path, "parameter", "optional")) as fd: | ||||||
|  |                     for line in fd: | ||||||
|  |                         parameters.append(line.strip()) | ||||||
|  |             except EnvironmentError as e: | ||||||
|  |                 # error ignored | ||||||
|  |                 pass | ||||||
|  |             finally: | ||||||
|  |                 self.__optional_parameters = parameters | ||||||
|  |         return self.__optional_parameters | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Object(object): | ||||||
|  | 
 | ||||||
|  |     @staticmethod | ||||||
|  |     def base_dir(): | ||||||
|  |         """Return the absolute path to the top level directory where objects | ||||||
|  |         are defined. | ||||||
|  | 
 | ||||||
|  |         Requires the environment variable '__cdist_out_dir' to be set. | ||||||
|  | 
 | ||||||
|  |         """ | ||||||
|  |         base_dir = os.path.join( | ||||||
|  |             os.environ['__cdist_out_dir'], | ||||||
|  |             'object' | ||||||
|  |         ) | ||||||
|  |         # FIXME: should directory be created elsewhere? | ||||||
|  |         if not os.path.isdir(base_dir): | ||||||
|  |             os.mkdir(base_dir) | ||||||
|  |         return base_dir | ||||||
|  | 
 | ||||||
|  |     @classmethod | ||||||
|  |     def list_objects(cls): | ||||||
|  |         """Return a list of object instances""" | ||||||
|  |         for object_name in cls.list_object_names(): | ||||||
|  |             type_name = object_name.split(os.sep)[0] | ||||||
|  |             object_id = os.sep.join(object_name.split(os.sep)[1:]) | ||||||
|  |             yield cls(Type(type_name), object_id=object_id) | ||||||
|  | 
 | ||||||
|  |     @classmethod | ||||||
|  |     def list_type_names(cls): | ||||||
|  |         """Return a list of type names""" | ||||||
|  |         return os.listdir(cls.base_dir()) | ||||||
|  | 
 | ||||||
|  |     @classmethod | ||||||
|  |     def list_object_names(cls): | ||||||
|  |         """Return a list of object names""" | ||||||
|  |         for path, dirs, files in os.walk(cls.base_dir()): | ||||||
|  |             # FIXME: use constant instead of string | ||||||
|  |             if '.cdist' in dirs: | ||||||
|  |                 yield os.path.relpath(path, cls.base_dir()) | ||||||
|  | 
 | ||||||
|  |     def __init__(self, type, object_id=None, parameter=None, requirements=None): | ||||||
|  |         self.type = type # instance of Type | ||||||
|  |         self.object_id = object_id | ||||||
|  |         self.qualified_name = os.path.join(self.type.name, self.object_id) | ||||||
|  |         self.parameter = parameter or {} | ||||||
|  |         self.requirements = requirements or [] | ||||||
|  |          | ||||||
|  |     def __repr__(self): | ||||||
|  |         return '<Object %s>' % self.qualified_name | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def path(self): | ||||||
|  |         return os.path.join( | ||||||
|  |             self.base_dir(), | ||||||
|  |             self.qualified_name, | ||||||
|  |             '.cdist' | ||||||
|  |         ) | ||||||
|  | 
 | ||||||
|  |     @property | ||||||
|  |     def changed(self): | ||||||
|  |         """Check whether the object has been changed.""" | ||||||
|  |         return os.path.isfile(os.path.join(self.path, "changed")) | ||||||
|  | 
 | ||||||
|  |     @changed.setter | ||||||
|  |     def changed(self, value): | ||||||
|  |         """Change the objects changed status.""" | ||||||
|  |         path = os.path.join(self.path, "changed") | ||||||
|  |         if value: | ||||||
|  |             open(path, "w").close() | ||||||
|  |         else: | ||||||
|  |             try: | ||||||
|  |                 os.remove(path) | ||||||
|  |             except EnvironmentError: | ||||||
|  |                 # ignore | ||||||
|  |                 pass | ||||||
|  | 
 | ||||||
|  |     # FIXME: implement other properties/methods | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue