def create_dataset(self, name='', datastore_name='', view_name='', stream_id='', parameter_dict=None, spatial_domain=None, temporal_domain=None, parameter_dictionary_id='', description=''):
        validate_true(parameter_dict or parameter_dictionary_id, 'A parameter dictionary must be supplied to register a new dataset.')
        validate_is_not_none(spatial_domain, 'A spatial domain must be supplied to register a new dataset.')
        validate_is_not_none(temporal_domain, 'A temporal domain must be supplied to register a new dataset.')
        
        if parameter_dictionary_id:
            pd = self.read_parameter_dictionary(parameter_dictionary_id)
            pcs = self.read_parameter_contexts(parameter_dictionary_id, id_only=False)
            parameter_dict = self._merge_contexts([ParameterContext.load(i.parameter_context) for i in pcs], pd.temporal_context)
            parameter_dict = parameter_dict.dump()

        dataset                      = Dataset()
        dataset.description          = description
        dataset.name                 = name
        dataset.primary_view_key     = stream_id or None
        dataset.datastore_name       = datastore_name or self.DEFAULT_DATASTORE
        dataset.view_name            = view_name or self.DEFAULT_VIEW
        dataset.parameter_dictionary = parameter_dict
        dataset.temporal_domain      = temporal_domain
        dataset.spatial_domain       = spatial_domain
        dataset.registered           = False


        dataset_id, _ = self.clients.resource_registry.create(dataset)
        if stream_id:
            self.add_stream(dataset_id,stream_id)

        log.debug('creating dataset: %s', dataset_id)

        cov = self._create_coverage(dataset_id, description or dataset_id, parameter_dict, spatial_domain, temporal_domain) 
        self._save_coverage(cov)
        cov.close()

        return dataset_id
Пример #2
0
    def get_cov(self):
        # Instantiate a ParameterDictionary
        pdict = ParameterDictionary()

        # Create a set of ParameterContext objects to define the parameters in the coverage, add each to the ParameterDictionary
        t_ctxt = ParameterContext(
            'time', param_type=QuantityType(value_encoding=np.dtype('int64')))
        t_ctxt.uom = 'seconds since 01-01-1970'
        pdict.add_context(t_ctxt, is_temporal=True)

        lat_ctxt = ParameterContext(
            'lat', param_type=QuantityType(value_encoding=np.dtype('float32')))
        lat_ctxt.axis = AxisTypeEnum.LAT
        lat_ctxt.uom = 'degree_north'
        pdict.add_context(lat_ctxt)

        lon_ctxt = ParameterContext(
            'lon', param_type=QuantityType(value_encoding=np.dtype('float32')))
        lon_ctxt.axis = AxisTypeEnum.LON
        lon_ctxt.uom = 'degree_east'
        pdict.add_context(lon_ctxt)

        # Construct temporal and spatial Coordinate Reference System objects
        tcrs = CRS([AxisTypeEnum.TIME])
        scrs = CRS([AxisTypeEnum.LON, AxisTypeEnum.LAT])

        # Construct temporal and spatial Domain objects
        tdom = GridDomain(GridShape('temporal', [0]), tcrs,
                          MutabilityEnum.EXTENSIBLE)  # 1d (timeline)
        sdom = GridDomain(GridShape('spatial',
                                    [0]), scrs, MutabilityEnum.IMMUTABLE
                          )  # 0d spatial topology (station/trajectory)

        # Instantiate the SimplexCoverage providing the ParameterDictionary, spatial Domain and temporal Domain
        scov = SimplexCoverage(self.working_dir,
                               create_guid(),
                               'sample coverage_model',
                               parameter_dictionary=pdict,
                               temporal_domain=tdom,
                               spatial_domain=sdom,
                               inline_data_writes=True,
                               in_memory_storage=False)

        # Insert some timesteps (automatically expands other arrays)
        nt = 200000
        scov.insert_timesteps(nt)

        # Add data for each parameter
        scov.set_parameter_values('time', value=np.arange(nt))
        scov.set_parameter_values('lat', value=45)
        scov.set_parameter_values('lon', value=-71)

        dset = Dataset()
        dset.parameter_dictionary = pdict.dump()
        dset.spatial_domain = sdom.dump()
        dset.temporal_domain = tdom.dump()

        return scov, dset
