Beispiel #1
0
def main(port, version, verbose, path):
    if version:
        click.echo(__version__)
        return

    projectDirpath = os.path.dirname(
        os.path.dirname(os.path.abspath(os.path.expanduser(__file__))))
    floScriptpath = os.path.join(projectDirpath, "didery/flo/main.flo")

    click.echo("MAIN")
    """ Main entry point for ioserve CLI"""

    verbose = VERBIAGE_NAMES.index(verbose)

    ioflo.app.run.run(name="skedder",
                      period=0.125,
                      real=True,
                      retro=True,
                      filepath=floScriptpath,
                      behaviors=['didery.core'],
                      mode='',
                      username='',
                      password='',
                      verbose=verbose,
                      consolepath='',
                      statistics=False,
                      preloads=[('.main.server.port', odict(value=port)),
                                ('.main.server.db', odict(value=path))])
Beispiel #2
0
def eventsSetup(config, did):
    if did is None:
        raise ValueError("did required. Use --did")

    h.validateDid(did)

    preloads = [('.main.events.servers', odict(value=config["servers"])),
                ('.main.events.did', odict(value=did))]

    return preloads
Beispiel #3
0
    def testShare(self):
        """
        Test Share Class
        """
        console.terse("{0}\n".format(self.testShare.__doc__))

        share = storing.Share()
        self.assertEqual(share.name, '')
        self.assertEqual(share.store, None)
        self.assertEqual(share.stamp, None)
        self.assertIsInstance(share.data, storing.Data)
        self.assertEqual(share.data.__dict__, odict())
        self.assertEqual(share.value, None)
        self.assertEqual(share.truth, None)
        self.assertEqual(share.unit, None)
        self.assertEqual(share.owner, None)
        self.assertEqual(share.deck, storing.Deck([]))
        self.assertEqual(share.marks, odict([]))

        share = storing.Share()
        share.data.error = None
        self.assertEqual(share.data.error, None)
        self.assertEqual(share['error'], None)

        haul = odict([('error', None),
                      ('panSpeed', 50),
                      ('tiltSpeed', 75)])

        share.update(haul)
        self.assertEqual(share.data.panSpeed, haul['panSpeed'])
        self.assertEqual(share.data.tiltSpeed, haul['tiltSpeed'])
        # order preserving
        self.assertEqual(share.keys(), ["error", "panSpeed", "tiltSpeed"])
        self.assertEqual(share.values(), [None, 50, 75])
        self.assertEqual(share.items(), [("error", None),
                                                 ("panSpeed", 50),
                                                 ("tiltSpeed", 75)])

        stuff = share.sift(haul.keys())
        self.assertEqual(haul, stuff)

        show = share.data._show()
        self.assertEqual(show, 'Data: error=None panSpeed=50 tiltSpeed=75\n')

        haul = odict([('panSpeed', 0),
                      ('tiltSpeed', 0)])

        share = storing.Share().update([('error', None)], haul)
        self.assertEqual(share.data.error, None)
        show = share.data._show()
        self.assertEqual(show, 'Data: error=None panSpeed=0 tiltSpeed=0\n')

        show = share.show()  # need to make this more useful
        self.assertEqual(show, 'Name  Value None\nerror = None panSpeed = 0 tiltSpeed = 0\n')
Beispiel #4
0
    def testShare(self):
        """
        Test Share Class
        """
        console.terse("{0}\n".format(self.testShare.__doc__))

        share = storing.Share()
        self.assertEqual(share.name, '')
        self.assertEqual(share.store, None)
        self.assertEqual(share.stamp, None)
        self.assertIsInstance(share.data, storing.Data)
        self.assertEqual(share.data.__dict__, odict())
        self.assertEqual(share.value, None)
        self.assertEqual(share.truth, None)
        self.assertEqual(share.unit, None)
        self.assertEqual(share.owner, None)
        self.assertEqual(share.deck, storing.Deck([]))
        self.assertEqual(share.marks, odict([]))

        share = storing.Share()
        share.data.error = None
        self.assertEqual(share.data.error, None)
        self.assertEqual(share['error'], None)

        haul = odict([('error', None),
                      ('panSpeed', 50),
                      ('tiltSpeed', 75)])

        share.update(haul)
        self.assertEqual(share.data.panSpeed, haul['panSpeed'])
        self.assertEqual(share.data.tiltSpeed, haul['tiltSpeed'])
        # order preserving
        self.assertEqual(share.keys(), ["error", "panSpeed", "tiltSpeed"])
        self.assertEqual(share.values(), [None, 50, 75])
        self.assertEqual(share.items(), [("error", None),
                                                 ("panSpeed", 50),
                                                 ("tiltSpeed", 75)])

        stuff = share.sift(haul.keys())
        self.assertEqual(haul, stuff)

        show = share.data._show()
        self.assertEqual(show, 'Data: error=None panSpeed=50 tiltSpeed=75\n')

        haul = odict([('panSpeed', 0),
                      ('tiltSpeed', 0)])

        share = storing.Share().update([('error', None)], haul)
        self.assertEqual(share.data.error, None)
        show = share.data._show()
        self.assertEqual(show, 'Data: error=None panSpeed=0 tiltSpeed=0\n')

        show = share.show()  # need to make this more useful
        self.assertEqual(show, 'Name  Value None\nerror = None panSpeed = 0 tiltSpeed = 0\n')
Beispiel #5
0
def uploadSetup(config, data, key_paths):
    if data is None:
        raise ValueError("Data file required. Use --data=path/to/file")

    data = h.parseDataFile(data, "otp")

    keys = getSigningKeys(key_paths)
    sk = keys[0]

    preloads = [('.main.upload.servers', odict(value=config["servers"])),
                ('.main.upload.data', odict(value=data)),
                ('.main.upload.sk', odict(value=sk))]

    return preloads
