Exemplo n.º 1
0
    def doCheckStaus(user,
                     nodeId,
                     cluster_normal_status=None,
                     expected_redistributing=""):
        """
        function: Check cluster status
        input : user, nodeId, cluster_normal_status, expected_redistributing
        output: status, output
        """
        try:
            statusFile = "/home/%s/gauss_check_status_%d.dat" % (user,
                                                                 os.getpid())
            TempfileManagement.removeTempFile(statusFile)
            cmd = ClusterCommand.getQueryStatusCmd(user, "", statusFile)
            (status, output) = subprocess.getstatusoutput(cmd)
            if status != 0:
                TempfileManagement.removeTempFile(statusFile)
                return (status, output)

            clusterStatus = DbClusterStatus()
            clusterStatus.initFromFile(statusFile)
            TempfileManagement.removeTempFile(statusFile)
        except Exception as e:
            DefaultValue.cleanTmpFile(statusFile)
            raise Exception(ErrorCode.GAUSS_516["GAUSS_51600"] +
                            "Error: %s." % str(e))
        status = 0
        output = ""
        statusRep = None
        if nodeId > 0:
            nodeStatus = clusterStatus.getDbNodeStatusById(nodeId)
            if nodeStatus is None:
                raise Exception(ErrorCode.GAUSS_516["GAUSS_51619"] % nodeId)

            status = 0 if nodeStatus.isNodeHealthy() else 1
            statusRep = nodeStatus.getNodeStatusReport()
        else:
            status = 0 if clusterStatus.isAllHealthy(cluster_normal_status) \
                          and (clusterStatus.redistributing ==
                                expected_redistributing or
                                expected_redistributing == "") else 1
            statusRep = clusterStatus.getClusterStatusReport()
            output += "cluster_state      : %s\n" % clusterStatus.clusterStatus
            output += "redistributing     : %s\n" % clusterStatus.redistributing
            output += "node_count         : %d\n" % statusRep.nodeCount
        output += "Datanode State\n"
        output += "    primary        : %d\n" % statusRep.dnPrimary
        output += "    standby        : %d\n" % statusRep.dnStandby
        output += "    secondary      : %d\n" % statusRep.dnDummy
        output += "    building       : %d\n" % statusRep.dnBuild
        output += "    abnormal       : %d\n" % statusRep.dnAbnormal
        output += "    down           : %d\n" % statusRep.dnDown

        return (status, output)
Exemplo n.º 2
0
    def getNodeStatus(self, nodename):
        """
        function: get node status
        input: nodename
        output: NA
        """
        try:
            # Create a temporary file to save cluster status
            tmpDir = DefaultValue.getTmpDirFromEnv()
            tmpFile = os.path.join(tmpDir, "gauss_cluster_status.dat_" + \
                                   str(datetime.now().strftime(
                                       '%Y%m%d%H%M%S')) + "_" + str(
                os.getpid()))

            # Perform the start operation
            # Writes the execution result to a temporary file
            cmd = ClusterCommand.getQueryStatusCmd(self.context.g_opts.user,
                                                   "", tmpFile, True)
            (status, output) = subprocess.getstatusoutput(cmd)
            if (status != 0):
                self.logger.debug("The cmd is %s " % cmd)
                raise Exception(ErrorCode.GAUSS_514["GAUSS_51400"] % \
                                cmd + "Error: \n%s" % output)

            # Initialize cluster status information for the temporary file
            clusterStatus = DbClusterStatus()
            clusterStatus.initFromFile(tmpFile)

            # Get node status
            nodeStatusInfo = None
            for dbNode in clusterStatus.dbNodes:
                if (dbNode.name == nodename):
                    nodeStatusInfo = dbNode
            if (nodeStatusInfo and nodeStatusInfo.isNodeHealthy()):
                nodeStatus = clusterStatus.OM_NODE_STATUS_NORMAL
            else:
                nodeStatus = clusterStatus.OM_NODE_STATUS_ABNORMAL

            DefaultValue.cleanTmpFile(tmpFile)
            return nodeStatus
        except Exception as e:
            DefaultValue.cleanTmpFile(tmpFile)
            self.logger.debug("Failed to get node status. Error: \n%s." %
                              str(e))
            return "Abnormal"