Esempio n. 1
0
    def retrieve(self, cseid, ft):
        if cseid not in self._db.list_collection_names():
            raise KeyError

        result = self._db[cseid].find_one(ft)

        if result is None:
            return None

        elif 'ty' in result:
            resource = ResourcesFactory().create(ty=result['ty'])
            resource.load(pc={resource.get_rtn(): result})

            rtn = None
            if 'rtn' in result:
                rtn = result['rtn']
                result.pop('rtn')
            else:
                raise KeyError

            _id = None
            if '_id' in result:
                _id = result['_id']
                result.pop('_id')
            else:
                raise KeyError

            resource.load({rtn: result})
            resource.set_id(str(_id))

            return resource

        else:
            raise TypeError
Esempio n. 2
0
    def test_module_create_cnt(self):
        f = ResourcesFactory()

        # create CSE
        csebase = f.create(ResourceType.CSEBase.value)
        csebase.set_csi(settings.GHOSTM2M['CSE-ID'])
        csebase_ri = CSEBaseMapper().store(settings.GHOSTM2M['CSE-ID'],
                                           csebase)

        # create parent AE
        ae = f.create(ty=ResourceType.AE.value,
                      pi=csebase_ri,
                      pc={'m2m:ae': {
                          'api': 'test',
                          'apn': 'rfid-reader'
                      }})

        ae_mapper = MappersFactory().get(ae)
        ae_ri = ae_mapper.store(settings.GHOSTM2M['CSE-ID'], ae)

        # create Container
        cnt = f.create(ty=ResourceType.container.value,
                       pi=ae_ri,
                       pc={'m2m:cnt': {
                           'rn': 'corner-rfids'
                       }})
        cnt_mapper = MappersFactory().get(cnt)
        cnt_ri = cnt_mapper.store(settings.GHOSTM2M['CSE-ID'], cnt)
        cnt.set_id(cnt_ri)
        recorded_cnt = cnt_mapper.retrieve(settings.GHOSTM2M['CSE-ID'],
                                           {'_id': ObjectId(cnt_ri)})

        # test dict
        self.assertIn('m2m:cnt', cnt.resource)
        self.assertIn('pi', cnt.resource['m2m:cnt'])
        self.assertIn('rn', cnt.resource['m2m:cnt'])

        self.assertEqual(ae_ri, cnt.resource['m2m:cnt']['pi'])
        self.assertEqual('corner-rfids', cnt.resource['m2m:cnt']['rn'])

        # test module
        self.assertEqual(cnt.rn, 'corner-rfids')
        self.assertEqual(cnt.pi, ae_ri)
        self.assertEqual(cnt.ri, cnt_ri)

        # test db
        self.assertIsInstance(recorded_cnt, Container)
        self.assertEqual(recorded_cnt.rn, 'corner-rfids')
        self.assertEqual(recorded_cnt.pi, ae_ri)
Esempio n. 3
0
def run():
    """
    create a CSEBase
    """
    resource = ResourcesFactory().create(ResourceType.CSEBase.value)
    resource.set_csi(settings.GHOSTM2M['CSE-ID'])

    base = DBConnection().db[settings.GHOSTM2M['CSE-ID']]
    result = base.find_one({
        'ty': ResourceType.CSEBase.value,
        'csi': settings.GHOSTM2M['CSE-ID']
    })
    if result is None:
        ri = CSEBaseMapper().store(settings.GHOSTM2M['CSE-ID'], resource)
        print('Creado CSEBase. ', ri)
    else:
        print('CSEBase ya existe. ', result)
