Exemplo n.º 1
0
    def create_view(self, view_name='', description='', fields=None, order=None, filters=''):
        """Creates a view which has the specified search fields, the order in which the search fields are presented
        to a query and a term filter.
        @param view_name Name of the view
        @param description Simple descriptive sentence
        @param fields Search fields
        @param order List of fields to determine order of precendence in which the results are presented
        @param filter Simple term filter

        @param view_name    str
        @param description    str
        @param fields    list
        @param order    list
        @param filters    str
        @retval view_id    str
        """
        res, _ = self.clients.resource_registry.find_resources(name=view_name, id_only=True)
        if len(res) > 0:
            raise BadRequest('The view resource with name: %s, already exists.' % view_name)

        #======================
        # Arg Validations
        #======================
        validate_is_instance(fields,list, 'Specified fields must be a list.')
        validate_true(len(fields)>0, 'Specfied fields must be a list.')
        if order is not None:
            validate_is_instance(order,list, 'Specified order must be a list of fields')
            for field in order:
                if not field in fields:
                    raise BadRequest('The specified ordering field was not part of the search fields.')

        fields = set(fields) # Convert fields to a set for aggregation across the catalogs
        #======================================================================================================
        # Priorty Queue Index Matching
        #======================================================================================================

        pq = [] # Priority queue for matching
        catalog_id = None
        catalogs, _ = self.clients.resource_registry.find_resources(restype=RT.Catalog, id_only=False)
        for catalog in catalogs:
            if set(catalog.catalog_fields).issubset(fields):
                index_num = len(self.clients.catalog_management.list_indexes(catalog._id))
                heapq.heappush(pq, (index_num,catalog))
        if pq:
            weight, catalog = heapq.heappop(pq)
            if weight < self.heuristic_cutoff:
                catalog_id = catalog._id

                
        if catalog_id is None:
            catalog_id = self.clients.catalog_management.create_catalog('%s_catalog'% view_name, keywords=list(fields))

        view_res = View(name=view_name, description=description)
        view_res.order = order
        view_res.filters = filters
        view_id, _ = self.clients.resource_registry.create(view_res)
        self.clients.resource_registry.create_association(subject=view_id, predicate=PRED.hasCatalog,object=catalog_id)
        return view_id
Exemplo n.º 2
0
    def create_view(self, view_name='', description='', fields=None, order=None, filters=''):
        """Creates a view which has the specified search fields, the order in which the search fields are presented
        to a query and a term filter.
        @param view_name Name of the view
        @param description Simple descriptive sentence
        @param fields Search fields
        @param order List of fields to determine order of precendence in which the results are presented
        @param filter Simple term filter

        @param view_name    str
        @param description    str
        @param fields    list
        @param order    list
        @param filters    str
        @retval view_id    str
        """
        res, _ = self.clients.resource_registry.find_resources(name=view_name, id_only=True)
        if len(res) > 0:
            raise BadRequest('The view resource with name: %s, already exists.' % view_name)

        #======================
        # Arg Validations
        #======================
        validate_is_instance(fields,list, 'Specified fields must be a list.')
        validate_true(len(fields)>0, 'Specfied fields must be a list.')
        if order is not None:
            validate_is_instance(order,list, 'Specified order must be a list of fields')
            for field in order:
                if not field in fields:
                    raise BadRequest('The specified ordering field was not part of the search fields.')

        fields = set(fields) # Convert fields to a set for aggregation across the catalogs
        #======================================================================================================
        # Priorty Queue Index Matching
        #======================================================================================================

        pq = [] # Priority queue for matching
        catalog_id = None
        catalogs, _ = self.clients.resource_registry.find_resources(restype=RT.Catalog, id_only=False)
        for catalog in catalogs:
            if set(catalog.catalog_fields).issubset(fields):
                index_num = len(self.clients.catalog_management.list_indexes(catalog._id))
                heapq.heappush(pq, (index_num,catalog))
        if pq:
            weight, catalog = heapq.heappop(pq)
            if weight < self.heuristic_cutoff:
                catalog_id = catalog._id

                
        if catalog_id is None:
            catalog_id = self.clients.catalog_management.create_catalog('%s_catalog'% view_name, keywords=list(fields))

        view_res = View(name=view_name, description=description)
        view_res.order = order
        view_res.filters = filters
        view_id, _ = self.clients.resource_registry.create(view_res)
        self.clients.resource_registry.create_association(subject=view_id, predicate=PRED.hasCatalog,object=catalog_id)
        return view_id
Exemplo n.º 3
0
 def get_builtin_view(self, view_name):
     view_obj = View(name=view_name)
     if view_name == "resources_index":
         rq = ResourceQuery()
         view_obj.view_definition = rq.get_query()
         return view_obj
     elif view_name == "events_index":
         eq = EventQuery()
         view_obj.view_definition = eq.get_query()
         return view_obj