Пример #3
0
    def get_cov(self):
        # Instantiate a ParameterDictionary
        pdict = ParameterDictionary()

        # Create a set of ParameterContext objects to define the parameters in the coverage, add each to the ParameterDictionary
        t_ctxt = ParameterContext('time', param_type=QuantityType(value_encoding=np.dtype('int64')))
        t_ctxt.uom = 'seconds since 01-01-1970'
        pdict.add_context(t_ctxt, is_temporal=True)

        lat_ctxt = ParameterContext('lat', param_type=QuantityType(value_encoding=np.dtype('float32')))
        lat_ctxt.axis = AxisTypeEnum.LAT
        lat_ctxt.uom = 'degree_north'
        pdict.add_context(lat_ctxt)

        lon_ctxt = ParameterContext('lon', param_type=QuantityType(value_encoding=np.dtype('float32')))
        lon_ctxt.axis = AxisTypeEnum.LON
        lon_ctxt.uom = 'degree_east'
        pdict.add_context(lon_ctxt)

        # Construct temporal and spatial Coordinate Reference System objects
        tcrs = CRS([AxisTypeEnum.TIME])
        scrs = CRS([AxisTypeEnum.LON, AxisTypeEnum.LAT])

        # Construct temporal and spatial Domain objects
        tdom = GridDomain(GridShape('temporal', [0]), tcrs, MutabilityEnum.EXTENSIBLE) # 1d (timeline)
        sdom = GridDomain(GridShape('spatial', [0]), scrs, MutabilityEnum.IMMUTABLE) # 0d spatial topology (station/trajectory)

        # Instantiate the SimplexCoverage providing the ParameterDictionary, spatial Domain and temporal Domain
        scov = SimplexCoverage(self.working_dir, create_guid(), 'sample coverage_model', parameter_dictionary=pdict, temporal_domain=tdom, spatial_domain=sdom, inline_data_writes=True, in_memory_storage=False)

        # Insert some timesteps (automatically expands other arrays)
        nt = 200000

        # Add data for each parameter
        data = { scov.temporal_parameter_name: np.arange(nt),
                 'lat': np.empty(nt),
                 'lon': np.empty(nt)
        }
        data['lat'][:] = 45
        data['lon'][:] = -71
        scov.set_parameter_values(make_parameter_data_dict(data))

        dset = Dataset()
        dset.parameter_dictionary = pdict.dump()
        dset.spatial_domain = sdom.dump()
        dset.temporal_domain = tdom.dump()

        return scov, dset
Пример #4
0
 def _make_dataset(self):
     tdom, sdom = time_series_domain()
     sdom = sdom.dump()
     tdom = tdom.dump()
     parameter_dict_id = self.dataset_management.read_parameter_dictionary_by_name(
         'ctd_parsed_param_dict', id_only=True)
     dataset = Dataset(name='test_dataset')
     dataset_id = self.dataset_management.create_dataset(
         dataset, parameter_dictionary_id=parameter_dict_id)
     return dataset_id
Пример #5
0
    def create_dataset(self, parameter_dict_id=''):
        '''
        Creates a time-series dataset
        '''
        if not parameter_dict_id:
            parameter_dict_id = self.dataset_management.read_parameter_dictionary_by_name('ctd_parsed_param_dict', id_only=True)

        dataset = Dataset('test_dataset_%i'%self.i)
        dataset_id = self.dataset_management.create_dataset(dataset, parameter_dictionary_id=parameter_dict_id)
        self.addCleanup(self.dataset_management.delete_dataset, dataset_id)
        return dataset_id
