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()
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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
示例#6
0
    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)
示例#7
0
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
示例#8
0
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
示例#9
0
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
示例#11
0
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
示例#12
0
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
示例#13
0
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
示例#14
0
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, {})
示例#15
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()
示例#17
0
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()
示例#19
0
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