def action(self): ''' Run once at enter ''' kind = self.opts.value['__role'] if kind not in daemons.APPL_KINDS: emsg = ("Invalid application kind = '{0}' for manor lane.".format(kind)) log.error(emsg + "\n") raise ValueError(emsg) if kind == 'master': lanename = 'master' elif kind == 'minion': role = self.opts.value.get('id', '') if not role: emsg = ("Missing role required to setup manor Lane.") log.error(emsg + "\n") raise ValueError(emsg) lanename = "{0}_{1}".format(role, kind) else: emsg = ("Unsupported application kind = '{0}' for manor Lane.".format(kind)) log.error(emsg + '\n') raise ValueError(emsg) name = 'manor' self.stack.value = LaneStack( name=name, lanename=lanename, sockdirpath=self.opts.value['sock_dir']) self.stack.value.Pk = raeting.packKinds.pack self.event_yards.value = set() self.local_cmd.value = deque() self.remote_cmd.value = deque() self.fun.value = deque() self.event.value = deque() self.event_req.value = deque() self.publish.value = deque() self.worker_verify.value = salt.utils.rand_string() if self.opts.value.get('worker_threads'): worker_seed = [] for index in range(self.opts.value['worker_threads']): worker_seed.append('worker{0}'.format(index + 1)) self.workers.value = itertools.cycle(worker_seed)
def _setup_jobber_stack(self): ''' Setup and return the LaneStack and Yard used by the jobber yard to communicate with the minion manor yard ''' role = self.opts.get('id', '') if not role: emsg = ("Missing role required to setup Jobber Lane.") log.error(emsg + "\n") raise ValueError(emsg) kind = self.opts['__role'] if kind not in kinds.APPL_KINDS: emsg = ("Invalid application kind = '{0}' for Jobber lane.".format( kind)) log.error(emsg + "\n") raise ValueError(emsg) if kind == 'minion': lanename = "{0}_{1}".format(role, kind) else: emsg = ("Unsupported application kind = '{0}' for Jobber Lane.". format(kind)) log.error(emsg + '\n') raise ValueError(emsg) sockdirpath = self.opts['sock_dir'] name = 'jobber' + nacling.uuid(size=18) stack = LaneStack(name=name, lanename=lanename, sockdirpath=sockdirpath) stack.Pk = raeting.PackKind.pack.value # add remote for the manor yard stack.addRemote( RemoteYard(stack=stack, name='manor', lanename=lanename, dirpath=sockdirpath)) console.concise("Created Jobber Stack {0}\n".format(stack.name)) return stack
def _setup_stack(self): ''' Setup and return the LaneStack and Yard used by by channel when global not already setup such as in salt-call to communicate to-from the minion ''' kind = self.opts.get('__role', '') # application kind 'master', 'minion', etc if not kind: emsg = ("Missing opts['__role']. required to setup RAETChannel.") log.error(emsg + "\n") raise ValueError(emsg) if kind == 'master': lanename = 'master' elif kind == 'minion': role = self.opts.get('id', '') if not role: emsg = ("Missing opts['id']. required to setup RAETChannel.") log.error(emsg + "\n") raise ValueError(emsg) lanename = role # add kind later else: emsg = ("Unsupported application kind '{0}' for RAETChannel " "Raet.".format(self.node)) log.error(emsg + '\n') raise ValueError(emsg) mid = self.opts.get('id', 'master') uid = nacling.uuid(size=18) name = 'channel' + uid stack = LaneStack(name=name, lanename=lanename, sockdirpath=self.opts['sock_dir']) stack.Pk = raeting.packKinds.pack stack.addRemote( RemoteYard(stack=stack, name='manor', lanename=lanename, dirpath=self.opts['sock_dir'])) log.debug("Created Channel Jobber Stack {0}\n".format(stack.name)) return stack
def _setup_stack(self): ''' Setup and return the LaneStack and Yard used by by channel when global not already setup such as in salt-call to communicate to-from the minion ''' role = self.opts.get('id') if not role: emsg = ("Missing role required to setup RAETChannel.") log.error(emsg + "\n") raise ValueError(emsg) kind = self.opts.get( '__role') # application kind 'master', 'minion', etc if kind not in daemons.APPL_KINDS: emsg = ("Invalid application kind = '{0}' for RAETChannel.".format( kind)) log.error(emsg + "\n") raise ValueError(emsg) if kind == 'master': lanename = 'master' elif kind == 'minion': lanename = "{0}_{1}".format(role, kind) else: emsg = ("Unsupported application kind '{0}' for RAETChannel.". format(kind)) log.error(emsg + '\n') raise ValueError(emsg) name = 'channel' + nacling.uuid(size=18) stack = LaneStack(name=name, lanename=lanename, sockdirpath=self.opts['sock_dir']) stack.Pk = raeting.packKinds.pack stack.addRemote( RemoteYard(stack=stack, name='manor', lanename=lanename, dirpath=self.opts['sock_dir'])) log.debug("Created Channel Jobber Stack {0}\n".format(stack.name)) return stack
def _setup_caller_stack(self, opts): ''' Setup and return the LaneStack and Yard used by by channel when global not already setup such as in salt-call to communicate to-from the minion ''' mid = opts['id'] sockdirpath = opts['sock_dir'] uid = nacling.uuid(size=18) name = 'caller' + uid stack = LaneStack(name=name, lanename=mid, sockdirpath=sockdirpath) stack.Pk = raeting.packKinds.pack stack.addRemote( RemoteYard(stack=stack, name='manor', lanename=mid, dirpath=sockdirpath)) log.debug("Created Caller Jobber Stack {0}\n".format(stack.name)) return stack
def action(self): ''' Set up the uxd stack and behaviors ''' name = "worker{0}".format(self.windex.value) # master application kind kind = self.opts.value['__role'] if kind not in daemons.APPL_KINDS: emsg = ("Invalid application kind = '{0}' for Master Worker.".format(kind)) log.error(emsg + "\n") raise ValueError(emsg) if kind == 'master': lanename = 'master' else: # workers currently are only supported for masters emsg = ("Invalid application kind '{0}' for Master Worker.".format(kind)) log.error(emsg + '\n') raise ValueError(emsg) sockdirpath=self.opts.value['sock_dir'] self.stack.value = LaneStack( name=name, lanename=lanename, sockdirpath=sockdirpath) self.stack.value.Pk = raeting.packKinds.pack manor_yard = RemoteYard( stack=self.stack.value, name='manor', lanename=lanename, dirpath=sockdirpath) self.stack.value.addRemote(manor_yard) self.remote_loader.value = salt.daemons.masterapi.RemoteFuncs( self.opts.value) self.local_loader.value = salt.daemons.masterapi.LocalFuncs( self.opts.value, self.access_keys.value) init = {} init['route'] = { 'src': (None, self.stack.value.local.name, None), 'dst': (None, manor_yard.name, 'worker_req') } self.stack.value.transmit(init, self.stack.value.fetchUidByName(manor_yard.name)) self.stack.value.serviceAll()
def pub(self, tgt, fun, arg=(), expr_form='glob', ret='', jid='', timeout=5, **kwargs): ''' Publish the command! ''' payload_kwargs = self._prep_pub(tgt, fun, arg=arg, expr_form=expr_form, ret=ret, jid=jid, timeout=timeout, **kwargs) yid = salt.utils.gen_jid() stack = LaneStack(yid=yid, lanename='master', sockdirpath=self.opts['sock_dir']) stack.Pk = raeting.packKinds.pack router_yard = RemoteYard(lanename='master', yid=0, dirpath=self.opts['sock_dir']) stack.addRemote(router_yard) route = { 'dst': (None, router_yard.name, 'local_cmd'), 'src': (None, stack.local.name, None) } msg = {'route': route, 'load': payload_kwargs} stack.transmit(msg) stack.serviceAll() while True: time.sleep(0.01) stack.serviceAll() for msg in stack.rxMsgs: return msg.get('return', {}).get('ret', {})
def __prep_stack(self): ''' Prepare the stack objects ''' yid = salt.utils.gen_jid() stackname = self.opts['id'] + yid dirpath = os.path.join(self.opts['cachedir'], stackname) self.stack = LaneStack(name=stackname, lanename=self.opts['id'], yid=yid, dirpath=dirpath, sockdirpath=self.opts['sock_dir']) self.stack.Pk = raeting.packKinds.pack self.router_yard = yarding.RemoteYard(stack=self.stack, yid=0, lanename=self.opts['id'], dirpath=self.opts['sock_dir']) self.stack.addRemote(self.router_yard) src = (self.opts['id'], self.stack.local.name, None) dst = ('master', None, 'remote_cmd') self.route = {'src': src, 'dst': dst}
def _setup_jobber_stack(self): ''' Setup and return the LaneStack and Yard used by the jobber to communicate to-from the minion ''' mid = self.opts['id'] yid = nacling.uuid(size=18) name = 'jobber' + yid stack = LaneStack(name=name, lanename=mid, sockdirpath=self.opts['sock_dir']) stack.Pk = raeting.packKinds.pack stack.addRemote( RemoteYard(stack=stack, name='manor', lanename=mid, dirpath=self.opts['sock_dir'])) console.concise("Created Jobber Stack {0}\n".format(stack.name)) return stack
def __prep_stack(self): self.yid = salt.utils.gen_jid() name = 'event' + self.yid cachedir = self.opts.get('cachedir', os.path.join(syspaths.CACHE_DIR, self.node)) basedirpath = os.path.abspath( os.path.join(cachedir, 'raet')) self.connected = False self.stack = LaneStack( name=name, yid=self.yid, lanename=self.node, basedirpath=basedirpath, sockdirpath=self.sock_dir) self.stack.Pk = raeting.packKinds.pack self.router_yard = RemoteYard( stack=self.stack, lanename=self.node, yid=0, dirpath=self.sock_dir) self.stack.addRemote(self.router_yard) self.connect_pub()
def _setup_caller_stack(self, opts): ''' Setup and return the LaneStack and Yard used by by channel when global not already setup such as in salt-call to communicate to-from the minion ''' role = opts.get('id') if not role: emsg = ("Missing role required to setup RAETChannel.") log.error(emsg + "\n") raise ValueError(emsg) kind = opts.get('__role') # application kind 'master', 'minion', etc if kind not in kinds.APPL_KINDS: emsg = ("Invalid application kind = '{0}' for RAETChannel.".format(kind)) log.error(emsg + "\n") raise ValueError(emsg) if kind in [kinds.APPL_KIND_NAMES[kinds.applKinds.minion], kinds.APPL_KIND_NAMES[kinds.applKinds.caller], ]: lanename = "{0}_{1}".format(role, kind) else: emsg = ("Unsupported application kind '{0}' for RAETChannel.".format(kind)) log.error(emsg + '\n') raise ValueError(emsg) sockdirpath = opts['sock_dir'] stackname = 'caller' + nacling.uuid(size=18) stack = LaneStack(name=stackname, lanename=lanename, sockdirpath=sockdirpath) stack.Pk = raeting.PackKind.pack.value stack.addRemote(RemoteYard(stack=stack, name='manor', lanename=lanename, dirpath=sockdirpath)) log.debug("Created Caller Jobber Stack %s\n", stack.name) return stack
def postinitio(self): ''' Set up required objects and queues ''' self.uxd_stack.value = LaneStack( name='yard', lanename=self.opts.value['id'], yid=0, sockdirpath=self.opts.value['sock_dir'], dirpath=self.opts.value['cachedir']) self.uxd_stack.value.Pk = raeting.packKinds.pack self.event_yards.value = set() self.local_cmd.value = deque() self.remote_cmd.value = deque() self.fun.value = deque() self.event.value = deque() self.event_req.value = deque() self.publish.value = deque() if self.opts.value.get('worker_threads'): worker_seed = [] for ind in range(self.opts.value['worker_threads']): worker_seed.append('yard{0}'.format(ind + 1)) self.workers.value = itertools.cycle(worker_seed)
def action(self): ''' Set up the uxd stack and behaviors ''' name = "{0}{1}{2}".format( self.opts.value.get('id', self.main.data.name), 'worker', self.yid.value) localname = name lanename = self.opts.value.get('id', self.main.data.lanename) basedirpath = os.path.abspath( os.path.join(self.opts.value['cachedir'], 'raet')) self.stack.value = LaneStack( name=name, #localname=localname, basedirpath=basedirpath, lanename=lanename, yid=self.yid.value, sockdirpath=self.opts.value['sock_dir']) self.stack.value.Pk = raeting.packKinds.pack manor_yard = RemoteYard(stack=self.stack.value, yid=0, lanename=lanename, dirpath=self.opts.value['sock_dir']) self.stack.value.addRemote(manor_yard) self.remote.value = salt.daemons.masterapi.RemoteFuncs(self.opts.value) self.local.value = salt.daemons.masterapi.LocalFuncs( self.opts.value, self.access_keys.value) init = {} init['route'] = { 'src': (None, self.stack.value.local.name, None), 'dst': (None, manor_yard.name, 'worker_req') } self.stack.value.transmit(init, self.stack.value.uids.get(manor_yard.name)) self.stack.value.serviceAll()
def _return_pub(self, msg, ret): ''' Send the return data back via the uxd socket ''' stackname = self.opts['id'] + ret['jid'] dirpath = os.path.join(self.opts['cachedir'], stackname) ret_stack = LaneStack( name=stackname, lanename=self.opts['id'], yid=ret['jid'], sockdirpath=self.opts['sock_dir'], dirpath=dirpath) ret_stack.Pk = raeting.packKinds.pack main_yard = RemoteYard( stack=ret_stack, yid=0, lanename=self.opts['id'], dirpath=self.opts['sock_dir'] ) ret_stack.addRemote(main_yard) route = {'src': (self.opts['id'], ret_stack.local.name, 'jid_ret'), 'dst': (msg['route']['src'][0], None, 'remote_cmd')} ret['cmd'] = '_return' ret['id'] = self.opts['id'] try: oput = self.modules.value[ret['fun']].__outputter__ except (KeyError, AttributeError, TypeError): pass else: if isinstance(oput, str): ret['out'] = oput msg = {'route': route, 'load': ret} ret_stack.transmit(msg, ret_stack.uids.get('yard0')) ret_stack.serviceAll()
def pub(self, tgt, fun, arg=(), tgt_type='glob', ret='', jid='', timeout=5, **kwargs): ''' Publish the command! ''' if 'expr_form' in kwargs: salt.utils.warn_until( 'Fluorine', 'The target type should be passed using the \'tgt_type\' ' 'argument instead of \'expr_form\'. Support for using ' '\'expr_form\' will be removed in Salt Fluorine.' ) tgt_type = kwargs.pop('expr_form') payload_kwargs = self._prep_pub( tgt, fun, arg=arg, tgt_type=tgt_type, ret=ret, jid=jid, timeout=timeout, **kwargs) kind = self.opts['__role'] if kind not in kinds.APPL_KINDS: emsg = ("Invalid application kind = '{0}' for Raet LocalClient.".format(kind)) log.error(emsg + "\n") raise ValueError(emsg) if kind in [kinds.APPL_KIND_NAMES[kinds.applKinds.master], kinds.APPL_KIND_NAMES[kinds.applKinds.syndic]]: lanename = 'master' else: emsg = ("Unsupported application kind '{0}' for Raet LocalClient.".format(kind)) log.error(emsg + '\n') raise ValueError(emsg) sockdirpath = self.opts['sock_dir'] name = 'client' + nacling.uuid(size=18) stack = LaneStack( name=name, lanename=lanename, sockdirpath=sockdirpath) stack.Pk = raeting.PackKind.pack.value manor_yard = RemoteYard( stack=stack, lanename=lanename, name='manor', dirpath=sockdirpath) stack.addRemote(manor_yard) route = {'dst': (None, manor_yard.name, 'local_cmd'), 'src': (None, stack.local.name, None)} msg = {'route': route, 'load': payload_kwargs} stack.transmit(msg) stack.serviceAll() while True: time.sleep(0.01) stack.serviceAll() while stack.rxMsgs: msg, sender = stack.rxMsgs.popleft() ret = msg.get('return', {}) if 'ret' in ret: stack.server.close() return ret['ret'] stack.server.close() return ret
def pub(self, tgt, fun, arg=(), expr_form='glob', ret='', jid='', timeout=5, **kwargs): ''' Publish the command! ''' payload_kwargs = self._prep_pub(tgt, fun, arg=arg, expr_form=expr_form, ret=ret, jid=jid, timeout=timeout, **kwargs) kind = self.opts['__role'] if kind not in kinds.APPL_KINDS: emsg = ("Invalid application kind = '{0}' for Raet LocalClient.". format(kind)) log.error(emsg + "\n") raise ValueError(emsg) if kind in [ kinds.APPL_KIND_NAMES[kinds.applKinds.master], kinds.APPL_KIND_NAMES[kinds.applKinds.syndic] ]: lanename = 'master' else: emsg = ("Unsupported application kind '{0}' for Raet LocalClient.". format(kind)) log.error(emsg + '\n') raise ValueError(emsg) sockdirpath = self.opts['sock_dir'] name = 'client' + nacling.uuid(size=18) stack = LaneStack(name=name, lanename=lanename, sockdirpath=sockdirpath) stack.Pk = raeting.packKinds.pack manor_yard = RemoteYard(stack=stack, lanename=lanename, name='manor', dirpath=sockdirpath) stack.addRemote(manor_yard) route = { 'dst': (None, manor_yard.name, 'local_cmd'), 'src': (None, stack.local.name, None) } msg = {'route': route, 'load': payload_kwargs} stack.transmit(msg) stack.serviceAll() while True: time.sleep(0.01) stack.serviceAll() while stack.rxMsgs: msg, sender = stack.rxMsgs.popleft() ret = msg.get('return', {}) if 'ret' in ret: stack.server.close() return ret['ret'] stack.server.close() return ret