def test_creation_simple():
    """Test creation of a service document."""
    doc = ServiceDocument('myserviceid')
    assert doc.service_id == 'myserviceid'
    assert isinstance(doc.timestamp, datetime)
    assert doc.availability == 100

    print(doc.to_xml())

    assert doc.to_xml() == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>myserviceid</id>' \
        '<availability>100</availability>' \
        '<timestamp>{0}</timestamp>' \
        '</serviceupdate>'.format(doc.timestamp.isoformat())

    dt = datetime(2015, 1, 1, 0, 0, 0)
    doc = ServiceDocument('anotherid', timestamp=dt,
                          availability=99)

    assert doc.to_xml() == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>anotherid</id>' \
        '<availability>99</availability>' \
        '<timestamp>2015-01-01T00:00:00</timestamp>' \
        '</serviceupdate>'
Beispiel #2
0
    def publish(cls, metrics):
        """Publish service metrics to CERN XSLS service."""
        api_url = current_app.config.get('METRICS_XSLS_API_URL')
        service_id = current_app.config.get('METRICS_XSLS_SERVICE_ID')

        if api_url is None:
            raise RuntimeError("METRICS_XSLS_API_URL must be set.")
        if service_id is None:
            raise RuntimeError("METRICS_XSLS_SERVICE_ID must be set.")

        # Create service document.
        doc = ServiceDocument(
            service_id,
            contact=current_app.config.get('METRICS_XSLS_EMAIL'),
            webpage=current_app.config.get('METRICS_XSLS_WEBPAGE'),
        )

        for obj in metrics:
            doc.add_numericvalue(obj.metric, obj.value)

        # Compute availability
        try:
            avail_imp = current_app.config.get(
                'METRICS_XSLS_AVAILABILITY')
            if avail_imp:
                avail_func = import_string(avail_imp)
                doc.availability = avail_func(doc)
        except Exception:
            current_app.logger.exception("Could not compute availability")

        resp = XSLSPublisher.send(doc, api_url=api_url)
        if resp.status_code != 200:
            raise RuntimeError("%s did not accept service XML (status %s)" % (
                resp.content, resp.status_code), resp.content)
Beispiel #3
0
def test_creation_simple():
    """Test creation of a service document."""
    doc = ServiceDocument('myserviceid')
    assert doc.service_id == 'myserviceid'
    assert isinstance(doc.timestamp, datetime)
    assert doc.status == Status.available

    assert validate_xsd(doc.to_xml())
    assert doc.to_xml() == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>myserviceid</id>' \
        '<status>available</status>' \
        '<timestamp>{0}</timestamp>' \
        '</serviceupdate>'.format(doc.timestamp.isoformat())

    dt = datetime(2015, 1, 1, 0, 0, 0)
    doc = ServiceDocument('anotherid', timestamp=dt, status=Status.degraded)

    assert doc.to_xml() == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>anotherid</id>' \
        '<status>degraded</status>' \
        '<timestamp>2015-01-01T00:00:00</timestamp>' \
        '</serviceupdate>'
    assert validate_xsd(doc.to_xml())
Beispiel #4
0
def main():

    config = Config(BASE_DIR + '/configuration/')
    sqlite = Sqlite(BASE_DIR + '/storage/harvester.db', config.XMLconfiguration)
    pandadb = PandaDB(BASE_DIR + '/settings.ini')
    es = Es(BASE_DIR + '/settings.ini')

    metrics = pandadb.get_db_metrics()
    dictHarvesterHosts, dictHarvesterInstnaces = es.get_last_submittedtime()
    sqlite.instances_availability(dictHarvesterInstnaces, metrics)

    instances = sqlite.get_instances()

    for instance in instances:
        for harvesterhost in instances[instance]:
            if harvesterhost != 'none':
                availability = instances[instance][harvesterhost]['availability']
                notificated = instances[instance][harvesterhost]['notificated']
                contacts = instances[instance][harvesterhost]['contacts']
                text = instances[instance][harvesterhost]['errorsdesc']
                if (availability == 0 or availability == 10) and notificated == 0:
                    email = Notifications(text=text,
                                          subject='Service issues on {0} {1}'.format(instance, harvesterhost),
                                          to=contacts)
                    email.send_notification_email()
                    sqlite.update_field('notificated', 1, instance, harvesterhost)
                    email = {}
                elif availability == 100 and notificated == 1:
                    sqlite.update_field('notificated', 0, instance, harvesterhost)
                host = harvesterhost.split('.')[0]
                doc = ServiceDocument('harv_{0}_{1}'.format(instance, host), availability=availability, contact=','.join(contacts), availabilitydesc="PandaHarvester instance:{0}".format(instance), availabilityinfo="{0}".format(text))
                XSLSPublisher.send(doc)
                doc = {}