Esempio n. 4
0
def run():
    """
    reset db
    """
    try:
        DBConnection().db_client.drop_database(settings.GHOSTM2M["dbname"])
        DBConnection().db_client.drop_database('users')
        print('OK')
    except Exception as e:
        print(str(e))

    # create CSEBase
    resource = ResourcesFactory().create(ResourceType.CSEBase.value)
    resource.set_csi(settings.GHOSTM2M['CSE-ID'])

    base = DBConnection().db[settings.GHOSTM2M['CSE-ID']]
    result = base.find_one({
        'ty': ResourceType.CSEBase.value,
        'csi': settings.GHOSTM2M['CSE-ID']
    })
    if result is None:
        ri = CSEBaseMapper().store(settings.GHOSTM2M['CSE-ID'], resource)
        print('Creado CSEBase. ', ri)
    else:
        print('CSEBase ya existe. ', result)

    # create user admin
    try:
        users = DBConnection().db['users']
        result = users.insert_one({
            '_id':
            settings.GHOSTM2M['admin-user']['username'],
            'pwd':
            settings.GHOSTM2M['admin-user']['pwd']
        })
        print("se crea usuario admin")
    except Exception as e:
        print('no se crea usuario admin')
        print(str(e))
Esempio n. 5
0
    def test_module_create_ae(self):
        f = ResourcesFactory()

        # create CSE
        csebase = f.create(ResourceType.CSEBase.value)
        csebase.set_csi(settings.GHOSTM2M['CSE-ID'])
        csebase_ri = CSEBaseMapper().store(settings.GHOSTM2M['CSE-ID'],
                                           csebase)

        # create AE
        ae = f.create(ty=ResourceType.AE.value,
                      pi=csebase_ri,
                      pc={'m2m:ae': {
                          'api': 'test',
                          'apn': 'rfid-reader'
                      }})

        ae_mapper = MappersFactory().get(ae)
        ae_ri = ae_mapper.store(settings.GHOSTM2M['CSE-ID'], ae)

        # test dict
        self.assertIn('m2m:ae', ae.resource)
        self.assertIn('pi', ae.resource['m2m:ae'])
        self.assertEqual(csebase_ri, ae.resource['m2m:ae']['pi'])

        # test module
        self.assertEqual(ae.apn, 'rfid-reader')
        self.assertEqual(ae.api, 'test')
        self.assertEqual(ae.pi, csebase_ri)

        recorded_ae = ae_mapper.retrieve(settings.GHOSTM2M['CSE-ID'],
                                         {'_id': ObjectId(ae_ri)})

        self.assertIsInstance(recorded_ae, AE)
        self.assertEqual(recorded_ae.apn, 'rfid-reader')
        self.assertEqual(recorded_ae.api, 'test')
        self.assertEqual(recorded_ae.pi, csebase_ri)