Beispiel #6
0
def removeSetup(config, did, key_paths):
    if did is None:
        raise ValueError("did required. Use --did")

    h.validateDid(did)

    keys = getSigningKeys(key_paths)
    sk = keys[0]

    preloads = [('.main.remove.servers', odict(value=config["servers"])),
                ('.main.remove.did', odict(value=did)),
                ('.main.remove.sk', odict(value=sk))]

    return preloads
Beispiel #7
0
        def echoGet(action=None):
            """
            Echo back request data
            """
            query = dict(bottle.request.query.items())
            body = bottle.request.json
            raw = bottle.request.body.read()
            form = odict(bottle.request.forms)

            data = odict(verb=bottle.request.method,
                        url=bottle.request.url,
                        action=action,
                        query=query,
                        form=form,
                        content=body)
            return data
Beispiel #8
0
def threadAlpha(stack,  delay=0.125):
    """
    return generator function threader in closure to run stack
    """
    addJoinRemote(stack, "beta", 7532)
    addJoinRemote(stack, "gamma", 7533)

    timer = ioflo.aid.timing.StoreTimer(store=stack.store, duration=1.5)
    while not timer.expired:
        stack.serviceAll()
        yield
        stack.store.advanceStamp(delay)

    msg = odict([("subject", "Introduction"),
                 ("content", "Hello from alpha")])
    messageAll(stack, msg)

    timer.extend(extension=1.5)
    while not timer.expired:
        stack.serviceAll()
        yield
        stack.store.advanceStamp(delay)

    printAll(stack)
    closeStack(stack)

    return
Beispiel #9
0
 def bar(skin, req=None, rep=None):
     """
     Generator function with "skin" parameter for skin wrapper to
     attach attributes
     """
     skin._status = 400
     skin._headers = odict(example="Hi")
     yield b""
     yield b""
     yield b"Hello There"
     return b"Goodbye"
Beispiel #10
0
def inceptSetup(config, data, path, key_paths):

    if data is None:
        if key_paths:
            click.echo(
                "\nWARN: Key file will not be used unless a data file is provided with --data.\n"
            )
        history, sk = historyInit(path)
        data = history
    else:
        data = h.parseDataFile(data, "history")

        keys = getSigningKeys(key_paths)
        sk = keys[0]

    preloads = [('.main.incept.servers', odict(value=config["servers"])),
                ('.main.incept.data', odict(value=data)),
                ('.main.incept.sk', odict(value=sk))]

    return preloads
Beispiel #11
0
def rotateSetup(config, data, path, key_paths):
    if data is None:
        raise ValueError("Data file required. Use --data=path/to/file")

    data = h.parseDataFile(data, "history")

    keys = getSigningKeys(key_paths, 2)

    if click.confirm("Generate a new pre-rotated key pair?"):
        pvk, psk = keyery(path)
        data["signers"].append(pvk)
        data["signer"] = int(data["signer"]) + 1

    preloads = [('.main.rotate.servers', odict(value=config["servers"])),
                ('.main.rotate.data', odict(value=data)),
                ('.main.rotate.did', odict(value=data["id"])),
                ('.main.rotate.sk', odict(value=keys[0])),
                ('.main.rotate.psk', odict(value=keys[1]))]

    return preloads
Beispiel #12
0
 def bar(skin, req=None, rep=None):
     """
     Generator function with "skin" parameter for skin wrapper to
     attach attributes
     """
     skin._status = 400
     skin._headers = odict(example="Hi")
     yield b""
     yield b""
     yield b"Hello There"
     return b"Goodbye"
Beispiel #13
0
def main():
    args = parseArgs(version=__version__)

    projectDirpath = os.path.dirname(
        os.path.dirname(os.path.abspath(os.path.expanduser(__file__))))
    floScriptpath = os.path.join(projectDirpath, "didery/flo/main.flo")

    ioflo.app.run.run(name="skedder",
                      period=100,
                      real=True,
                      retro=True,
                      filepath=floScriptpath,
                      behaviors=['didery.core'],
                      mode='',
                      username='',
                      password='',
                      verbose=args.verbose,
                      consolepath='',
                      statistics=False,
                      preloads=[('.main.server.port', odict(value=args.port)),
                                ('.main.server.db', odict(value=args.path))])
Beispiel #14
0
def roadStackMessageAll(self, **kwa):
    """
    Send message to all remotes

    Ioinit attributes:
        stack is a RoadStack instance
        message is message to send with fields subject and content

    Context: enter

    Example:
        do road stack message all at enter
    """
    if self.stack.value:
        stack = self.stack.value
        msg = odict([("subject", self.message.data.subject),
                     ("content", self.message.data.content)])
        for remote in stack.remotes.values():
            stack.transmit(msg, remote.uid)
Beispiel #15
0
async def threadGamma(stack,  delay=0.125):
    """
    return generator function threader in closure to run stack
    """
    timer = ioflo.aid.timing.StoreTimer(store=stack.store, duration=1.5)
    while not timer.expired:
        stack.serviceAll()
        await yielder()
        stack.store.advanceStamp(delay)

    msg = odict([("subject", "Introduction"),
                 ("content", "Hello from gamma")])
    messageAll(stack, msg)

    timer.extend(extension=1.5)
    while not timer.expired:
        stack.serviceAll()
        await yielder()
        stack.store.advanceStamp(delay)

    printAll(stack)
    closeStack(stack)

    return
