def test_update_value_tags(config, root_client, clean_db, one_node): iv = IsacValue(one_node, 'test://test_update/test_update_value_tags/test', static_tags={'static': 'tag'}, survey_last_value=False, survey_static_tags=False) try: archiver = arch.InfluxDBArchiver(config) iv.value = randint(0, 100) green.sleep(0.25) stored_values = read_data(config, root_client, 'SELECT * FROM /.*/ GROUP BY authority, path ORDER BY time DESC LIMIT 1') for uri, points in stored_values.items(): assert uri == iv.uri assert points[0]['value_int'] == iv.value compare_time(points[0]['time'], iv.timestamp) assert points[0]['d_peer_name'] == iv.isac_node.transport.name() assert points[0]['d_peer_uuid'] == str(iv.isac_node.transport.uuid()) assert points[0]['s_static'] == iv.static_tags['static'] iv.tags['test'] = str(randint(0, 100)) iv.value = randint(0, 100) green.sleep(0.25) stored_values = read_data(config, root_client, 'SELECT * FROM /.*/ GROUP BY authority, path ORDER BY time DESC LIMIT 1') for uri, points in stored_values.items(): assert uri == iv.uri assert points[0]['value_int'] == iv.value compare_time(points[0]['time'], iv.timestamp) assert points[0]['d_test'] == iv.tags['test'] assert points[0]['d_peer_name'] == iv.isac_node.transport.name() assert points[0]['d_peer_uuid'] == str(iv.isac_node.transport.uuid()) assert points[0]['s_static'] == iv.static_tags['static'] finally: archiver.shutdown()
def test_creation_no_init(two_nodes): nA, nB = two_nodes uri = 'test://test_isac_value/test_creation_no_init/test_no_init' ivA = IsacValue(nA, uri, survey_static_tags=False) assert ivA.value is None assert ivA.timestamp == datetime(1970, 1, 1, 0, 0) assert ivA.static_tags == {} assert ivA.tags == {} assert ivA.metadata is None ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivB.value is None assert ivB.timestamp == datetime(1970, 1, 1, 0, 0) assert ivB.static_tags == {} assert ivB.tags == {} assert ivB.metadata is None ivB = None ivA.value = randint(0, 100) ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivB.value == ivA.value assert ivB.timestamp == ivA.timestamp assert ivB.static_tags == {} assert ivB.tags == nA.name_uuid() assert ivB.metadata is None
def test_creation_no_init(two_nodes): # noqa: F811 nA, nB = two_nodes uri = 'test://test_isac_value/test_creation_no_init/test_no_init' ivA = IsacValue(nA, uri, survey_static_tags=False) assert ivA.value is None assert ivA.timestamp == datetime(1970, 1, 1, 0, 0) assert ivA.static_tags == {} assert ivA.tags == {} assert ivA.metadata is None ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivB.value is None assert ivB.timestamp == datetime(1970, 1, 1, 0, 0) assert ivB.static_tags == {} assert ivB.tags == {} assert ivB.metadata is None ivB = None ivA.value = randint(0, 100) ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivB.value == ivA.value assert ivB.timestamp == ivA.timestamp assert ivB.static_tags == {} assert ivB.tags == nA.name_uuid() assert ivB.metadata is None
def test_property_tags(two_nodes): # noqa: F811 nA, nB = two_nodes uri = 'test://test_isac_value/test_property_tags/test_property_tags' dynamic_tags = {'this': 'is', 'dynamic': 'tags'} dynamic_tags_full = dynamic_tags dynamic_tags_full.update(nA.name_uuid()) dynamic_tags2 = {'this': 'is', 'dynamic': 'tags', 'additional': 'tag'} dynamic_tags2_full = dynamic_tags2 dynamic_tags2_full.update(nA.name_uuid()) ivA = IsacValue(nA, uri, randint(0, 100), dynamic_tags=dict(dynamic_tags), survey_last_value=False, survey_static_tags=False) ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivA.tags == dynamic_tags_full assert ivB.tags == dynamic_tags_full ivA.tags['additional'] = 'tag' ivA.value = randint(0, 100) assert ivA.tags == dynamic_tags2_full assert ivB.tags == dynamic_tags2_full
def test_creation_dynamic_tags(two_nodes): # noqa: F811 nA, nB = two_nodes uri = 'test://test_isac_value/test_creation_dynamic_tags/test_dynamic_tags' dynamic_tags = {'this': 'is', 'dynamic': 'tags'} dynamic_tags_full = dynamic_tags dynamic_tags_full.update(nA.name_uuid()) ivA = IsacValue(nA, uri, dynamic_tags=dynamic_tags, survey_last_value=False, survey_static_tags=False) assert ivA.tags == dynamic_tags ivB = IsacValue(nB, uri, survey_static_tags=False) # Did not get stored because the default timestamps (0) were equal in both cases assert ivB.tags == {} ivB = None ivA.value = randint(0, 100) ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivA.tags == dynamic_tags_full assert ivB.value == ivA.value assert ivB.timestamp == ivA.timestamp assert ivB.tags == dynamic_tags_full
def run(self): self.running = True while self.running: try: try: tag, data = _read_trame(self.ser.readline()) except BadChecksum: continue logger.debug('Read %s: %s', tag, data) if tag not in self.ALLOWED_TAGS: logger.warning('Discarding %s: %s', tag, data) continue try: signal = self.signals[tag] except KeyError: logger.info('Creating ISAC value for %s', tag) metadata = { 'ts_precision': 's', 'smoothing': True } signal = IsacValue( self.isac_node, 'tic://alidron-tic/%s' % tag, static_tags={'location': 'entrance.switchboard'}, metadata=metadata, survey_last_value=False, survey_static_tags=False ) self.signals[tag] = signal try: signal.value = int(data) except ValueError: signal.value = data except Exception as ex: logger.error('Hum, something weird: %s', ex)
def test_property_value(two_nodes): # noqa: F811 nA, nB = two_nodes uri = 'test://test_isac_value/test_property_value/test_property_value' ivA = IsacValue(nA, uri, survey_last_value=False, survey_static_tags=False) ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivA.value is None assert ivB.value is None v1 = randint(0, 100) ivA.value = v1 ts1 = ivA.timestamp assert ivA.value == v1 assert ivB.value == v1
def test_property_value(two_nodes): nA,nB = two_nodes uri = 'test://test_isac_value/test_property_value/test_property_value' ivA = IsacValue(nA, uri, survey_last_value=False, survey_static_tags=False) ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivA.value is None assert ivB.value is None v1 = randint(0, 100) ivA.value = v1 ts1 = ivA.timestamp assert ivA.value == v1 assert ivB.value == v1
def test_survey_last_value(two_nodes): nA, nB = two_nodes uri = 'test://test_survey_value/test_survey_last_value/my_value' iv = IsacValue(nA, uri, survey_last_value=False, survey_static_tags=False) # Uninitialised/new value have a None value at time 0 assert nB.survey_last_value(uri, limit_peers=1) == (None, 0, {}) iv.value = randint(0, 100) assert nB.survey_last_value(uri, limit_peers=1) == (iv.value, iv.timestamp_float, nA.name_uuid()) # Inexistent value are not an error, they simply return None at time 0 # (That is actually what give the default state of an uninitialised/new value behind the scene) assert nB.survey_last_value('test://test_survey_value/test_survey_last_value/inexistent', limit_peers=1) == (None, 0, {})
def test_smoothing_by_config(config, clean_db, one_node): t_start = datetime.now() iv = IsacValue(one_node, 'test://test_smoothing/test_smoothing_by_config/test', survey_last_value=False, survey_static_tags=False) try: config['config']['default_smoothing'] = True archiver = arch.InfluxDBArchiver(config) expected_history = [] def _save_point(): value, ts, tags = iv.value_ts_tags ts = degrade_time(ts) expected_history.append((value, ts, tags)) base = randint(0, 100) iv.value = base _save_point() iv.value += 10 _save_point() iv.value = iv.value iv.value = iv.value iv.value = iv.value iv.value = iv.value _save_point() iv.value += 10 _save_point() green.sleep(0.5) t_end = datetime.now() data = iv.get_history((t_start, t_end)) assert data == expected_history finally: archiver.shutdown() config['config']['default_smoothing'] = arch.DEFAULT_SMOOTHING
def test_observer_after_creation(two_nodes): nA, nB = two_nodes obs = Observer() uri = 'test://test_isac_value/test_observer/test_observer' ivA = IsacValue(nA, uri, static_tags={'this': 'is', 'static': 'tags'}, survey_last_value=False, survey_static_tags=False) ivB = IsacValue(nB, uri) ivB.observers += obs.observer ivA.value = randint(0, 100) green.sleep(0.5) assert obs.args, 'Callback not received' iv_recv, value, ts, tags = obs.args assert iv_recv == ivB assert value == ivA.value assert ts == ivA.timestamp assert tags == ivA.tags assert obs.static_tags == ivA.static_tags
def test_property_timestamp(two_nodes): # noqa: F811 nA, nB = two_nodes uri = 'test://test_isac_value/test_property_timestamp/test_property_timestamp' ivA = IsacValue(nA, uri, survey_last_value=False, survey_static_tags=False) ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivA.timestamp == datetime(1970, 1, 1, 0, 0) assert ivA.timestamp_float == 0 assert ivB.timestamp == datetime(1970, 1, 1, 0, 0) assert ivB.timestamp_float == 0 v1 = randint(0, 100) ivA.value = v1 ts1 = ivA.timestamp assert datetime.fromtimestamp(ivA.timestamp_float) == ts1 assert ivB.value == v1 assert ivB.timestamp == ts1 assert datetime.fromtimestamp(ivB.timestamp_float) == ts1
def test_property_timestamp(two_nodes): nA,nB = two_nodes uri = 'test://test_isac_value/test_property_timestamp/test_property_timestamp' ivA = IsacValue(nA, uri, survey_last_value=False, survey_static_tags=False) ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivA.timestamp == datetime(1970, 1, 1, 0, 0) assert ivA.timestamp_float == 0 assert ivB.timestamp == datetime(1970, 1, 1, 0, 0) assert ivB.timestamp_float == 0 v1 = randint(0, 100) ivA.value = v1 ts1 = ivA.timestamp assert datetime.fromtimestamp(ivA.timestamp_float) == ts1 assert ivB.value == v1 assert ivB.timestamp == ts1 assert datetime.fromtimestamp(ivB.timestamp_float) == ts1
def test_survey_last_value(two_nodes): # noqa: F811 nA, nB = two_nodes uri = 'test://test_survey_value/test_survey_last_value/my_value' iv = IsacValue(nA, uri, survey_last_value=False, survey_static_tags=False) # Uninitialised/new value have a None value at time 0 assert nB.survey_last_value(uri, limit_peers=1) == (None, 0, {}) iv.value = randint(0, 100) assert nB.survey_last_value( uri, limit_peers=1) == (iv.value, iv.timestamp_float, nA.name_uuid()) # Inexistent value are not an error, they simply return None at time 0 # (That is actually what give the default state of an uninitialised/new value behind the scene) assert nB.survey_last_value( 'test://test_survey_value/test_survey_last_value/inexistent', limit_peers=1 ) == (None, 0, {})
def test_property_tags(two_nodes): nA,nB = two_nodes uri = 'test://test_isac_value/test_property_tags/test_property_tags' dynamic_tags = {'this': 'is', 'dynamic': 'tags'} dynamic_tags_full = dynamic_tags dynamic_tags_full.update(nA.name_uuid()) dynamic_tags2 = {'this': 'is', 'dynamic': 'tags', 'additional': 'tag'} dynamic_tags2_full = dynamic_tags2 dynamic_tags2_full.update(nA.name_uuid()) ivA = IsacValue(nA, uri, randint(0, 100), dynamic_tags=dict(dynamic_tags), survey_last_value=False, survey_static_tags=False) ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivA.tags == dynamic_tags_full assert ivB.tags == dynamic_tags_full ivA.tags['additional'] = 'tag' ivA.value = randint(0, 100) assert ivA.tags == dynamic_tags2_full assert ivB.tags == dynamic_tags2_full
def test_buffer_on_db_deleted(config, root_client, clean_db, one_node): db = config['archiver-user']['db'] buffer_path = config['buffer']['path'] iv = IsacValue(one_node, 'test://test_buffer/test_buffer_on_db_deleted/test', survey_last_value=False, survey_static_tags=False) try: archiver = arch.InfluxDBArchiver(config) base = randint(0, 100) iv.value = base green.sleep(0.25) root_client.drop_database(db) iv.value += 10 iv.value += 10 green.sleep(0.25) assert os.path.exists(buffer_path) with open(buffer_path, 'r') as buffer_r: assert len(pickle.load(buffer_r)) == 2 archiver._create_db() iv.value += 10 green.sleep(0.5) assert not os.path.exists(buffer_path) stored_values = read_data(config, root_client, 'SELECT * FROM /.*/ GROUP BY authority, path ORDER BY time ASC') got_values = [] for uri, points in stored_values.items(): assert uri == iv.uri for point in points: got_values.append(point['value_int']) expected_values = [i for i in range(base+10, base+40, 10)] assert got_values == expected_values finally: archiver.shutdown()
def test_creation_dynamic_tags(two_nodes): nA, nB = two_nodes uri = 'test://test_isac_value/test_creation_dynamic_tags/test_dynamic_tags' dynamic_tags = {'this': 'is', 'dynamic': 'tags'} dynamic_tags_full = dynamic_tags dynamic_tags_full.update(nA.name_uuid()) ivA = IsacValue(nA, uri, dynamic_tags=dynamic_tags, survey_last_value=False, survey_static_tags=False) assert ivA.tags == dynamic_tags ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivB.tags == {} # Did not get stored because the default timestamps (0) were equal in both cases ivB = None ivA.value = randint(0, 100) ivB = IsacValue(nB, uri, survey_static_tags=False) assert ivA.tags == dynamic_tags_full assert ivB.value == ivA.value assert ivB.timestamp == ivA.timestamp assert ivB.tags == dynamic_tags_full
def test_get_history(config, clean_db, two_nodes): nA, nB = two_nodes t_start = datetime.now() uri = 'test://test_history/test_get_history/test' ivA = IsacValue(nA, uri, survey_last_value=False, survey_static_tags=False) try: archiver = arch.InfluxDBArchiver(config) our_history = [] for i in range(10): ivA.value = randint(0, 100) value, ts, tags = ivA.value_ts_tags ts = degrade_time(ts) our_history.append((value, ts, tags)) green.sleep(0.5) t_end = datetime.now() ivB = IsacValue(nB, uri, survey_last_value=False, survey_static_tags=False) data = ivB.get_history((t_start, t_end)) assert data == our_history finally: archiver.shutdown()
def test_observer_after_creation(two_nodes): # noqa: F811 nA, nB = two_nodes obs = Observer() uri = 'test://test_isac_value/test_observer/test_observer' ivA = IsacValue(nA, uri, static_tags={ 'this': 'is', 'static': 'tags' }, survey_last_value=False, survey_static_tags=False) ivB = IsacValue(nB, uri) ivB.observers += obs.observer ivA.value = randint(0, 100) green.sleep(0.5) assert obs.args, 'Callback not received' iv_recv, value, ts, tags = obs.args assert iv_recv == ivB assert value == ivA.value assert ts == ivA.timestamp assert tags == ivA.tags assert obs.static_tags == ivA.static_tags
def test_types_all(config, clean_db, one_node): t_start = datetime.now() iv = IsacValue(one_node, "test://test_types/test_types_all/test", survey_last_value=False, survey_static_tags=False) try: archiver = arch.InfluxDBArchiver(config) expected_history = [] def _save_point(): value, ts, tags = iv.value_ts_tags ts = degrade_time(ts) expected_history.append((value, ts, tags)) iv.value = randint(0, 100) _save_point() iv.value = random() * 100 _save_point() iv.value = False _save_point() iv.value = True _save_point() iv.value = "".join(choice(string.ascii_uppercase + string.digits) for _ in range(16)) _save_point() iv.value = {"a": 1, "b": 2, "c": 3} _save_point() t_end = datetime.now() data = iv.get_history((t_start, t_end)) assert len(data) == len(expected_history) for got, expected in zip(data, expected_history): if isinstance(expected[0], float): assert abs(got[0] - expected[0]) < 1e-10 assert got[1:] == expected[1:] else: assert got == expected finally: archiver.shutdown()
def _make_iv(node, uri): ivs[uri] = IsacValue(node, uri, static_tags={'nb': uri[-1]}, metadata={'leaf': uri[-4:]}, survey_last_value=False, survey_static_tags=False) ivs[uri].value = randint(0, 100)
def _make_iv(uri): iv = IsacValue(one_node, uri, static_tags={'nb': uri[-1]}, metadata={'leaf': uri[-3:], 'list': list('123456789'), 'dict': dict(zip(list('ABCDEFGHI'), list('123456789')))}, survey_last_value=False, survey_static_tags=False) iv.value = randint(0, 100) ivs[uri] = iv.value, iv.timestamp, iv.tags, iv.static_tags, iv.metadata