def test_outofbounds():
    """Test out of bounds values."""
    with pytest.raises(AssertionError):
        ServiceDocument(None)
    with pytest.raises(AssertionError):
        ServiceDocument(1234)
    with pytest.raises(AssertionError):
        ServiceDocument('id', timestamp='1234')
    with pytest.raises(AssertionError):
        ServiceDocument('id', status=100)
    with pytest.raises(AssertionError):
        ServiceDocument('id', status='not-a-status')
    doc = ServiceDocument('id')
    with pytest.raises(AssertionError):
        doc.add_numericvalue(1234, 'val')
    with pytest.raises(AssertionError):
        doc.add_numericvalue('name', 1234, desc=1234)
    with pytest.raises(AssertionError):
        doc.add_numericvalue('name', 'astring', desc=1234)
    # Remove in v0.3 (availability removed)
    with pytest.raises(AssertionError):
        ServiceDocument('id', availability=-1)
    with pytest.raises(AssertionError):
        ServiceDocument('id', availability=101)
    with pytest.raises(AssertionError):
        ServiceDocument('id', availability='100')
def test_creation_simple():
    """Test creation of a service document."""
    doc = ServiceDocument('myserviceid')
    assert doc.service_id == 'myserviceid'
    assert isinstance(doc.timestamp, datetime)
    assert doc.status == Status.available

    assert validate_xsd(doc.to_xml())
    assert doc.to_xml() == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>myserviceid</id>' \
        '<status>available</status>' \
        '<timestamp>{0}</timestamp>' \
        '</serviceupdate>'.format(doc.timestamp.isoformat())

    dt = datetime(2015, 1, 1, 0, 0, 0)
    doc = ServiceDocument('anotherid', timestamp=dt,
                          status=Status.degraded)

    assert doc.to_xml() == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>anotherid</id>' \
        '<status>degraded</status>' \
        '<timestamp>2015-01-01T00:00:00</timestamp>' \
        '</serviceupdate>'
    assert validate_xsd(doc.to_xml())
def test_creation_attrs():
    """Test non-mandatory attributes."""
    dt = datetime(2015, 1, 1, 0, 0, 0)
    doc = ServiceDocument(
        'myid',
        timestamp=dt,
        availabilitydesc='My description',
        contact='*****@*****.**',
        webpage='http://example.org',
        availabilityinfo='Extra info',
    )

    assert doc.to_xml() == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>myid</id>' \
        '<availability>100</availability>' \
        '<timestamp>2015-01-01T00:00:00</timestamp>' \
        '<availabilitydesc>My description</availabilitydesc>' \
        '<contact>[email protected]</contact>' \
        '<webpage>http://example.org</webpage>' \
        '<availabilityinfo>Extra info</availabilityinfo>' \
        '</serviceupdate>'
Beispiel #8
0
def test_creation_attrs():
    """Test non-mandatory attributes."""
    dt = datetime(2015, 1, 1, 0, 0, 0)
    doc = ServiceDocument(
        'myid',
        timestamp=dt,
        availabilitydesc='My description',
        contact='*****@*****.**',
        webpage='http://example.org',
        availabilityinfo='Extra info',
    )

    assert doc.to_xml() == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>myid</id>' \
        '<status>available</status>' \
        '<timestamp>2015-01-01T00:00:00</timestamp>' \
        '<availabilitydesc>My description</availabilitydesc>' \
        '<contact>[email protected]</contact>' \
        '<webpage>http://example.org</webpage>' \
        '<availabilityinfo>Extra info</availabilityinfo>' \
        '</serviceupdate>'
    assert validate_xsd(doc.to_xml())
