Esempio n. 1
0
    def put(self, host):
        """Method to handle gateway PUT requests
        
        Args:
            host (str): Gateway host address
        """
        try:
            gateway = yield Gateway.find(where=['host = ?', host], limit=1)
            # Return a 404 if not found.
            if gateway is None:
                abort(404, message={'error': "Gateway {} doesn't exist".format(host)})

            kwargs = {}
            for a,v in self.args.items():
                if v is not None and v != getattr(gateway, a):
                    kwargs[a] = v
                    setattr(gateway, a, v)
            (valid, message) = yield gateway.valid()
            if not valid:
                abort(400, message=message)
            
            # Update the gateway and server with the new attributes
            if kwargs:
                gateway.update(**kwargs)
                self.server.lora.updateGateway(host, gateway)
            returnValue(({}, 200))

        except TimeoutError:
            log.error("REST API timeout retrieving gateway {host}",
                      host=host)
Esempio n. 2
0
    def test_addGateway(self):
        """ Test addGateway method"""
        address = '192.168.1.199'
        expected = address

        g = Gateway(host=address, name='Test Add', enabled=True, power=26)
        self.lora.addGateway(g)
        result = self.lora.gateways[1].host

        self.assertEqual(expected, result)
Esempio n. 3
0
 def _test_gateway(self):
     """Create a test gateway object. We must load the device
     dynamically as it depends on the adbapi intialisation"""
     
     return Gateway(
         host='192.168.1.125',
         name='gateway',
         eui=36028797019005945,
         enabled=True,
         power=20,
         )
Esempio n. 4
0
 def get(self, host):
     """Method to handle gateway GET requests"""  
     try:
         g = yield Gateway.find(where=['host = ?', host], limit=1)
         # Return a 404 if not found.
         if g is None:
             abort(404, message={'error': "Gateway {} doesn't exist.".format(host)})
         returnValue(marshal(g, self.fields))
         
     except TimeoutError:
         log.error("REST API timeout retrieving gateway {host}",
                   host=host)
Esempio n. 5
0
    def post(self):
        """Method to create a gateway"""
        host = self.args['host']
        name = self.args['name']
        eui = self.args['eui']
        enabled = self.args['enabled']
        power = self.args['power']
        
        message = {}
        # Check for required args
        required = {'host', 'name', 'eui', 'enabled', 'power'}
        for r in required:
            if self.args[r] is None:
                message[r] = "Missing the {} parameter.".format(r)
        if message:
            abort(400, message=message)
            
        # Ensure we have a valid address
        try:
            ipaddress.ip_address(host)
        except (ipaddress.AddressValueError, ValueError):
            message = {'error': "Invalid IP address {} ".format(host)}
            abort(400, message=message)
            
        # Ensure we have a valid EUI
        if not isinstance(eui, (int, long)):
            message = {'error': "Invalid gateway EUI {} ".format(eui)}
            abort(400, message=message)

        # Check this gateway does not currently exist
        exists = yield Gateway.exists(where=['host = ?', host])
        if exists:
            message = {'error': "Gateway address {} ".format(host) + \
                                 "currently exists."}
            abort(400, message=message)

        # Check the EUI does not currently exist
        exists = yield Gateway.exists(where=['eui = ?', eui])
        if exists:
            message = {'error': "Gateway EUI {} ".format(eui) + \
                                 "currently exists."}
            abort(400, message=message)

        # Create and validate
        gateway = Gateway(host=host, eui=eui, name=name, enabled=enabled, power=power)
        (valid, message) = gateway.valid()
        if not valid:
            abort(400, message=message)

        try:
            g = yield gateway.save()
            if g is None:
                abort(500, message={'error': "Error saving the gateway."})
            # Add the new gateway to the server.
            self.server.lora.addGateway(g)
            location = self.restapi.api.prefix + '/gateway/' + str(host)
            returnValue(({}, 201, {'Location': location}))
        except TimeoutError:
            # Exception returns 500 to client
            log.error("REST API timeout for gateway POST request")
Esempio n. 6
0
    def setUp(self):
        """Test setup. Creates a new NetServer
        """
        Registry.getConfig = MagicMock(return_value=None)

        ## Get factory default configuration
        with patch.object(Model, 'save', MagicMock()):
            config = yield Config.loadFactoryDefaults()
        server = NetServer(config)

        self.lora = lora_wan.LoraWAN(server)
        g = Gateway(host='192.168.1.125', name='Test', enabled=True, power=26)
        self.lora.gateways.append(g)
Esempio n. 7
0
    def test_updateGateway(self):
        """ Test updateGateway method"""
        address = '192.168.1.199'
        expected = address

        host = self.lora.gateways[0].host
        gateway = Gateway(host=address,
                          name='Test Update',
                          enabled=True,
                          power=26)
        self.lora.updateGateway(host, gateway)
        result = self.lora.gateways[0].host

        self.assertEqual(expected, result)
Esempio n. 8
0
 def get(self):
     """Method to get all gateways"""
     try:
         gateways = yield Gateway.all()
         if gateways is None:
             returnValue({})
         data = {}
         for i,g in enumerate(gateways):
             data[i] = marshal(g, self.fields)
         returnValue(data)
         
     except TimeoutError:
         # Exception returns 500 to client
         log.error("REST API timeout retrieving all gateways")
Esempio n. 9
0
    def delete(self, host):
        """Method to handle gateway DELETE requests
        
        Args:
            host (str): Gateway host
        """
        try:
            g = yield Gateway.find(where=['host = ?', host], limit=1)
            # Return a 404 if not found.
            if g is None:
                abort(404, message={'error': "Gateway {} doesn't exist.".format(host)})
            deleted = yield g.delete()
            self.server.lora.deleteGateway(g)
            returnValue(({}, 200))

        except TimeoutError:
            log.error("REST API timeout retrieving gateway {host}",
                      host=host)
Esempio n. 10
0
    def test_txpkResponse(self):
        self.server.lora = LoraWAN(self)
        self.server.lora.addGateway(
            Gateway(host='192.168.1.125', name='Test', enabled=True, power=26))
        tmst = randrange(0, 4294967295)
        rxpk = Rxpk(tmst=tmst,
                    chan=3,
                    freq=915.8,
                    datr='SF7BW125',
                    data="n/uSwM0LIED8X6QV0mJMjC6oc2HOWFpCfmTry",
                    size=54)
        device = self._test_device()
        device.rx = self.server.band.rxparams((rxpk.chan, rxpk.datr),
                                              join=False)
        gateway = self.server.lora.gateway(device.gw_addr)
        expected = [
            (True, device.rx[1]['freq'], device.rx[1]['datr']),
            (True, device.rx[2]['freq'], device.rx[2]['datr']),
            (tmst + 1000000, device.rx[1]['freq'], device.rx[1]['datr']),
            (tmst + 2000000, device.rx[2]['freq'], device.rx[2]['datr'])
        ]

        result = []
        txpk = self.server._txpkResponse(device,
                                         rxpk.data,
                                         gateway,
                                         tmst,
                                         immediate=True)
        for i in range(1, 3):
            result.append((txpk[i].imme, txpk[i].freq, txpk[i].datr))
        txpk = self.server._txpkResponse(device,
                                         rxpk.data,
                                         gateway,
                                         tmst,
                                         immediate=False)
        for i in range(1, 3):
            result.append((txpk[i].tmst, txpk[i].freq, txpk[i].datr))

        self.assertEqual(expected, result)