Beispiel #16
0
def test_get_backend():
    """
    """
    print("Testing Falcon Example Backend Call")

    store = Store(stamp=0.0)  # create store
    priming.setupTest()

    valet = Valet(
        port=8101,
        bufsize=131072,
        store=store,
        app=exapp,
    )

    result = valet.open()
    assert result
    assert valet.servant.ha == ('0.0.0.0', 8101)
    assert valet.servant.eha == ('127.0.0.1', 8101)

    path = "http://{}:{}{}".format('localhost', valet.servant.eha[1],
                                   "/example/backend")
    headers = odict([('Accept', 'application/json'), ('Content-Length', 0)])
    patron = Patron(
        bufsize=131072,
        store=store,
        method='GET',
        path=path,
        headers=headers,
        reconnectable=True,
    )

    assert patron.connector.reopen()
    assert patron.connector.accepted == False
    assert patron.connector.connected == False
    assert patron.connector.cutoff == False

    patron.transmit()
    timer = StoreTimer(store, duration=1.0)
    while (patron.requests or patron.connector.txes or not patron.responses
           or not valet.idle()):
        valet.serviceAll()
        time.sleep(0.05)
        patron.serviceAll()
        time.sleep(0.05)
        store.advanceStamp(0.1)

    assert patron.connector.accepted == True
    assert patron.connector.connected == True
    assert patron.connector.cutoff == False

    assert len(valet.servant.ixes) == 1
    assert len(valet.reqs) == 1
    assert len(valet.reps) == 1
    requestant = valet.reqs.values()[0]
    assert requestant.method == patron.requester.method
    assert requestant.url == patron.requester.path
    assert requestant.headers == {
        'accept': 'application/json',
        'accept-encoding': 'identity',
        'content-length': '0',
        'host': 'localhost:8101'
    }

    assert len(patron.responses) == 1
    rep = patron.responses.popleft()
    assert rep['status'] == 200
    assert rep['reason'] == 'OK'
    assert rep['body'] == bytearray(
        b'{\n  "approved": true,\n  "body": "\\nHello World\\n\\n"\n}')
    assert rep['data'] == odict([('approved', True),
                                 ('body', '\nHello World\n\n')])

    responder = valet.reps.values()[0]
    assert responder.status.startswith(str(rep['status']))
    assert responder.headers == rep['headers']

    # test for error by sending query arg path
    #request = odict([('method', 'GET'),
    #('path', '/example/backend'),
    #('qargs', odict(path='/unknown')),
    #('fragment', u''),
    #('headers', odict([('Accept', 'application/json'),
    #('Content-Length', 0)])),
    #])

    #patron.requests.append(request)

    headers = odict([('Accept', 'application/json'), ('Content-Length', 0)])
    patron.request(method='GET',
                   path='/example/backend',
                   qargs=odict(path='/unknown'),
                   headers=headers)
    timer = StoreTimer(store, duration=1.0)
    while (patron.requests or patron.connector.txes or not patron.responses
           or not valet.idle()):
        valet.serviceAll()
        time.sleep(0.05)
        patron.serviceAll()
        time.sleep(0.05)
        store.advanceStamp(0.1)

    assert len(patron.responses) == 1
    rep = patron.responses.popleft()
    assert rep['status'] == 404
    assert rep['reason'] == 'Not Found'
    assert rep['body'] == bytearray(b'404 Not Found\nBackend Validation'
                                    b' Error\nError backend validation.'
                                    b' unknown\n')
    assert not rep['data']

    valet.close()
    patron.close()
    print("Done Test")
Beispiel #17
0
    def testData(self):
        """
        Test Data Class
        """
        console.terse("{0}\n".format(self.testData.__doc__))

        data = storing.Data()
        show = data._show()
        self.assertEqual(show, 'Data: \n')
        self.assertEqual(repr(data), 'Data([])')
        data.x = 1
        data.y = 2
        data.a = 3
        # order preserving
        self.assertEqual(data.__dict__.keys(), ["x", "y", "a"])
        self.assertEqual(data.__dict__.values(), [1, 2, 3])
        self.assertEqual(data.__dict__.items(), [("x", 1),
                                                 ("y", 2),
                                                 ("a", 3)])
        show = data._show()
        self.assertEqual(show, 'Data: x=1 y=2 a=3\n')
        self.assertEqual(repr(data), "Data([('x', 1), ('y', 2), ('a', 3)])")
        stuff = data._sift()
        self.assertEqual(stuff, odict([("x", 1),
                                        ("y", 2),
                                        ("a", 3)]))
        self.assertEqual(stuff.keys(), data.__dict__.keys())

        stuff = data._sift(("y", "x"))
        self.assertEqual(stuff,odict([("y", 2),
                                        ("x", 1)]) )
        self.assertEqual(stuff.keys(), ["y", "x"])

        stuff = data._sift([])
        self.assertEqual(stuff,odict() )
        self.assertEqual(stuff.keys(), [])

        with self.assertRaises(AttributeError) as ex:
            data._b = 4
        self.assertEqual(repr(data), "Data([('x', 1), ('y', 2), ('a', 3)])")
        data._change([("z", 4), ("b", 5)])
        self.assertEqual(data.__dict__.keys(), ["x", "y", "a", "z", "b"])
        self.assertEqual(data.__dict__.values(), [1, 2, 3, 4, 5])
        self.assertEqual(data.__dict__.items(), [("x", 1),
                                                 ("y", 2),
                                                 ("a", 3),
                                                 ("z", 4),
                                                 ("b", 5)])

        items = [("x", 1),
                        ("y", 2),
                        ("a", 3),
                        ("z", 4),
                        ("b", 5)]
        stuff = odict(items)

        data = storing.Data(stuff)
        self.assertEqual(repr(data),
                         "Data([('x', 1), ('y', 2), ('a', 3), ('z', 4), ('b', 5)])")

        data = storing.Data(items)
        self.assertEqual(repr(data),
                         "Data([('x', 1), ('y', 2), ('a', 3), ('z', 4), ('b', 5)])")

        data = storing.Data(error=None)
        self.assertEqual(data.error, None)

        haul = odict([('error', None),
                      ('panSpeed', 50),
                      ('tiltSpeed', 75)])

        data._change(haul)
        self.assertEqual(data.panSpeed, haul['panSpeed'])
        self.assertEqual(data.tiltSpeed, haul['tiltSpeed'])
        # order preserving
        self.assertEqual(data.__dict__.keys(), ["error", "panSpeed", "tiltSpeed"])
        self.assertEqual(data.__dict__.values(), [None, 50, 75])
        self.assertEqual(data.__dict__.items(), [("error", None),
                                                 ("panSpeed", 50),
                                                 ("tiltSpeed", 75)])

        stuff = data._sift(haul.keys())
        self.assertEqual(haul, stuff)

        show = data._show()
        self.assertEqual(show, 'Data: error=None panSpeed=50 tiltSpeed=75\n')

        haul = odict([('panSpeed', 0),
                      ('tiltSpeed', 0)])

        data = storing.Data([('error', None)], haul)
        self.assertEqual(data.error, None)
        show = data._show()
        self.assertEqual(show, 'Data: error=None panSpeed=0 tiltSpeed=0\n')