Esempio n. 6
0
def m2mrequest(request, cseid, resourceid=None, attrib=None):
    data = json.loads(request.body)
    primitive = None

    # parse URL
    try:
        http_to = dict()
        http_to['cse-id'] = cseid

        if resourceid is not None:
            http_to['unstructured-resource-id'] = resourceid

        if attrib is not None:
            http_to['attr'] = attrib

    except:
        resp = ResponsePrimitive(
            0, ResponseStatusCode.INTERNAL_SERVER_ERROR.value)
        return JsonResponse(resp.toDict())

    try:
        if 'm2m:rqp' in data:
            primitive = data['m2m:rqp']
    except KeyError:
        resp = ResponsePrimitive(0, ResponseStatusCode.BAD_REQUEST.value)
        return JsonResponse(resp.toDict())

    try:
        if 'fr' in primitive:
            fr = primitive['fr']
            username, pwd = fr.split(':', maxsplit=2)
            user = User(username, pwd)
            if not user.valid():
                resp = ResponsePrimitive(
                    0, ResponseStatusCode.OPERATION_NOT_ALLOWED.value)
                return JsonResponse(resp.toDict())

    except Exception:
        resp = ResponsePrimitive(0, ResponseStatusCode.BAD_REQUEST.value)
        return JsonResponse(resp.toDict())

    # CREATE or NOTIFY
    if request.method == "POST":

        try:
            if 'op' in primitive:
                op = primitive['op']
        except KeyError:
            return JsonResponse({
                'status': 0,
                'info': 'no operation in primitive'
            })

        try:
            if 'ty' in primitive:
                ty = primitive['ty']
        except KeyError:
            return JsonResponse({
                'status': 0,
                'info': 'no resourceType in request primitive'
            })

        if op == Operation.Create.value:
            resource = None
            try:
                if primitive['ty'] == ResourceType.AE.value:
                    target_resource = http_to['cse-id']
                else:
                    target_resource = http_to['unstructured-resource-id']

                if target_resource is None:
                    resp = ResponsePrimitive(
                        rsc=ResponseStatusCode.BAD_REQUEST.value)
                    return JsonResponse(resp.toDict())

                pc = None
                if 'pc' in primitive:
                    pc = primitive['pc']
                resource = ResourcesFactory().create(ty=primitive['ty'],
                                                     pc=pc,
                                                     pi=target_resource)
                mapper = MappersFactory().get(resource)
                ri = mapper.store(http_to['cse-id'], resource)
                resource.set_id(ri)
                resp = ResponsePrimitive(rsc=ResponseStatusCode.CREATED.value)
                resp.set_pc(resource.toDict())
                return JsonResponse(resp.toDict())

            except:
                resp = ResponsePrimitive(
                    rsc=ResponseStatusCode.BAD_REQUEST.value)
                return JsonResponse(resp.toDict())

        else:
            resp = ResponsePrimitive(
                rsc=ResponseStatusCode.NOT_IMPLEMENTED.value)
            return JsonResponse(resp.toDict())

    # RETRIEVE or DISCOVERY
    elif request.method == "GET":
        try:
            try:
                if 'op' in primitive:
                    op = primitive['op']
            except KeyError:
                rsp = ResponsePrimitive(
                    rsc=ResponseStatusCode.BAD_REQUEST.value)
                return JsonResponse(rsp.toDict())

            if op == Operation.Retrieve.value:
                if 'unstructured-resource-id' in http_to:
                    resource = ResourceMapper().retrieve(
                        http_to["cse-id"],
                        {'_id': ObjectId(http_to['unstructured-resource-id'])})
                else:
                    resource = ResourceMapper().retrieve(
                        http_to["cse-id"], {'csi': http_to['cse-id']})

                filter_criteria = request.GET.dict()

                if filter_criteria:
                    # DISCOVERY
                    results = ResourceMapper().discovery(
                        http_to["cse-id"], http_to['unstructured-resource-id'],
                        filter_criteria)
                    rsp = {
                        "m2m:rsp": {
                            "pc": {
                                "m2m:uril": results
                            },
                            "rsc": ResponseStatusCode.OK.value,
                            "ri": resource.get_id()
                        }
                    }
                    return JsonResponse(rsp)

                if 'attr' in http_to:
                    if hasattr(resource, http_to['attr']):
                        target_attr = getattr(resource, http_to['attr'])
                        rsp = ResponsePrimitive(
                            rsc=ResponseStatusCode.OK.value)
                        rsp.set_pc(target_attr)
                        return JsonResponse(rsp.toDict())
                    else:
                        rsp = ResponsePrimitive(
                            rsc=ResponseStatusCode.NOT_FOUND.value)
                        return JsonResponse(rsp.toDict())

                else:
                    if resource is None:
                        rsp = ResponsePrimitive(
                            rsc=ResponseStatusCode.NOT_FOUND.value)
                        return JsonResponse(rsp.toDict())

                    rsp = ResponsePrimitive(rsc=ResponseStatusCode.OK.value)
                    rsp.set_pc(resource.toDict())
                    return JsonResponse(rsp.toDict())

            else:
                rsp = ResponsePrimitive(
                    rsc=ResponseStatusCode.NOT_IMPLEMENTED.value)
                return JsonResponse(rsp.toDict())

        except Exception:
            rsp = ResponsePrimitive(
                rsc=ResponseStatusCode.INTERNAL_SERVER_ERROR.value)
            return JsonResponse(rsp.toDict())

    else:
        rsp = ResponsePrimitive(rsc=ResponseStatusCode.NOT_IMPLEMENTED.value)
        return JsonResponse(rsp.toDict())
