def load_deploy(self): """ Loads the deployment map :raises IOError: if can't read map """ logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) if not self.deploy_file: raise AssertionError try: self.update_template_vars() self.deploy_dataset = DataSet(self.deploy_file, additional_template_vars=self.template_vars) logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) logobj(self.deploy_dataset.content) self.deploy = DotMap(self.deploy_dataset.content) logobj(self.deploy) self.update_template_vars() except IOError as e: logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name + ': ' + repr(e)) # must be a new install or else we don't have permissions. autonames_dataset = DataSet(self.autonames_file, additional_template_vars=self.template_vars) autonames = DotMap(autonames_dataset.content) self.config.update(autonames) caches_dataset = DataSet(self.caches_file, additional_template_vars=self.template_vars) caches = DotMap(caches_dataset.content) self.config.update(caches)
def __init__(self, head_text=None, foot_text=None, **kwargs): logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) logobj(foot_text) logobj(head_text) # Tab background body = urwid.AttrMap(urwid.SolidFill(fill_char=' '), 'bg') StyledFrame.__init__(self, StyledFrame(body=body, foot_text=foot_text, head_text=head_text, **kwargs), **kwargs)
def __init__(self, body, foot_text=None, head_text=None, **kwargs): logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) logobj(foot_text) logobj(head_text) footer = urwid.Text(' ' + foot_text, align='center') footer = urwid.AttrWrap(footer, 'footer') header = urwid.Text(' ' + head_text, align='center') header = urwid.AttrWrap(header, 'header') urwid.Frame.__init__(self, body=body, footer=footer, header=header, **kwargs)
def __init__(self, head_text=None, foot_text=None, **kwargs): logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) logobj(foot_text) logobj(head_text) # Tab background body = urwid.AttrMap(urwid.SolidFill(fill_char=' '), 'bg') StyledFrame.__init__( self, StyledFrame(body=body, foot_text=foot_text, head_text=head_text, **kwargs), **kwargs)
def __init__(self, body, foot_text=None, head_text=None, **kwargs): logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) logobj(foot_text) logobj(head_text) footer = urwid.Text(' ' + foot_text, align='center') footer = urwid.AttrWrap(footer, 'footer') header = urwid.Text(' ' + head_text, align='center') header = urwid.AttrWrap(header, 'header') urwid.Frame.__init__(self, body=body, footer=footer, header=header, **kwargs)
def get_attr(self, map_type, key=None, name=None): """ Access common patterns within the ECSConf object """ logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) logobj(map_type) logobj(key) logobj(name) try: # If only map_type provided, return the data at map_type in the yaml tree if key is None and name is None: return self.deploy.facts[map_type] # If map_type and key are provided, return the data at key of map_type in the yaml tree if key is not None and name is None: return [x[key] for x in self.deploy.facts[map_type]] # If map_type, key, and name are provided, then return the name field at key of # map_type in the yaml tree if key is not None and name is not None: try: attr_map = [x[key] for x in self.deploy.facts[map_type] if x[NAME] == name][0] except IndexError: try: attr_map = [x[key] for x in self.deploy.facts[map_type] if x[USERNAME] == name][0] except IndexError: raise return attr_map except KeyError: return None
def get_attr(self, map_type, key=None, name=None): """ Access common patterns within the ECSConf object """ logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) logobj(map_type) logobj(key) logobj(name) try: # If only map_type provided, return the data at map_type in the yaml tree if key is None and name is None: return self.deploy.facts[map_type] # If map_type and key are provided, return the data at key of map_type in the yaml tree if key is not None and name is None: return [x[key] for x in self.deploy.facts[map_type]] # If map_type, key, and name are provided, then return the name field at key of # map_type in the yaml tree if key is not None and name is not None: try: attr_map = [ x[key] for x in self.deploy.facts[map_type] if x[NAME] == name ][0] except IndexError: try: attr_map = [ x[key] for x in self.deploy.facts[map_type] if x[USERNAME] == name ][0] except IndexError: raise return attr_map except KeyError: return None
def load_config(self): """ Loads the config :raises IOError: if can't read config """ logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) try: self.update_template_vars() self.config_dataset = DataSet(self.config_file) self.config = DotMap(self.config_dataset.content) logobj(self.config) self.update_template_vars() except IOError as e: # If this fails, there's nothing more we can do. # Something is broken in the install container. logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name + ': ' + repr(e)) print("Unable to locate config file: " + repr(e)) raise if len(self.config.ui.script_file) != 0: self.script_file = self.config.ui.script_file logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name + ': will look for script in: ' + repr(self.script_file)) if len(self.config.ui.state_file) != 0: self.state_file = self.config.ui.state_file logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name + ': will look for state in: ' + repr(self.state_file)) if len(self.config.ui.deploy_file) != 0: self.deploy_file = self.config.ui.deploy_file logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name + ': will look for deploy in: ' + repr(self.deploy_file))
def load_state(self): """ Load current state (may be empty) :raises IOError: if filesystem exceptions prevent config file read or initial write """ logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) if self.state_file is None: pass else: try: self.update_template_vars() self.state_dataset = DataSet(self.state_file, additional_template_vars=self.template_vars) logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) logobj(self.state_dataset.content) self.state = DotMap(self.state_dataset.content) logobj(self.state) self.update_template_vars() except IOError as e: logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name + ': ' + repr(e)) # must be a new install or else we don't have permissions. # Try to create an empty config and see what happens. try: self.state_dataset = DataSet(self.state_file, create_if_missing=True, additional_template_vars=self.template_vars) logobj(self.state_dataset.content) self.state = DotMap(self.state_dataset.content) logobj(self.state) self.update_template_vars() except IOError as cf: logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name + ': ' + repr(cf)) print("Unable to create a new state file: " + repr(cf)) # and presumably crash, though at some point we should tell # the user to make sure they're mounting /opt correctly in Docker raise
def create_widget(self, widget_blueprint): logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) if not widget_blueprint.type: raise ValueError("No widget type defined in blueprint") else: # TODO: Replace this with a proper mapping hash because using globals() is bad wobj = globals()[widget_blueprint.type] # TODO: refactor this later because it's ugly wdirector = widget_blueprint.director or None wargs = widget_blueprint.args or None wbody = widget_blueprint.body or None wbrief = widget_blueprint.brief or None wtitle = widget_blueprint.title or None wnamespace = widget_blueprint.namespace or None wkeytexts = widget_blueprint.keytexts or None logobj(wobj) logobj(wdirector) logobj(wargs) logobj(wbody) logobj(wbrief) logobj(wtitle) logobj(wnamespace) logobj(wkeytexts) # * 'args': [{'prev_button': 'EmptyWidget'}], # * 'body': 'Thank you etc etc.\n', # 'brief': 'Free and Frictionless Overview', # 'help': 'popup help Use the arrowkeys etc etc', # - 'keys': ['help', 'exit', 'color'], # * 'title': 'EMC ECS 2.2 Community Edition', # * 'type': 'InfoOverlay'} # * key_texts = "[F1] Help | [F5] Save etc etc" # * director = Director obj where callbacks can be made # * namespace = config file variable namespace # # What needs to be sent to an InfoOverlay, # title_widget urwid.Text(title_text, align='center') # nav_widget = widgets.NavButtonBox(self.d) # body_widget = urwid.Text(body) # bg_widget = widgets.TabBackground(header_text, footer_text, **kwargs) # logobj(widget_blueprint) nav_widget = NavButtonBox(wdirector, **wargs) logobj(nav_widget) title_widget = urwid.Text(wtitle, align='center') logobj(title_widget) # If wbody is none, then assume the constructor for # for the widget will take care of rendering its own body # from the provided args if wbody is not None: body_widget = urwid.Text(wbody) else: body_widget = wbody # TODO: bind popup widgets to this (for help, logs, etc) bg_widget = TabBackground(head_text=wbrief, foot_text=wkeytexts) # Pass everything on down to new object wdict = { 'nav_widget': nav_widget, 'title_widget': title_widget, 'body_widget': body_widget, 'namespace': wnamespace, 'director': wdirector, 'bg_widget': bg_widget } wdict.update(wargs) return wobj.__init(**wdict)
# Bucket stuff BUCKET = 'buckets' BUCKET_D = MU[:-1] + _D DEFAULTS[BUCKET] = { DESC: DESC_DEFAULT } # File export stuff EXPORT = 'exports' EXPORT_D = EXPORT[:-1] + _D DEFAULTS[EXPORT] = { DESC: DESC_DEFAULT } logobj(DEFAULTS) """ Classes """ class ECSConf(object): """ Provides access to ECS deployment mappings within the given DotMap object """ def __init__(self, deploymap): logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) self.deploy = deploymap
's3_secret_key': None, 'swift_password': None, 'swift_groups_list': ['users'] } # Bucket stuff BUCKET = 'buckets' BUCKET_D = MU[:-1] + _D DEFAULTS[BUCKET] = {DESC: DESC_DEFAULT} # File export stuff EXPORT = 'exports' EXPORT_D = EXPORT[:-1] + _D DEFAULTS[EXPORT] = {DESC: DESC_DEFAULT} logobj(DEFAULTS) """ Classes """ class ECSConf(object): """ Provides access to ECS deployment mappings within the given DotMap object """ def __init__(self, deploymap): logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) self.deploy = deploymap @staticmethod
def create_widget(self, widget_blueprint): logging.debug(self.__class__.__name__ + ': ' + sys._getframe().f_code.co_name) if not widget_blueprint.type: raise ValueError("No widget type defined in blueprint") else: # TODO: Replace this with a proper mapping hash because using globals() is bad wobj = globals()[widget_blueprint.type] # TODO: refactor this later because it's ugly wdirector = widget_blueprint.director or None wargs = widget_blueprint.args or None wbody = widget_blueprint.body or None wbrief = widget_blueprint.brief or None wtitle = widget_blueprint.title or None wnamespace = widget_blueprint.namespace or None wkeytexts = widget_blueprint.keytexts or None logobj(wobj) logobj(wdirector) logobj(wargs) logobj(wbody) logobj(wbrief) logobj(wtitle) logobj(wnamespace) logobj(wkeytexts) # * 'args': [{'prev_button': 'EmptyWidget'}], # * 'body': 'Thank you etc etc.\n', # 'brief': 'Free and Frictionless Overview', # 'help': 'popup help Use the arrowkeys etc etc', # - 'keys': ['help', 'exit', 'color'], # * 'title': 'EMC ECS 2.2 Community Edition', # * 'type': 'InfoOverlay'} # * key_texts = "[F1] Help | [F5] Save etc etc" # * director = Director obj where callbacks can be made # * namespace = config file variable namespace # # What needs to be sent to an InfoOverlay, # title_widget urwid.Text(title_text, align='center') # nav_widget = widgets.NavButtonBox(self.d) # body_widget = urwid.Text(body) # bg_widget = widgets.TabBackground(header_text, footer_text, **kwargs) # logobj(widget_blueprint) nav_widget = NavButtonBox(wdirector, **wargs) logobj(nav_widget) title_widget = urwid.Text(wtitle, align='center') logobj(title_widget) # If wbody is none, then assume the constructor for # for the widget will take care of rendering its own body # from the provided args if wbody is not None: body_widget = urwid.Text(wbody) else: body_widget = wbody # TODO: bind popup widgets to this (for help, logs, etc) bg_widget = TabBackground(head_text=wbrief, foot_text=wkeytexts) # Pass everything on down to new object wdict = {'nav_widget': nav_widget, 'title_widget': title_widget, 'body_widget': body_widget, 'namespace': wnamespace, 'director': wdirector, 'bg_widget': bg_widget } wdict.update(wargs) return wobj.__init(**wdict)