Exemplo n.º 4
0
 def get_builtin_view(self, view_name):
     view_obj = View(name=view_name)
     if view_name == "resources_index":
         rq = ResourceQuery()
         view_obj.view_definition = rq.get_query()
         return view_obj
     elif view_name == "events_index":
         eq = EventQuery()
         view_obj.view_definition = eq.get_query()
         return view_obj
Exemplo n.º 5
0
    def test_view_request(self, mock_es):
        self.call_count = 0
        def cb(*args, **kwargs):
            self.call_count +=1
            return [1]
        self.discovery.elasticsearch_host = ''
        self.discovery.elasticsearch_port = ''

        v = View()
        setattr(v, '_id', 'a')
        self.discovery.list_catalogs = Mock()
        self.discovery.list_catalogs.return_value = [1,2]

        retval = self.discovery._multi(cb,v)
        self.assertTrue(retval == [1,1])

        c = Catalog()
        setattr(c, '_id', 'c')
        self.cms_list_indexes.return_value = [1,2]

        retval = self.discovery._multi(cb,c)
        self.assertTrue(retval == [1,1])


        retval = self.discovery._multi(cb,v, limit=1)
        self.assertTrue(retval == [1])

        retval = self.discovery._multi(cb,c, limit=1)
        self.assertTrue(retval == [1])
        
        self.discovery._multi = Mock()
        self.rr_read.return_value = v
        self.discovery._multi.return_value = 'test'
        retval = self.discovery.query_term('blah', 'field', 'value')
        self.assertTrue(retval == 'test')