Beispiel #9
0
def test_xslspublisher_send():
    """."""
    httpretty.register_uri(httpretty.POST, EXAMPLE_URL, body="", status=200)

    dt = datetime(2015, 1, 1, 0, 0, 0)
    doc = ServiceDocument('myid', timestamp=dt)
    resp = XSLSPublisher.send(doc, api_url=EXAMPLE_URL)
    assert resp.status_code == 200

    # Parse multipart/form-data (not supported by HTTPretty)
    content_type = httpretty.last_request().headers['Content-Type'].split(';')
    content_type = [x.strip() for x in content_type]
    key, boundary = content_type[1].split("=")
    data = cgi.parse_multipart(httpretty.last_request().rfile,
                               {'boundary': boundary.encode('utf-8')})

    assert 'file' in data
    assert data['file'][0].decode('utf-8') == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>myid</id><status>available</status>' \
        '<timestamp>2015-01-01T00:00:00</timestamp></serviceupdate>'
def test_availablity_to_status():
    """Test creation of a service document."""
    dt = datetime(2015, 1, 1, 0, 0, 0)
    doc = ServiceDocument('anotherid', timestamp=dt, availability=99)
    assert doc.status == Status.available
    assert doc.availability == 99
    assert validate_xsd(doc.to_xml())

    doc = ServiceDocument('anotherid', timestamp=dt, availability=60)
    assert doc.status == Status.degraded
    assert doc.availability == 60
    assert validate_xsd(doc.to_xml())

    doc = ServiceDocument('anotherid', timestamp=dt, availability=20)
    assert doc.status == Status.unavailable
    assert doc.availability == 20
    assert validate_xsd(doc.to_xml())

    with pytest.raises(AssertionError):
        doc = ServiceDocument('anid', timestamp=dt, status=Status.unavailable,
                              availability=20)

    doc = ServiceDocument('anotherid', timestamp=dt, status='available')
    assert doc.status == Status.available
    assert doc.availability == 100
    assert validate_xsd(doc.to_xml())

    doc = ServiceDocument('anotherid', timestamp=dt, status='degraded')
    assert doc.status == Status.degraded
    assert doc.availability == 50
    assert validate_xsd(doc.to_xml())

    doc = ServiceDocument('anotherid', timestamp=dt, status='unavailable')
    assert doc.status == Status.unavailable
    assert doc.availability == 0
    assert validate_xsd(doc.to_xml())
def test_numericvalue():
    """Test adding numeric data to service."""
    dt = datetime(2015, 1, 1, 0, 0, 0)
    doc = ServiceDocument('myid', timestamp=dt)
    doc.add_numericvalue('val1', 1234)
    doc.add_numericvalue('val2', 12.34)
    doc.add_numericvalue('val3', Decimal("0.1"))
    doc.add_numericvalue('val4', Decimal("0.1") + Decimal("0.2"))
    doc.add_numericvalue('val5', 1234, desc="a desc")
    doc.add_numericvalue('val6', long_type(1234))

    assert doc.to_xml() == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>myid</id>' \
        '<status>available</status>' \
        '<timestamp>2015-01-01T00:00:00</timestamp>' \
        '<data>' \
        '<numericvalue name="val1">1234</numericvalue>' \
        '<numericvalue name="val2">12.34</numericvalue>' \
        '<numericvalue name="val3">0.1</numericvalue>' \
        '<numericvalue name="val4">0.3</numericvalue>' \
        '<numericvalue desc="a desc" name="val5">1234</numericvalue>' \
        '<numericvalue name="val6">1234</numericvalue>' \
        '</data>' \
        '</serviceupdate>'
    assert validate_xsd(doc.to_xml())