Пример #6
0
    def test_dataset_crud(self):
        pdict_id = self.dataset_management.read_parameter_dictionary_by_name(
            'ctd_parsed_param_dict', id_only=True)
        dataset = Dataset(name='ctd_dataset')
        dataset_id = self.dataset_management.create_dataset(
            dataset, parameter_dictionary_id=pdict_id)

        ds_obj = self.dataset_management.read_dataset(dataset_id)
        self.assertEquals(ds_obj.name, 'ctd_dataset')

        ds_obj.name = 'something different'
        self.dataset_management.update_dataset(ds_obj)
        ds_obj2 = self.dataset_management.read_dataset(dataset_id)
        self.assertEquals(ds_obj.name, ds_obj2.name)
Пример #7
0
    def create_dataset(self, parameter_dict_id=''):
        '''
        Creates a time-series dataset
        '''
        dataset_management = DatasetManagementServiceClient()
        if not parameter_dict_id:
            parameter_dict_id = dataset_management.read_parameter_dictionary_by_name(
                'ctd_parsed_param_dict', id_only=True)

        dataset = Dataset(name='test_dataset_')

        dataset_id = dataset_management.create_dataset(
            dataset, parameter_dictionary_id=parameter_dict_id)
        self.addCleanup(dataset_management.delete_dataset, dataset_id)
        return dataset_id
    def create_dataset(self, name='', datastore_name='', view_name='', stream_id='', parameter_dict=None, parameter_dictionary_id='', description='', parent_dataset_id=''):
        
        validate_true(parameter_dict or parameter_dictionary_id, 'A parameter dictionary must be supplied to register a new dataset.')
        
        if parameter_dictionary_id:
            pd = self.read_parameter_dictionary(parameter_dictionary_id)
            pcs = self.read_parameter_contexts(parameter_dictionary_id, id_only=False)
            parameter_dict = self._merge_contexts([ParameterContext.load(i.parameter_context) for i in pcs], pd.temporal_context)
            parameter_dict = parameter_dict.dump()

        parameter_dict = self.numpy_walk(parameter_dict)

        dataset                      = Dataset()
        dataset.description          = description
        dataset.name                 = name
        dataset.primary_view_key     = stream_id or None
        dataset.datastore_name       = datastore_name or self.DEFAULT_DATASTORE
        dataset.view_name            = view_name or self.DEFAULT_VIEW
        dataset.parameter_dictionary = parameter_dict
        dataset.registered           = False

        

        dataset_id, _ = self.clients.resource_registry.create(dataset)
        if stream_id:
            self.add_stream(dataset_id, stream_id)

        log.debug('creating dataset: %s', dataset_id)
        if parent_dataset_id:
            vcov = self._create_view_coverage(dataset_id, description or dataset_id, parent_dataset_id)
            vcov.close()
            return dataset_id

        cov = self._create_coverage(dataset_id, description or dataset_id, parameter_dict)
        self._save_coverage(cov)
        cov.close()

        #table loader create resource
        if self._get_eoi_service_available():
            log.debug('DM:create dataset: %s -- dataset_id: %s', name, dataset_id)
            self._create_single_resource(dataset_id, parameter_dict)


        return dataset_id
    def create_dataset(self,
                       name='',
                       datastore_name='',
                       view_name='',
                       stream_id='',
                       parameter_dict=None,
                       spatial_domain=None,
                       temporal_domain=None,
                       parameter_dictionary_id='',
                       description='',
                       parent_dataset_id=''):
        validate_true(
            parameter_dict or parameter_dictionary_id,
            'A parameter dictionary must be supplied to register a new dataset.'
        )
        validate_is_not_none(
            spatial_domain,
            'A spatial domain must be supplied to register a new dataset.')
        validate_is_not_none(
            temporal_domain,
            'A temporal domain must be supplied to register a new dataset.')

        if parameter_dictionary_id:
            pd = self.read_parameter_dictionary(parameter_dictionary_id)
            pcs = self.read_parameter_contexts(parameter_dictionary_id,
                                               id_only=False)
            parameter_dict = self._merge_contexts(
                [ParameterContext.load(i.parameter_context) for i in pcs],
                pd.temporal_context)
            parameter_dict = parameter_dict.dump()

        parameter_dict = self.numpy_walk(parameter_dict)

        dataset = Dataset()
        dataset.description = description
        dataset.name = name
        dataset.primary_view_key = stream_id or None
        dataset.datastore_name = datastore_name or self.DEFAULT_DATASTORE
        dataset.view_name = view_name or self.DEFAULT_VIEW
        dataset.parameter_dictionary = parameter_dict
        dataset.temporal_domain = temporal_domain
        dataset.spatial_domain = spatial_domain
        dataset.registered = False

        dataset_id, _ = self.clients.resource_registry.create(dataset)
        if stream_id:
            self.add_stream(dataset_id, stream_id)

        log.debug('creating dataset: %s', dataset_id)
        if parent_dataset_id:
            vcov = self._create_view_coverage(dataset_id, description
                                              or dataset_id, parent_dataset_id)
            vcov.close()
            return dataset_id

        cov = self._create_coverage(dataset_id, description or dataset_id,
                                    parameter_dict, spatial_domain,
                                    temporal_domain)
        self._save_coverage(cov)
        cov.close()

        return dataset_id