Beispiel #18
0
console = getConsole()

"""
Usage pattern

frame server
  do ioserve server open at enter
  do ioserve server service
  do ioserve server close at exit


"""

@doify('IoserveServerOpen', ioinits=odict(valet="",
                                          port=odict(inode="", ival=8080),
                                          test=""))
def ioserveServerOpen(self, buffer=False, **kwa):
    """
    Setup and open a rest server

    Ioinit attributes
        valet is Valet instance (wsgi server)
        mock is Flag if True load mock service endpoints
        test if Flag if True load test endpoints

    Parameters:
        buffer is boolean If True then create wire log buffer for Valet

    Context: enter
Beispiel #19
0
console = getConsole()
"""
Usage pattern

frame server
    do didery server open at enter
    do didery server service
    do didery server close at exit
"""


@doify('DideryServerOpen',
       ioinits=odict(
           valet="",
           test="",
           port=odict(ival=8080),
           db=odict(ival=""),
           mode=odict(ival=""),
       ))
def dideryServerOpen(self):
    """
    Setup and open a rest server

    Ioinit attributes
        valet is Valet instance (wsgi server)
        port is server port

    Context: enter

    Example:
        do didery server open at enter
Beispiel #20
0
        console.terse("Data:\t{}\n".format(formatted_data))

        for url, result in results.items():
            console.verbose("{}\n".format(result))
    else:
        console.terse("Consensus Failed.\n\n")

        for url, result in results.items():
            console.concise("{}\n".format(result))


@doify('Incept',
       ioinits=odict(servers="",
                     data="",
                     sk="",
                     test="",
                     complete=odict(value=False),
                     verbosity="",
                     start=""))
def incept(self):
    if not self.start.value:
        self.complete.value = True
        return

    console = getConsole("didery.py", verbosity=self.verbosity.value)

    outputSetupInfo(console, self.servers.value, data=self.data.value)

    result = hist.postHistory(self.data.value, self.sk.value,
                              self.servers.value)
Beispiel #21
0
except ImportError:
    import json

# ================================================== #
#                 CONSTANTS & GLOBALS                #
# ================================================== #

console = getConsole()

# ================================================== #
#                     FUNCTIONS                      #
# ================================================== #

@doify('ReputationServerOpen', ioinits=odict(valet="",
                                             port=odict(ival=8080),
                                             dbDirPath="",
                                             test="",
                                             preload=""))
def reputationServerOpen(self, buffer=False, **kwa):
    """
    Sets up and opens a rest server.

        Ioinit Attributes:
        valet - Valet instance (wsgi server)
        port - Server port number
        dbDirPath - Directory path for the database
        test - Flag; If True, uses a test configuration if any is
        available
        preload - Flag; If True (and test is True), preloads the
        database for testing
Beispiel #22
0
def main(incept, upload, rotate, update, retrieve, download, delete, remove,
         events, v, mute, data, did, save, keys, config):
    if mute:
        verbose = 0
    else:
        v = 1 if v == 0 else v

        verbose = v if v <= 4 else 4

    preloads = [
        ('.main.incept.verbosity', odict(value=verbose)),
        ('.main.upload.verbosity', odict(value=verbose)),
        ('.main.rotate.verbosity', odict(value=verbose)),
        ('.main.update.verbosity', odict(value=verbose)),
        ('.main.retrieve.verbosity', odict(value=verbose)),
        ('.main.download.verbosity', odict(value=verbose)),
        ('.main.delete.verbosity', odict(value=verbose)),
        ('.main.remove.verbosity', odict(value=verbose)),
        ('.main.events.verbosity', odict(value=verbose)),
        ('.main.incept.start', odict(value=True if incept else False)),
        ('.main.upload.start', odict(value=True if upload else False)),
        ('.main.rotate.start', odict(value=True if rotate else False)),
        ('.main.update.start', odict(value=True if update else False)),
        ('.main.retrieve.start', odict(value=True if retrieve else False)),
        ('.main.download.start', odict(value=True if download else False)),
        ('.main.delete.start', odict(value=True if delete else False)),
        ('.main.remove.start', odict(value=True if remove else False)),
        ('.main.events.start', odict(value=True if events else False))
    ]

    options = [
        incept, upload, rotate, update, retrieve, download, delete, remove,
        events
    ]
    count = options.count(True)
    if count > 1:
        click.echo(
            "Cannot combine --incept --upload, --rotate, --update, --retrieve, --download, --delete, --remove, or --events."
        )
        return
    if count == 0:
        click.echo("No options given. For help use --help. Exiting Didery.py")
        return

    try:
        configData = h.parseConfigFile(config)
    except ValidationError as err:
        click.echo("Error parsing the config file: {}.".format(err))
        return

    try:
        if incept:
            preloads.extend(inceptSetup(configData, data, save, keys))

        if upload:
            preloads.extend(uploadSetup(configData, data, keys))

        if rotate:
            preloads.extend(rotateSetup(configData, data, save, keys))

        if update:
            preloads.extend(updateSetup(configData, data, keys))

        if retrieve:
            preloads.extend(retrieveSetup(configData, did))

        if download:
            preloads.extend(downloadSetup(configData, did))

        if delete:
            preloads.extend(deleteSetup(configData, did, keys))

        if remove:
            preloads.extend(removeSetup(configData, did, keys))

        if events:
            preloads.extend(eventsSetup(configData, did))

    except (ValidationError, ValueError) as ex:
        click.echo("Error setting up didery.py: {}.".format(ex))
        return

    projectDirpath = os.path.dirname(
        os.path.dirname(os.path.abspath(os.path.expanduser(__file__))))
    floScriptpath = os.path.join(projectDirpath, "diderypy/flo/main.flo")
    """ Main entry point for ioserve CLI"""
    ioflo.app.run.run(name="didery.py",
                      period=0.125,
                      real=True,
                      retro=True,
                      filepath=floScriptpath,
                      behaviors=['diderypy.core'],
                      mode='',
                      username='',
                      password='',
                      verbose=0,
                      consolepath='',
                      statistics=False,
                      preloads=preloads)
Beispiel #23
0
"""
Usage pattern

