Exemplo n.º 1
0
 def startElement(self, tag, attrs):
     ''' This methods creates an element based on XML tags and inserts it into the data store. '''
     ds = DataStore()
     # Create a new node based on the XML attributes.
     e = Element(tag, attrs)
     # If this is the head tag for the XML dump, initialize the data store
     if 'GANGLIA_XML' == tag:
         ds.acquireLock(self)
         self._elemStack.append(ds.getNode(
         ))  # Fetch the root node.  It has already been set into the tree.
         self._elemStackLen += 1
         cfg = getConfig()
         # We'll go ahead and update any existing GRID tag with a new one (new time) even if one already exists.
         e = Element(
             'GRID', {
                 'NAME': cfg[GmetadConfig.GRIDNAME],
                 'AUTHORITY': cfg[GmetadConfig.AUTHORITY],
                 'LOCALTIME': '%d' % time.time()
             })
         self._ancestry.append('GANGLIA_XML')
     # Insert the new node into the data store at the appropriate location
     self._elemStack.append(
         ds.setNode(e, self._elemStack[self._elemStackLen - 1]))
     # If this is a cluster or nested grid node, then keep track of the data store path to this node.
     if (len(self._ancestry) < 2
             or (len(self._ancestry) == 2 and e.id in ['GRID', 'CLUSTER'])):
         self._ancestry.append('%s:%s' % (e.id, e.getAttr('name')))
     self._elemStackLen += 1
Exemplo n.º 2
0
 def getXml(self, filter=None, queryargs=None):
     ''' This method generates the output XML for either the entire data store or 
         specified portions based on the filter and query args.'''
     if filter is None:
         filterList = None
     elif not len(filter.strip()):
         filterList = None
     else:
         filterList = filter.split('/')
     rbuf = '%s\n%s\n' % (self._xml_starttag, self._xml_dtd)
     ds = DataStore()
     if ds.rootElement is not None:
         ds.acquireLock(self)
         rbuf += self._getXmlImpl(ds.rootElement, filterList, queryargs)
         ds.releaseLock(self)
     return rbuf
Exemplo n.º 3
0
 def endElement(self, tag):
     # Release the data store lock of we hit the end of the XML dump
     if tag == 'GANGLIA_XML':
         DataStore().releaseLock(self)
     self._elemStack.pop()
     self._elemStackLen -= 1
Exemplo n.º 4
0
    def run(self):
        ds = DataStore()
        while not self._shuttingDown:
            connected = False
            # Create a socket and connect to the cluster data source.
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            try:
                sock.connect(
                    self._getEndpoint(
                        self.dataSource.hosts[self.lastKnownGoodHost]))
                connected = True
            except socket.error:
                # Keep track of the last good data source within the cluster. If we can't reconnect to the
                #  same data source, try the next one in the list.
                curidx = self.lastKnownGoodHost
                while True:
                    curidx += 1
                    if curidx >= len(self.dataSource.hosts):
                        curidx = 0
                    if curidx == self.lastKnownGoodHost: break
                    try:
                        sock.connect(
                            self._getEndpoint(self.dataSource.hosts[curidx]))
                        self.lastKnownGoodHost = curidx
                        connected = True
                        break
                    except socket.error:
                        pass
            if connected:
                logging.info('Querying data source %s via host %s' %
                             (self.dataSource.name,
                              self.dataSource.hosts[self.lastKnownGoodHost]))
                xmlbuf = ''
                while True:
                    # Read all of the XML data from the data source.
                    buf = sock.recv(8192)
                    if not buf:
                        break
                    xmlbuf += buf
                sock.close()
                # Create an XML parser and parse the buffer
                gch = GmondContentHandler()
                xml.sax.parseString(xmlbuf, gch)
                # Notify the data store that all updates for the cluster are finished.
                clusterNode = ds.getNode(gch.getClusterAncestry())
                if clusterNode is not None:
                    clusterNode.setAttr('status', 'up')
            else:
                logging.error(
                    'Could not connect to any host for data source %s' %
                    self.dataSource.name)
                ds = DataStore()
                cfg = getConfig()
                gridKey = Element.generateKey(
                    ['GRID', cfg[GmetadConfig.GRIDNAME]])
                clusterKey = Element.generateKey(
                    ['CLUSTER', self.dataSource.name])
                gridNode = ds.getNode([str(ds.rootElement), gridKey])
                clusterNode = None
                if gridNode is not None and str(gridNode) == gridKey:
                    try:
                        clusterNode = gridNode[clusterKey]
                    except KeyError:
                        clusterNode = Element(
                            'CLUSTER', {
                                'NAME': self.dataSource.name,
                                'LOCALTIME': '%d' % time.time()
                            })
                        ds.setNode(clusterNode, gridNode)
                if clusterNode is not None:
                    clusterNode.setAttr('status', 'down')
                    #clusterNode.localtime = time.time()

            ds.updateFinished(clusterNode)

            if self._shuttingDown:
                break
            # Go to sleep for a while.
            self._cond.acquire()
            self._cond.wait(getRandomInterval(self.dataSource.interval))
            self._cond.release()