Beispiel #12
0
def test_availablity_to_status():
    """Test creation of a service document."""
    dt = datetime(2015, 1, 1, 0, 0, 0)
    doc = ServiceDocument('anotherid', timestamp=dt, availability=99)
    assert doc.status == Status.available
    assert doc.availability == 99
    assert validate_xsd(doc.to_xml())

    doc = ServiceDocument('anotherid', timestamp=dt, availability=60)
    assert doc.status == Status.degraded
    assert doc.availability == 60
    assert validate_xsd(doc.to_xml())

    doc = ServiceDocument('anotherid', timestamp=dt, availability=20)
    assert doc.status == Status.unavailable
    assert doc.availability == 20
    assert validate_xsd(doc.to_xml())

    with pytest.raises(AssertionError):
        doc = ServiceDocument('anid',
                              timestamp=dt,
                              status=Status.unavailable,
                              availability=20)

    doc = ServiceDocument('anotherid', timestamp=dt, status='available')
    assert doc.status == Status.available
    assert doc.availability == 100
    assert validate_xsd(doc.to_xml())

    doc = ServiceDocument('anotherid', timestamp=dt, status='degraded')
    assert doc.status == Status.degraded
    assert doc.availability == 50
    assert validate_xsd(doc.to_xml())

    doc = ServiceDocument('anotherid', timestamp=dt, status='unavailable')
    assert doc.status == Status.unavailable
    assert doc.availability == 0
    assert validate_xsd(doc.to_xml())
Beispiel #13
0
def test_numericvalue():
    """Test adding numeric data to service."""
    dt = datetime(2015, 1, 1, 0, 0, 0)
    doc = ServiceDocument('myid', timestamp=dt)
    doc.add_numericvalue('val1', 1234)
    doc.add_numericvalue('val2', 12.34)
    doc.add_numericvalue('val3', Decimal("0.1"))
    doc.add_numericvalue('val4', Decimal("0.1") + Decimal("0.2"))
    doc.add_numericvalue('val5', 1234, desc="a desc")
    doc.add_numericvalue('val6', long_type(1234))

    assert doc.to_xml() == \
        '<serviceupdate xmlns="http://sls.cern.ch/SLS/XML/update">' \
        '<id>myid</id>' \
        '<status>available</status>' \
        '<timestamp>2015-01-01T00:00:00</timestamp>' \
        '<data>' \
        '<numericvalue name="val1">1234</numericvalue>' \
        '<numericvalue name="val2">12.34</numericvalue>' \
        '<numericvalue name="val3">0.1</numericvalue>' \
        '<numericvalue name="val4">0.3</numericvalue>' \
        '<numericvalue desc="a desc" name="val5">1234</numericvalue>' \
        '<numericvalue name="val6">1234</numericvalue>' \
        '</data>' \
        '</serviceupdate>'
    assert validate_xsd(doc.to_xml())
Beispiel #14
0
def test_outofbounds():
    """Test out of bounds values."""
    with pytest.raises(AssertionError):
        ServiceDocument(None)
    with pytest.raises(AssertionError):
        ServiceDocument(1234)
    with pytest.raises(AssertionError):
        ServiceDocument('id', timestamp='1234')
    with pytest.raises(AssertionError):
        ServiceDocument('id', status=100)
    with pytest.raises(AssertionError):
        ServiceDocument('id', status='not-a-status')
    doc = ServiceDocument('id')
    with pytest.raises(AssertionError):
        doc.add_numericvalue(1234, 'val')
    with pytest.raises(AssertionError):
        doc.add_numericvalue('name', 1234, desc=1234)
    with pytest.raises(AssertionError):
        doc.add_numericvalue('name', 'astring', desc=1234)
    # Remove in v0.3 (availability removed)
    with pytest.raises(AssertionError):
        ServiceDocument('id', availability=-1)
    with pytest.raises(AssertionError):
        ServiceDocument('id', availability=101)
    with pytest.raises(AssertionError):
        ServiceDocument('id', availability='100')