Пример #10
0
    def test_scion_agent(self):
        # Create user
        actor_id = self.scion_client.define_user(first_name="John",
                                                 last_name="Doe",
                                                 username="******",
                                                 password="******",
                                                 email="*****@*****.**")

        inst_ids = []
        ds_ids = []
        for source in sources:

            # Instrument
            agent_info = [
                dict(
                    agent_type="data_agent",
                    config=dict(
                        plugin=
                        "scion.agent.model.orb.orb_plugin.Orb_DataAgentPlugin",
                        sampling_interval=0.5,
                        stream_name="basic_streams",
                        auto_streaming=False))
            ]
            inst_obj = Instrument(
                name=source,
                description="Multiplexed generic compressed data frame packet",
                location=GeospatialLocation(latitude=42.867079,
                                            longitude=-127.257324),
                agent_info=agent_info)
            inst_id, _ = self.rr.create(inst_obj, actor_id=actor_id)
            inst_ids.append(inst_id)

            # Dataset
            schema_def = DataSchemaParser.parse_schema_ref("ds_orb_mgenc_m40")
            ds_obj = Dataset(name=source, schema_definition=schema_def)
            ds_id, _ = self.rr.create(ds_obj, actor_id=actor_id)
            self.rr.create_association(inst_id, PRED.hasDataset, ds_id)

            ds_filename = self.container.file_system.get(
                "%s/%s%s.hdf5" % (DS_BASE_PATH, DS_FILE_PREFIX, ds_id))
            self.assertFalse(os.path.exists(ds_filename))

            inst_data_t0 = self.scion_client.get_asset_data(inst_id)
            self.assertEquals(inst_data_t0["dataset_id"], ds_id)
            self.assertEquals(inst_data_t0["num_rows"], 0)
            ds_ids.append(ds_id)

        # Install a data packet catcher
        # TODO

        # Start agent
        sacs = []
        for idx, source in enumerate(sources):
            self.assertFalse(
                StreamingAgentClient.is_agent_active(inst_ids[idx]))
            agent_pid = self.scion_client.start_agent(inst_ids[idx])
            self.assertTrue(StreamingAgentClient.is_agent_active(
                inst_ids[idx]))

            sac = StreamingAgentClient(resource_id=inst_ids[idx],
                                       process=self.scion_proc)
            agent_status = sac.get_status()
            self.assertEquals(agent_status["current_state"],
                              StreamingAgent.AGENTSTATE_INITIALIZED)

            sac.connect()
            agent_status = sac.get_status()
            self.assertEquals(agent_status["current_state"],
                              StreamingAgent.AGENTSTATE_CONNECTED)

            # Coming in from the agent config.
            streaming_args = {
                #'orb_name' : 'taexport.ucsd.edu:usarrayTA',
                'orb_name': 'ceusnexport.ucsd.edu:usarray',
                'select': source,
                '--timeout': 5,
                'sample_interval': 5
            }

            sac.start_streaming(streaming_args)
            agent_status = sac.get_status()
            self.assertEquals(agent_status["current_state"],
                              StreamingAgent.AGENTSTATE_STREAMING)
            sacs.append(sac)

        gevent.sleep(120)

        # Take down agent
        for idx, sac in enumerate(sacs):
            #sac.stop_streaming()  # Not required to stop agent, just to test here
            #agent_status = sac.get_status()
            #self.assertEquals(agent_status["current_state"], StreamingAgent.AGENTSTATE_CONNECTED)

            #sac.disconnect()
            #agent_status = sac.get_status()
            #self.assertEquals(agent_status["current_state"], StreamingAgent.AGENTSTATE_INITIALIZED)

            self.scion_client.stop_agent(inst_ids[idx])
            self.assertFalse(
                StreamingAgentClient.is_agent_active(inst_ids[idx]))
