def postMaster()

in VMBackup/main/workloadPatch/WorkloadPatch.py [0:0]


    def postMaster(self):
        global daemonProcess
        self.logger.log("WorkloadPatch: Entering post mode for master")
        try:
            if self.ipc_folder != None and self.ipc_folder != "": #IPCm based workloads
                if os.path.exists(self.outfile):
                    os.remove(self.outfile)
                else:
                    self.logger.log("WorkloadPatch: File for IPC does not exist at post")
                if len(self.child) == 0 or self.child[0].poll() is not None:
                    self.logger.log("WorkloadPatch: Not app consistent backup")
                    self.error_details.append(ErrorDetail(CommonVariables.FailedWorkloadQuiescingTimeout,"not app consistent"))
                elif self.child[0].poll() is None:
                    self.logger.log("WorkloadPatch: pre connection still running. Sending kill signal")
                    self.child[0].kill()
            else: #non IPC based workloads
                if (self.pre_database_status != "NOTOPEN") and (daemonProcess is None or daemonProcess.poll() is not None):
                    self.logger.log("WorkloadPatch: Not app consistent backup")
                    self.error_details.append(ErrorDetail(CommonVariables.FailedWorkloadQuiescingTimeout,"not app consistent"))
                elif daemonProcess.poll() is None:
                    self.logger.log("WorkloadPatch: pre connection still running. Sending kill signal")
                    daemonProcess.kill()
        except Exception as e:
            self.logger.log("WorkloadPatch: exception in daemon process indentification" + str(e))
        
        postSuccess = False

        if 'mysql' in self.name.lower() or 'mariadb' in self.name.lower():
            self.logger.log("WorkloadPatch: Create connection string for post master")
            postscript = os.path.join(self.temp_script_folder, self.scriptpath + "/postMysqlMaster.sql")
            args = self.sudo_user+" "+self.command+self.name+" "+self.cred_string+" < "+postscript
            self.logger.log("WorkloadPatch: command to execute: "+str(self.sudo_user)+"  "+str(self.command))
            post_child = subprocess.Popen(args,stdout=subprocess.PIPE,stdin=subprocess.PIPE,shell=True,stderr=subprocess.PIPE)
        elif 'oracle' in self.name.lower():
            self.logger.log("WorkloadPatch: Post- Inside oracle post")
            postOracle = self.command + "sqlplus" + " -S -R 2 /nolog @" + os.path.join(self.temp_script_folder, self.scriptpath + "/postOracleMaster.sql ")
            args =  "su - "+self.linux_user+" -c "+"\'"+postOracle+"\'"
            self.logger.log("WorkloadPatch: argument passed for post script:"+str(args))
            process = subprocess.Popen(args, stdout=subprocess.PIPE, shell=True)
            wait_counter = 5
            while process.poll()==None and wait_counter>0:
                wait_counter -= 1
                sleep(2)
            while True:
                line= process.stdout.readline()
                line = Utils.HandlerUtil.HandlerUtility.convert_to_string(line)
                if(line != ''):
                    self.logger.log("WorkloadPatch: post completed with output "+line.rstrip(), True)
                else:
                    break
                if 'END BACKUP succeeded' in line:
                    self.logger.log("WorkloadPatch: post succeeded")
                    postSuccess = True
                    break
                if('LOG_MODE=' in line):
                    line = line.replace('\n','')
                    line_split = line.split('=')
                    self.logger.log("WorkloadPatch: log mode set is "+line_split[1], True)
                    if(line_split[1] == "ARCHIVELOG"):
                        self.post_log_mode = "ARCHIVELOG"
                        self.logger.log("WorkloadPatch: Archive log mode for oracle")
                    else:
                        self.post_log_mode = "NOARCHIVELOG" 
                        self.logger.log("WorkloadPatch: No archive log mode for oracle")
                if('STATUS=' in line):
                    line = line.replace('\n', '')
                    line_split = line.split('=')
                    self.logger.log("WorkloadPatch: database status is "+line_split[1], True)
                    if(line_split[1] == "OPEN"):
                        self.post_database_status = "OPEN"
                        self.logger.log("WorkloadPatch: Database is open")
                    else:##handle other DB status if required
                        self.post_database_status = "NOTOPEN"
                        self.logger.log("WorkloadPatch: Database is not open")
            if((self.pre_log_mode == "NOARCHIVELOG" and self.post_log_mode == "ARCHIVELOG") or (self.pre_log_mode == "ARCHIVELOG" and self.post_log_mode == "NOARCHIVELOG")):
                self.logger.log("WorkloadPatch: Database log mode changed during backup")
                self.error_details.append(ErrorDetail(CommonVariables.FailedWorkloadLogModeChanged, "Database log mode changed during backup"))
            if(postSuccess == False):
                if(self.pre_database_status == "NOTOPEN" and self.post_database_status == "NOTOPEN"):
                    self.logger.log("WorkloadPatch: Database in closed status, backup is app consistent")
                elif((self.pre_database_status == "OPEN" and self.post_database_status == "NOTOPEN") or (self.pre_database_status == "NOTOPEN" and self.post_database_status == "OPEN")):
                    self.logger.log("WorkloadPatch: Database status changed during backup")
                    self.error_details.append(ErrorDetail(CommonVariables.FailedWorkloadDatabaseStatusChanged, "Database status changed during backup"))
                else:
                    self.error_details.append(ErrorDetail(CommonVariables.FailedWorkloadPostError, "Workload Post failed"))
            
            self.logger.log("WorkloadPatch: Post- Completed")
            self.callLogBackup()
        elif 'postgres' in self.name.lower():
            self.logger.log("WorkloadPatch: Post- Inside postgres post")
            postPostgres = self.command + "psql " + self.cred_string + " -f " + os.path.join(os.getcwd(), "main/workloadPatch/"+self.scriptpath+"/postPostgresMaster.sql")
            args =  "su - "+self.linux_user+" -c "+"\'"+postPostgres+"\'"
            self.logger.log("WorkloadPatch: argument passed for post script:"+str(self.linux_user)+"  "+str(self.command))
            process = subprocess.Popen(args,stdout=subprocess.PIPE, shell=True)
            wait_counter = 5
            while process.poll()==None and wait_counter>0:
                wait_counter -= 1
                sleep(2)
            self.logger.log("WorkloadPatch: Post- Completed")
        #Add new workload support here
        else:
            self.logger.log("WorkloadPatch: Unsupported workload name")
            self.error_details.append(ErrorDetail(CommonVariables.FailedWorkloadInvalidWorkloadName, "Workload Not supported"))