Example #1
0
class SnmpQueryBuilder:
    def __init__(self, tableOidOffset):
        self.queryElements = TreeSet(OffsetBasedComparator())
        self.tableOidOffset = tableOidOffset

    def addQueryElement(self, offset, name, type='string'):
        queryElement = QueryElement(offset, name, type)
        self.queryElements.add(queryElement)

    def __buildQueryParts(self, productOidBase, queryElements):
        ''' Build query parts and returns base query part and parts for each
        query element (OID)
        @types: str, java.util.TreeSet -> tuple(str, list(str))'''
        if productOidBase:
            tableOidBase = self.__glue_(productOidBase, self.tableOidOffset,
                                        '.')
        else:
            tableOidBase = self.tableOidOffset

        iterator = self.queryElements.iterator()
        queryElement = iterator.next()
        oidNoType = self.__glue_(tableOidBase, queryElement.offset, '.')
        surrogateOid = self.__glue_(tableOidBase, queryElement.offset + 1, '.')
        oidNoType = self.__glue_(oidNoType, surrogateOid)
        queryBase = self.__glue_(oidNoType, queryElement.type)

        oidParts = []
        while iterator.hasNext():
            queryElement = iterator.next()
            oidNoType = self.__glue_(tableOidBase, queryElement.offset, '.')
            oid = self.__glue_(oidNoType, queryElement.type)
            oidParts.append(oid)
        return queryBase, oidParts

    def produceQuery(self, productOidBase):
        '@types: str -> str'
        queryBase, oidParts = self.__buildQueryParts(productOidBase,
                                                     self.queryElements)
        # make single query where query base is joined with parts related to
        # each query element
        return reduce(self.__glue_, (queryBase, ) + tuple(oidParts))

    def producePartialQueries(self, productOidBase):
        queryBase, oidParts = self.__buildQueryParts(productOidBase,
                                                     self.queryElements)
        #        zi = zip(queryBase * len(oidParts), oidParts)
        #        return map(lambda pair, _ = self: _.__glue_(pair[0], pair[1]), zi)
        queries = []
        for elementPart in oidParts:
            queries.append(self.__glue_(queryBase, elementPart))
        return queries

    def parseResults(self, resultSet):
        table = resultSet.asTable()
        return self.produceResults(table)

    def produceResults(self, table):
        resultItems = []
        for rowIndex in range(len(table)):
            columnIndex = 1
            resultItem = ResultItem()
            iterator = self.queryElements.iterator()
            while iterator.hasNext():
                queryElement = iterator.next()
                name = queryElement.name
                setattr(resultItem, name, table[rowIndex][columnIndex])
                columnIndex += 1
            try:
                setattr(resultItem, 'meta_data', table[rowIndex][0])
            except:
                pass
            resultItems.append(resultItem)

        return resultItems

    def mergeAndParseResults(self, resultSets):
        resultTable = []
        numberOfResults = len(resultSets)
        if numberOfResults > 0:
            firstTable = resultSets[0].asTable()
            numberOfRows = len(firstTable)
            for rowIndex in xrange(numberOfRows):
                resultTable.append([
                    firstTable[rowIndex][0], firstTable[rowIndex][1],
                    firstTable[rowIndex][2]
                ])
            if numberOfResults > 1:
                for i in xrange(1, numberOfResults):
                    table = resultSets[i].asTable()
                    for rowIndex in xrange(numberOfRows):
                        resultTable[rowIndex].append(table[rowIndex][2])

        return self.produceResults(resultTable)

    def __glue_(self, base, offset, separator=','):
        return ('%s%s%s') % (base, separator, offset)
Example #2
0
class SnmpQueryBuilder:
    def __init__(self, tableOidOffset):
        self.queryElements = TreeSet(OffsetBasedComparator())
        self.tableOidOffset = tableOidOffset

    def addQueryElement(self, offset, name, type='string'):
        queryElement = QueryElement(offset, name, type)
        self.queryElements.add(queryElement)

    def __buildQueryParts(self, productOidBase, queryElements):
        ''' Build query parts and returns base query part and parts for each
        query element (OID)
        @types: str, java.util.TreeSet -> tuple(str, list(str))'''
        if productOidBase:
            tableOidBase = self.__glue_(productOidBase, self.tableOidOffset, '.')
        else:
            tableOidBase = self.tableOidOffset

        iterator = self.queryElements.iterator()
        queryElement = iterator.next()
        oidNoType = self.__glue_(tableOidBase, queryElement.offset, '.')
        surrogateOid = self.__glue_(tableOidBase, queryElement.offset + 1, '.')
        oidNoType = self.__glue_(oidNoType, surrogateOid)
        queryBase = self.__glue_(oidNoType, queryElement.type)

        oidParts = []
        while iterator.hasNext():
            queryElement = iterator.next()
            oidNoType = self.__glue_(tableOidBase, queryElement.offset, '.')
            oid = self.__glue_(oidNoType, queryElement.type)
            oidParts.append(oid)
        return queryBase, oidParts

    def produceQuery(self, productOidBase):
        '@types: str -> str'
        queryBase, oidParts = self.__buildQueryParts(productOidBase,
                                                     self.queryElements)
        # make single query where query base is joined with parts related to
        # each query element
        return reduce(self.__glue_, (queryBase,) + tuple(oidParts))

    def producePartialQueries(self, productOidBase):
        queryBase, oidParts = self.__buildQueryParts(productOidBase,
                                                     self.queryElements)
#        zi = zip(queryBase * len(oidParts), oidParts)
#        return map(lambda pair, _ = self: _.__glue_(pair[0], pair[1]), zi)
        queries = []
        for elementPart in oidParts:
            queries.append(self.__glue_(queryBase, elementPart))
        return queries

    def parseResults(self, resultSet):
        table = resultSet.asTable()
        return self.produceResults(table)

    def produceResults(self, table):
        resultItems = []
        for rowIndex in range(len(table)):
            columnIndex = 1
            resultItem = ResultItem()
            iterator = self.queryElements.iterator()
            while iterator.hasNext():
                queryElement = iterator.next()
                name = queryElement.name
                setattr(resultItem, name, table[rowIndex][columnIndex])
                columnIndex += 1
            try:
                setattr(resultItem, 'meta_data', table[rowIndex][0])
            except:
                pass
            resultItems.append(resultItem)

        return resultItems

    def mergeAndParseResults(self, resultSets):
        resultTable = []
        numberOfResults = len(resultSets)
        if numberOfResults > 0:
            firstTable = resultSets[0].asTable()
            numberOfRows = len(firstTable)
            for rowIndex in xrange(numberOfRows):
                resultTable.append([firstTable[rowIndex][0],
                                    firstTable[rowIndex][1],
                                    firstTable[rowIndex][2]])
            if numberOfResults > 1:
                for i in xrange(1, numberOfResults):
                    table = resultSets[i].asTable()
                    for rowIndex in xrange(numberOfRows):
                        resultTable[rowIndex].append(table[rowIndex][2])

        return self.produceResults(resultTable)

    def __glue_(self, base, offset, separator=','):
        return     ('%s%s%s') % (base, separator, offset)