Пример #11
0
    def test_scion_agent(self):
        # Create user
        actor_id = self.scion_client.define_user(first_name="John",
                                                 last_name="Doe",
                                                 username="******",
                                                 password="******",
                                                 email="*****@*****.**")

        # Create instrument
        agent_info = [
            dict(agent_type="data_agent",
                 config=dict(
                     plugin=
                     "scion.agent.model.cdip.cdip_plugin.CDIP_DataAgentPlugin",
                     sampling_interval=10,
                     stream_name="basic_streams",
                     auto_streaming=False))
        ]
        inst_obj = Instrument(name="TA_121A/MGENC/M40",
                              description="CDIP buoy data",
                              location=GeospatialLocation(
                                  latitude=37.94831666666667,
                                  longitude=-123.4675),
                              agent_info=agent_info)
        inst_id, _ = self.rr.create(inst_obj, actor_id=actor_id)

        # Create dataset
        schema_def = DataSchemaParser.parse_schema_ref("ds_cdip01_main")
        ds_obj = Dataset(name="Dataset Sensor", schema_definition=schema_def)
        ds_id, _ = self.rr.create(ds_obj, actor_id=actor_id)

        self.rr.create_association(inst_id, PRED.hasDataset, ds_id)

        ds_filename = self.container.file_system.get(
            "%s/%s%s.hdf5" % (DS_BASE_PATH, DS_FILE_PREFIX, ds_id))
        self.assertFalse(os.path.exists(ds_filename))

        inst_data_t0 = self.scion_client.get_asset_data(inst_id)
        self.assertEquals(inst_data_t0["dataset_id"], ds_id)
        self.assertEquals(inst_data_t0["num_rows"], 0)

        # Install a data packet catcher
        self.recv_packets, self.recv_rows = [], 0

        def process_packet_cb(packet, route, stream):
            if not isinstance(packet, DataPacket):
                log.warn("Received a non DataPacket message")
            self.recv_packets.append(packet)
            self.recv_rows += len(packet.data["data"])
            log.info("Received data packet #%s: rows=%s, cols=%s",
                     len(self.recv_packets), len(packet.data["data"]),
                     packet.data["cols"])
            #log.info('Packet data: ' + str(packet.data))
        def cleanup_stream_sub():
            if self.stream_sub:
                self.stream_sub.stop()
                self.stream_sub = None

        self.stream_sub = StreamSubscriber(process=self.scion_proc,
                                           stream="basic_streams",
                                           callback=process_packet_cb)
        self.stream_sub.start()

        self.addCleanup(cleanup_stream_sub)

        # Start agent
        self.assertFalse(StreamingAgentClient.is_agent_active(inst_id))

        agent_pid = self.scion_client.start_agent(inst_id)

        self.assertTrue(StreamingAgentClient.is_agent_active(inst_id))

        sac = StreamingAgentClient(resource_id=inst_id,
                                   process=self.scion_proc)
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"],
                          StreamingAgent.AGENTSTATE_INITIALIZED)

        sac.connect()
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"],
                          StreamingAgent.AGENTSTATE_CONNECTED)

        # Coming in from the agent config.
        streaming_args = {
            'url': 'http://cdip.ucsd.edu/data_access/justdar.cdip?029+pm',
            'sampling_interval': 10
        }

        sac.start_streaming(streaming_args)
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"],
                          StreamingAgent.AGENTSTATE_STREAMING)

        # Set to progressively high values for real data stream tests.
        gevent.sleep(20)

        # Retrieve data
        self.assertTrue(os.path.exists(ds_filename))

        inst_data = self.scion_client.get_asset_data(inst_id)
        """
        {'data': {'Dp': [[1465682100000, 325]],
            'Hs': [[1465682100000, 3.03]],
            'Ta': [[1465682100000, 6.92]],
            'Temp': [[1465682100000, 12.2]],
            'Tp': [[1465682100000, 9.09]]},
         'dataset_id': '08bc829159e6401182462b713b180dbe',
         'num_rows': 1,
         'ts_generated': '1465685467675',
         'var_def': [{'base_type': 'ntp_time',
              'description': 'NTPv4 timestamp',
              'name': 'time',
              'storage_dtype': 'i8',
              'unit': ''},
             {'base_type': 'float',
              'description': 'Significant wave height',
              'name': 'Hs',
              'storage_dtype': 'f8',
              'unit': 'meters'},
             {'base_type': 'float',
              'description': 'Peak wave period',
              'name': 'Tp',
              'storage_dtype': 'f8',
              'unit': 'seconds'},
             {'base_type': 'int',
              'description': 'Peak wave direction',
              'name': 'Dp',
              'storage_dtype': 'i4',
              'unit': 'degrees'},
             {'base_type': 'float',
              'description': 'Average wave period',
              'name': 'Ta',
              'storage_dtype': 'f8',
              'unit': 'seconds'},
             {'base_type': 'float',
              'description': 'Surface temperature',
              'name': 'Temp',
              'storage_dtype': 'f8',
              'unit': 'celcius'}],
         'variables': ['time', 'Hs', 'Tp', 'Dp', 'Ta', 'Temp']}
        """
        num_rows = inst_data["num_rows"]
        log.info('CDIP test produced %i data rows.' % num_rows)

        # Take down agent
        sac.stop_streaming()  # Not required to stop agent, just to test here
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"],
                          StreamingAgent.AGENTSTATE_CONNECTED)

        sac.disconnect()
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"],
                          StreamingAgent.AGENTSTATE_INITIALIZED)

        self.scion_client.stop_agent(inst_id)

        self.assertFalse(StreamingAgentClient.is_agent_active(inst_id))