frame stacker
  do road stack open at enter
  do road stack service
  do road stack close at exit


"""


@doify('RoadStackOpen',
       ioinits=odict(stack="",
                     conf=odict(inode="",
                                ival=odict([("name", "server"),
                                            ("host", "0.0.0.0"),
                                            ("port", 7531)]))))
def roadStackOpen(self, **kwa):
    """
    Setup and open a road stack

    Ioinit attributes
        stack holds RoadStack instance created here
        conf is configuration data of stack with fields name, host, port

    Context: enter

    Example:
        do road stack open at enter
    """
Beispiel #24
0
    def testBasic(self):
        """
        Test Valet Patron and Bottle
        """
        console.terse("{0}\n".format(self.testBasic.__doc__))

        store = Store(stamp=0.0)

        app = bottle.default_app() # create bottle app

        @app.get('/echo')
        @app.get('/echo/<action>')
        @app.post('/echo')
        @app.post('/echo/<action>')
        def echoGet(action=None):
            """
            Echo back request data
            """
            query = dict(bottle.request.query.items())
            body = bottle.request.json
            raw = bottle.request.body.read()
            form = odict(bottle.request.forms)

            data = odict(verb=bottle.request.method,
                        url=bottle.request.url,
                        action=action,
                        query=query,
                        form=form,
                        content=body)
            return data


        console.terse("{0}\n".format("Building Valet ...\n"))
        wireLogAlpha = WireLog(buffify=True, same=True)
        result = wireLogAlpha.reopen()

        alpha = Valet(port = 6101,
                              bufsize=131072,
                              wlog=wireLogAlpha,
                              store=store,
                              app=app)
        self.assertIs(alpha.servant.reopen(), True)
        self.assertEqual(alpha.servant.ha, ('0.0.0.0', 6101))
        self.assertEqual(alpha.servant.eha, ('127.0.0.1', 6101))

        console.terse("{0}\n".format("Building Patron ...\n"))
        wireLogBeta = WireLog(buffify=True,  same=True)
        result = wireLogBeta.reopen()

        path = "http://{0}:{1}/".format('localhost', alpha.servant.eha[1])

        beta = Patron(bufsize=131072,
                      wlog=wireLogBeta,
                      store=store,
                      path=path,
                      reconnectable=True)

        self.assertIs(beta.connector.reopen(), True)
        self.assertIs(beta.connector.accepted, False)
        self.assertIs(beta.connector.connected, False)
        self.assertIs(beta.connector.cutoff, False)

        request = odict([('method', u'GET'),
                         ('path', u'/echo?name=fame'),
                         ('qargs', odict()),
                         ('fragment', u''),
                         ('headers', odict([('Accept', 'application/json'),
                                            ('Content-Length', 0)])),
                        ])

        beta.requests.append(request)
        timer = StoreTimer(store, duration=1.0)
        while (beta.requests or beta.connector.txes or not beta.responses or
               not alpha.idle()):
            alpha.serviceAll()
            time.sleep(0.05)
            beta.serviceAll()
            time.sleep(0.05)
            store.advanceStamp(0.1)

        self.assertIs(beta.connector.accepted, True)
        self.assertIs(beta.connector.connected, True)
        self.assertIs(beta.connector.cutoff, False)

        self.assertEqual(len(alpha.servant.ixes), 1)
        self.assertEqual(len(alpha.reqs), 1)
        self.assertEqual(len(alpha.reps), 1)
        requestant = alpha.reqs.values()[0]
        self.assertEqual(requestant.method, request['method'])
        self.assertEqual(requestant.url, request['path'])
        self.assertEqual(requestant.headers, {'accept': 'application/json',
                                                'accept-encoding': 'identity',
                                                'content-length': '0',
                                                'host': 'localhost:6101'})

        self.assertEqual(len(beta.responses), 1)
        response = beta.responses.popleft()
        self.assertEqual(response['status'], 200)
        self.assertEqual(response['reason'], 'OK')
        self.assertEqual(response['body'],bytearray(b''))
        self.assertEqual(response['data'],{'action': None,
                                            'content': None,
                                            'form': {},
                                            'query': {'name': 'fame'},
                                            'url': 'http://localhost:6101/echo?name=fame',
                                            'verb': 'GET'},)

        responder = alpha.reps.values()[0]
        self.assertTrue(responder.status.startswith, str(response['status']))
        self.assertEqual(responder.headers, response['headers'])

        alpha.servant.closeAll()
        beta.connector.close()

        wireLogAlpha.close()
        wireLogBeta.close()
Beispiel #25
0
    alpha = createStack('alpha', 7531)
    beta = createStack('beta', 7532)
    gamma = createStack('gamma', 7533)

    addJoinRemote(alpha, "beta", 7532)
    addJoinRemote(alpha, "gamma", 7533)
    addJoinRemote(beta, "gamma", 7533)

    alphaThread = gevent.spawn(serviceStack, alpha)
    betaThread = gevent.spawn(serviceStack, beta)
    gammaThread = gevent.spawn(serviceStack, gamma)

    gevent.sleep(1.5)
    print("Queing messages\n")

    msg = odict([("subject", "Introduction"), ("content", "Hello from alpha")])
    messageAll(alpha, msg)

    msg = odict([("subject", "Introduction"), ("content", "Hello from beta")])
    messageAll(beta, msg)

    msg = odict([("subject", "Introduction"), ("content", "Hello from gamma")])
    messageAll(gamma, msg)

    gevent.sleep(1.5)

    printAll(alpha)
    printAll(beta)
    printAll(gamma)

    gevent.joinall([alphaThread, betaThread, gammaThread])
Beispiel #26
0
def backendRequest(
    method=u'GET',
    scheme=u'',  #default if not in path
    host=u'localhost',  # default if not in path
    port=None,  # default if not in path
    path=u'/',
    qargs=None,
    data=None,
    store=None,
    timeout=2.0,
    buffer=False,
):
    """
    Perform Async ReST request to Backend Server

    Parameters:

    Usage: (Inside a generator function)

        response = yield from backendRequest()

    response is the response if valid else None
    before response is completed the yield from yields up an empty string ''
    once completed then response has a value

    path can be full url with host port etc  path takes precedence over others


    """
    store = store if store is not None else Store(stamp=0.0)
    if buffer:
        wlog = WireLog(buffify=buffify, same=True)
        wlog.reopen()
    else:
        wlog = None

    headers = odict([('Accept', 'application/json'), ('Connection', 'close')])

    client = Patron(
        bufsize=131072,
        wlog=wlog,
        store=store,
        scheme=scheme,
        hostname=host,
        port=port,
        method=method,
        path=path,
        qargs=qargs,
        headers=headers,
        data=data,
        reconnectable=False,
    )

    console.concise("Making Backend Request {0} {1} ...\n".format(
        method, path))

    client.transmit()
    # assumes store clock is advanced elsewhere
    timer = timing.StoreTimer(store=store, duration=timeout)
    while ((client.requests or client.connector.txes or not client.responses)
           and not timer.expired):
        try:
            client.serviceAll()
        except Exception as ex:
            console.terse(
                "Error: Servicing backend client. '{0}'\n".format(ex))
            raise ex
        yield b''  # this is eventually yielded by wsgi app while waiting

    response = None  # in case timed out
    if client.responses:
        response = client.responses.popleft()
    client.close()
    if wlog:
        wlog.close()

    return response
Beispiel #27
0
    def testTestStream(self):
        """
        Test Valet WSGI service request response stream sse
        """
        console.terse("{0}\n".format(self.testTestStream.__doc__))

        store = Store(stamp=0.0)

        app = bottle.default_app() # create bottle app

        ending.loadTest(app, store)

        console.terse("{0}\n".format("Building Valet ...\n"))
        wireLogAlpha = WireLog(buffify=True, same=True)
        result = wireLogAlpha.reopen()

        alpha = Valet(port = 6101,
                              bufsize=131072,
                              wlog=wireLogAlpha,
                              store=store,
                              app=app)
        self.assertIs(alpha.servant.reopen(), True)
        self.assertEqual(alpha.servant.ha, ('0.0.0.0', 6101))
        self.assertEqual(alpha.servant.eha, ('127.0.0.1', 6101))

        console.terse("{0}\n".format("Building Patron ...\n"))
        wireLogBeta = WireLog(buffify=True,  same=True)
        result = wireLogBeta.reopen()

        path = "http://{0}:{1}/".format('localhost', alpha.servant.eha[1])

        beta = Patron(bufsize=131072,
                                     wlog=wireLogBeta,
                                     store=store,
                                     path=path,
                                     reconnectable=True)

        self.assertIs(beta.connector.reopen(), True)
        self.assertIs(beta.connector.accepted, False)
        self.assertIs(beta.connector.connected, False)
        self.assertIs(beta.connector.cutoff, False)

        request = odict([('method', u'GET'),
                         ('path', u'/test/stream'),
                         ('qargs', odict()),
                         ('fragment', u''),
                         ('headers', odict([('Accept', 'application/json'),
                                            ('Content-Length', 0)])),
                         ('body', None),
                        ])

        beta.requests.append(request)
        timer = StoreTimer(store, duration=1.0)
        while (not timer.expired):
            alpha.serviceAll()
            time.sleep(0.05)
            beta.serviceAll()
            time.sleep(0.05)
            store.advanceStamp(0.1)

        self.assertIs(beta.connector.accepted, True)
        self.assertIs(beta.connector.connected, True)
        self.assertIs(beta.connector.cutoff, False)

        self.assertEqual(len(alpha.servant.ixes), 1)
        self.assertEqual(len(alpha.reqs), 1)
        self.assertEqual(len(alpha.reps), 1)
        requestant = alpha.reqs.values()[0]
        self.assertEqual(requestant.method, request['method'])
        self.assertEqual(requestant.url, request['path'])
        self.assertEqual(requestant.headers, {'accept': 'application/json',
                                                'accept-encoding': 'identity',
                                                'content-length': '0',
                                                'host': 'localhost:6101'})


        #timed out while stream still open so no responses in .responses
        self.assertIs(beta.waited, True)
        self.assertIs(beta.respondent.ended, False)
        self.assertEqual(len(beta.responses), 0)
        self.assertIn('content-type', beta.respondent.headers)
        self.assertEqual(beta.respondent.headers['content-type'], 'text/event-stream')
        self.assertIn('transfer-encoding', beta.respondent.headers)
        self.assertEqual(beta.respondent.headers['transfer-encoding'], 'chunked')

        self.assertTrue(len(beta.events) >= 3)
        self.assertEqual(beta.respondent.retry, 1000)
        self.assertTrue(int(beta.respondent.leid) >= 2)
        event = beta.events.popleft()
        self.assertEqual(event, {'id': '0', 'name': '', 'data': 'START'})
        event = beta.events.popleft()
        self.assertEqual(event, {'id': '1', 'name': '', 'data': '1'})
        event = beta.events.popleft()
        self.assertEqual(event, {'id': '2', 'name': '', 'data': '2'})
        beta.events.clear()

        #keep going until ended
        timer.restart(duration=1.5)
        while (not timer.expired):
            alpha.serviceAll()
            time.sleep(0.05)
            beta.serviceAll()
            time.sleep(0.05)
            store.advanceStamp(0.1)

        self.assertTrue(len(beta.events) >= 3)
        self.assertEqual(beta.respondent.leid,  '9')
        self.assertEqual(beta.events[-2], {'id': '9', 'name': '', 'data': '9'})
        self.assertEqual(beta.events[-1], {'id': '9', 'name': '', 'data': 'END'})
        beta.events.clear()

        alpha.servant.closeAll()
        beta.connector.close()

        wireLogAlpha.close()
        wireLogBeta.close()
Beispiel #28
0
from ioflo.aid.sixing import *

from Resource import resource
from Resource import priming

console = getConsole()

# This file defines behaviors run by the main.flo script which control the server


@doify('ValetServerOpen',
       ioinits=odict(
           valet="",
           port=odict(ival=8000),
           dbDirPath="",
           keepDirPath="",
           test="",
           preload="",
           fakeHidKind=odict(ival=False),
       ))
def valetServerOpen(self, buffer=False, **kwa):
    if buffer:
        wlog = WireLog(buffify=True, same=True)
        result = wlog.reopen()
    else:
        wlog = None

    port = int(self.port.value)
    app = falcon.API()
    resource.loadResource(app, store=self.store)
Beispiel #29
0
console = getConsole()
"""
Usage pattern

