Esempio n. 1
0
File: core.py Progetto: dlax/salt
    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)
Esempio n. 2
0
    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
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
 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()
Esempio n. 7
0
 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', {})
Esempio n. 8
0
 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}
Esempio n. 9
0
    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
Esempio n. 10
0
 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()
Esempio n. 11
0
    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
Esempio n. 12
0
 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)
Esempio n. 13
0
    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()
Esempio n. 14
0
    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()
Esempio n. 15
0
    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
Esempio n. 16
0
    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