Пример #12
0
    def test_scion_agent(self):
        # Create user
        actor_id = self.scion_client.define_user(
                first_name="John", last_name="Doe",
                username="******", password="******", email="*****@*****.**")

        # Create instrument
        agent_info=[dict(agent_type="data_agent",
                         config=dict(plugin="scion.agent.model.orb.orb_plugin.Orb_DataAgentPlugin",
                                     sampling_interval=0.5, stream_name="basic_streams",
                                     auto_streaming=False))]
        inst_obj = Instrument(name="TA_121A/MGENC/M40", description="Multiplexed generic compressed data frame packet",
                              location=GeospatialLocation(latitude=42.867079, longitude=-127.257324),
                              agent_info=agent_info)
        inst_id, _ = self.rr.create(inst_obj, actor_id=actor_id)

        # Create dataset
        schema_def = DataSchemaParser.parse_schema_ref("ds_orb_mgenc_m40")
        ds_obj = Dataset(name="Dataset Sensor 3",
                         schema_definition=schema_def)
        ds_id, _ = self.rr.create(ds_obj, actor_id=actor_id)

        self.rr.create_association(inst_id, PRED.hasDataset, ds_id)

        ds_filename = self.container.file_system.get("%s/%s%s.hdf5" % (DS_BASE_PATH, DS_FILE_PREFIX, ds_id))
        self.assertFalse(os.path.exists(ds_filename))

        inst_data_t0 = self.scion_client.get_asset_data(inst_id)
        self.assertEquals(inst_data_t0["dataset_id"], ds_id)
        self.assertEquals(inst_data_t0["num_rows"], 0)

        # Install a data packet catcher
        self.recv_packets, self.recv_rows = [], 0
        def process_packet_cb(packet, route, stream):
            if not isinstance(packet, DataPacket):
                log.warn("Received a non DataPacket message")
            self.recv_packets.append(packet)
            self.recv_rows += len(packet.data["data"])
            log.info("Received data packet #%s: rows=%s, cols=%s", len(self.recv_packets), len(packet.data["data"]),
                     packet.data["cols"])
            #log.info('Packet data: ' + str(packet.data))
        def cleanup_stream_sub():
            if self.stream_sub:
                self.stream_sub.stop()
                self.stream_sub = None

        self.stream_sub = StreamSubscriber(process=self.scion_proc, stream="basic_streams", callback=process_packet_cb)
        self.stream_sub.start()
        
        self.addCleanup(cleanup_stream_sub)

        # Start agent
        self.assertFalse(StreamingAgentClient.is_agent_active(inst_id))

        agent_pid = self.scion_client.start_agent(inst_id)

        self.assertTrue(StreamingAgentClient.is_agent_active(inst_id))

       
        sac = StreamingAgentClient(resource_id=inst_id, process=self.scion_proc)
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"], StreamingAgent.AGENTSTATE_INITIALIZED)

        sac.connect()
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"], StreamingAgent.AGENTSTATE_CONNECTED)

        # Coming in from the agent config.
        streaming_args = { 
            'orb_name' : 'taexport.ucsd.edu:usarrayTA',
            #'select' : 'TA_109C/MGENC/M40',
            'select' : 'TA_121A/MGENC/M40',
            '--timeout' : 5,
            'sample_interval' : 5 
        }

        sac.start_streaming(streaming_args)
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"], StreamingAgent.AGENTSTATE_STREAMING)

        gevent.sleep(180)

        # Retrieve data
        """
        gevent.sleep(1)
        self.assertTrue(os.path.exists(ds_filename))

        inst_data_t1 = self.scion_client.get_asset_data(inst_id)
        self.assertEquals(inst_data_t1["dataset_id"], ds_id)
        self.assertEquals(inst_data_t1["variables"], ['time', 'cpu_percent'])
        self.assertIn("cpu_percent", inst_data_t1["data"])
        num_rows_t1 = inst_data_t1["num_rows"]
        self.assertGreaterEqual(num_rows_t1, 2)

        gevent.sleep(1)
        inst_data_t2 = self.scion_client.get_asset_data(inst_id)
        num_rows_t2 = inst_data_t2["num_rows"]
        self.assertGreater(num_rows_t2, num_rows_t1)

        self.assertGreaterEqual(len(self.recv_packets), self.recv_rows)
        self.assertLessEqual(abs(self.recv_rows - num_rows_t2), 2)
        """

        # Take down agent
        sac.stop_streaming()  # Not required to stop agent, just to test here
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"], StreamingAgent.AGENTSTATE_CONNECTED)

        sac.disconnect()
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"], StreamingAgent.AGENTSTATE_INITIALIZED)

        self.scion_client.stop_agent(inst_id)

        self.assertFalse(StreamingAgentClient.is_agent_active(inst_id))