frame server
    do leopy server open at enter
    do leopy server service
    do leopy server close at exit
"""


@doify('LeopyServerOpen',
       ioinits=odict(
           valet="",
           test="",
           port=odict(ival=8080),
       ))
def leopyServerOpen(self):
    """
    Setup and open a rest server

    Ioinit attributes
        valet is Valet instance (wsgi server)
        port is server port

    Context: enter

    Example:
        do leopy server open at enter
    """
Beispiel #30
0
    def testData(self):
        """
        Test Data Class
        """
        console.terse("{0}\n".format(self.testData.__doc__))

        data = storing.Data()
        show = data._show()
        self.assertEqual(show, 'Data: \n')
        self.assertEqual(repr(data), 'Data([])')
        data.x = 1
        data.y = 2
        data.a = 3
        # order preserving
        self.assertEqual(data.__dict__.keys(), ["x", "y", "a"])
        self.assertEqual(data.__dict__.values(), [1, 2, 3])
        self.assertEqual(data.__dict__.items(), [("x", 1),
                                                 ("y", 2),
                                                 ("a", 3)])
        show = data._show()
        self.assertEqual(show, 'Data: x=1 y=2 a=3\n')
        self.assertEqual(repr(data), "Data([('x', 1), ('y', 2), ('a', 3)])")
        stuff = data._sift()
        self.assertEqual(stuff, odict([("x", 1),
                                        ("y", 2),
                                        ("a", 3)]))
        self.assertEqual(stuff.keys(), data.__dict__.keys())

        stuff = data._sift(("y", "x"))
        self.assertEqual(stuff,odict([("y", 2),
                                        ("x", 1)]) )
        self.assertEqual(stuff.keys(), ["y", "x"])

        stuff = data._sift([])
        self.assertEqual(stuff,odict() )
        self.assertEqual(stuff.keys(), [])

        with self.assertRaises(AttributeError) as ex:
            data._b = 4
        self.assertEqual(repr(data), "Data([('x', 1), ('y', 2), ('a', 3)])")
        data._change([("z", 4), ("b", 5)])
        self.assertEqual(data.__dict__.keys(), ["x", "y", "a", "z", "b"])
        self.assertEqual(data.__dict__.values(), [1, 2, 3, 4, 5])
        self.assertEqual(data.__dict__.items(), [("x", 1),
                                                 ("y", 2),
                                                 ("a", 3),
                                                 ("z", 4),
                                                 ("b", 5)])

        items = [("x", 1),
                        ("y", 2),
                        ("a", 3),
                        ("z", 4),
                        ("b", 5)]
        stuff = odict(items)

        data = storing.Data(stuff)
        self.assertEqual(repr(data),
                         "Data([('x', 1), ('y', 2), ('a', 3), ('z', 4), ('b', 5)])")

        data = storing.Data(items)
        self.assertEqual(repr(data),
                         "Data([('x', 1), ('y', 2), ('a', 3), ('z', 4), ('b', 5)])")

        data = storing.Data(error=None)
        self.assertEqual(data.error, None)

        haul = odict([('error', None),
                      ('panSpeed', 50),
                      ('tiltSpeed', 75)])

        data._change(haul)
        self.assertEqual(data.panSpeed, haul['panSpeed'])
        self.assertEqual(data.tiltSpeed, haul['tiltSpeed'])
        # order preserving
        self.assertEqual(data.__dict__.keys(), ["error", "panSpeed", "tiltSpeed"])
        self.assertEqual(data.__dict__.values(), [None, 50, 75])
        self.assertEqual(data.__dict__.items(), [("error", None),
                                                 ("panSpeed", 50),
                                                 ("tiltSpeed", 75)])

        stuff = data._sift(haul.keys())
        self.assertEqual(haul, stuff)

        show = data._show()
        self.assertEqual(show, 'Data: error=None panSpeed=50 tiltSpeed=75\n')

        haul = odict([('panSpeed', 0),
                      ('tiltSpeed', 0)])

        data = storing.Data([('error', None)], haul)
        self.assertEqual(data.error, None)
        show = data._show()
        self.assertEqual(show, 'Data: error=None panSpeed=0 tiltSpeed=0\n')
Beispiel #31
0
    def testLoadTestEnds(self):
        """
        Test behavior
        """
        console.terse("{0}\n".format(self.testLoadTestEnds.__doc__))

        store = Store(stamp=0.0)

        app = bottle.default_app() # create bottle app

        ending.loadTest(app, store)

        console.terse("{0}\n".format("Building Valet ...\n"))
        wireLogAlpha = WireLog(buffify=True, same=True)
        result = wireLogAlpha.reopen()

        alpha = Valet(port = 6101,
                              bufsize=131072,
                              wlog=wireLogAlpha,
                              store=store,
                              app=app)
        self.assertIs(alpha.servant.reopen(), True)
        self.assertEqual(alpha.servant.ha, ('0.0.0.0', 6101))
        self.assertEqual(alpha.servant.eha, ('127.0.0.1', 6101))

        console.terse("{0}\n".format("Building Patron ...\n"))
        wireLogBeta = WireLog(buffify=True,  same=True)
        result = wireLogBeta.reopen()

        path = "http://{0}:{1}/".format('localhost', alpha.servant.eha[1])

        beta = Patron(bufsize=131072,
                      wlog=wireLogBeta,
                      store=store,
                      path=path,
                      reconnectable=True)

        self.assertIs(beta.connector.reopen(), True)
        self.assertIs(beta.connector.accepted, False)
        self.assertIs(beta.connector.connected, False)
        self.assertIs(beta.connector.cutoff, False)

        # get echo
        request = odict([('method', u'GET'),
                         ('path', u'/test/echo?name=fame'),
                         ('qargs', odict()),
                         ('fragment', u''),
                         ('headers', odict([('Accept', 'application/json'),
                                            ('Content-Length', 0)])),
                        ])

        beta.requests.append(request)
        timer = StoreTimer(store, duration=1.0)
        while (beta.requests or beta.connector.txes or not beta.responses or
               not alpha.idle()):
            alpha.serviceAll()
            time.sleep(0.05)
            beta.serviceAll()
            time.sleep(0.05)
            store.advanceStamp(0.1)

        self.assertIs(beta.connector.accepted, True)
        self.assertIs(beta.connector.connected, True)
        self.assertIs(beta.connector.cutoff, False)

        self.assertEqual(len(alpha.servant.ixes), 1)
        self.assertEqual(len(alpha.reqs), 1)
        self.assertEqual(len(alpha.reps), 1)
        requestant = alpha.reqs.values()[0]
        self.assertEqual(requestant.method, request['method'])
        self.assertEqual(requestant.url, request['path'])
        self.assertEqual(requestant.headers, {'accept': 'application/json',
                                                'accept-encoding': 'identity',
                                                'content-length': '0',
                                                'host': 'localhost:6101'})

        self.assertEqual(len(beta.responses), 1)
        response = beta.responses.popleft()
        self.assertEqual(response['status'], 200)
        self.assertEqual(response['reason'], 'OK')
        self.assertEqual(response['body'],bytearray(b''))
        self.assertEqual(response['data'],{'action': None,
                                            'body': '',
                                            'data': None,
                                            'form': odict([]),
                                            'headers': {'Accept': 'application/json',
                                                        'Accept-Encoding': 'identity',
                                                        'Content-Length': '0',
                                                        'Content-Type': '',
                                                        'Host': 'localhost:6101'},
                                            'query': odict([('name', 'fame')]),
                                            'url': 'http://localhost:6101/test/echo?name=fame',
                                            'verb': 'GET'},)

        responder = alpha.reps.values()[0]
        self.assertTrue(responder.status.startswith, str(response['status']))
        self.assertEqual(responder.headers, response['headers'])

        # get routes
        request = odict([('method', u'GET'),
                         ('path', u'/test/route'),
                         ('qargs', odict()),
                         ('fragment', u''),
                         ('headers', odict([('Accept', 'application/json'),
                                            ('Content-Length', 0)])),
                        ])

        beta.requests.append(request)
        timer = StoreTimer(store, duration=1.0)
        while (beta.requests or beta.connector.txes or not beta.responses or
               not alpha.idle()):
            alpha.serviceAll()
            time.sleep(0.05)
            beta.serviceAll()
            time.sleep(0.05)
            store.advanceStamp(0.1)

        self.assertIs(beta.connector.accepted, True)
        self.assertIs(beta.connector.connected, True)
        self.assertIs(beta.connector.cutoff, False)

        self.assertEqual(len(alpha.servant.ixes), 1)
        self.assertEqual(len(alpha.reqs), 1)
        self.assertEqual(len(alpha.reps), 1)
        requestant = alpha.reqs.values()[0]
        self.assertEqual(requestant.method, request['method'])
        self.assertEqual(requestant.url, request['path'])
        self.assertEqual(requestant.headers, {'accept': 'application/json',
                                                'accept-encoding': 'identity',
                                                'content-length': '0',
                                                'host': 'localhost:6101'})

        self.assertEqual(len(beta.responses), 1)
        response = beta.responses.popleft()
        self.assertEqual(response['status'], 200)
        self.assertEqual(response['reason'], 'OK')
        self.assertEqual(response['body'], bytearray(
                b'Web app file is located at /Data/Code/public/ioserve/ios'
                b'erve/end\n/echo/<action> POST\n/echo POST\n/echo/<actio'
                b'n> GET\n/echo GET\n/ GET\n/test GET\n/test/route GET\n/te'
                b'st/echo POST\n/test/echo/<action> POST\n/test/echo GET'
                b'\n/test/echo/<action> GET\n/test/auth POST\n/test/auth/'
                b'<token> POST\n/test/auth GET\n/test/auth/<token> GET\n/'
                b'test/stream GET'))
        self.assertEqual(response['data'],{
                            'action': None,
                            'body': '',
                            'data': None,
                            'form': odict([]),
                            'headers': {'Accept': 'application/json',
                                        'Accept-Encoding': 'identity',
                                        'Content-Length': '0',
                                        'Content-Type': '',
                                        'Host': 'localhost:6101'},
                            'query': odict([('name', 'fame')]),
                            'url': 'http://localhost:6101/test/echo?name=fame',
                            'verb': 'GET'},)

        responder = alpha.reps.values()[0]
        self.assertTrue(responder.status.startswith, str(response['status']))
        self.assertEqual(responder.headers, response['headers'])

        alpha.servant.closeAll()
        beta.connector.close()

        wireLogAlpha.close()
        wireLogBeta.close()