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>'
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)
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 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_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>'
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())
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())