def getRecoveryActionsFromConfigFile()

in automation/tinc/main/ext/qautils/gppylib/programs/clsRecoverSegment.py [0:0]


    def getRecoveryActionsFromConfigFile(self, gpArray):
        """
        getRecoveryActionsFromConfigFile

        returns a GpMirrorListToBuild object
        """

        # create fileData object from config file
        #
        filename = self.__options.recoveryConfigFile
        fslist   = None
        rows     = []
        with open(filename) as f:
            for lineno, line in line_reader(f):
                if fslist is None:
                    fslist = parse_filespace_order(filename, lineno, line)
                else:
                    fixed, flexible = parse_gprecoverseg_line(filename, lineno, line, fslist)
                    rows.append( ParsedConfigFileRow(fixed, flexible, line) )
        fileData = ParsedConfigFile(fslist, rows)
        
        # validate fileData
        #
        validateFlexibleHeadersListAllFilespaces("Segment recovery config", gpArray, fileData)
        filespaceNameToFilespace = dict([ (fs.getName(), fs) for fs in gpArray.getFilespaces(False)])

        allAddresses = [row.getFixedValuesMap()["newAddress"] for row in fileData.getRows()
                                                if "newAddress" in row.getFixedValuesMap()]
        allNoneArr = [None for a in allAddresses]
        interfaceLookup = GpInterfaceToHostNameCache(self.__pool, allAddresses, allNoneArr)

        failedSegments = []
        failoverSegments = []
        for row in fileData.getRows():
            fixedValues = row.getFixedValuesMap()
            flexibleValues = row.getFlexibleValuesMap()

            # find the failed segment
            failedAddress = fixedValues['failedAddress']
            failedPort = fixedValues['failedPort']
            failedDataDirectory = normalizeAndValidateInputPath( fixedValues['failedDataDirectory'],
                                                                        "config file", row.getLine())
            failedSegment = None
            for segment in gpArray.getDbList():
                if segment.getSegmentAddress() == failedAddress and \
                            str(segment.getSegmentPort()) == failedPort and \
                            segment.getSegmentDataDirectory() == failedDataDirectory:

                    if failedSegment is not None:
                        #
                        # this could be an assertion -- configuration should not allow multiple entries!
                        #
                        raise Exception(("A segment to recover was found twice in configuration.  " \
                            "This segment is described by address:port:directory '%s:%s:%s' on the input line: %s") %
                            (failedAddress, failedPort, failedDataDirectory, row.getLine()))
                    failedSegment = segment

            if failedSegment is None:
                raise Exception("A segment to recover was not found in configuration.  " \
                            "This segment is described by address:port:directory '%s:%s:%s' on the input line: %s" %
                            (failedAddress, failedPort, failedDataDirectory, row.getLine()))

            failoverSegment = None
            if "newAddress" in fixedValues:
                """
                When the second set was passed, the caller is going to tell us to where we need to failover, so
                  build a failover segment
                """
                # these two lines make it so that failoverSegment points to the object that is registered in gparray
                failoverSegment = failedSegment
                failedSegment = failoverSegment.copy()

                address = fixedValues["newAddress"]
                try:
                    port = int(fixedValues["newPort"])
                    replicationPort = int(fixedValues["newReplicationPort"])
                except ValueError:
                    raise Exception( 'Config file format error, invalid number value in line: %s' % (row.getLine()))

                dataDirectory = normalizeAndValidateInputPath(fixedValues["newDataDirectory"], "config file", row.getLine())

                hostName = interfaceLookup.getHostName(address)
                if hostName is None:
                    raise Exception( 'Unable to find host name for address %s from line:%s' % (address, row.getLine()))

                filespaceOidToPathMap = {}
                for fsName, path in flexibleValues.iteritems():
                    path = normalizeAndValidateInputPath(path, "config file", row.getLine())
                    filespaceOidToPathMap[filespaceNameToFilespace[fsName].getOid()] = path

                # now update values in failover segment
                failoverSegment.setSegmentAddress( address )
                failoverSegment.setSegmentHostName( hostName )
                failoverSegment.setSegmentPort( port )
                failoverSegment.setSegmentReplicationPort( replicationPort )
                failoverSegment.setSegmentDataDirectory( dataDirectory )

                for fsOid, path in filespaceOidToPathMap.iteritems():
                    failoverSegment.getSegmentFilespaces()[fsOid] = path
                failoverSegment.getSegmentFilespaces()[gparray.SYSTEM_FILESPACE] = dataDirectory

            # this must come AFTER the if check above because failedSegment can be adjusted to
            #   point to a different object
            failedSegments.append(failedSegment)
            failoverSegments.append(failoverSegment)

        peersForFailedSegments = self.findAndValidatePeersForFailedSegments(gpArray, failedSegments)

        segs = []
        for i in range(len(failedSegments)):
            segs.append( GpMirrorToBuild(failedSegments[i], peersForFailedSegments[i], failoverSegments[i], \
                                self.__options.forceFullResynchronization))
        return GpMirrorListToBuild(segs, self.__pool, self.__options.quiet, self.__options.parallelDegree)