def to_highstate(self, slsmod): # generate a state that uses the stateconf.set state, which # is a no-op state, to hold a reference to the sls module # containing the DSL statements. This is to prevent the module # from being GC'ed, so that objects defined in it will be # available while salt is executing the states. slsmod_id = '_slsmod_' + self.name self.state(slsmod_id).stateconf.set(slsmod=slsmod) del self.get_all_decls()[slsmod_id] highstate = OrderedDict() if self.includes: highstate['include'] = [{t[0]: t[1]} for t in self.includes] if self.extends: highstate['extend'] = extend = OrderedDict() for ext in self.extends: extend[ext._id] = ext._repr(context='extend') for decl in self.decls: highstate[decl._id] = decl._repr() if self.included_highstate: errors = [] HighState.get_active().merge_included_states( highstate, self.included_highstate, errors) if errors: raise PyDslError('\n'.join(errors)) return highstate
def to_highstate(self, slsmod): # generate a state that uses the stateconf.set state, which # is a no-op state, to hold a reference to the sls module # containing the DSL statements. This is to prevent the module # from being GC'ed, so that objects defined in it will be # available while salt is executing the states. slsmod_id = '_slsmod_' + self.name self.state(slsmod_id).stateconf.set(slsmod=slsmod) del self.get_all_decls()[slsmod_id] highstate = OrderedDict() if self.includes: highstate['include'] = [{t[0]: t[1]} for t in self.includes] if self.extends: highstate['extend'] = extend = OrderedDict() for ext in self.extends: extend[ext._id] = ext._repr(context='extend') for decl in self.decls: highstate[decl._id] = decl._repr() if self.included_highstate: errors = [] HighState.get_active().merge_included_states( highstate, self.included_highstate, errors ) if errors: raise PyDslError('\n'.join(errors)) return highstate
def __init__(self, sls, saltenv, rendered_sls): self.name = sls self.saltenv = saltenv self.includes = [] self.included_highstate = HighState.get_active().building_highstate self.extends = [] self.decls = [] self.options = Options() self.funcs = [] # track the ordering of state func declarations self.rendered_sls = rendered_sls # a set of names of rendered sls modules if not HighState.get_active(): raise PyDslError('PyDSL only works with a running high state!')
def __call__(self, check=True): sls = Sls.get_render_stack()[-1] if self._id in sls.get_all_decls(): last_func = sls.last_func() if last_func and self._mods[-1]._func is not last_func: raise PyDslError( ('Cannot run state({0}: {1}) that is required by a runtime ' 'state({2}: {3}), at compile time.').format( self._mods[-1]._name, self._id, last_func.mod, last_func.mod._state_id ) ) sls.get_all_decls().pop(self._id) sls.decls.remove(self) self._mods[0]._func._remove_auto_require() for m in self._mods: try: sls.funcs.remove(m._func) except ValueError: pass result = HighState.get_active().state.functions['state.high']({self._id: self._repr()}) result = sorted(result.iteritems(), key=lambda t: t[1]['__run_num__']) if check: for k, v in result: if not v['result']: import pprint raise PyDslError( 'Failed executing low state at compile time:\n{0}' .format(pprint.pformat({k:v}))) return result
def __call__(self, check=True): sls = Sls.get_render_stack()[-1] if self._id in sls.get_all_decls(): last_func = sls.last_func() if last_func and self._mods[-1]._func is not last_func: raise PyDslError( 'Cannot run state({0}: {1}) that is required by a runtime ' 'state({2}: {3}), at compile time.'.format( self._mods[-1]._name, self._id, last_func.mod, last_func.mod._state_id)) sls.get_all_decls().pop(self._id) sls.decls.remove(self) self._mods[0]._func._remove_auto_require() for m in self._mods: try: sls.funcs.remove(m._func) except ValueError: pass result = HighState.get_active().state.functions['state.high']({ self._id: self._repr() }) result = sorted(result.iteritems(), key=lambda t: t[1]['__run_num__']) if check: for k, v in result: if not v['result']: import pprint raise PyDslError( 'Failed executing low state at compile time:\n{0}'. format(pprint.pformat({k: v}))) return result
def include(self, *sls_names, **kws): if kws.get('env', None) is not None: warn_until( 'Boron', 'Passing a salt environment should be done using \'saltenv\' ' 'not \'env\'. This functionality will be removed in Salt Boron.' ) # Backwards compatibility kws['saltenv'] = kws.pop('env') saltenv = kws.get('saltenv', self.saltenv) if kws.get('delayed', False): for incl in sls_names: self.includes.append((saltenv, incl)) return HIGHSTATE = HighState.get_active() global SLS_MATCHES if SLS_MATCHES is None: SLS_MATCHES = HIGHSTATE.top_matches(HIGHSTATE.get_top()) highstate = self.included_highstate slsmods = [] # a list of pydsl sls modules rendered. for sls in sls_names: r_env = '{0}:{1}'.format(saltenv, sls) if r_env not in self.rendered_sls: self.rendered_sls.add(sls) # needed in case the starting sls # uses the pydsl renderer. histates, errors = HIGHSTATE.render_state( sls, saltenv, self.rendered_sls, SLS_MATCHES ) HIGHSTATE.merge_included_states(highstate, histates, errors) if errors: raise PyDslError('\n'.join(errors)) HIGHSTATE.clean_duplicate_extends(highstate) state_id = '_slsmod_{0}'.format(sls) if state_id not in highstate: slsmods.append(None) else: for arg in highstate[state_id]['stateconf']: if isinstance(arg, dict) and iter(arg).next() == 'slsmod': slsmods.append(arg['slsmod']) break if not slsmods: return None return slsmods[0] if len(slsmods) == 1 else slsmods
def include(self, *sls_names, **kws): if kws.get('env', None) is not None: warn_until( 'Boron', 'Passing a salt environment should be done using \'saltenv\' ' 'not \'env\'. This functionality will be removed in Salt Boron.' ) # Backwards compatibility kws['saltenv'] = kws.pop('env') saltenv = kws.get('saltenv', self.saltenv) if kws.get('delayed', False): for incl in sls_names: self.includes.append((saltenv, incl)) return HIGHSTATE = HighState.get_active() global SLS_MATCHES if SLS_MATCHES is None: SLS_MATCHES = HIGHSTATE.top_matches(HIGHSTATE.get_top()) highstate = self.included_highstate slsmods = [] # a list of pydsl sls core rendered. for sls in sls_names: r_env = '{0}:{1}'.format(saltenv, sls) if r_env not in self.rendered_sls: self.rendered_sls.add( sls ) # needed in case the starting sls uses the pydsl renderer. histates, errors = HIGHSTATE.render_state( sls, saltenv, self.rendered_sls, SLS_MATCHES) HIGHSTATE.merge_included_states(highstate, histates, errors) if errors: raise PyDslError('\n'.join(errors)) HIGHSTATE.clean_duplicate_extends(highstate) state_id = '_slsmod_{0}'.format(sls) if state_id not in highstate: slsmods.append(None) else: for arg in highstate[state_id]['stateconf']: if isinstance(arg, dict) and next(iter(arg)) == 'slsmod': slsmods.append(arg['slsmod']) break if not slsmods: return None return slsmods[0] if len(slsmods) == 1 else slsmods
def include(self, *sls_names, **kws): if 'env' in kws: warn_until( 'Oxygen', 'Parameter \'env\' has been detected in the argument list. This ' 'parameter is no longer used and has been replaced by \'saltenv\' ' 'as of Salt 2016.11.0. This warning will be removed in Salt Oxygen.' ) kws.pop('env') saltenv = kws.get('saltenv', self.saltenv) if kws.get('delayed', False): for incl in sls_names: self.includes.append((saltenv, incl)) return HIGHSTATE = HighState.get_active() global SLS_MATCHES if SLS_MATCHES is None: SLS_MATCHES = HIGHSTATE.top_matches(HIGHSTATE.get_top()) highstate = self.included_highstate slsmods = [] # a list of pydsl sls modules rendered. for sls in sls_names: r_env = '{0}:{1}'.format(saltenv, sls) if r_env not in self.rendered_sls: self.rendered_sls.add( sls ) # needed in case the starting sls uses the pydsl renderer. histates, errors = HIGHSTATE.render_state( sls, saltenv, self.rendered_sls, SLS_MATCHES) HIGHSTATE.merge_included_states(highstate, histates, errors) if errors: raise PyDslError('\n'.join(errors)) HIGHSTATE.clean_duplicate_extends(highstate) state_id = '_slsmod_{0}'.format(sls) if state_id not in highstate: slsmods.append(None) else: for arg in highstate[state_id]['stateconf']: if isinstance(arg, dict) and next(iter(arg)) == 'slsmod': slsmods.append(arg['slsmod']) break if not slsmods: return None return slsmods[0] if len(slsmods) == 1 else slsmods
def include(self, *sls_names, **kws): if 'env' in kws: warn_until( 'Oxygen', 'Parameter \'env\' has been detected in the argument list. This ' 'parameter is no longer used and has been replaced by \'saltenv\' ' 'as of Salt 2016.11.0. This warning will be removed in Salt Oxygen.' ) kws.pop('env') saltenv = kws.get('saltenv', self.saltenv) if kws.get('delayed', False): for incl in sls_names: self.includes.append((saltenv, incl)) return HIGHSTATE = HighState.get_active() global SLS_MATCHES if SLS_MATCHES is None: SLS_MATCHES = HIGHSTATE.top_matches(HIGHSTATE.get_top()) highstate = self.included_highstate slsmods = [] # a list of pydsl sls modules rendered. for sls in sls_names: r_env = '{0}:{1}'.format(saltenv, sls) if r_env not in self.rendered_sls: self.rendered_sls.add(sls) # needed in case the starting sls uses the pydsl renderer. histates, errors = HIGHSTATE.render_state( sls, saltenv, self.rendered_sls, SLS_MATCHES ) HIGHSTATE.merge_included_states(highstate, histates, errors) if errors: raise PyDslError('\n'.join(errors)) HIGHSTATE.clean_duplicate_extends(highstate) state_id = '_slsmod_{0}'.format(sls) if state_id not in highstate: slsmods.append(None) else: for arg in highstate[state_id]['stateconf']: if isinstance(arg, dict) and next(iter(arg)) == 'slsmod': slsmods.append(arg['slsmod']) break if not slsmods: return None return slsmods[0] if len(slsmods) == 1 else slsmods
def __call__(self, check=True): sls = Sls.get_render_stack()[-1] if self._id in sls.get_all_decls(): last_func = sls.last_func() if last_func and self._mods[-1]._func is not last_func: raise PyDslError( "Cannot run state({0}: {1}) that is required by a runtime " "state({2}: {3}), at compile time.".format( self._mods[-1]._name, self._id, last_func.mod, last_func.mod._state_id, ) ) sls.get_all_decls().pop(self._id) sls.decls.remove(self) self._mods[0]._func._remove_auto_require() for m in self._mods: try: sls.funcs.remove(m._func) except ValueError: pass result = HighState.get_active().state.functions["state.high"]( {self._id: self._repr()} ) if not isinstance(result, dict): # A list is an error raise PyDslError( "An error occurred while running highstate: {0}".format( "; ".join(result) ) ) result = sorted(six.iteritems(result), key=lambda t: t[1]["__run_num__"]) if check: for k, v in result: if not v["result"]: import pprint raise PyDslError( "Failed executing low state at compile time:\n{0}".format( pprint.pformat({k: v}) ) ) return result
def include(self, *sls_names, **kws): if "env" in kws: # "env" is not supported; Use "saltenv". kws.pop("env") saltenv = kws.get("saltenv", self.saltenv) if kws.get("delayed", False): for incl in sls_names: self.includes.append((saltenv, incl)) return HIGHSTATE = HighState.get_active() global SLS_MATCHES if SLS_MATCHES is None: SLS_MATCHES = HIGHSTATE.top_matches(HIGHSTATE.get_top()) highstate = self.included_highstate slsmods = [] # a list of pydsl sls modules rendered. for sls in sls_names: r_env = "{0}:{1}".format(saltenv, sls) if r_env not in self.rendered_sls: self.rendered_sls.add( sls ) # needed in case the starting sls uses the pydsl renderer. histates, errors = HIGHSTATE.render_state( sls, saltenv, self.rendered_sls, SLS_MATCHES ) HIGHSTATE.merge_included_states(highstate, histates, errors) if errors: raise PyDslError("\n".join(errors)) HIGHSTATE.clean_duplicate_extends(highstate) state_id = "_slsmod_{0}".format(sls) if state_id not in highstate: slsmods.append(None) else: for arg in highstate[state_id]["stateconf"]: if isinstance(arg, dict) and next(iter(arg)) == "slsmod": slsmods.append(arg["slsmod"]) break if not slsmods: return None return slsmods[0] if len(slsmods) == 1 else slsmods
def include(self, *sls_names, **kws): env = kws.get('env', self.env) if kws.get('delayed', False): for incl in sls_names: self.includes.append((env, incl)) return HIGHSTATE = HighState.get_active() global SLS_MATCHES if SLS_MATCHES is None: SLS_MATCHES = HIGHSTATE.top_matches(HIGHSTATE.get_top()) highstate = self.included_highstate slsmods = [] # a list of pydsl sls modules rendered. for sls in sls_names: if sls not in self.rendered_sls: self.rendered_sls.add( sls ) # needed in case the starting sls uses the pydsl renderer. histates, errors = HIGHSTATE.render_state( sls, env, self.rendered_sls, SLS_MATCHES) HIGHSTATE.merge_included_states(highstate, histates, errors) if errors: raise PyDslError('\n'.join(errors)) HIGHSTATE.clean_duplicate_extends(highstate) id = '_slsmod_' + sls if id not in highstate: slsmods.append(None) else: for arg in highstate[id]['stateconf']: if isinstance(arg, dict) and iter(arg).next() == 'slsmod': slsmods.append(arg['slsmod']) break if not slsmods: return None return slsmods[0] if len(slsmods) == 1 else slsmods
def include(self, *sls_names, **kws): env = kws.get('env', self.env) if kws.get('delayed', False): for incl in sls_names: self.includes.append((env, incl)) return HIGHSTATE = HighState.get_active() global SLS_MATCHES if SLS_MATCHES is None: SLS_MATCHES = HIGHSTATE.top_matches(HIGHSTATE.get_top()) highstate = self.included_highstate slsmods = [] # a list of pydsl sls modules rendered. for sls in sls_names: if sls not in self.rendered_sls: self.rendered_sls.add(sls) # needed in case the starting sls # uses the pydsl renderer. histates, errors = HIGHSTATE.render_state( sls, env, self.rendered_sls, SLS_MATCHES ) HIGHSTATE.merge_included_states(highstate, histates, errors) if errors: raise PyDslError('\n'.join(errors)) HIGHSTATE.clean_duplicate_extends(highstate) state_id = '_slsmod_{0}'.format(sls) if state_id not in highstate: slsmods.append(None) else: for arg in highstate[state_id]['stateconf']: if isinstance(arg, dict) and iter(arg).next() == 'slsmod': slsmods.append(arg['slsmod']) break if not slsmods: return None return slsmods[0] if len(slsmods) == 1 else slsmods
def get_all_decls(cls): return HighState.get_active()._pydsl_all_decls
def get_render_stack(cls): return HighState.get_active()._pydsl_render_stack