Пример #13
0
    def test_scion_agent(self):
        # Create user
        actor_id = self.scion_client.define_user(first_name="John",
                                                 last_name="Doe",
                                                 username="******",
                                                 password="******",
                                                 email="*****@*****.**")

        # Create instrument
        data_filename = os.path.join(
            os.path.split(__file__)[0], "testdata/orb_replay_data.yml")
        agent_info = [
            dict(
                agent_type="data_agent",
                config=dict(
                    plugin=
                    "scion.agent.model.orb.orb_replay_plugin.ORBReplay_DataAgentPlugin",
                    sampling_interval=0.2,
                    stream_name="basic_streams",
                    replay_file=data_filename,
                    replay_scenario="basic",
                    auto_streaming=False))
        ]
        inst_obj = Instrument(name="ORB Sensor 1",
                              description="Seismic stream",
                              location=GeospatialLocation(
                                  latitude=32.867079, longitude=-117.257324),
                              agent_info=agent_info)
        inst_id, _ = self.rr.create(inst_obj, actor_id=actor_id)

        # Create dataset
        schema_def = DataSchemaParser.parse_schema_ref("ds_orb01_main")
        ds_obj = Dataset(name="ORB Dataset 1", schema_definition=schema_def)
        ds_id, _ = self.rr.create(ds_obj, actor_id=actor_id)

        self.rr.create_association(inst_id, PRED.hasDataset, ds_id)

        ds_filename = self.container.file_system.get(
            "%s/%s%s.hdf5" % (DS_BASE_PATH, DS_FILE_PREFIX, ds_id))

        # Install a data packet catcher
        self.recv_packets, self.recv_rows = [], 0

        def process_packet_cb(packet, route, stream):
            if not isinstance(packet, DataPacket):
                log.warn("Received a non DataPacket message")
            self.recv_packets.append(packet)
            self.recv_rows += len(packet.data["data"])
            log.info("Received data packet #%s: rows=%s, cols=%s",
                     len(self.recv_packets), len(packet.data["data"]),
                     packet.data["cols"])

        def cleanup_stream_sub():
            if self.stream_sub:
                self.stream_sub.stop()
                self.stream_sub = None

        self.stream_sub = StreamSubscriber(process=self.scion_proc,
                                           stream="basic_streams",
                                           callback=process_packet_cb)
        self.stream_sub.start()

        self.addCleanup(cleanup_stream_sub)

        # Start agent
        agent_pid = self.scion_client.start_agent(inst_id)

        self.assertTrue(StreamingAgentClient.is_agent_active(inst_id))

        sac = StreamingAgentClient(resource_id=inst_id,
                                   process=self.scion_proc)
        sac.connect()
        sac.start_streaming()
        agent_status = sac.get_status()
        self.assertEquals(agent_status["current_state"],
                          StreamingAgent.AGENTSTATE_STREAMING)

        # Retrieve data
        gevent.sleep(1.5)
        self.assertTrue(os.path.exists(ds_filename))
        inst_data_t2 = self.scion_client.get_asset_data(inst_id)
        print "T2", inst_data_t2

        num_rows_t2 = inst_data_t2["num_rows"]
        self.assertEquals(num_rows_t2, 40)
        sample_data = inst_data_t2["data"]["sample_vector"]
        self.assertEquals(sample_data[0][1], 100)
        self.assertEquals(sample_data[39][1], 409)
        self.assertEquals(sample_data[1][0] - sample_data[0][0], 100)
        self.assertEquals(sample_data[39][0] - sample_data[0][0], 3900)

        # Take down agent
        sac.stop_streaming()  # Not required to stop agent, just to test here
        sac.disconnect()
        self.scion_client.stop_agent(inst_id)

        self.assertFalse(StreamingAgentClient.is_agent_active(inst_id))

        inst_data = self.scion_client.get_asset_data(
            inst_id, data_filter=dict(max_rows=20))
        self.assertEquals(len(inst_data["data"]["sample_vector"]), 20)
        self.assertEquals(inst_data["data"]["sample_vector"][0][1], 300)

        inst_data = self.scion_client.get_asset_data(
            inst_id, data_filter=dict(start_time="1460694001000"))
        self.assertEquals(len(inst_data["data"]["sample_vector"]), 30)
        self.assertEquals(inst_data["data"]["sample_vector"][0][1], 200)

        # Note: Time filter applies before expansion
        inst_data = self.scion_client.get_asset_data(
            inst_id,
            data_filter=dict(start_time="1460694001000",
                             start_time_include=False))
        self.assertEquals(len(inst_data["data"]["sample_vector"]), 20)
        self.assertEquals(inst_data["data"]["sample_vector"][0][1], 300)

        inst_data = self.scion_client.get_asset_data(
            inst_id, data_filter=dict(start_time="1460694001000", max_rows=10))
        self.assertEquals(len(inst_data["data"]["sample_vector"]), 10)
        self.assertEquals(inst_data["data"]["sample_vector"][0][1], 400)

        inst_data = self.scion_client.get_asset_data(
            inst_id,
            data_filter=dict(start_time="1460694001000",
                             end_time="1460694002000"))
        print inst_data
        self.assertEquals(len(inst_data["data"]["sample_vector"]), 20)
        self.assertEquals(inst_data["data"]["sample_vector"][0][1], 200)