Esempio n. 7
0
    def test_api_retrieve(self):

        f = ResourcesFactory()

        # create admin user
        result = DBConnection().db['users'].find_one(
            {'_id': settings.GHOSTM2M['admin-user']['username']})
        if result is None:
            DBConnection().db['users'].insert_one({
                '_id':
                settings.GHOSTM2M['admin-user']['username'],
                'pwd':
                settings.GHOSTM2M['admin-user']['pwd']
            })

        # create CSE
        csebase = f.create(ResourceType.CSEBase.value)
        csebase.set_csi(settings.GHOSTM2M['CSE-ID'])
        csebase_ri = CSEBaseMapper().store(settings.GHOSTM2M['CSE-ID'],
                                           csebase)

        # create AE
        ae = f.create(ty=ResourceType.AE.value,
                      pi=csebase_ri,
                      pc={'m2m:ae': {
                          'api': 'test',
                          'apn': 'rfid-reader'
                      }})

        ae_mapper = MappersFactory().get(ae)
        ae_ri = ae_mapper.store(settings.GHOSTM2M['CSE-ID'], ae)
        ae.set_id(ae_ri)

        # create Container
        cnt = f.create(ty=ResourceType.container.value,
                       pi=ae_ri,
                       pc={'m2m:cnt': {
                           'rn': 'corner-rfids'
                       }})
        cnt_mapper = MappersFactory().get(cnt)
        cnt_ri = cnt_mapper.store(settings.GHOSTM2M['CSE-ID'], cnt)
        cnt.set_id(cnt_ri)

        # create ContentInstance
        cin = f.create(ty=ResourceType.contentInstance.value,
                       pi=cnt_ri,
                       pc={'m2m:cin': {
                           'con': 'abcdef'
                       }})
        cin_mapper = MappersFactory().get(cin)
        cin_ri = cin_mapper.store(settings.GHOSTM2M['CSE-ID'], cin)
        cin.set_id(cin_ri)

        # Request CSE
        #
        request = {
            'm2m:rqp': {
                'op':
                Operation.Retrieve.value,
                'fr':
                '{}:{}'.format(settings.GHOSTM2M['admin-user']['username'],
                               settings.GHOSTM2M['admin-user']['pwd']),
                'to':
                '/~/Cernicalo',
            }
        }
        request_str = json.dumps(request)
        response = self.client.generic('GET', '/~/Cernicalo', request_str,
                                       'application/json')
        self.assertEqual(response.status_code, 200)
        response_cse = json.loads(response.content)['m2m:rsp']
        self.assertIn('rsc', response_cse)
        self.assertEqual(response_cse['rsc'], ResponseStatusCode.OK.value)

        # Request AE
        request = {
            'm2m:rqp': {
                'op':
                Operation.Retrieve.value,
                'fr':
                '{}:{}'.format(settings.GHOSTM2M['admin-user']['username'],
                               settings.GHOSTM2M['admin-user']['pwd']),
                'to':
                '/~/Cernicalo',
            }
        }

        request_str = json.dumps(request)
        response = self.client.generic('GET', '/~/Cernicalo/{}'.format(ae_ri),
                                       request_str, 'application/json')
        self.assertEqual(response.status_code, 200)
        response_ae = json.loads(response.content)['m2m:rsp']
        self.assertIn('pc', response_ae)
        self.assertIn('m2m:ae', response_ae['pc'])
        self.assertIn('apn', response_ae['pc']['m2m:ae'])
        self.assertIn('ri', response_ae['pc']['m2m:ae'])

        # Request Container
        request = {
            'm2m:rqp': {
                'op':
                Operation.Retrieve.value,
                'fr':
                '{}:{}'.format(settings.GHOSTM2M['admin-user']['username'],
                               settings.GHOSTM2M['admin-user']['pwd']),
                'to':
                '/~/Cernicalo',
            }
        }

        request_str = json.dumps(request)
        response = self.client.generic('GET', '/~/Cernicalo/{}'.format(cnt_ri),
                                       request_str, 'application/json')
        self.assertEqual(response.status_code, 200)
        response_cnt = json.loads(response.content)['m2m:rsp']
        self.assertIn('pc', response_cnt)
        self.assertIn('m2m:cnt', response_cnt['pc'])
        self.assertIn('rn', response_cnt['pc']['m2m:cnt'])
        self.assertIn('ri', response_cnt['pc']['m2m:cnt'])
        self.assertIn('cni', response_cnt['pc']['m2m:cnt'])
        self.assertEqual(response_cnt['pc']['m2m:cnt']['cni'], 1)

        # Request ContentInstance
        request = {
            'm2m:rqp': {
                'op':
                Operation.Retrieve.value,
                'fr':
                '{}:{}'.format(settings.GHOSTM2M['admin-user']['username'],
                               settings.GHOSTM2M['admin-user']['pwd']),
                'to':
                '/~/Cernicalo',
            }
        }

        request_str = json.dumps(request)
        response = self.client.generic('GET', '/~/Cernicalo/{}'.format(cin_ri),
                                       request_str, 'application/json')
        self.assertEqual(response.status_code, 200)
        response_cin = json.loads(response.content)['m2m:rsp']
        self.assertIn('pc', response_cin)
        self.assertIn('m2m:cin', response_cin['pc'])
        self.assertIn('con', response_cin['pc']['m2m:cin'])
        self.assertIn('ri', response_cin['pc']['m2m:cin'])
        self.assertIn('pi', response_cin['pc']['m2m:cin'])
        self.assertEqual(response_cin['pc']['m2m:cin']['pi'], cnt_ri)

        # Request <last> <ContentInstance>
        request = {
            'm2m:rqp': {
                'op':
                Operation.Retrieve.value,
                'fr':
                '{}:{}'.format(settings.GHOSTM2M['admin-user']['username'],
                               settings.GHOSTM2M['admin-user']['pwd']),
                'to':
                '/~/Cernicalo',
            }
        }
        request_str = json.dumps(request)
        response = self.client.generic('GET',
                                       '/~/Cernicalo/{}/la'.format(cnt_ri),
                                       request_str, 'application/json')
        self.assertEqual(response.status_code, 200)
        response_la = json.loads(response.content)['m2m:rsp']
        self.assertIn('pc', response_cin)

        # Check updated parent <Container>
        request = {
            'm2m:rqp': {
                'op':
                Operation.Retrieve.value,
                'fr':
                '{}:{}'.format(settings.GHOSTM2M['admin-user']['username'],
                               settings.GHOSTM2M['admin-user']['pwd']),
                'to':
                '/~/Cernicalo',
            }
        }

        request_str = json.dumps(request)
        response = self.client.generic('GET', '/~/Cernicalo/{}'.format(cnt_ri),
                                       request_str, 'application/json')
        self.assertEqual(response.status_code, 200)
        response_cnt = json.loads(response.content)['m2m:rsp']
        self.assertIn('pc', response_cnt)
        self.assertIn('m2m:cnt', response_cnt['pc'])
        self.assertIn('rn', response_cnt['pc']['m2m:cnt'])
        self.assertIn('ri', response_cnt['pc']['m2m:cnt'])

        self.assertIn('la', response_cnt['pc']['m2m:cnt'])
        self.assertEqual(response_cnt['pc']['m2m:cnt']['la'], cin_ri)

        # create another ContentInstance
        cin = f.create(ty=ResourceType.contentInstance.value,
                       pi=cnt_ri,
                       pc={'m2m:cin': {
                           'con': 'segundocontent'
                       }})
        cin_mapper = MappersFactory().get(cin)
        cin_ri = cin_mapper.store(settings.GHOSTM2M['CSE-ID'], cin)
        cin.set_id(cin_ri)

        request_str = json.dumps(request)
        response = self.client.generic('GET', '/~/Cernicalo/{}'.format(cnt_ri),
                                       request_str, 'application/json')
        self.assertEqual(response.status_code, 200)
        response_cnt = json.loads(response.content)['m2m:rsp']

        self.assertIn('cni', response_cnt['pc']['m2m:cnt'])
        self.assertEqual(response_cnt['pc']['m2m:cnt']['cni'], 2)

        self.assertIn('la', response_cnt['pc']['m2m:cnt'])
        self.assertEqual(response_cnt['pc']['m2m:cnt']['la'], cin_ri)

        request_str = json.dumps(request)
        response = self.client.generic(
            'GET',
            '/~/Cernicalo/{}?ty={}'.format(cnt_ri,
                                           ResourceType.contentInstance.value),
            request_str, 'application/json')

        self.assertEqual(response.status_code, 200)
        self.assertIn('m2m:rsp', json.loads(response.content))
        response_discovery = json.loads(response.content)['m2m:rsp']
        self.assertIn('pc', response_discovery)
        self.assertIn('m2m:uril', response_discovery['pc'])
        self.assertIsInstance(response_discovery['pc']['m2m:uril'], list)
