Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
 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'])
Ejemplo n.º 3
0
    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'])
Ejemplo n.º 4
0
    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()