def handle(self, *args, **options): window = 24*60*60 if Metadata.objects.count() == 0: if create_measurement_mds() == None: return mds = Metadata.objects.filter(poll=True) # TODO: Assumes all mds use the same service, and single domain ma = mds[0].service if ma is None or not is_psservice_available(ma): # Hardcoded MA for ESCPS ma = create_psservice("urn:ogf:network:domain=internet2.edu:node=packrat", "ESCPSMA", "http://packrat.internet2.edu:2010/perfSONAR_PS/services/snmp/ESCPSMA", "SNMPMA", "ESCPS SNMP MA") Metadata.objects.update(service=ma) Metadata.objects.update(key=None) # Update metadata keys if we have any missing if mds.filter(key=None).count() > 0: node_mds = [] port_mds = [] for md in mds.filter(key=None): if hasattr(md.subject, 'port'): port_mds.append(md) if len(port_mds): response = query_psservice(ma, PORT_MDK_REQUEST) root = etree.fromstring(response) for md in port_mds: addresses = [] for node_address in NodeAddresses.objects.filter(node=md.subject.parent): addresses.append(node_address.address.value) addresses = ','.join(addresses) names = [] for port_names in NetworkObjectNames.objects.filter(networkobject=md.subject): names.append(port_names.name.value) names = '~^~'.join(names) event_type = md.event_type.value # Special cases direction = '' if md.event_type.value == \ 'http://ggf.org/ns/nmwg/characteristic/network/utilization/bytes/received/2.0': direction = 'in' event_type = 'http://ggf.org/ns/nmwg/characteristic/utilization/2.0' elif md.event_type.value == \ 'http://ggf.org/ns/nmwg/characteristic/network/utilization/bytes/sent/2.0': direction = 'out' event_type = 'http://ggf.org/ns/nmwg/characteristic/utilization/2.0' xpath = PORT_KEY_MD_XPATH % (addresses, names, direction, direction, event_type) metadata_ids = root.xpath( xpath ) if not len(metadata_ids): continue keys = root.xpath(KEY_XPATH % metadata_ids[0]) if not len(keys): continue md.key = keys[0] md.save() mds = Metadata.objects.all().exclude(key=None) for md in mds: last_datum = Data.objects.filter(metadata=md).order_by('time').reverse()[:1] if len(last_datum): last_time = int(time.mktime(last_datum[0].time.timetuple())) + 1 else: last_time = int(time.time()) - window response = query_psservice(ma, SETUPDATA_REQUEST % (md.key, last_time)) if response is None: # TODO: Check for errors continue for v in parse_snmp_response(response): Data.objects.create(metadata=md, time=v['timeValue'], value=v['value'], units=v['valueUnits']) # keep a sliding window of measurements curr_time = int(time.time()) drop_time = datetime.fromtimestamp(float(curr_time - window)) old_data = Data.objects.filter(time__lt=drop_time) old_data.delete()
def handle(self, *args, **options): window = 24*60*60 if Metadata.objects.count() == 0: if create_measurement_mds() == None: return mds = Metadata.objects.filter(poll=True) # TODO: Assumes all mds use the same service, and single domain ma = mds[0].service if ma is None or not is_psservice_available(ma): xquery = GANGLIA_MA_XQUERY % create_urn(get_urn_value(mds[0].subject.unis_id, 'domain')) response = query_hls(settings.UNIS_INSTANCE, xquery, useSSL=True) service = etree.fromstring(response).find(".//{%s}service" % PSSERVICE_NS) if service is None: return accessPoint = service.find("{%s}accessPoint" % PSSERVICE_NS).text serviceNode = service.find("{%s}serviceNode" % PSSERVICE_NS).text serviceName = service.find("{%s}serviceName" % PSSERVICE_NS).text serviceType = service.find("{%s}serviceType" % PSSERVICE_NS).text serviceDescription = service.find("{%s}serviceDescription" % PSSERVICE_NS).text ma = create_psservice(serviceNode, serviceName, accessPoint, serviceType, serviceDescription) # Update all mds (remember we assume single MA for now) Metadata.objects.update(service=ma) # Update metadata keys if we have any missing if mds.filter(key=None).count() > 0: node_mds = [] port_mds = [] for md in mds.filter(key=None): if hasattr(md.subject, 'node'): node_mds.append(md) elif hasattr(md.subject, 'port'): port_mds.append(md) if len(node_mds): response = query_psservice(ma, NODE_MDK_REQUEST) root = etree.fromstring(response) for md in node_mds: addresses = [] for node_address in NodeAddresses.objects.filter(node=md.subject): addresses.append(node_address.address.value) addresses = ','.join(addresses) xpath = NODE_KEY_MD_XPATH % (addresses, md.event_type.value) metadata_ids = root.xpath( xpath ) if not len(metadata_ids): continue keys = root.xpath(KEY_XPATH % metadata_ids[0]) if not len(keys): continue md.key = keys[0] md.save() if len(port_mds): response = query_psservice(ma, PORT_MDK_REQUEST) root = etree.fromstring(response) for md in port_mds: addresses = [] for node_address in NodeAddresses.objects.filter(node=md.subject.parent): addresses.append(node_address.address.value) addresses = ','.join(addresses) names = [] for port_names in NetworkObjectNames.objects.filter(networkobject=md.subject): names.append(port_names.name.value) names = '~^~'.join(names) event_type = md.event_type.value # Special cases direction = '' if md.event_type.value == \ 'http://ggf.org/ns/nmwg/characteristic/network/utilization/bytes/received/2.0': direction = 'in' event_type = 'http://ggf.org/ns/nmwg/characteristic/utilization/2.0' elif md.event_type.value == \ 'http://ggf.org/ns/nmwg/characteristic/network/utilization/bytes/sent/2.0': direction = 'out' event_type = 'http://ggf.org/ns/nmwg/characteristic/utilization/2.0' xpath = PORT_KEY_MD_XPATH % (addresses, names, direction, direction, event_type) metadata_ids = root.xpath( xpath ) if not len(metadata_ids): continue keys = root.xpath(KEY_XPATH % metadata_ids[0]) if not len(keys): continue md.key = keys[0] md.save() for md in mds: last_datum = Data.objects.filter(metadata=md).order_by('time').reverse()[:1] if len(last_datum): last_time = int(time.mktime(last_datum[0].time.timetuple())) + 1 else: last_time = int(time.time()) - window response = query_psservice(ma, SETUPDATA_REQUEST % (md.key, last_time)) if response is None: # TODO: Check for errors continue for v in parse_snmp_response(response): Data.objects.create(metadata=md, time=v['timeValue'], value=v['value'], units=v['valueUnits'])
def handle(self, *args, **options): window = 24 * 60 * 60 if Metadata.objects.count() == 0: if create_measurement_mds() == None: return mds = Metadata.objects.filter(poll=True) # TODO: Assumes all mds use the same service, and single domain ma = mds[0].service if ma is None or not is_psservice_available(ma): xquery = GANGLIA_MA_XQUERY % create_urn( get_urn_value(mds[0].subject.unis_id, 'domain')) response = query_hls(settings.UNIS_INSTANCE, xquery, useSSL=True) service = etree.fromstring(response).find(".//{%s}service" % PSSERVICE_NS) if service is None: return accessPoint = service.find("{%s}accessPoint" % PSSERVICE_NS).text serviceNode = service.find("{%s}serviceNode" % PSSERVICE_NS).text serviceName = service.find("{%s}serviceName" % PSSERVICE_NS).text serviceType = service.find("{%s}serviceType" % PSSERVICE_NS).text serviceDescription = service.find("{%s}serviceDescription" % PSSERVICE_NS).text ma = create_psservice(serviceNode, serviceName, accessPoint, serviceType, serviceDescription) # Update all mds (remember we assume single MA for now) Metadata.objects.update(service=ma) # Update metadata keys if we have any missing if mds.filter(key=None).count() > 0: node_mds = [] port_mds = [] for md in mds.filter(key=None): if hasattr(md.subject, 'node'): node_mds.append(md) elif hasattr(md.subject, 'port'): port_mds.append(md) if len(node_mds): response = query_psservice(ma, NODE_MDK_REQUEST) root = etree.fromstring(response) for md in node_mds: addresses = [] for node_address in NodeAddresses.objects.filter( node=md.subject): addresses.append(node_address.address.value) addresses = ','.join(addresses) xpath = NODE_KEY_MD_XPATH % (addresses, md.event_type.value) metadata_ids = root.xpath(xpath) if not len(metadata_ids): continue keys = root.xpath(KEY_XPATH % metadata_ids[0]) if not len(keys): continue md.key = keys[0] md.save() if len(port_mds): response = query_psservice(ma, PORT_MDK_REQUEST) root = etree.fromstring(response) for md in port_mds: addresses = [] for node_address in NodeAddresses.objects.filter( node=md.subject.parent): addresses.append(node_address.address.value) addresses = ','.join(addresses) names = [] for port_names in NetworkObjectNames.objects.filter( networkobject=md.subject): names.append(port_names.name.value) names = '~^~'.join(names) event_type = md.event_type.value # Special cases direction = '' if md.event_type.value == \ 'http://ggf.org/ns/nmwg/characteristic/network/utilization/bytes/received/2.0': direction = 'in' event_type = 'http://ggf.org/ns/nmwg/characteristic/utilization/2.0' elif md.event_type.value == \ 'http://ggf.org/ns/nmwg/characteristic/network/utilization/bytes/sent/2.0': direction = 'out' event_type = 'http://ggf.org/ns/nmwg/characteristic/utilization/2.0' xpath = PORT_KEY_MD_XPATH % (addresses, names, direction, direction, event_type) metadata_ids = root.xpath(xpath) if not len(metadata_ids): continue keys = root.xpath(KEY_XPATH % metadata_ids[0]) if not len(keys): continue md.key = keys[0] md.save() for md in mds: last_datum = Data.objects.filter( metadata=md).order_by('time').reverse()[:1] if len(last_datum): last_time = int(time.mktime( last_datum[0].time.timetuple())) + 1 else: last_time = int(time.time()) - window response = query_psservice(ma, SETUPDATA_REQUEST % (md.key, last_time)) if response is None: # TODO: Check for errors continue for v in parse_snmp_response(response): Data.objects.create(metadata=md, time=v['timeValue'], value=v['value'], units=v['valueUnits'])
def handle(self, *args, **options): window = 24 * 60 * 60 if Metadata.objects.count() == 0: if create_measurement_mds() == None: return mds = Metadata.objects.filter(poll=True) # TODO: Assumes all mds use the same service, and single domain ma = mds[0].service if ma is None or not is_psservice_available(ma): # Hardcoded MA for ESCPS ma = create_psservice( "urn:ogf:network:domain=internet2.edu:node=packrat", "ESCPSMA", "http://packrat.internet2.edu:2010/perfSONAR_PS/services/snmp/ESCPSMA", "SNMPMA", "ESCPS SNMP MA") Metadata.objects.update(service=ma) Metadata.objects.update(key=None) # Update metadata keys if we have any missing if mds.filter(key=None).count() > 0: node_mds = [] port_mds = [] for md in mds.filter(key=None): if hasattr(md.subject, 'port'): port_mds.append(md) if len(port_mds): response = query_psservice(ma, PORT_MDK_REQUEST) root = etree.fromstring(response) for md in port_mds: addresses = [] for node_address in NodeAddresses.objects.filter( node=md.subject.parent): addresses.append(node_address.address.value) addresses = ','.join(addresses) names = [] for port_names in NetworkObjectNames.objects.filter( networkobject=md.subject): names.append(port_names.name.value) names = '~^~'.join(names) event_type = md.event_type.value # Special cases direction = '' if md.event_type.value == \ 'http://ggf.org/ns/nmwg/characteristic/network/utilization/bytes/received/2.0': direction = 'in' event_type = 'http://ggf.org/ns/nmwg/characteristic/utilization/2.0' elif md.event_type.value == \ 'http://ggf.org/ns/nmwg/characteristic/network/utilization/bytes/sent/2.0': direction = 'out' event_type = 'http://ggf.org/ns/nmwg/characteristic/utilization/2.0' xpath = PORT_KEY_MD_XPATH % (addresses, names, direction, direction, event_type) metadata_ids = root.xpath(xpath) if not len(metadata_ids): continue keys = root.xpath(KEY_XPATH % metadata_ids[0]) if not len(keys): continue md.key = keys[0] md.save() mds = Metadata.objects.all().exclude(key=None) for md in mds: last_datum = Data.objects.filter( metadata=md).order_by('time').reverse()[:1] if len(last_datum): last_time = int(time.mktime( last_datum[0].time.timetuple())) + 1 else: last_time = int(time.time()) - window response = query_psservice(ma, SETUPDATA_REQUEST % (md.key, last_time)) if response is None: # TODO: Check for errors continue for v in parse_snmp_response(response): Data.objects.create(metadata=md, time=v['timeValue'], value=v['value'], units=v['valueUnits']) # keep a sliding window of measurements curr_time = int(time.time()) drop_time = datetime.fromtimestamp(float(curr_time - window)) old_data = Data.objects.filter(time__lt=drop_time) old_data.delete()