Esempio n. 8
0
    def test_api_create_cin(self):
        # create admin user
        result = DBConnection().db['users'].find_one(
            {'_id': settings.GHOSTM2M['admin-user']['username']})
        if result is None:
            DBConnection().db['users'].insert_one({
                '_id':
                settings.GHOSTM2M['admin-user']['username'],
                'pwd':
                settings.GHOSTM2M['admin-user']['pwd']
            })

        # send request for create AE
        request = {
            'm2m:rqp': {
                'op':
                1,
                'ty':
                1,
                'pc': {
                    'm2m:ae': {
                        "apn": "lector-tarjetas"
                    }
                },
                'fr':
                '{}:{}'.format(settings.GHOSTM2M['admin-user']['username'],
                               settings.GHOSTM2M['admin-user']['pwd']),
                'to':
                '//localhost:80/Cernicalo'
            }
        }

        response = self.client.post('/~/Cernicalo/',
                                    json.dumps(request),
                                    content_type="application/json")

        self.assertEqual(response.status_code, 200)
        response_ae = json.loads(response.content)['m2m:rsp']

        factory = ResourcesFactory()
        parent_ae = factory.create(request['m2m:rqp']['ty'],
                                   pc=response_ae['pc'])

        request = {
            'm2m:rqp': {
                'op':
                Operation.Create.value,
                'ty':
                ResourceType.container.value,
                'pc': {
                    'm2m:cnt': {
                        'rn': 'corners-rfids'
                    }
                },
                'fr':
                '{}:{}'.format(settings.GHOSTM2M['admin-user']['username'],
                               settings.GHOSTM2M['admin-user']['pwd']),
                'to':
                '/~/Cernicalo/{}'.format(parent_ae.ri),
            }
        }
        response = self.client.post('/~/Cernicalo/{}'.format(parent_ae.ri),
                                    json.dumps(request),
                                    content_type="application/json")

        self.assertEqual(response.status_code, 200)
        response_cnt = json.loads(response.content)['m2m:rsp']
        cnt = factory.create(request['m2m:rqp']['ty'], pc=response_cnt['pc'])

        request = {
            'm2m:rqp': {
                'op':
                Operation.Create.value,
                'ty':
                ResourceType.contentInstance.value,
                'pc': {
                    'm2m:cin': {
                        'con': 'hola mundo!'
                    }
                },
                'fr':
                '{}:{}'.format(settings.GHOSTM2M['admin-user']['username'],
                               settings.GHOSTM2M['admin-user']['pwd']),
                'to':
                '/~/Cernicalo/{}'.format(cnt.ri),
            }
        }

        response = self.client.post('/~/Cernicalo/{}'.format(cnt.ri),
                                    json.dumps(request),
                                    content_type="application/json")

        self.assertIn('m2m:rsp', json.loads(response.content))
        response_cin = json.loads(response.content)['m2m:rsp']

        self.assertIn('m2m:cin', response_cin['pc'])

        cin = factory.create(request['m2m:rqp']['ty'], pc=response_cin['pc'])

        self.assertIsInstance(cin, ContentInstance)
        self.assertEqual(cin.pi, cnt.ri)
        self.assertEqual(cin.con, 'hola mundo!')

        parent = ResourceMapper().retrieve(cseid=settings.GHOSTM2M['CSE-ID'],
                                           ft={'_id': ObjectId(cin.pi)})
        self.assertIsInstance(parent, Container)
        self.assertNotEqual(parent.la, None)