Exemplo n.º 6
0
 def get_builtin_view(self, view_name):
     view_obj = View(name=view_name)
     if view_name == "resources_index":
         rq = ResourceQuery()
         view_obj.view_definition = rq.get_query()
         return view_obj
     elif view_name == "data_products_index":
         rq = ResourceQuery()
         rq.set_filter(rq.filter_type(["DataProduct", "DataProcess", "Deployment", "InstrumentDevice", "InstrumentModel",
                         "InstrumentAgentInstance", "InstrumentAgent", "PlatformDevice", "PlatformModel",
                         "PlatformAgentInstance", "PlatformAgent", "PlatformSite", "Observatory", "UserRole",
                         "Org", "Attachment", "ExternalDatasetAgent", "ExternalDatasetAgentInstance"]))
         view_obj.view_definition = rq.get_query()
         return view_obj
     elif view_name == "events_index":
         eq = EventQuery()
         view_obj.view_definition = eq.get_query()
         return view_obj
    def test_query_view(self):
        res_objs = [
            (IonObject(RT.ActorIdentity, name="Act1"), ),
            (IonObject(RT.ActorIdentity, name="Act2"), ),
            (IonObject(RT.TestInstrument,
                       name="ID1",
                       lcstate=LCS.DEPLOYED,
                       firmware_version='A1'), "Act1"),
            (IonObject(RT.TestInstrument,
                       name="ID2",
                       lcstate=LCS.INTEGRATED,
                       firmware_version='A2'), "Act2"),
            (IonObject(RT.TestPlatform, name="PD1"), ),
            (IonObject(RT.TestPlatform, name="PD2"), ),
            (IonObject(RT.TestSite, name="Site1", lcstate=LCS.DEPLOYED), ),
        ]
        assocs = [
            ("PD1", PRED.hasTestDevice, "ID1"),
            ("PD2", PRED.hasTestDevice, "ID2"),
        ]
        res_by_name = create_dummy_resources(res_objs, assocs)

        # ----------------------------------------------------
        # Resource attribute search

        rq = ResourceQuery()
        rq.set_filter(rq.filter_type(RT.TestInstrument))
        view_obj = View(name="All TestInstrument resources",
                        view_definition=rq.get_query())
        view_id = self.discovery.create_view(view_obj)

        # TEST: View by ID
        result = self.discovery.query_view(view_id, id_only=False)
        self.assertEquals(len(result), 2)
        self.assertTrue(
            all(True for ro in result if ro.type_ == RT.TestInstrument))

        # TEST: View by Name
        result = self.discovery.query_view(
            view_name="All TestInstrument resources", id_only=False)
        self.assertEquals(len(result), 2)
        self.assertTrue(
            all(True for ro in result if ro.type_ == RT.TestInstrument))

        # TEST: View plus ext_query
        rq = ResourceQuery()
        rq.set_filter(rq.filter_name("ID1"))
        result = self.discovery.query_view(view_id,
                                           id_only=False,
                                           ext_query=rq.get_query())
        self.assertEquals(len(result), 1)
        self.assertEquals(result[0].name, "ID1")

        # TEST: View with params (anonymous)
        rq = ResourceQuery()
        rq.set_filter(
            rq.filter_type(RT.TestInstrument),
            rq.filter_attribute("firmware_version", "$(firmware_version)"))
        view_obj = View(
            name=
            "TestInstrument resources with a specific firmware - parameterized",
            view_definition=rq.get_query())
        view_id = self.discovery.create_view(view_obj)

        view_params = {"firmware_version": "A2"}
        result = self.discovery.query_view(view_id,
                                           id_only=False,
                                           search_args=view_params)
        self.assertEquals(len(result), 1)
        self.assertEquals(result[0].name, "ID2")

        # TEST: View with params (anonymous) - no values provided
        result = self.discovery.query_view(view_id, id_only=False)
        self.assertEquals(len(result), 0)

        # View with params (with definitions and defaults)
        view_param_def = [
            CustomAttribute(name="firmware_version", type="str", default="A1")
        ]
        view_obj = View(
            name=
            "TestInstrument resources with a specific firmware - parameterized with defaults",
            view_definition=rq.get_query(),
            view_parameters=view_param_def)
        view_id = self.discovery.create_view(view_obj)

        # TEST: Definition defaults
        result = self.discovery.query_view(view_id, id_only=False)
        self.assertEquals(len(result), 1)
        self.assertEquals(result[0].name, "ID1")

        # TEST: Parameterized values
        result = self.discovery.query_view(view_id,
                                           id_only=False,
                                           search_args=view_params)
        self.assertEquals(len(result), 1)
        self.assertEquals(result[0].name, "ID2")

        # TEST: Parameterized association query for resource owner
        rq = ResourceQuery()
        rq.set_filter(rq.filter_associated_from_object("$(owner)"))
        view_obj = View(name="Resources owned by actor - parameterized",
                        view_definition=rq.get_query())
        view_id = self.discovery.create_view(view_obj)
        view_params = {"owner": res_by_name["Act2"]}
        result = self.discovery.query_view(view_id,
                                           id_only=False,
                                           search_args=view_params)
        self.assertEquals(len(result), 1)
        self.assertEquals(result[0].name, "ID2")

        # TEST: Parameterized association query for resource owner with parameter value
        view_params = {"owner": res_by_name["Act2"], "query_info": True}
        result = self.discovery.query_view(view_id,
                                           id_only=False,
                                           search_args=view_params)
        self.assertEquals(len(result), 2)
        self.assertEquals(result[0].name, "ID2")
        self.assertIn("_query_info", result[1])
        self.assertIn("statement_sql", result[1])

        # TEST: Builtin views
        rq = ResourceQuery()
        rq.set_filter(rq.filter_type(RT.TestSite))
        result = self.discovery.query_view(view_name="resources_index",
                                           id_only=False,
                                           ext_query=rq.get_query())
        self.assertEquals(len(result), 1)
        self.assertEquals(result[0].name, "Site1")

        # --- Events setup

        from interface.objects import ResourceOperatorEvent, ResourceCommandEvent
        t0 = 136304640000
        events = [
            ("RME1",
             ResourceCommandEvent(origin="O1",
                                  origin_type="OT1",
                                  sub_type="ST1",
                                  ts_created=str(t0))),
            ("RME2",
             ResourceCommandEvent(origin="O2",
                                  origin_type="OT1",
                                  sub_type="ST2",
                                  ts_created=str(t0 + 1))),
            ("RME3",
             ResourceCommandEvent(origin="O2",
                                  origin_type="OT2",
                                  sub_type="ST3",
                                  ts_created=str(t0 + 2))),
            ("RLE1",
             ResourceOperatorEvent(origin="O1",
                                   origin_type="OT3",
                                   sub_type="ST4",
                                   ts_created=str(t0 + 3))),
            ("RLE2",
             ResourceOperatorEvent(origin="O3",
                                   origin_type="OT3",
                                   sub_type="ST5",
                                   ts_created=str(t0 + 4))),
            ("RLE3",
             ResourceOperatorEvent(origin="O3",
                                   origin_type="OT2",
                                   sub_type="ST6",
                                   ts_created=str(t0 + 5))),
        ]
        ev_by_alias = create_dummy_events(events)

        # TEST: Event query with views
        eq = EventQuery()
        eq.set_filter(eq.filter_type(OT.ResourceCommandEvent))
        view_obj = View(name="All ResourceCommandEvent events",
                        view_definition=eq.get_query())
        view_id = self.discovery.create_view(view_obj)
        result = self.discovery.query_view(view_id, id_only=False)
        self.assertEquals(len(result), 3)
        self.assertTrue(
            all(True for eo in result if eo.type_ == OT.ResourceCommandEvent))

        # TEST: Event query with views - stripped format
        result = self.discovery.query_view(
            view_id,
            id_only=False,
            search_args=dict(attribute_filter=["origin"]))
        self.assertEquals(len(result), 3)
        self.assertTrue(all(True for eo in result if isinstance(eo, dict)))
        self.assertTrue(all(True for eo in result if "origin" in eo))
        self.assertTrue(all(True for eo in result if len(eo) <= 4))

        # TEST: Builtin views
        eq = EventQuery()
        eq.set_filter(eq.filter_type(OT.ResourceCommandEvent))
        result = self.discovery.query_view(view_name="events_index",
                                           id_only=False,
                                           ext_query=eq.get_query())
        self.assertEquals(len(result), 3)