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_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_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_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") 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>' \ '<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>' \ '</data>' \ '</serviceupdate>'
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())