示例#1
0
文件: actors.py 项目: DaveQB/salt
    def action(self):

        self.presence_req.value = deque()
        self.availables.value = set()
        self.alloweds.value = odict()
        self.aliveds.value = odict()
        self.reapeds.value = odict()
示例#2
0
    def paginate(self, headsize):
        '''
        Create packeted segments from .packed using headsize
        '''
        if self.kind == raeting.packKinds.json:
            extrasize = 4096 #need better estimate
        else:
            extrasize = 2048

        hotelsize = headsize + extrasize
        secsize = raeting.UXD_MAX_PACKET_SIZE - hotelsize

        seccount = (self.size // secsize) + (1 if self.size % secsize else 0)
        for i in range(seccount):
            if i == seccount - 1: #last section
                section = self.packed[i * secsize:]
            else:
                section = self.packed[i * secsize: (i+1) * secsize]
            data = odict(self.data)
            data['number'] = i
            data['count'] = seccount
            data['section'] = section
            page = TxPage( stack=self.stack, data=odict(page=data), kind=self.kind)
            page.pack()
            self.pages.append(page)
示例#3
0
文件: actors.py 项目: mjura/salt-1
    def action(self):

        self.presence_req.value = deque()
        self.availables.value = set()
        self.alloweds.value = odict()
        self.aliveds.value = odict()
        self.reapeds.value = odict()
示例#4
0
文件: core.py 项目: mutagendev/salt
class SaltRaetRoadStackAllowed(ioflo.base.deeding.Deed):
    '''
    Updates status with .allowed of zeroth remote estate (master)
    FloScript:

    do salt raet road stack allowed
    go next if allowed in .raet.udp.stack.status

    '''
    Ioinits = odict(inode=".raet.udp.stack.",
                    stack='stack',
                    status=odict(ipath='status',
                                 ival=odict(
                                     joined=False,
                                     allowed=False,
                                     idle=False,
                                 )))

    def action(self, **kwa):
        '''
        Update .status share
        '''
        stack = self.stack.value
        allowed = False
        if stack and isinstance(stack, RoadStack):
            if stack.remotes:
                allowed = stack.remotes.values()[0].allowed
        self.status.update(allowed=allowed)
示例#5
0
class ParserRaet(deeding.ParamDeed):  # pylint: disable=W0232
    '''
    ParserRaet parses a packed RAET packet from pack and fills in data

    inherited attributes
        .name is actor name string
        .store is data store ref
        .ioinits is dict of io init data for initio
        ._parametric is flag for initio to not create attributes
    '''
    Ioinits = odict(
        data=odict(ipath='data', ival=odict(), iown=True),
        inlog=odict(ipath='inlog', ival=odict(), iown=True),
    )

    def action(self, data, inlog, **kwa):
        """ Parse packet from raw packed"""
        if data.value:
            data.value = raeting.defaultData(data.value)
            rest = raeting.parsePacket(data.value)
            data.stampNow()
            inlog.value[(data.value['meta']['sh'],
                         data.value['meta']['sp'])] = data.value['body'].get(
                             'data', {})
        return None
示例#6
0
class ReceiverRaet(deeding.ParamDeed):  # pylint: disable=W0232
    '''
    ReceiverRaet pulls packet from rxes deque and puts into new data
    and assigns meta data source ha using received ha

    inherited attributes
        .name is actor name string
        .store is data store ref
        .ioinits is dict of io init data for initio
        ._parametric is flag for initio to not create attributes
    '''
    Ioinits = odict(
        data='data',
        rxes=odict(ipath='.raet.media.rxes', ival=deque()),
    )

    def action(self, data, rxes, **kwa):
        '''
        Handle recived packet
        '''
        if rxes.value:
            rx, sa, da = rxes.value.popleft()
            data.value = raeting.defaultData()
            data.value['pack'] = rx
            data.value['meta']['sh'], data.value['meta']['sp'] = sa
            data.value['meta']['dh'], data.value['meta']['dp'] = da
        return None
示例#7
0
class SaltRaetRoadStackJoined(ioflo.base.deeding.Deed):
    '''
    Updates status with .joined of zeroth remote estate (master)
    FloScript:

    do salt raet road stack joined
    go next if joined in .salt.road.manor.status

    '''
    Ioinits = odict(
        inode=".salt.road.manor.",
        stack='stack',
        status=odict(ipath='status', ival=odict(joined=False,
                                                allowed=False,
                                                alived=False,
                                                rejected=False,
                                                idle=False, )))

    def action(self, **kwa):
        '''
        Update .status share
        '''
        stack = self.stack.value
        joined = False
        if stack and isinstance(stack, RoadStack):
            if stack.remotes:
                for remote in stack.remotes.values():
                    joined = any([remote.joined for remote in stack.remotes.values()])
        self.status.update(joined=joined)
示例#8
0
 def __init__(self,
              name='',
              version=raeting.VERSION,
              store=None,
              device=None,
              did=None,
              ha=("", raeting.RAET_PORT),
              rxMsgs = None,
              txMsgs = None,
              udpRxes = None,
              udpTxes = None,
              ):
     '''
     Setup StackUdp instance
     '''
     if not name:
         name = "stack{0}".format(StackUdp.Count)
         StackUdp.Count += 1
     self.name = name
     self.version = version
     self.store = store or storing.Store(stamp=0.0)
     self.devices = odict() # remote devices attached to this stack by did
     self.dids = odict() # reverse lookup did by device.name
      # local device for this stack
     self.device = device or devicing.LocalDevice(stack=self, did=did, ha=ha)
     self.transactions = odict() #transactions
     self.rxMsgs = rxMsgs if rxMsgs is not None else deque() # messages received
     self.txMsgs = txMsgs if txMsgs is not None else deque() # messages to transmit
     #(msg, ddid) ddid=0 is broadcast
     self.udpRxes = udpRxes if udpRxes is not None else deque() # udp packets received
     self.udpTxes = udpTxes if udpTxes is not None else deque() # udp packet to transmit
     self.serverUdp = aiding.SocketUdpNb(ha=self.device.ha)
     self.serverUdp.reopen()  # open socket
     self.device.ha = self.serverUdp.ha  # update device host address after open
示例#9
0
class SaltRaetRoadStackRejected(ioflo.base.deeding.Deed):
    '''
    Updates status with rejected of .acceptance of zeroth remote estate (master)
    FloScript:

    do salt raet road stack rejected
    go next if rejected in .salt.road.manor.status

    '''
    Ioinits = odict(
        inode=".salt.road.manor.",
        stack='stack',
        status=odict(ipath='status', ival=odict(joined=False,
                                                allowed=False,
                                                alived=False,
                                                rejected=False,
                                                idle=False, )))

    def action(self, **kwa):
        '''
        Update .status share
        '''
        stack = self.stack.value
        rejected = False
        if stack and isinstance(stack, RoadStack):
            if stack.remotes:
                for remote in stack.remotes.values():
                    rejected = all([remote.acceptance == raeting.acceptances.rejected
                                    for remote in stack.remotes.values()])
            else:  # no remotes so assume rejected
                rejected = True
        self.status.update(rejected=rejected)
示例#10
0
    def action(self, **kwa):
        '''
        Manage the presence of any remotes

        availables is set of names of alive remotes which are also allowed
        changeds is is share with two fields:
            plus is set of names of newly available remotes
            minus is set of names of newly unavailable remotes
        alloweds is dict of allowed remotes keyed by name
        aliveds is dict of alived remotes keyed by name
        reapeds is dict of reaped remotes keyed by name
        '''
        stack = self.stack.value
        if stack and isinstance(stack, RoadStack):
            stack.manage(cascade=True)
            # make copies
            self.availables.value = set(self.stack.value.availables)
            self.changeds.update(plus=set(self.stack.value.changeds['plus']))
            self.changeds.update(minus=set(self.stack.value.changeds['minus']))
            self.alloweds.value = odict(self.stack.value.alloweds)
            self.aliveds.value = odict(self.stack.value.aliveds)
            self.reapeds.value = odict(self.stack.value.reapeds)

            console.concise(" Manage {0}.\nAvailables: {1}\nChangeds:\nPlus: {2}\n"
                            "Minus: {3}\nAlloweds: {4}\nAliveds: {5}\nReapeds: {6}\n".format(
                    stack.name,
                    self.availables.value,
                    self.changeds.data.plus,
                    self.changeds.data.minus,
                    self.alloweds.value,
                    self.aliveds.value,
                    self.reapeds.value))
示例#11
0
    def manage(self, cascade=False, immediate=False):
        '''
        Manage remote estates. Time based processing of remote status such as
        presence (keep alive) etc.

        cascade induces the alive transactions to run join, allow, alive until
        failure or alive success

        immediate indicates to run first attempt immediately and not wait for timer

        availables = dict of remotes that are both alive and allowed
        '''
        alloweds = odict()
        aliveds = odict()
        for remote in self.remotes.values(): # should not start anything
            remote.manage(cascade=cascade, immediate=immediate)
            if remote.allowed:
                alloweds[remote.name] = remote
            if remote.alived:
                aliveds[remote.name] = remote

        old = set(self.aliveds.keys())
        current = set(aliveds.keys())
        plus = current.difference(old)
        minus = old.difference(current)
        self.availables = current
        self.changeds = odict(plus=plus, minus=minus)
        self.alloweds = alloweds
        self.aliveds =  aliveds
示例#12
0
class ComposerRaet(deeding.ParamDeed):  # pylint: disable=W0232
    '''
    ComposerRaet creates packet data as nested dicts from fields in
    share parms meta, head, neck, body, tail

    inherited attributes
        .name is actor name string
        .store is data store ref
        .ioinits is dict of io init data for initio
        ._parametric is flag for initio to not create attributes
    '''
    Ioinits = odict(data=odict(ipath='data', ival=odict(), iown='True'),
                    meta='meta',
                    head='head',
                    neck='neck',
                    body='body',
                    tail='tail')

    def action(self, data, meta, head, neck, body, tail, **kwa):
        '''
        Build packet data from data section shares
        '''
        dat = raeting.defaultData()
        dat['meta'].update(raeting.META_DEFAULTS)
        dat['meta'].update(meta.items())
        dat['head'].update(raeting.HEAD_DEFAULTS)
        dat['head'].update(head.items())
        dat['neck'].update(neck.items())
        dat['body'].update(data=odict(body.items()))
        dat['tail'].update(tail.items())
        data.value = dat
        return None
示例#13
0
    def testSegmentedMsgpack(self):
        '''
        Test segmented message transactions
        '''
        console.terse("{0}\n".format(self.testSegmentedJson.__doc__))

        stuff = []
        for i in range(300):
            stuff.append(str(i).rjust(10, " "))
        stuff = "".join(stuff)

        others = []
        mains = []
        others.append(
            odict(house="Snake eyes", queue="near stuff", stuff=stuff))
        mains.append(odict(house="Craps", queue="far stuff", stuff=stuff))

        bloat = []
        for i in range(300):
            bloat.append(str(i).rjust(100, " "))
        bloat = "".join(bloat)
        others.append(odict(house="Other", queue="big stuff", bloat=bloat))
        mains.append(odict(house="Main", queue="gig stuff", bloat=bloat))

        self.bidirectional(bk=raeting.bodyKinds.msgpack,
                           mains=mains,
                           others=others)
示例#14
0
    def manage(self, cascade=False, immediate=False):
        '''
        Manage remote estates. Time based processing of remote status such as
        presence (keep alive) etc.

        cascade induces the alive transactions to run join, allow, alive until
        failure or alive success

        immediate indicates to run first attempt immediately and not wait for timer

        availables = dict of remotes that are both alive and allowed
        '''
        alloweds = odict()
        aliveds = odict()
        reapeds = odict()
        for remote in self.remotes.values():  # should not start anything
            remote.manage(cascade=cascade, immediate=immediate)
            if remote.allowed:
                alloweds[remote.name] = remote
            if remote.alived:
                aliveds[remote.name] = remote
            if remote.reaped:
                reapeds[remote.name] = remote

        old = set(self.aliveds.keys())
        current = set(aliveds.keys())
        plus = current.difference(old)
        minus = old.difference(current)
        self.availables = current
        self.changeds = odict(plus=plus, minus=minus)
        self.alloweds = alloweds
        self.aliveds = aliveds
        self.reapeds = reapeds
示例#15
0
    def testSegmentedMsgpackBurst(self):
        '''
        Test segmented message transactions with burst count limiting
        '''
        console.terse("{0}\n".format(self.testSegmentedMsgpackBurst.__doc__))

        stuff = []
        for i in range(300):
            stuff.append(str(i).rjust(10, " "))
        stuff = "".join(stuff)

        others = []
        mains = []
        others.append(odict(house="Snake eyes", queue="near stuff", stuff=stuff))
        mains.append(odict(house="Craps", queue="far stuff", stuff=stuff))

        bloat = []
        for i in range(300):
            bloat.append(str(i).rjust(100, " "))
        bloat = "".join(bloat)
        others.append(odict(house="Other", queue="big stuff", bloat=bloat))
        mains.append(odict(house="Main", queue="gig stuff", bloat=bloat))

        stacking.RoadStack.BurstSize = 16
        self.assertEqual(stacking.RoadStack.BurstSize, 16)
        self.bidirectional(bk=raeting.BodyKind.msgpack.value, mains=mains, others=others, duration=20.0)
        stacking.RoadStack.BurstSize = 0
        self.assertEqual(stacking.RoadStack.BurstSize, 0)
示例#16
0
    def testMessageSectionedMsgpack(self):
        '''
        Sectioned messages with msgpack packing
        '''
        console.terse("{0}\n".format(self.testMessageSectionedMsgpack.__doc__))

        self.bootstrap(kind=raeting.packKinds.pack)

        #big packets
        stuff = []
        for i in range(10000):
            stuff.append(str(i).rjust(10, " "))
        stuff = "".join(stuff)

        src = ['mayor', self.main.local.name, None]
        dst = ['citizen', self.other.local.name, None]
        route = odict([('src', src), ('dst', dst)])

        mains = []
        mains.append(odict([('route', route), ('content', stuff)]))

        src = ['citizen', self.other.local.name, None]
        dst = ['mayor', self.main.local.name, None]
        route = odict([('src', src), ('dst', dst)])

        others = []
        others.append(odict([('route', route), ('content', stuff)]))

        self.message(mains=mains, others=others, duration=2.0)
示例#17
0
    def testMessageSectionedMsgpack(self):
        '''
        Sectioned messages with msgpack packing
        '''
        console.terse("{0}\n".format(self.testMessageSectionedMsgpack.__doc__))

        self.bootstrap(kind=raeting.packKinds.pack)

        #big packets
        stuff = []
        for i in range(10000):
            stuff.append(str(i).rjust(10, " "))
        stuff = "".join(stuff)

        src = ['mayor', self.main.local.name, None]
        dst = ['citizen', self.other.local.name, None]
        route = odict([('src', src), ('dst', dst)])


        mains = []
        mains.append(odict([('route', route), ('content', stuff)]))

        src = ['citizen', self.other.local.name, None]
        dst = ['mayor', self.main.local.name, None]
        route = odict([('src', src), ('dst', dst)])

        others = []
        others.append(odict([('route', route), ('content', stuff)]))

        self.message(mains=mains, others=others, duration=2.0)
示例#18
0
class SaltRaetRoadCleanup(deeding.Deed):
    '''
    Cleanup stray road keep directories

    FloScript:

    do salt raet road cleanup at enter

    '''
    Ioinits = odict(
                     inode="raet.road.stack.",
                     local=odict(
                                 ipath='local',
                                 ival=odict(basedirpath='/tmp/raet/keep')
                                )
                    )

    def action(self):
        '''
        Should only run once to cleanup stale lane uxd files.
        '''
        basedirpath = os.path.abspath(os.path.expanduser(self.local.data.basedirpath))
        console.concise("Cleaning up road files in {0}\n".format(basedirpath))
        if os.path.exists(basedirpath):
            shutil.rmtree(basedirpath)
示例#19
0
文件: actors.py 项目: mjura/salt-1
class PresenterTestCleanup(ioflo.base.deeding.Deed):
    '''
    Clean up after a test
    '''
    Ioinits = {
        'presence_req': '.salt.presence.event_req',
        'alloweds': {
            'ipath': '.salt.var.presence.alloweds',
            'ival': odict()
        },
        'aliveds': {
            'ipath': '.salt.var.presence.aliveds',
            'ival': odict()
        },
        'reapeds': {
            'ipath': '.salt.var.presence.reapeds',
            'ival': odict()
        },
        'availables': {
            'ipath': '.salt.var.presence.availables',
            'ival': set()
        }
    }

    def action(self):

        self.presence_req.value = deque()
        self.availables.value = set()
        self.alloweds.value = odict()
        self.aliveds.value = odict()
        self.reapeds.value = odict()
示例#20
0
class RaetLaneStackYardAdd(deeding.Deed):
    '''
    Adds yard to lane stack.
    Where lane is the lane name and name is the yard name in the parameters
    FloScript:

    do raet lane stack yard add to lane "ash" name "lord" at enter

    '''
    Ioinits = odict(
        inode=".raet.lane.stack.",
        stack='stack',
        local=odict(ipath='local',
                    ival=odict(sockdirpath="/tmp/raet/test/lane/")))

    def action(self, lane="lane", name=None, **kwa):
        '''
        Adds new yard to stack on lane with name
        '''
        stack = self.stack.value
        sockdirpath = self.local.data.sockdirpath
        if stack and isinstance(stack, LaneStack):
            yard = yarding.RemoteYard(stack=stack,
                                      lanename=lane,
                                      name=name,
                                      dirpath=sockdirpath)
            stack.addRemote(yard)
            self.local.value = yard
示例#21
0
文件: actors.py 项目: mjura/salt-1
    def action(self):

        self.presence_req.value = deque()
        self.availables.value = set()
        self.alloweds.value = odict()
        self.aliveds.value = odict()
        self.reapeds.value = odict()

        # Create event stack
        name = 'event' + nacling.uuid(size=18)
        lanename = self.lane_stack.value.local.lanename
        sock_dir = self.lane_stack.value.local.dirpath
        ryn = 'manor'
        console.terse(
            "Create stack: name = {0}, lanename = {1}, sock_dir = {2}\n".
            format(name, lanename, sock_dir))
        stack = LaneStack(name=name, lanename=lanename, sockdirpath=sock_dir)
        stack.addRemote(
            RemoteYard(stack=stack,
                       lanename=lanename,
                       name=ryn,
                       dirpath=sock_dir))
        self.event_stack.value = stack

        route = {
            'dst': (None, ryn, 'presence_req'),
            'src': (None, stack.local.name, None)
        }
        msg = {'route': route}
        stack.transmit(msg, stack.nameRemotes[ryn].uid)
        serviceLanes([stack, self.lane_stack.value])
示例#22
0
    def action(self, **kwa):
        '''
        Manage the presence of any remotes

        availables is set of names of alive remotes which are also allowed
        changeds is is share with two fields:
            plus is set of names of newly available remotes
            minus is set of names of newly unavailable remotes
        alloweds is dict of allowed remotes keyed by name
        aliveds is dict of alived remotes keyed by name
        reapeds is dict of reaped remotes keyed by name
        '''
        stack = self.stack.value
        if stack and isinstance(stack, RoadStack):
            stack.manage(cascade=True)
            # make copies
            self.availables.value = set(self.stack.value.availables)
            self.changeds.update(plus=set(self.stack.value.changeds['plus']))
            self.changeds.update(minus=set(self.stack.value.changeds['minus']))
            self.alloweds.value = odict(self.stack.value.alloweds)
            self.aliveds.value = odict(self.stack.value.aliveds)
            self.reapeds.value = odict(self.stack.value.reapeds)

            console.concise(" Manage {0}.\nAvailables: {1}\nChangeds:\nPlus: {2}\n"
                            "Minus: {3}\nAlloweds: {4}\nAliveds: {5}\nReapeds: {6}\n".format(
                    stack.name,
                    self.availables.value,
                    self.changeds.data.plus,
                    self.changeds.data.minus,
                    self.alloweds.value,
                    self.aliveds.value,
                    self.reapeds.value))
示例#23
0
class RaetRoadStackAllowed(deeding.Deed):  # pylint: disable=W0232
    '''
    Updates status field in share with .allowed of zeroth remote estate (main)
    FloScript:

    do raet road stack allowed
    go next if allowed in .raet.road.stack.status

    '''
    Ioinits = odict(inode=".raet.road.stack.",
                    stack='stack',
                    status=odict(ipath='status',
                                 ival=odict(
                                     joined=False,
                                     allowed=False,
                                     idle=False,
                                 )))

    def action(self, **kwa):
        '''
        Update .status share
        '''
        stack = self.stack.value
        allowed = False
        if stack and isinstance(stack, RoadStack):
            if stack.remotes:
                allowed = stack.remotes.values()[0].allowed
        self.status.update(allowed=allowed)
示例#24
0
class RaetRoadStackIdled(deeding.Deed):  # pylint: disable=W0232
    '''
    Updates idle status field in shate to true if there are no outstanding
    transactions in the associated stack

    FloScript:

    do raet road stack idled
    go next if idled in .raet.road.stack.status

    '''
    Ioinits = odict(inode=".raet.road.stack.",
                    stack='stack',
                    status=odict(ipath='status',
                                 ival=odict(
                                     joined=False,
                                     allowed=False,
                                     idle=False,
                                 )))

    def action(self, **kwa):
        '''
        Update .status share
        '''
        stack = self.stack.value
        idled = False
        if stack and isinstance(stack, RoadStack):
            if not stack.transactions:
                idled = True
        self.status.update(idled=idled)
示例#25
0
class RaetLaneStackYardAdd(deeding.Deed):  # pylint: disable=W0232
    '''
    Adds yard to lane stack.
    Where lane is the lane name and name is the yard name in the parameters
    FloScript:

    do raet lane stack yard add to lane "ash" name "lord" at enter

    '''
    Ioinits = odict(
        inode=".raet.lane.stack.",
        stack='stack',
        local='yard',
        yard=odict(ipath='local', ival=odict(name=None, lane="maple")),
    )

    def action(self, lane="lane", name=None, **kwa):
        '''
        Adds new yard to stack on lane with yid
        '''
        stack = self.stack.value
        if stack and isinstance(stack, LaneStack):
            yard = yarding.RemoteYard(stack=stack, lanename=lane, name=name)
            stack.addRemote(yard)
            self.local.value = yard
示例#26
0
class RaetRoadStack(deeding.Deed):
    '''
    Initialize and run raet road stack
    FloScript:

    do raet road stack

    '''
    Ioinits = odict(
        inode="raet.road.stack.",
        stack='stack',
        txmsgs=odict(ipath='txmsgs', ival=deque()),
        rxmsgs=odict(ipath='rxmsgs', ival=deque()),
        local=odict(ipath='local', ival=odict(   name='master',
                                                 basedirpath='/tmp/raet/keep',
                                                 main=False,
                                                 mutable=True,
                                                 auto=raeting.autoModes.once,
                                                 uid=None,
                                                 host='0.0.0.0',
                                                 port=raeting.RAET_PORT,
                                                 sigkey=None,
                                                 prikey=None)),)

    def postinitio(self):
        '''
        Setup stack instance
        '''
        sigkey = self.local.data.sigkey
        prikey = self.local.data.prikey
        name = self.local.data.name
        basedirpath = os.path.abspath(os.path.expanduser(self.local.data.basedirpath))
        auto = self.local.data.auto
        main = self.local.data.main
        mutable = self.local.data.mutable
        ha = (self.local.data.host, self.local.data.port)

        uid = self.local.data.uid
        txMsgs = self.txmsgs.value
        rxMsgs = self.rxmsgs.value

        self.stack.value = RoadStack(store=self.store,
                                     main=main,
                                     mutable=mutable,
                                     name=name,
                                     uid=uid,
                                     ha=ha,
                                     sigkey=sigkey,
                                     prikey=prikey,
                                     auto=auto,
                                     basedirpath=basedirpath,
                                     txMsgs=txMsgs,
                                     rxMsgs=rxMsgs, )

    def action(self, **kwa):
        '''
        Service all the deques for the stack
        '''
        self.stack.value.serviceAll()
示例#27
0
    def testAutoAccept(self):
        '''
        Basic send auto accept message
        '''
        console.terse("{0}\n".format(self.testAutoAccept.__doc__))

        self.assertTrue(self.main.accept)

        # Don't add remote yard to main so only way to get message from other is
        # if auto acccept works
        self.other.addRemote(
            yarding.RemoteYard(stack=self.other, ha=self.main.local.ha))

        self.assertEqual(self.main.name, 'main')
        self.assertEqual(self.main.local.name, 'main')
        self.assertEqual(self.main.local.ha,
                         os.path.join(self.baseDirpath, 'cherry.main.uxd'))
        self.assertEqual(len(self.main.remotes), 0)

        self.assertEqual(self.other.name, 'other')
        self.assertEqual(self.other.local.name, 'other')
        self.assertEqual(self.other.local.ha,
                         os.path.join(self.baseDirpath, 'cherry.other.uxd'))
        self.assertEqual(len(self.other.remotes), 1)
        remote = self.other.remotes.values()[0]
        self.assertEqual(remote.ha,
                         os.path.join(self.baseDirpath, 'cherry.main.uxd'))
        self.assertEqual(remote.name, 'main')
        self.assertTrue(remote.uid in self.other.remotes)
        self.assertTrue(remote.name in self.other.uids)
        self.assertIs(self.other.remotes[self.other.uids[remote.name]], remote)

        stacking.LaneStack.Pk = raeting.packKinds.pack

        others = []
        others.append(
            odict(what="This is a message to the lord. Let me be",
                  extra="Go away."))

        self.message(mains=[], others=others)

        self.assertEqual(len(self.main.remotes), 1)
        remote = self.main.remotes.values()[0]
        self.assertEqual(remote.ha,
                         os.path.join(self.baseDirpath, 'cherry.other.uxd'))
        self.assertEqual(remote.name, 'other')
        self.assertTrue(remote.uid in self.main.remotes)
        self.assertTrue(remote.name in self.main.uids)
        self.assertIs(self.main.remotes[self.main.uids[remote.name]], remote)

        self.main.rxMsgs = deque()
        self.other.rxMsgs = deque()

        mains = []
        mains.append(
            odict(what="This is a message to the serf. Get to Work",
                  extra="Fix the fence."))

        self.message(mains=mains, others=[])
示例#28
0
    def testBasicRaetMsgpack(self):
        '''
        Basic pack parse with header json and body msgpack
        '''
        console.terse("{0}\n".format(self.testBasicRaetMsgpack.__doc__))

        hk = raeting.headKinds.raet
        bk = raeting.bodyKinds.msgpack

        data = odict(hk=hk, bk=bk)
        body = odict(msg='Hello Raet World', extra='Goodby Big Moon')
        packet0 = packeting.TxPacket(
            embody=body,
            data=data,
        )
        self.assertDictEqual(packet0.body.data, body)
        packet0.pack()
        self.assertEqual(
            packet0.packed,
            'ri RAET\npl 0048\nhl 1c\nbk 3\n\n\x82\xa3msg\xb0Hello Raet World\xa5extra\xafGoodby Big Moon'
        )

        packet1 = packeting.RxPacket(packed=packet0.packed)
        packet1.parse()
        self.assertDictEqual(
            packet1.data, {
                'sh': '',
                'sp': 7530,
                'dh': '127.0.0.1',
                'dp': 7530,
                'ri': 'RAET',
                'vn': 0,
                'pk': 0,
                'pl': 72,
                'hk': 0,
                'hl': 28,
                'se': 0,
                'de': 0,
                'cf': False,
                'bf': False,
                'si': 0,
                'ti': 0,
                'tk': 0,
                'dt': 0,
                'oi': 0,
                'wf': False,
                'sn': 0,
                'sc': 1,
                'ml': 0,
                'sf': False,
                'af': False,
                'bk': 3,
                'ck': 0,
                'fk': 0,
                'fl': 0,
                'fg': '00'
            })
        self.assertDictEqual(packet1.body.data, body)
示例#29
0
    def testBasicJson(self):
        '''
        Basic pack parse with header json and body json
        '''
        console.terse("{0}\n".format(self.testBasicJson.__doc__))

        hk = raeting.headKinds.json
        bk = raeting.bodyKinds.json

        data = odict(hk=hk, bk=bk)
        body = odict(msg='Hello Raet World', extra='Goodby Big Moon')
        packet0 = packeting.TxPacket(
            embody=body,
            data=data,
        )
        self.assertDictEqual(packet0.body.data, body)
        packet0.pack()
        self.assertEqual(
            packet0.packed,
            '{"ri":"RAET","pl":"000006c","hl":"38","hk":1,"bk":1}\r\n\r\n{"msg":"Hello Raet World","extra":"Goodby Big Moon"}'
        )

        packet1 = packeting.RxPacket(packed=packet0.packed)
        packet1.parse()
        self.assertDictEqual(
            packet1.data, {
                'sh': '',
                'sp': 7530,
                'dh': '127.0.0.1',
                'dp': 7530,
                'ri': 'RAET',
                'vn': 0,
                'pk': 0,
                'pl': 108,
                'hk': 1,
                'hl': 56,
                'se': 0,
                'de': 0,
                'cf': False,
                'bf': False,
                'si': 0,
                'ti': 0,
                'tk': 0,
                'dt': 0,
                'oi': 0,
                'wf': False,
                'sn': 0,
                'sc': 1,
                'ml': 0,
                'sf': False,
                'af': False,
                'bk': 1,
                'ck': 0,
                'fk': 0,
                'fl': 0,
                'fg': '00'
            })
        self.assertDictEqual(packet1.body.data, body)
示例#30
0
    def __init__(self,
                 store=None,
                 version=raeting.VERSION,
                 main=None,
                 puid=None,
                 local=None, #passed up from subclass
                 name='',
                 uid=None,
                 server=None,
                 ha=None,
                 bufcnt=2,
                 rxMsgs=None,
                 txMsgs=None,
                 rxes=None,
                 txes=None,
                 stats=None,
                ):
        '''
        Setup Stack instance
        '''
        self.store = store or storing.Store(stamp=0.0)

        self.version = version
        self.main = main

        if getattr(self, 'puid', None) is None:
            self.puid = puid if puid is not None else self.Uid

        self.local = local or lotting.Lot(stack=self,
                                          name=name,
                                          uid=uid,
                                          ha=ha,)
        self.local.stack = self

        self.remotes = self.uidRemotes = odict() # remotes indexed by uid
        self.nameRemotes = odict() # remotes indexed by name

        self.bufcnt = bufcnt
        if not server:
            server = self.serverFromLocal()

        self.server = server
        if self.server:
            if not self.server.reopen():  # open socket
                raise raeting.StackError("Stack '{0}': Failed opening server at"
                            " '{1}'\n".format(self.name, self.server.ha))

            self.ha = self.server.ha  # update local host address after open

            console.verbose("Stack '{0}': Opened server at '{1}'\n".format(self.name,
                                                                           self.ha))

        self.rxMsgs = rxMsgs if rxMsgs is not None else deque() # messages received
        self.txMsgs = txMsgs if txMsgs is not None else deque() # messages to transmit
        self.rxes = rxes if rxes is not None else deque() # udp packets received
        self.txes = txes if txes is not None else deque() # udp packet to transmit
        self.stats = stats if stats is not None else odict() # udp statistics
        self.statTimer = aiding.StoreTimer(self.store)
示例#31
0
    def __init__(self,
                 name='',
                 main=None,
                 mutable=None,
                 keep=None,
                 dirpath='',
                 basedirpath='',
                 local=None,
                 eid=None, #local estate eid, none means generate it
                 ha=("", raeting.RAET_PORT),
                 bufcnt=2,
                 auto=None,
                 period=None,
                 offset=None,
                 interim=None,
                 role=None,
                 **kwa
                 ):
        '''
        Setup StackUdp instance

        '''
        keep = keep or keeping.RoadKeep(dirpath=dirpath,
                                        basedirpath=basedirpath,
                                        stackname=name,
                                        auto=auto)

        local = local or estating.LocalEstate(stack=self,
                                              name=name,
                                              eid=eid,
                                              main=main,
                                              mutable=mutable,
                                              ha=ha,
                                              role=role)
        local.stack = self
        if local.main is None and main is not None:
            local.main = True if main else False

        if local.mutable is None and mutable is not None:
            local.mutable = True if mutable else False

        self.period = period if period is not None else self.Period
        self.offset = offset if offset is not None else self.Offset
        self.interim = interim if interim is not None else self.Interim

        super(RoadStack, self).__init__(name=name,
                                        main=main,
                                        keep=keep,
                                        dirpath=dirpath,
                                        basedirpath=basedirpath,
                                        local=local,
                                        bufcnt=bufcnt,
                                        **kwa)

        self.alloweds = odict() # allowed remotes keyed by name
        self.aliveds =  odict() # alived remotes keyed by name
        self.reapeds =  odict() # reaped remotes keyed by name
        self.availables = set() # set of available remote names
示例#32
0
文件: actors.py 项目: mjura/salt-1
class PresenterTestSetup(ioflo.base.deeding.Deed):
    '''
    Setup shares for presence tests
    '''
    Ioinits = {
        'presence_req': '.salt.presence.event_req',
        'lane_stack': '.salt.lane.manor.stack',
        'event_stack': '.salt.test.lane.stack',
        'alloweds': {
            'ipath': '.salt.var.presence.alloweds',
            'ival': odict()
        },
        'aliveds': {
            'ipath': '.salt.var.presence.aliveds',
            'ival': odict()
        },
        'reapeds': {
            'ipath': '.salt.var.presence.reapeds',
            'ival': odict()
        },
        'availables': {
            'ipath': '.salt.var.presence.availables',
            'ival': set()
        }
    }

    def action(self):

        self.presence_req.value = deque()
        self.availables.value = set()
        self.alloweds.value = odict()
        self.aliveds.value = odict()
        self.reapeds.value = odict()

        # Create event stack
        name = 'event' + nacling.uuid(size=18)
        lanename = self.lane_stack.value.local.lanename
        sock_dir = self.lane_stack.value.local.dirpath
        ryn = 'manor'
        console.terse(
            "Create stack: name = {0}, lanename = {1}, sock_dir = {2}\n".
            format(name, lanename, sock_dir))
        stack = LaneStack(name=name, lanename=lanename, sockdirpath=sock_dir)
        stack.addRemote(
            RemoteYard(stack=stack,
                       lanename=lanename,
                       name=ryn,
                       dirpath=sock_dir))
        self.event_stack.value = stack

        route = {
            'dst': (None, ryn, 'presence_req'),
            'src': (None, stack.local.name, None)
        }
        msg = {'route': route}
        stack.transmit(msg, stack.nameRemotes[ryn].uid)
        serviceLanes([stack, self.lane_stack.value])
示例#33
0
class ServerRaet(deeding.ParamDeed):  # pylint: disable=W0232
    '''
    ServerRaet transmits and recieves udp packets from txes and rxes deques
    using sh, sp fields in sa server address (server host, server port) to receive on.
    Server is nonblocking socket connection

    inherited attributes
        .name is actor name string
        .store is data store ref
        .ioinits is dict of io init data for initio
        ._parametric is flag for initio to not create attributes
    '''
    Ioinits = odict(
        txes=odict(ipath='txes', ival=deque(), iown=True),
        rxes=odict(ipath='rxes', ival=deque(), iown=True),
        connection=odict(ipath='connection', ival=None, iown=True),
        address=odict(ipath='address', ival=odict(host='', port=7530,
                                                  ha=None)),
        txlog=odict(ipath='txlog', ival=odict(), iown=True),
        rxlog=odict(ipath='rxlog', ival=odict(), iown=True),
    )

    def postinitio(self, connection, address, **kwa):
        '''
        Set up server to transmit and recive on address
        '''
        connection.value = aiding.SocketUdpNb(host=address.data.host,
                                              port=address.data.port)
        connection.value.reopen()  # create socket connection
        host, port = connection.value.ha
        address.update(host=host, port=port, ha=(host, port))
        return None

    def action(self, txes, rxes, connection, address, txlog, rxlog, **kwa):
        '''
        Receive any udp packets on server socket and put in rxes
        Send any packets in txes
        '''
        server = connection.value
        txl = txlog.value
        rxl = rxlog.value

        if server:
            rxds = rxes.value
            while True:
                rx, ra = server.receive()  # if no data the tuple is ('',None)
                if not rx:  # no received data so break
                    break
                rxds.append((rx, ra, address.data.ha))
                rxl[ra] = rx

            txds = txes.value
            while txds:
                tx, ta = txds.popleft()
                server.send(tx, ta)
                txl[ta] = tx
        return None
示例#34
0
    def testMinionStatsUnknownRemote(self):
        """
        Test Minion Stats request with unknown remote (B1)
        """
        console.terse("{0}\n".format(
            self.testMinionStatsUnknownRemote.__doc__))

        # Bootstrap
        self.addEnterDeed("TestOptsSetupMinion")
        self.addEnterDeed("SaltRaetManorLaneSetup")
        self.addEnterDeed("SaltRaetRoadStackSetup")
        self.addEnterDeed("StatsMinionTestSetup")
        act = self.addRecurDeed("SaltRaetStatsEventerMinion")
        self.resolve()  # resolve House, Framer, Frame, Acts, Actors
        self.frame.enter()

        # Prepare
        # add a test stat key-value
        roadStack = self.store.fetch('.salt.road.manor.stack')
        laneStack = self.store.fetch('.salt.lane.manor.stack')
        roadStack.value.stats = odict({'test_road_stats_event': 111})
        laneStack.value.stats = odict({'test_lane_stats_event': 222})
        # ensure stats are equal to expected
        self.assertDictEqual(roadStack.value.stats,
                             {'test_road_stats_event': 111})
        self.assertDictEqual(laneStack.value.stats,
                             {'test_lane_stats_event': 222})

        # add stats request
        testStack = self.store.fetch('.salt.test.road.stack').value
        statsReq = self.store.fetch('.salt.stats.event_req').value
        tag = tagify('road', 'stats')
        minionName = roadStack.value.local.name
        # unknown remote (src) name in stats request
        unknownName = 'unknownName'
        statsReq.append({
            'route': {
                'dst': (minionName, None, 'stats_req'),
                'src': (unknownName, None, None)
            },
            'tag': tag
        })

        # Test
        self.frame.recur()  # run in frame

        # Check
        self.assertEqual(len(testStack.rxMsgs), 0)
        testStack.serviceAll()
        self.assertEqual(len(testStack.rxMsgs), 0)

        # Close active stacks servers
        act.actor.lane_stack.value.server.close()
        act.actor.road_stack.value.server.close()
        testStack = self.store.fetch('.salt.test.road.stack')
        if testStack:
            testStack.value.server.close()
示例#35
0
文件: test_stats.py 项目: DaveQB/salt
    def testMinionLaneStats(self):
        """
        Test Minion Road Stats request (A2)
        """
        console.terse("{0}\n".format(self.testMinionLaneStats.__doc__))

        # Bootstrap
        self.addEnterDeed("TestOptsSetupMinion")
        self.addEnterDeed("SaltRaetManorLaneSetup")
        self.addEnterDeed("SaltRaetRoadStackSetup")
        self.addEnterDeed("StatsMinionTestSetup")
        act = self.addRecurDeed("SaltRaetStatsEventerMinion")
        self.resolve()  # resolve House, Framer, Frame, Acts, Actors
        self.frame.enter()

        # Prepare
        # add a test stat key-value
        roadStack = self.store.fetch('.salt.road.manor.stack')
        laneStack = self.store.fetch('.salt.lane.manor.stack')
        roadStack.value.stats = odict()
        laneStack.value.stats = odict({'test_stats_event': 111})
        # ensure stats are equal to expected
        self.assertDictEqual(roadStack.value.stats, {})
        self.assertDictEqual(laneStack.value.stats, {'test_stats_event': 111})

        # add stats request
        testStack = self.store.fetch('.salt.test.road.stack').value
        statsReq = self.store.fetch('.salt.stats.event_req').value
        tag = tagify('lane', 'stats')
        minionName = roadStack.value.local.name
        masterName = testStack.local.name
        # lane stats request
        statsReq.append({'route': {'dst': (minionName, None, 'stats_req'),
                                   'src': (masterName, None, None)},
                         'tag': tag})

        # Test
        self.frame.recur()  # run in frame

        # Check
        self.assertEqual(len(testStack.rxMsgs), 0)
        testStack.serviceAll()
        self.assertEqual(len(testStack.rxMsgs), 1)

        msg, sender = testStack.rxMsgs.popleft()
        self.assertDictEqual(msg, {u'route': {u'src': [ns2u(minionName), u'manor', None],
                                              u'dst': [ns2u(masterName), None, u'event_fire']},
                                   u'tag': ns2u(tag),
                                   u'data': {u'test_stats_event': 111}})

        # Close active stacks servers
        act.actor.lane_stack.value.server.close()
        act.actor.road_stack.value.server.close()
        testStack = self.store.fetch('.salt.test.road.stack')
        if testStack:
            testStack.value.server.close()
示例#36
0
    def __init__(self,
                 name='',
                 main=None,
                 keep=None,
                 dirpath=None,
                 local=None,
                 eid=None,
                 ha=("", raeting.RAET_PORT),
                 bufcnt=2,
                 safe=None,
                 auto=None,
                 **kwa
                 ):
        '''
        Setup StackUdp instance
        '''
        if not name:
            name = "roadstack{0}".format(RoadStack.Count)
            RoadStack.Count += 1

        if not keep:
            keep = keeping.RoadKeep(dirpath=dirpath, stackname=name)

        if not safe:
            safe = keeping.SafeKeep(dirpath=dirpath,
                                    stackname=name,
                                    auto=auto)
        else:
            if auto is not None:
                safe.auto = True if auto else False
        self.safe = safe

        if not local:
            self.remotes = odict()
            local = estating.LocalEstate(stack=self,
                                         eid=eid,
                                         main=main,
                                         ha=ha)
        else:
            if main is not None:
                local.main = True if main else False

        server = aiding.SocketUdpNb(ha=local.ha,
                                    bufsize=raeting.UDP_MAX_PACKET_SIZE * bufcnt)

        super(RoadStack, self).__init__(name=name,
                                        keep=keep,
                                        dirpath=dirpath,
                                        local=local,
                                        server=server,
                                        **kwa)

        self.transactions = odict() #transactions

        self.dumpLocal() # save local data
        self.dumpRemotes() # save remote data
示例#37
0
文件: salting.py 项目: DaveQB/salt
 def loadLocalRoleData(self):
     '''
     Load and return the role data
     '''
     keydata = self.saltRaetKey.read_local()
     if not keydata:
         keydata = odict([('sign', None), ('priv', None)])
     data = odict([('sighex', keydata['sign']),
                  ('prihex', keydata['priv'])])
     return data
示例#38
0
文件: salting.py 项目: virHappy/salt
 def loadLocalRoleData(self):
     '''
     Load and return the role data
     '''
     keydata = self.saltRaetKey.read_local()
     if not keydata:
         keydata = odict([('sign', None), ('priv', None)])
     data = odict([('sighex', keydata['sign']),
                   ('prihex', keydata['priv'])])
     return data
示例#39
0
文件: stacking.py 项目: topochan/salt
    def __init__(self,
                 name='',
                 main=False,
                 version=raeting.VERSION,
                 store=None,
                 estate=None,
                 eid=None,
                 ha=("", raeting.RAET_PORT),
                 rxMsgs=None,
                 txMsgs=None,
                 udpRxes=None,
                 udpTxes=None,
                 road=None,
                 safe=None,
                 auto=None,
                 dirpath=None,
                 ):
        '''
        Setup StackUdp instance
        '''
        if not name:
            name = "stackUdp{0}".format(StackUdp.Count)
            StackUdp.Count += 1
        self.name = name
        self.version = version
        self.store = store or storing.Store(stamp=0.0)
        self.estates = odict() # remote estates attached to this stack by eid
        self.eids = odict() # reverse lookup eid by estate.name
        self.transactions = odict() #transactions
        self.rxMsgs = rxMsgs if rxMsgs is not None else deque() # messages received
        self.txMsgs = txMsgs if txMsgs is not None else deque() # messages to transmit
        self.udpRxes = udpRxes if udpRxes is not None else deque() # udp packets received
        self.udpTxes = udpTxes if udpTxes is not None else deque() # udp packet to transmit

        self.road = road or keeping.RoadKeep(dirpath=dirpath,
                                             stackname=self.name)
        self.safe = safe or keeping.SafeKeep(dirpath=dirpath,
                                             stackname=self.name,
                                             auto=auto)
        kept = self.loadLocal() # local estate from saved data
        # local estate for this stack
        self.estate = kept or estate or estating.LocalEstate(stack=self,
                                                             eid=eid,
                                                             main=main,
                                                             ha=ha)
        self.estate.stack = self
        self.serverUdp = aiding.SocketUdpNb(ha=self.estate.ha, bufsize=raeting.MAX_MESSAGE_SIZE)
        self.serverUdp.reopen()  # open socket
        self.estate.ha = self.serverUdp.ha  # update estate host address after open
        self.dumpLocal() # save local estate data

        kepts = self.loadAllRemote() # remote estates from saved data
        for kept in kepts:
            self.addRemoteEstate(kept)
        self.dumpAllRemote() # save remote estate data
示例#40
0
文件: test_stats.py 项目: DaveQB/salt
    def testMinionStatsWrongMissingTag(self):
        """
        Test Minion Stats requests with unknown and missing tag (A3, A4)
        """
        console.terse("{0}\n".format(self.testMinionStatsWrongMissingTag.__doc__))

        # Bootstrap
        self.addEnterDeed("TestOptsSetupMinion")
        self.addEnterDeed("SaltRaetManorLaneSetup")
        self.addEnterDeed("SaltRaetRoadStackSetup")
        self.addEnterDeed("StatsMinionTestSetup")
        act = self.addRecurDeed("SaltRaetStatsEventerMinion")
        self.resolve()  # resolve House, Framer, Frame, Acts, Actors
        self.frame.enter()

        # Prepare
        # add a test stat key-value
        roadStack = self.store.fetch('.salt.road.manor.stack')
        laneStack = self.store.fetch('.salt.lane.manor.stack')
        roadStack.value.stats = odict({'test_road_stats_event': 111})
        laneStack.value.stats = odict({'test_lane_stats_event': 222})
        # ensure stats are equal to expected
        self.assertDictEqual(roadStack.value.stats, {'test_road_stats_event': 111})
        self.assertDictEqual(laneStack.value.stats, {'test_lane_stats_event': 222})

        # add stats request
        testStack = self.store.fetch('.salt.test.road.stack').value
        statsReq = self.store.fetch('.salt.stats.event_req').value
        tag = 'salt/unknown/tag'
        self.assertNotEqual(tag, tagify('lane', 'stats'))
        self.assertNotEqual(tag, tagify('road', 'stats'))
        minionName = roadStack.value.local.name
        masterName = testStack.local.name
        # unknown tag in stats request
        statsReq.append({'route': {'dst': (minionName, None, 'stats_req'),
                                   'src': (masterName, None, None)},
                         'tag': tag})
        # no tag in stats request
        statsReq.append({'route': {'dst': (minionName, None, 'stats_req'),
                                   'src': (masterName, None, None)}})

        # Test
        self.frame.recur()  # run in frame

        # Check
        self.assertEqual(len(testStack.rxMsgs), 0)
        testStack.serviceAll()
        self.assertEqual(len(testStack.rxMsgs), 0)

        # Close active stacks servers
        act.actor.lane_stack.value.server.close()
        act.actor.road_stack.value.server.close()
        testStack = self.store.fetch('.salt.test.road.stack')
        if testStack:
            testStack.value.server.close()
示例#41
0
文件: core.py 项目: agoragames/salt
class SaltRaetRoadStackManager(ioflo.base.deeding.Deed):
    '''
    Runs the manage method of RoadStack
    FloScript:
        do salt raet road stack manager

    '''
    Ioinits = odict(
        inode=".raet.udp.stack.",
        stack='stack',
        alloweds={
            'ipath': '.salt.var.presence.alloweds',
            'ival': odict()
        },
        aliveds={
            'ipath': '.salt.var.presence.aliveds',
            'ival': odict()
        },
        availables={
            'ipath': '.salt.var.presence.availables',
            'ival': set()
        },
        changeds={
            'ipath': '.salt.var.presence.changeds',
            'ival': odict(plus=set(), minus=set())
        },
    )

    def action(self, **kwa):
        '''
        Manage the presence of any remotes

        availables is set of names of alive remotes which are also allowed
        changeds is is share with two fields:
            plus is set of names of newly available remotes
            minus is set of names of newly unavailable remotes
        alloweds is dict of allowed remotes keyed by name
        aliveds is dict of alived remotes keyed by name
        '''
        stack = self.stack.value
        if stack and isinstance(stack, RoadStack):
            stack.manage(cascade=True)
            # make copies
            self.availables.value = set(self.stack.value.availables)
            self.changeds.update(plus=set(self.stack.value.changeds['plus']))
            self.changeds.update(minus=set(self.stack.value.changeds['minus']))
            self.alloweds.value = odict(self.stack.value.alloweds)
            self.aliveds.value = odict(self.stack.value.aliveds)

            console.concise(
                " Manage {0}.\nAvailables: {1}\nChangeds:\nPlus: {2}\n"
                "Minus: {3}\nAlloweds: {4}\nAliveds{5}\n".format(
                    stack.name, self.availables.value, self.changeds.data.plus,
                    self.changeds.data.minus, self.alloweds.value,
                    self.aliveds.value))
示例#42
0
文件: stacking.py 项目: techhat/raet
    def __init__(self,
                 name='',
                 main=None,
                 keep=None,
                 dirpath=None,
                 local=None,
                 eid=None, #local estate eid
                 ha=("", raeting.RAET_PORT),
                 bufcnt=2,
                 safe=None,
                 auto=None,
                 period=None,
                 offset=None,
                 **kwa
                 ):
        '''
        Setup StackUdp instance
        '''
        self.eid = self.Eid # eid of next estate to add to road

        if not name:
            name = "roadstack{0}".format(RoadStack.Count)
            RoadStack.Count += 1

        if not keep:
            keep = keeping.RoadKeep(dirpath=dirpath, stackname=name)

        if not safe:
            safe = keeping.SafeKeep(dirpath=dirpath,
                                    stackname=name,
                                    auto=auto)
        self.safe = safe

        if not local:
            self.remotes = odict()
            local = estating.LocalEstate(stack=self,
                                         name=name,
                                         eid=eid,
                                         main=main,
                                         ha=ha)
        else:
            if main is not None:
                local.main = True if main else False

        self.period = period if period is not None else self.Period
        self.offset = offset if offset is not None else self.Offset

        super(RoadStack, self).__init__(name=name,
                                        keep=keep,
                                        dirpath=dirpath,
                                        local=local,
                                        bufcnt=bufcnt,
                                        **kwa)

        self.transactions = odict() #transactions
示例#43
0
    def __init__(self,
                 name='',
                 main=None,
                 version=raeting.VERSION,
                 store=None,
                 keep=None,
                 local=None,
                 bufcnt=2,
                 server=None,
                 rxMsgs=None,
                 txMsgs=None,
                 rxes=None,
                 txes=None,
                 stats=None,
                ):
        '''
        Setup Stack instance
        '''
        if not name:
            name = "{0}{1}".format(self.__class__.__name__.lower(), Stack.Count)
            Stack.Count += 1

        self.version = version
        self.store = store or storing.Store(stamp=0.0)
        self.local = local or lotting.LocalLot(stack=self,
                                               name=name,
                                               main=main,)
        self.local.stack = self
        if self.local.main is None and main is not None:
            self.local.main = True if main else False

        self.remotes = self.uidRemotes = odict() # remotes indexed by uid
        self.nameRemotes = odict() # remotes indexed by name
        self.haRemotes = odict() # remotes indexed by ha host address

        self.bufcnt = bufcnt
        if not server:
            server = self.serverFromLocal()

        self.server = server
        if self.server:
            if not self.server.reopen():  # open socket
                raise raeting.StackError("Stack '{0}': Failed opening server at"
                            " '{1}'\n".format(self.name, self.server.ha))
            if self.local:
                self.local.ha = self.server.ha  # update local host address after open

            console.verbose("Stack '{0}': Opened server at '{1}'\n".format(self.name, self.local.ha))

        self.rxMsgs = rxMsgs if rxMsgs is not None else deque() # messages received
        self.txMsgs = txMsgs if txMsgs is not None else deque() # messages to transmit
        self.rxes = rxes if rxes is not None else deque() # udp packets received
        self.txes = txes if txes is not None else deque() # udp packet to transmit
        self.stats = stats if stats is not None else odict() # udp statistics
        self.statTimer = aiding.StoreTimer(self.store)
示例#44
0
    def testBasicJson(self):
        '''
        Basic pack parse with header json and body json
        '''
        console.terse("{0}\n".format(self.testBasicJson.__doc__))

        hk = raeting.HeadKind.json.value
        bk = raeting.BodyKind.json.value

        data = odict(hk=hk, bk=bk)
        #body = odict(msg='Hello Raet World', extra='Goodby Big Moon')
        body = odict([('msg', 'Hello Raet World'), ('extra', 'Goodby Big Moon')])
        packet0 = packeting.TxPacket(embody=body, data=data, )
        self.assertDictEqual(packet0.body.data, body)
        packet0.pack()
        self.assertEqual(packet0.packed,
                b'{"ri":"RAET","pl":"0000076","hl":"42","fg":"00","hk":1,"bk":1}\r\n\r\n{"msg":"Hello Raet World","extra":"Goodby Big Moon"}')

        packet1 = packeting.RxPacket(packed=packet0.packed)
        packet1.parse()
        self.assertDictEqual(packet1.data, {'sh': '',
                                            'sp': 7530,
                                            'dh': '127.0.0.1',
                                            'dp': 7530,
                                            'ri':'RAET',
                                            'vn': 0,
                                            'pk': 0,
                                            'pl': 118,
                                            'hk': 1,
                                            'hl': 66,
                                            'se': 0,
                                            'de': 0,
                                            'cf': False,
                                            'bf': False,
                                            'nf': False,
                                            'df': False,
                                            'vf': False,
                                            'si': 0,
                                            'ti': 0,
                                            'tk': 0,
                                            'dt': 0,
                                            'oi': 0,
                                            'wf': False,
                                            'sn': 0,
                                            'sc': 1,
                                            'ml': 0,
                                            'sf': False,
                                            'af': False,
                                            'bk': 1,
                                            'ck': 0,
                                            'fk': 0,
                                            'fl': 0,
                                            'fg': '00'})
        self.assertDictEqual(packet1.body.data, body)
示例#45
0
    def testAutoAccept(self):
        '''
        Basic send auto accept message
        '''
        console.terse("{0}\n".format(self.testAutoAccept.__doc__))

        self.assertTrue(self.main.accept)

        # Don't add remote yard to main so only way to get message from other is
        # if auto acccept works
        self.other.addRemote(yarding.RemoteYard(stack=self.other, ha=self.main.local.ha))

        self.assertEqual(self.main.name, 'main')
        self.assertEqual(self.main.local.name, 'main')
        self.assertEqual(self.main.local.ha, os.path.join(self.baseDirpath, 'cherry.main.uxd'))
        self.assertEqual(len(self.main.remotes), 0)

        self.assertEqual(self.other.name, 'other')
        self.assertEqual(self.other.local.name, 'other')
        self.assertEqual(self.other.local.ha, os.path.join(self.baseDirpath, 'cherry.other.uxd'))
        self.assertEqual(len(self.other.remotes), 1)
        remote = self.other.remotes.values()[0]
        self.assertEqual(remote.ha, os.path.join(self.baseDirpath, 'cherry.main.uxd'))
        self.assertEqual(remote.name, 'main')
        self.assertTrue(remote.uid in self.other.remotes)
        self.assertTrue(remote.name in self.other.nameRemotes)
        self.assertTrue(remote.ha in self.other.haRemotes)
        self.assertIs(self.other.nameRemotes[remote.name], remote)
        self.assertIs(self.other.haRemotes[remote.ha], remote)

        stacking.LaneStack.Pk = raeting.packKinds.pack

        others = []
        others.append(odict(what="This is a message to the lord. Let me be", extra="Go away."))

        self.message(mains=[], others=others)

        self.assertEqual(len(self.main.remotes), 1)
        remote = self.main.remotes.values()[0]
        self.assertEqual(remote.ha, os.path.join(self.baseDirpath, 'cherry.other.uxd'))
        self.assertEqual(remote.name, 'other')
        self.assertTrue(remote.uid in self.main.remotes)
        self.assertTrue(remote.name in self.main.nameRemotes)
        self.assertTrue(remote.ha in self.main.haRemotes)
        self.assertIs(self.main.nameRemotes[remote.name], remote)
        self.assertIs(self.main.haRemotes[remote.ha], remote)

        self.main.rxMsgs = deque()
        self.other.rxMsgs = deque()

        mains = []
        mains.append(odict(what="This is a message to the serf. Get to Work", extra="Fix the fence."))

        self.message(mains=mains, others=[])
示例#46
0
    def testBasicRaetMsgpack(self):
        '''
        Basic pack parse with header json and body msgpack
        '''
        console.terse("{0}\n".format(self.testBasicRaetMsgpack.__doc__))

        hk = raeting.HeadKind.raet.value
        bk = raeting.BodyKind.msgpack.value

        data = odict(hk=hk, bk=bk)
        #body = odict(msg='Hello Raet World', extra='Goodby Big Moon')
        body = odict([('msg', 'Hello Raet World'), ('extra', 'Goodby Big Moon')])
        packet0 = packeting.TxPacket(embody=body, data=data, )
        self.assertDictEqual(packet0.body.data, body)
        packet0.pack()
        self.assertEqual(packet0.packed,
                b'ri RAET\npl 004e\nhl 22\nfg 00\nbk 3\n\n\x82\xa3msg\xb0Hello Raet World\xa5extra\xafGoodby Big Moon')

        packet1 = packeting.RxPacket(packed=packet0.packed)
        packet1.parse()
        self.assertDictEqual(packet1.data, {'sh': '',
                                            'sp': 7530,
                                            'dh': '127.0.0.1',
                                            'dp': 7530,
                                            'ri':'RAET',
                                            'vn': 0,
                                            'pk': 0,
                                            'pl': 78,
                                            'hk': 0,
                                            'hl': 34,
                                            'se': 0,
                                            'de': 0,
                                            'cf': False,
                                            'bf': False,
                                            'nf': False,
                                            'df': False,
                                            'vf': False,
                                            'si': 0,
                                            'ti': 0,
                                            'tk': 0,
                                            'dt': 0,
                                            'oi': 0,
                                            'wf': False,
                                            'sn': 0,
                                            'sc': 1,
                                            'ml': 0,
                                            'sf': False,
                                            'af': False,
                                            'bk': 3,
                                            'ck': 0,
                                            'fk': 0,
                                            'fl': 0,
                                            'fg': '00'})
        self.assertDictEqual(packet1.body.data, body)
示例#47
0
    def testBasicMsgpack(self):
        '''
        Basic pack parse with header json and body msgpack
        '''
        console.terse("{0}\n".format(self.testBasicMsgpack.__doc__))

        hk = raeting.headKinds.json
        bk = raeting.bodyKinds.msgpack

        data = odict(hk=hk, bk=bk)
        body = odict(msg='Hello Raet World', extra='Goodby Big Moon')
        packet0 = packeting.TxPacket(embody=body, data=data, )
        self.assertDictEqual(packet0.body.data, body)
        packet0.pack()
        self.assertEqual(packet0.packed,
                '{"ri":"RAET","pl":"0000064","hl":"38","hk":1,"bk":3}\r\n\r\n\x82\xa3msg\xb0Hello Raet World\xa5extra\xafGoodby Big Moon')

        packet1 = packeting.RxPacket(packed=packet0.packed)
        packet1.parse()
        self.assertDictEqual(packet1.data, {'sh': '',
                                            'sp': 7530,
                                            'dh': '127.0.0.1',
                                            'dp': 7530,
                                            'ri':'RAET',
                                            'vn': 0,
                                            'pk': 0,
                                            'pl': 100,
                                            'hk': 1,
                                            'hl': 56,
                                            'se': 0,
                                            'de': 0,
                                            'cf': False,
                                            'bf': False,
                                            'nf': False,
                                            'df': False,
                                            'vf': False,
                                            'si': 0,
                                            'ti': 0,
                                            'tk': 0,
                                            'dt': 0,
                                            'oi': 0,
                                            'wf': False,
                                            'sn': 0,
                                            'sc': 1,
                                            'ml': 0,
                                            'sf': False,
                                            'af': False,
                                            'bk': 3,
                                            'ck': 0,
                                            'fk': 0,
                                            'fl': 0,
                                            'fg': '00'})
        self.assertDictEqual(packet1.body.data, body)
示例#48
0
    def testBasicRaetJson(self):
        '''
        Basic pack parse with header raet and body json
        '''
        console.terse("{0}\n".format(self.testBasicRaetJson.__doc__))

        hk = raeting.headKinds.raet
        bk = raeting.bodyKinds.json

        data = odict(hk=hk, bk=bk)
        body = odict(msg='Hello Raet World', extra='Goodby Big Moon')
        packet0 = packeting.TxPacket(embody=body, data=data, )
        self.assertDictEqual(packet0.body.data, body)
        packet0.pack()
        self.assertEqual(packet0.packed,
                'ri RAET\npl 0050\nhl 1c\nbk 1\n\n{"msg":"Hello Raet World","extra":"Goodby Big Moon"}')

        packet1 = packeting.RxPacket(packed=packet0.packed)
        packet1.parse()
        self.assertDictEqual(packet1.data, {'sh': '',
                                            'sp': 7530,
                                            'dh': '127.0.0.1',
                                            'dp': 7530,
                                            'ri':'RAET',
                                            'vn': 0,
                                            'pk': 0,
                                            'pl': 80,
                                            'hk': 0,
                                            'hl': 28,
                                            'se': 0,
                                            'de': 0,
                                            'cf': False,
                                            'bf': False,
                                            'nf': False,
                                            'df': False,
                                            'vf': False,
                                            'si': 0,
                                            'ti': 0,
                                            'tk': 0,
                                            'dt': 0,
                                            'oi': 0,
                                            'wf': False,
                                            'sn': 0,
                                            'sc': 1,
                                            'ml': 0,
                                            'sf': False,
                                            'af': False,
                                            'bk': 1,
                                            'ck': 0,
                                            'fk': 0,
                                            'fl': 0,
                                            'fg': '00'})
        self.assertDictEqual(packet1.body.data, body)
    def testBasic(self):
        """
        Test Basic
        """
        console.terse("{0}\n".format(self.testBasic.__doc__))

        console.terse("{0}\n".format("Connecting ...\n"))
        hc = HTTPConnection('127.0.0.1', port=8080, timeout=1.0,)

        hc.connect()

        console.terse("{0}\n".format("Get '/echo?name=fame' ...\n"))
        headers = odict([('Accept', 'application/json')])
        hc.request(method='GET', path='/echo?name=fame', body=None, headers=headers )
        response = hc.getresponse()
        console.terse(str(response.fileno()) + "\n")  # must call this before read
        console.terse(str(response.getheaders()) + "\n")
        console.terse(str(response.msg)  + "\n")
        console.terse(str(response.version) + "\n")
        console.terse(str(response.status) + "\n")
        console.terse(response.reason + "\n")
        console.terse(str(response.read()) + "\n")

        console.terse("{0}\n".format("Post ...\n"))
        headers = odict([('Accept', 'application/json'), ('Content-Type', 'application/json')])
        body = odict([('name', 'Peter'), ('occupation', 'Engineer')])
        body = ns2b(json.dumps(body, separators=(',', ':'), encoding='utf-8'))
        hc.request(method='POST', path='/demo', body=body, headers=headers )
        response = hc.getresponse()
        console.terse(str(response.fileno()) + "\n") # must call this before read
        console.terse(str(response.getheaders()) + "\n")
        console.terse(str(response.msg)  + "\n")
        console.terse(str(response.version) + "\n")
        console.terse(str(response.status) + "\n")
        console.terse(response.reason+ "\n")
        console.terse(str(response.read()) + "\n")

        #console.terse("{0}\n".format("SSE stream ...\n"))
        #body = b''
        #headers = odict([('Accept', 'application/json'), ('Content-Type', 'application/json')])
        #hc.request(method='GET', path='/stream', body=body, headers=headers )
        #response = hc.getresponse()
        #console.terse(str(response.fileno()) + "\n") # must call this before read
        #console.terse(str(response.getheaders()) + "\n")
        #console.terse(str(response.msg)  + "\n")
        #console.terse(str(response.version) + "\n")
        #console.terse(str(response.status) + "\n")
        #console.terse(response.reason+ "\n")
        #console.terse(str(response.read()) + "\n")

        hc.close()
示例#50
0
    def testMessageMsgpack(self):
        '''
        Basic messaging with msgpack packing
        '''
        console.terse("{0}\n".format(self.testMessageMsgpack.__doc__))
        self.bootstrap(kind=raeting.packKinds.pack)

        mains = []
        mains.append(odict(what="This is a message to the serf. Get to Work", extra="Fix the fence."))

        others = []
        others.append(odict(what="This is a message to the lord. Let me be", extra="Go away."))

        self.message(mains=mains, others=others)
示例#51
0
def test(hk=raeting.headKinds.raet):
    """
    Test packeting.
    """
    data = odict(hk=hk, bk=raeting.bodyKinds.json)
    body = odict(msg="Hello Raet World", extra="what is this")
    packet0 = packeting.TxPacket(embody=body, data=data)
    print packet0.body.data
    packet0.pack()
    print packet0.packed
    packet1 = packeting.RxPacket(packed=packet0.packed)
    packet1.parse()
    print packet1.data
    print packet1.body.data
示例#52
0
    def __init__(self,
                 name='',
                 main=False,
                 keep=None,
                 dirpath='',
                 local=None,
                 lanename='lane',
                 yid=None,
                 yardname='',
                 sockdirpath='',
                 ha='',
                 bufcnt=10,
                 accept=None,
                 **kwa
                 ):
        '''
        Setup StackUxd instance
        '''
        if not name:
            name = "lanestack{0}".format(LaneStack.Count)
            LaneStack.Count += 1

        if not keep:
            keep = keeping.LaneKeep(dirpath=dirpath, stackname=name)

        if not local:
            self.remotes = odict()
            local = yarding.LocalYard(  stack=self,
                                        yid=yid,
                                        name=yardname,
                                        main=main,
                                        ha=ha,
                                        dirpath=sockdirpath,
                                        lanename=lanename)


        server = aiding.SocketUxdNb(ha=local.ha,
                            bufsize=raeting.UXD_MAX_PACKET_SIZE * bufcnt)

        super(LaneStack, self).__init__(name=name,
                                        keep=keep,
                                        dirpath=dirpath,
                                        local=local,
                                        server=server,
                                        **kwa)

        self.books = odict()
        self.accept = self.Accept if accept is None else accept #accept uxd msg if not in lane
示例#53
0
    def dumpRemote(self, remote):
        '''
        Dump remote estate
        '''
        data = odict([
                        ('name', remote.name),
                        ('uid', remote.uid),
                        ('fuid', remote.fuid),
                        ('ha', remote.ha),
                        ('iha', remote.iha),
                        ('natted', remote.natted),
                        ('fqdn', remote.fqdn),
                        ('dyned', remote.dyned),
                        ('sid', remote.sid),
                        ('main', remote.main),
                        ('kind', remote.kind),
                        ('joined', remote.joined),
                        ('role', remote.role),
                    ])
        if self.verifyRemoteData(data, remoteFields=self.RemoteDumpFields):
            self.dumpRemoteData(data, remote.name)

        if remote.pubber.keyhex  and remote.verfer.keyhex:
            # kludge to persist the keys since no way to write
            self.saltRaetKey.status(remote.role,
                                remote.pubber.keyhex,
                                remote.verfer.keyhex)
示例#54
0
文件: stacking.py 项目: pengyao/raet
 def stale(self, packet):
     '''
     Initiate stale transaction in order to nack a stale correspondent packet
     but only for preexisting remotes
     '''
     if packet.data['pk'] in [PcktKind.nack,
                             PcktKind.unjoined,
                             PcktKind.unallowed,
                             PcktKind.renew,
                             PcktKind.refuse,
                             PcktKind.reject,]:
         return # ignore stale nacks
     create = False
     uid = packet.data['de']
     remote = self.retrieveRemote(uid=uid)
     if not remote:
         emsg = "Stack '{0}'. Unknown remote id '{1}', fail to nack stale\n".format(
                   self.name, uid)
         console.terse(emsg)
         self.incStat('invalid_remote_eid')
         return
     data = odict(hk=self.Hk, bk=self.Bk)
     staler = transacting.Staler(stack=self,
                                 remote=remote,
                                 kind=packet.data['tk'],
                                 sid=packet.data['si'],
                                 tid=packet.data['ti'],
                                 txData=data,
                                 rxPacket=packet)
     staler.nack()
示例#55
0
 def dumpRemotes(self):
     '''
     Dump all remotes data to files
     '''
     datadict = odict()
     for remote in self.remotes.values():
         self.dumpRemote(remote)
示例#56
0
文件: stacking.py 项目: Niev/raet
    def message(self, body, uid=None):
        '''
        Sends message body to yard name and manages paging of long messages
        '''
        if uid is None:
            if not self.remotes:
                emsg = "No yard to send to\n"
                console.terse(emsg)
                self.incStat("invalid_destination")
                return
            uid = self.remotes.values()[0].name
        if uid not in self.remotes:
            emsg = "Invalid destination yard '{0}'\n".format(uid)
            console.terse(emsg)
            self.incStat("invalid_destination")
            return
        remote = self.remotes[uid]
        data = odict(pk=self.Pk,
                     sn=self.local.name,
                     dn=remote.name,
                     si=remote.sid,
                     bi=remote.nextBid())
        book = paging.TxBook(data=data, body=body)
        try:
            book.pack()
        except raeting.PageError as ex:
            console.terse(str(ex) + '\n')
            self.incStat("packing_error")
            return

        for page in book.pages:
            self.txes.append((page.packed, remote.ha))
示例#57
0
文件: stacking.py 项目: Niev/raet
    def __init__(self,
                 local=None, #passed up from subclass
                 name='',
                 puid=None,
                 uid=None,
                 lanename='lane',
                 sockdirpath='',
                 ha='',
                 bufcnt=10,
                 accept=None,
                 **kwa
                 ):
        '''
        Setup LaneStack instance
        '''
        if getattr(self, 'puid', None) is None:
            self.puid = puid if puid is not None else self.Uid

        local = local or yarding.Yard(stack=self,
                                            name=name,
                                            uid=uid,
                                            ha=ha,
                                            dirpath=sockdirpath,
                                            lanename=lanename)

        super(LaneStack, self).__init__(puid=puid,
                                        local=local,
                                        bufcnt=bufcnt,
                                        **kwa)

        self.haRemotes = odict() # remotes indexed by ha host address
        self.accept = self.Accept if accept is None else accept #accept uxd msg if not in lane
示例#58
0
文件: packeting.py 项目: techhat/raet
    def parse(self):
        '''
        Parses body. Assumes already unpacked.
        Results in updated .data
        '''
        bk = self.packet.data['bk']

        if bk not in raeting.BODY_KIND_NAMES:
            self.packet.data['bk']= raeting.bodyKinds.unknown
            emsg = "Unrecognizable packet body."
            raise raeting.PacketError(emsg)

        self.data = odict()

        if bk == raeting.bodyKinds.json:
            if self.packed:
                kit = json.loads(self.packed, object_pairs_hook=odict)
                if not isinstance(kit, Mapping):
                    emsg = "Packet body not a mapping."
                    raise raeting.PacketError(emsg)
                self.data = kit
        elif bk == raeting.bodyKinds.msgpack:
            if self.packed:
                if not msgpack:
                    emsg = "Msgpack not installed."
                    raise raeting.PacketError(emsg)
                kit = msgpack.loads(self.packed, object_pairs_hook=odict)
                if not isinstance(kit, Mapping):
                    emsg = "Packet body not a mapping."
                    raise raeting.PacketError(emsg)
                self.data = kit
        elif bk == raeting.bodyKinds.raw:
            self.data = self.packed # return as string
        elif bk == raeting.bodyKinds.nada:
            pass
示例#59
0
    def stale(self, packet):
        '''
        Initiate stale transaction in order to nack a stale correspondent packet
        '''
        if packet.data['pk'] in [raeting.pcktKinds.nack,
                                         raeting.pcktKinds.unjoined,
                                         raeting.pcktKinds.unallowed,
                                         raeting.pcktKinds.renew,
                                         raeting.pcktKinds.refuse,
                                         raeting.pcktKinds.reject,]:
            return # ignore stale nacks

        duid = packet.data['se']
        ha = (packet.data['sh'], packet.data['sp'])
        remote = self.retrieveRemote(duid=duid, ha=ha)
        if not remote:
            emsg = "Invalid remote destination estate id '{0}'\n".format(duid)
            console.terse(emsg)
            self.incStat('invalid_remote_eid')
            return
        data = odict(hk=self.Hk, bk=self.Bk)
        staler = transacting.Staler(stack=self,
                                    remote=remote,
                                    kind=packet.data['tk'],
                                    sid=packet.data['si'],
                                    tid=packet.data['ti'],
                                    txData=data,
                                    rxPacket=packet)
        staler.nack()