diff --git a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/demoapp.sql b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/demoapp.sql index 3e96bfc..a44cfe8 100644 --- a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/demoapp.sql +++ b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/demoapp.sql @@ -1,7 +1,7 @@ connect sys/'&1'@oshard-catalog-0:1521/CATCDB as sysdba alter session set container=CAT1PDB; alter session enable shard ddl; - create user app_schema identified by app_schema; + create user app_schema identified by '&1'; grant connect, resource, alter session to app_schema; grant execute on dbms_crypto to app_schema; grant create table, create procedure, create tablespace, create materialized view to app_schema; diff --git a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/main.py b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/main.py index da0c6a9..b7f0f17 100644 --- a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/main.py +++ b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/main.py @@ -20,7 +20,7 @@ def main(): # Checking Comand line Args try: - opts, args = getopt.getopt(sys.argv[1:], '', ['addshard=','deleteshard=','validateshard=','checkliveness=','resetlistener=','restartdb=','createdir=','optype=','addshardgroup=','deployshard=','movechunks=','checkonlineshard=','cancelchunks=','checkchunks=','checkgsmshard=','validatenochunks=','invitednode=','help']) + opts, args = getopt.getopt(sys.argv[1:], '', ['addshard=','deleteshard=','validateshard=','checkliveness=','resetlistener=','restartdb=','createdir=','optype=','addshardgroup=','deployshard=','movechunks=','checkonlineshard=','cancelchunks=','checkchunks=','checkgsmshard=','checkreadyness=','validatenochunks=','invitednode=','resetpassword=','exporttdekey=','importtdekey=','help']) except getopt.GetoptError: pass @@ -45,7 +45,7 @@ def main(): for opt, arg in opts: if opt in ('--help'): - oralogger.msg_ = '''{:^17}-{:^17} : You can pass parameter --addshard, --deleteshard, --validateshard, --checkliveness, --resetlistener, --restartdb, --createdir, --optype, --addshardgroup, --deployshard, '--checkonlineshard', '--cancelchunks', '--movechunks', '--checkchunks', '--checkgsmshard','--validatenochunks', '--invitednode', or --help''' + oralogger.msg_ = '''{:^17}-{:^17} : You can pass parameter --addshard, --deleteshard, --validateshard, --checkliveness, --resetlistener, --restartdb, --createdir, --optype, --addshardgroup, --deployshard, '--checkonlineshard', '--cancelchunks', '--movechunks', '--checkchunks', '--checkgsmshard','--validatenochunks', '--checkreadyness','--invitednode', '--resetpassword','--exporttdekey','--importtdekey',or --help''' stdout_handler.handle(oralogger) elif opt in ('--addshard'): file_name = oenv.logfile_name("ADD_SHARD") @@ -68,6 +68,12 @@ def main(): oralogger.filename_ = file_name ocommon.log_info_message("=======================================================================",file_name) oenv.add_custom_variable("CHECK_LIVENESS",arg) + elif opt in ('--checkreadyness'): + oralogger.stdout_ = None + file_name = oenv.logfile_name("CHECK_READYNESS") + oralogger.filename_ = file_name + ocommon.log_info_message("=======================================================================",file_name) + oenv.add_custom_variable("CHECK_READYNESS",arg) elif opt in ('--resetlistener'): file_name = oenv.logfile_name("RESET_LISTENER") oralogger.filename_ = file_name @@ -83,8 +89,6 @@ def main(): oralogger.filename_ = file_name ocommon.log_info_message("=======================================================================",file_name) oenv.add_custom_variable("CREATE_DIR",arg) - elif opt in ('--optype'): - oenv.add_custom_variable("OP_TYPE",arg) elif opt in ('--addshardgroup'): file_name = oenv.logfile_name("ADD_SGROUP_PARAMS") oralogger.filename_ = file_name @@ -130,6 +134,23 @@ def main(): oralogger.filename_ = file_name ocommon.log_info_message("=======================================================================",file_name) oenv.add_custom_variable("INVITED_NODE_OP",arg) + elif opt in ('--resetpassword'): + file_name = oenv.logfile_name("RESET_PASSWD") + oralogger.filename_ = file_name + ocommon.log_info_message("=======================================================================",file_name) + oenv.add_custom_variable("RESET_PASSWORD",arg) + elif opt in ('--exporttdekey'): + file_name = oenv.logfile_name("EXPORT_TDE_KEY") + oralogger.filename_ = file_name + ocommon.log_info_message("=======================================================================",file_name) + oenv.add_custom_variable("EXPORT_TDE_KEY",arg) + elif opt in ('--importtdekey'): + file_name = oenv.logfile_name("IMPORT_TDE_KEY") + oralogger.filename_ = file_name + ocommon.log_info_message("=======================================================================",file_name) + oenv.add_custom_variable("IMPORT_TDE_KEY",arg) + elif opt in ('--optype'): + oenv.add_custom_variable("OP_TYPE",arg) else: pass diff --git a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oracommon.py b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oracommon.py index f5c2f14..8c96b7f 100644 --- a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oracommon.py +++ b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oracommon.py @@ -13,7 +13,6 @@ import time import datetime import os -import commands import getopt import shlex import json @@ -22,12 +21,15 @@ import re import os.path import socket +import string +import random class OraCommon: def __init__(self,oralogger,orahandler,oraenv): self.ologger = oralogger self.ohandler = orahandler self.oenv = oraenv.get_instance() + self.ora_env_dict = oraenv.get_env_vars() self.file_name = os.path.basename(__file__) def run_sqlplus(self,cmd,sql_cmd,dbenv): @@ -41,7 +43,7 @@ def run_sqlplus(self,cmd,sql_cmd,dbenv): cmd=self.unmask_str(cmd) # message="Received Command : {0}\n{1}".format(cmd,sql_cmd) # self.log_info_message(message,self.file_name) - p = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,env=dbenv,shell=True) + p = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,env=dbenv,shell=True,universal_newlines=True) p.stdin.write(sql_cmd) # (stdout,stderr), retcode = p.communicate(sqlplus_script.encode('utf-8')), p.returncode (stdout,stderr),retcode = p.communicate(),p.returncode @@ -51,7 +53,7 @@ def run_sqlplus(self,cmd,sql_cmd,dbenv): self.log_error_message(error_msg,self.file_name) self.prog_exit(self) - return stdout,stderr,retcode + return stdout.replace("\n\n", "\n"),stderr,retcode def execute_cmd(self,cmd,env,dir): """ @@ -61,7 +63,7 @@ def execute_cmd(self,cmd,env,dir): message="Received Command : {0}".format(self.mask_str(cmd)) self.log_info_message(message,self.file_name) cmd=self.unmask_str(cmd) - out = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,universal_newlines=True) (output,error),retcode = out.communicate(),out.returncode except: error_msg=sys.exc_info() @@ -280,6 +282,24 @@ def update_key(self,key,value,env_dict): return env_dict + def check_file(self,file,local,remote,user): + """ + check locally or remotely + Attributes: + file (string): file to be created + local (boolean): dir to craetes locally + remote (boolean): dir to be created remotely + node (string): remote node name on which dir to be created + user (string): remote user to be connected + """ + self.log_info_message("Inside check_file()",self.file_name) + if local: + if os.path.isfile(file): + return True + else: + return False + + def read_file(self,fname): """ Read the contents of a file and returns the contents to end user @@ -328,7 +348,7 @@ def create_dir(self,dir,local,remote,user): msg='''Dir {0} already exist'''.format(dir) self.log_info_message(msg,self.file_name) - if remote and node: + if remote: pass def create_file(self,file,local,remote,user): @@ -348,14 +368,14 @@ def create_file(self,file,local,remote,user): output,error,retcode=self.execute_cmd(cmd,None,None) self.check_os_err(output,error,retcode,True) - if remote and node: + if remote: pass def shutdown_db(self,env_dict): """ Shutdown the database """ - file="/home/oracle/shutDown.sh immediate" + file="/home/oracle/shutDown.sh" if not os.path.isfile(file): self.log_info_message("Inside shutdown_db()",self.file_name) sqlpluslogincmd='''{0}/bin/sqlplus "/as sysdba"'''.format(env_dict["ORACLE_HOME"]) @@ -367,7 +387,7 @@ def shutdown_db(self,env_dict): self.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) self.check_sql_err(output,error,retcode,True) else: - cmd='''sh {0}'''.format(file) + cmd='''sh {0} immediate'''.format(file) output,error,retcode=self.execute_cmd(cmd,None,None) self.check_os_err(output,error,retcode,True) @@ -432,6 +452,39 @@ def stop_gsm(self,env_dict): self.log_info_message("Calling check_sql_err() to validate the gsm command return status",self.file_name) self.check_sql_err(output,error,retcode,None) + def set_events(self,source): + """ + Seting events at DB level + """ + scope='' + accepted_scope = ['spfile', 'memory', 'both'] + + if self.check_key("DB_EVENTS",self.ora_env_dict): + events=str(self.ora_env_dict["DB_EVENTS"]).split(";") + + for event in events: + msg='''Setting up event {0}'''.format(event) + self.log_info_message(msg,self.file_name) + scope='' + ohome=self.ora_env_dict["ORACLE_HOME"] + inst_sid=self.ora_env_dict["ORACLE_SID"] + sqlpluslogincmd=self.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + self.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + source=event.split(":") + if len(source) > 1: + if source[1].split("=")[0] == "scope": + scope=source[1].split("=")[1] + + if scope not in accepted_scope: + sqlcmd=""" + alter system set events='{0}';""".format(source[0]) + else: + sqlcmd=""" + alter system set event='{0}' scope={1};""".format(source[0],scope) + output,error,retcode=self.run_sqlplus(sqlpluslogincmd,sqlcmd,None) + self.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.check_sql_err(output,error,retcode,True) + def start_gsm(self,env_dict): """ Start the GSM @@ -472,6 +525,23 @@ def check_substr_match(self,source_str,sub_str): else: return False + def find_str_in_string(self,source_str,delimeter,search_str): + """AI is creating summary for find_str_in_string + + Args: + source_str ([string]): [string where you need to search] + delimeter ([character]): [string delimeter] + search_str ([string]): [string to be searched] + """ + if delimeter == 'comma': + new_str=source_str.split(',') + for str in new_str: + if str.lower() == search_str.lower(): + return True + return False + + return False + def check_status_value(self,match): """ return completed or notcompleted @@ -539,7 +609,28 @@ def get_domain(self,ohost): get the domain name from hostname """ return ohost.partition('.')[2] + +######### Get the DOMAIN############## + def get_host_domain(self): + """ + Return Public Hostname + """ + domain=None + domain=socket.getfqdn().split('.',1)[1] + if domain is None: + domain="example.info" + + return domain + ######### get the public IP ############## + def get_ip(self,hostname,domain): + """ + Return the Ip based on hostname + """ + if not domain: + domain=self.get_host_domain() + + return socket.gethostbyname(hostname) def get_global_dbdomain(self,ohost,gdbname): """ @@ -607,24 +698,117 @@ def get_sys_passwd(self): return dbpasswd def get_password(self,key): - """ - get the password - """ - passwd_file_flag=False - self.log_info_message("Getting the OS password",self.file_name) - if key == 'ASM': - pass - elif key == 'OS': - pass - else: + """ + get the password + """ + passwd_file_flag=False + password=None + password_file=None if self.check_key("SECRET_VOLUME",self.ora_env_dict): + self.log_info_message("Secret_Volume set to : ",self.ora_env_dict["SECRET_VOLUME"]) msg='''SECRET_VOLUME passed as an env variable and set to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) else: self.ora_env_dict=self.add_key("SECRET_VOLUME","/run/secrets",self.ora_env_dict) msg='''SECRET_VOLUME not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) self.log_warn_message(msg,self.file_name) -######### Get Password ############## + if self.check_key("KEY_SECRET_VOLUME",self.ora_env_dict): + self.log_info_message("Secret_Volume set to : ",self.ora_env_dict["KEY_SECRET_VOLUME"]) + msg='''KEY_SECRET_VOLUME passed as an env variable and set to {0}'''.format(self.ora_env_dict["KEY_SECRET_VOLUME"]) + else: + if self.check_key("SECRET_VOLUME",self.ora_env_dict): + self.ora_env_dict=self.add_key("KEY_SECRET_VOLUME",self.ora_env_dict["SECRET_VOLUME"],self.ora_env_dict) + msg='''KEY_SECRET_VOLUME not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["KEY_SECRET_VOLUME"]) + self.log_warn_message(msg,self.file_name) + + if self.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict): + msg='''COMMON_OS_PWD_FILE passed as an env variable and set to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) + else: + self.ora_env_dict=self.add_key("COMMON_OS_PWD_FILE","common_os_pwdfile.enc",self.ora_env_dict) + msg='''COMMON_OS_PWD_FILE not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) + self.log_warn_message(msg,self.file_name) + + if self.check_key("PWD_KEY",self.ora_env_dict): + msg='''PWD_KEY passed as an env variable and set to {0}'''.format(self.ora_env_dict["PWD_KEY"]) + else: + self.ora_env_dict=self.add_key("PWD_KEY","pwd.key",self.ora_env_dict) + msg='''PWD_KEY not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["PWD_KEY"]) + self.log_warn_message(msg,self.file_name) + + if self.check_key("PASSWORD_FILE",self.ora_env_dict): + msg='''PASSWORD_FILE passed as an env variable and set to {0}'''.format(self.ora_env_dict["PASSWORD_FILE"]) + else: + self.ora_env_dict=self.add_key("PASSWORD_FILE","dbpasswd.file",self.ora_env_dict) + msg='''PASSWORD_FILE not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["PASSWORD_FILE"]) + self.log_warn_message(msg,self.file_name) + + secret_volume = self.ora_env_dict["SECRET_VOLUME"] + key_secret_volume= self.ora_env_dict["KEY_SECRET_VOLUME"] + common_os_pwd_file = self.ora_env_dict["COMMON_OS_PWD_FILE"] + pwd_volume=None + if self.check_key("PWD_VOLUME",self.ora_env_dict): + pwd_volume=self.ora_env_dict["PWD_VOLUME"] + else: + pwd_volume="/var/tmp" + pwd_key = self.ora_env_dict["PWD_KEY"] + passwd_file='''{0}/{1}'''.format(secret_volume,self.ora_env_dict["COMMON_OS_PWD_FILE"]) + dbpasswd_file='''{0}/{1}'''.format(secret_volume,self.ora_env_dict["PASSWORD_FILE"]) + key_file='''{0}/{1}'''.format(self.ora_env_dict["KEY_SECRET_VOLUME"],self.ora_env_dict["PWD_KEY"]) + key_secret_volume='''{0}'''.format(self.ora_env_dict["KEY_SECRET_VOLUME"]) + self.log_info_message("Password file set to : " + passwd_file,self.file_name) + self.log_info_message("key file set to : " + key_file,self.file_name) + self.log_info_message("dbpasswd file set to : " + dbpasswd_file,self.file_name) + self.log_info_message("key secret voluem set to file set to : " + key_secret_volume,self.file_name) + self.log_info_message("pwd volume set : " + pwd_volume,self.file_name) + #print(passwd_file) + if (os.path.isfile(passwd_file)) and (os.path.isfile(key_file)): + msg='''Passwd file {0} and key file {1} exist. Password file Check passed!'''.format(passwd_file,key_file) + self.log_info_message(msg,self.file_name) + msg='''Reading encrypted passwd from file {0}.'''.format(passwd_file) + self.log_info_message(msg,self.file_name) + cmd=None + if self.check_key("ENCRYPTION_TYPE",self.ora_env_dict): + if self.ora_env_dict["ENCRYPTION_TYPE"].lower() != "aes256": + cmd='''openssl enc -d -aes-256-cbc -in \"{0}/{1}\" -out {2}/{1} -pass file:\"{3}/{4}\"'''.formatformat(secret_volume,common_os_pwd_file,pwd_volume,key_secret_volume,pwd_key) + else: + cmd ='''openssl rsautl -decrypt -in \"{0}/{1}\" -out {2}/{1} -inkey \"{3}/{4}\"'''.format(secret_volume,common_os_pwd_file,pwd_volume,key_secret_volume,pwd_key) + + output,error,retcode=self.execute_cmd(cmd,None,None) + self.check_os_err(output,error,retcode,True) + passwd_file_flag = True + password_file='''{0}/{1}'''.format(pwd_volume,self.ora_env_dict["COMMON_OS_PWD_FILE"]) + elif os.path.isfile(dbpasswd_file): + msg='''Passwd file {0} exist. Password file Check passed!'''.format(dbpasswd_file) + self.log_info_message(msg,self.file_name) + msg='''Reading encrypted passwd from file {0}.'''.format(dbpasswd_file) + self.log_info_message(msg,self.file_name) + cmd='''openssl base64 -d -in \"{0}\" -out \"{2}/{1}\"'''.format(dbpasswd_file,self.ora_env_dict["PASSWORD_FILE"],pwd_volume) + output,error,retcode=self.execute_cmd(cmd,None,None) + self.check_os_err(output,error,retcode,True) + passwd_file_flag = True + password_file='''{1}/{0}'''.format(self.ora_env_dict["PASSWORD_FILE"],pwd_volume) + + if not passwd_file_flag: + # get random password pf length 8 with letters, digits, and symbols + characters1 = string.ascii_letters + string.digits + "_-%#" + str1 = ''.join(random.choice(string.ascii_uppercase) for i in range(4)) + str2 = ''.join(random.choice(characters1) for i in range(8)) + password=str1+str2 + else: + fname='''{0}'''.format(password_file) + fdata=self.read_file(fname) + password=fdata + self.remove_file(fname) + + if self.check_key("ORACLE_PWD",self.ora_env_dict): + msg="ORACLE_PWD is passed as an env variable. Check Passed!" + self.log_info_message(msg,self.file_name) + else: + self.ora_env_dict=self.add_key("ORACLE_PWD",password,self.ora_env_dict) + msg="ORACLE_PWD set to HIDDEN_STRING generated using encrypted password file" + self.log_info_message(msg,self.file_name) + +######### Get oraversion ############## def get_oraversion(self,home): """ get the software version @@ -634,3 +818,65 @@ def get_oraversion(self,home): self.check_os_err(output,error,retcode,True) return output + +####### Get db lock file location ####### + def get_db_lock_location(self): + """ + get the db location + """ + if self.check_key("DB_LOCK_FILE_LOCATION",self.ora_env_dict): + return self.ora_env_dict["DB_LOCK_FILE_LOCATION"] + else: + ### Please note that you should not change following path as SIDB team is maintaining lock files under following location + return "/tmp/." + +####### Get the TDE Key ############### + def export_tde_key(self,filename): + """ + This function export the tde. + """ + self.log_info_message("Inside gettdekey()",self.file_name) + sqlpluslogincmd='''{0}/bin/sqlplus "/as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + sqlcmd=''' + ALTER SESSION DISABLE SHARD DDL; + ADMINISTER KEY MANAGEMENT EXPORT ENCRYPTION KEYS WITH SECRET {0} TO {1} IDENTIFIED BY {0}; + '''.format('HIDDEN_STRING',filename) + self.log_info_message("Running the sqlplus command to export the tde: " + sqlcmd,self.file_name) + output,error,retcode=self.run_sqlplus(sqlpluslogincmd,sqlcmd,None) + self.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.check_sql_err(output,error,retcode,True) + +####### Get the TDE Key ############### + def import_tde_key(self,filename): + """ + This function import the TDE key. + """ + self.log_info_message("Inside importtdekey()",self.file_name) + sqlpluslogincmd='''{0}/bin/sqlplus "/as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + sqlcmd=''' + ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY {0}; + ADMINISTER KEY MANAGEMENT IMPORT ENCRYPTION KEYS WITH SECRET {0} FROM {1} IDENTIFIED BY {0} WITH BACKUP + '''.format('HIDDEN_STRING',filename) + self.log_info_message("Running the sqlplus command to import the tde key: " + sqlcmd,self.file_name) + output,error,retcode=self.run_sqlplus(sqlpluslogincmd,sqlcmd,None) + self.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.check_sql_err(output,error,retcode,True) +######## Reset the DB Password in database ######## + def reset_passwd(self): + """ + This function reset the password. + """ + password_script='''{0}/{1}'''.format(self.ora_env_dict["HOME"],"setPassword.sh") + self.log_info_message("Executing password reset", self.file_name) + if self.check_key("ORACLE_PWD",self.ora_env_dict) and self.check_key("HOME",self.ora_env_dict) and os.path.isfile(password_script): + cmd='''{0} {1} '''.format(password_script,'HIDDEN_STRING') + self.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + output,error,retcode=self.execute_cmd(cmd,None,None) + self.check_os_err(output,error,retcode,True) + self.unset_mask_str() + else: + msg='''Error Occurred! Either HOME DIR {0} does not exist, ORACLE_PWD {1} is not set or PASSWORD SCRIPT {2} does not exist'''.format(self.ora_env_dict["HOME"],self.ora_env_dict["ORACLE_PWD"],password_script) + self.log_error_message(msg,self.file_name) + self.oracommon.prog_exit() \ No newline at end of file diff --git a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oraenv.py b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oraenv.py index f33bb1a..dd96c48 100644 --- a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oraenv.py +++ b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oraenv.py @@ -15,6 +15,7 @@ class OraEnv: __instance = None __env_var_file = '/etc/rac_env_vars' + __env_var_file_flag = None __env_var_dict = {} __ora_asm_diskgroup_name = '+DATA' @@ -60,6 +61,8 @@ def read_variable(): @staticmethod def add_variable(): """ Add more variable ased on enviornment with default values in __env_var_dict""" + OraEnv.__env_var_dict["GSM_LOCK_STATUS_FILE"] = "/tmp/.gsm_status_lock_file" + OraEnv.__env_var_dict["SHARD_LOCK_STATUS_FILE"] = "/tmp/.shard_status_lock_file" if "ORA_ASM_DISKGROUP_NAME" not in OraEnv.__env_var_dict: OraEnv.__env_var_dict["ORA_ASM_DISKGROUP_NAME"] = "+DATA" @@ -102,6 +105,8 @@ def logfile_name(file_type): OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/shard_remove.log" elif file_type == "CHECK_LIVENESS": OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/shard_checkliveness.log" + elif file_type == "CHECK_READYNESS": + OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/shard_checkreadyness.log" elif file_type == "RESET_LISTENER": OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/reset_listener.log" elif file_type == "RESTART_DB": @@ -122,6 +127,12 @@ def logfile_name(file_type): OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/check_online_shard.log" elif file_type == "CHECK_GSM_SHARD": OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/check_gsm_shard.log" + elif file_type == "INVITED_NODE_OP": + OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/node_invited_op.log" + elif file_type == "RESET_PASSWD": + OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/reset_passwd_file.log" + elif file_type == "TDE_KEY": + OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/tde_key.log" else: pass diff --git a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oragsm.py b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oragsm.py index 4a5266e..d8d1634 100644 --- a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oragsm.py +++ b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oragsm.py @@ -74,7 +74,16 @@ def setup(self): self.ocommon.log_info_message("No existing catalog and GDS setup found on this system. Setting up GDS and will configure catalog on this machine.",self.file_name) self.ocommon.prog_exit("127") else: - self.self.setup_gsm_shardg("ADD_SGROUP_PARAMS") + self.setup_gsm_shardg("ADD_SGROUP_PARAMS") + sys.exit(0) + elif self.ocommon.check_key("ADD_SSPACE_PARAMS",self.ora_env_dict): + self.catalog_checks() + status = self.catalog_setup_checks() + if not status: + self.ocommon.log_info_message("No existing catalog and GDS setup found on this system. Setting up GDS and will configure catalog on this machine.",self.file_name) + self.ocommon.prog_exit("127") + else: + self.setup_gsm_sspace("ADD_SSPACE_PARAMS") sys.exit(0) elif self.ocommon.check_key("REMOVE_SHARD",self.ora_env_dict): self.catalog_checks() @@ -83,8 +92,13 @@ def setup(self): self.ocommon.log_info_message("No existing catalog and GDS setup found on this system. Setting up GDS and will configure catalog on this machine.",self.file_name) self.ocommon.prog_exit("127") else: - self.remove_gsm_shard() + status=self.remove_gsm_shard() + + if status: sys.exit(0) + else: + sys.exit(1) + elif self.ocommon.check_key("MOVE_CHUNKS",self.ora_env_dict): self.catalog_checks() status = self.catalog_setup_checks() @@ -94,6 +108,9 @@ def setup(self): else: self.move_shard_chunks() sys.exit(0) + elif self.ocommon.check_key("TDE_KEY",self.ora_env_dict): + self.ocommon.get_tde_key() + sys.exit(0) elif self.ocommon.check_key("CANCEL_CHUNKS",self.ora_env_dict): self.catalog_checks() status = self.catalog_setup_checks() @@ -148,10 +165,18 @@ def setup(self): else: sys.exit(0) elif self.ocommon.check_key("CHECK_LIVENESS",self.ora_env_dict): + filename=self.ora_env_dict["GSM_LOCK_STATUS_FILE"] + if os.path.exists(filename): + self.ocommon.log_info_message("provisioning is still in progress as file " + filename + " still exist!",self.file_name) + sys.exit(0) status = self.catalog_setup_checks() if not status: self.ocommon.log_info_message("No existing catalog and GDS setup found on this system. Setting up GDS and will configure catalog on this machine.",self.file_name) self.ocommon.prog_exit("127") + status = self.check_gsm_director_status(None) + if not status: + self.ocommon.log_info_message("No GDS setup found on this system.",self.file_name) + self.ocommon.prog_exit("127") self.ocommon.log_info_message("GSM liveness check completed sucessfully!",self.file_name) sys.exit(0) elif self.ocommon.check_key("INVITED_NODE_OP",self.ora_env_dict): @@ -186,7 +211,11 @@ def setup(self): self.setup_gsm_director() self.start_gsm_director() self.status_gsm_director() - self.setup_gsm_shardg("SHARD_GROUP") + if self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + if self.ora_env_dict["SHARDING_TYPE"].upper() != 'USER': + self.setup_gsm_shardg("SHARD_GROUP") + else: + self.setup_gsm_shardg("SHARD_GROUP") self.gsm_backup_file() self.gsm_completion_message() ### Running Custom Scripts @@ -216,7 +245,13 @@ def setup(self): self.setup_gsm_director() self.start_gsm_director() self.status_gsm_director() - self.setup_gsm_shardg("SHARD_GROUP") + if self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + if self.ora_env_dict["SHARDING_TYPE"].upper() != 'USER': + self.setup_gsm_shardg("SHARD_GROUP") + if self.ora_env_dict["SHARDING_TYPE"].upper() == 'USER': + self.setup_gsm_sspace("SHARD_SPACE") + else: + self.setup_gsm_shardg("SHARD_GROUP") self.setup_gsm_shard() self.set_hostid_null() self.stop_gsm_director() @@ -247,8 +282,16 @@ def setup_machine(self): This function performs the compute before performing setup """ self.omachine.setup() + filename = self.ora_env_dict["GSM_LOCK_STATUS_FILE"] + touchfile = 'touch {0}'.format(filename) + if not os.path.isfile(filename): + self.ocommon.log_error_message("Setting file provisioning status file :" + filename ,self.file_name) + output,error,retcode=self.ocommon.execute_cmd(touchfile,None,self.ora_env_dict) + if retcode == 1: + self.ocommon.log_error_message("error occurred while touching the file :" + filename + ". Exiting!",self.file_name) + self.ocommon.prog_exit("127") - ########### SETUP_MACHINE ENDS here #################### + ########### ENDS here #################### def gsm_checks(self): """ @@ -259,7 +302,7 @@ def gsm_checks(self): self.shard_user_check() self.gsm_hostname_check() self.director_params_checks() - self.catalog_params_check() + self.catalog_params_check() self.shard_params_check() self.sgroup_params_check() @@ -295,65 +338,13 @@ def ohome_check(self): self.ocommon.prog_exit("127") def passwd_check(self): - """ - This funnction perform password related checks - """ - passwd_file_flag = False - if self.ocommon.check_key("SECRET_VOLUME",self.ora_env_dict): - msg='''SECRET_VOLUME passed as an env variable and set to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - else: - self.ora_env_dict=self.ocommon.add_key("SECRET_VOLUME","/run/secrets",self.ora_env_dict) - msg='''SECRET_VOLUME not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict): - msg='''COMMON_OS_PWD_FILE passed as an env variable and set to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - else: - self.ora_env_dict=self.ocommon.add_key("COMMON_OS_PWD_FILE","common_os_pwdfile.enc",self.ora_env_dict) - msg='''COMMON_OS_PWD_FILE not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("PWD_KEY",self.ora_env_dict): - msg='''PWD_KEY passed as an env variable and set to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - else: - self.ora_env_dict=self.ocommon.add_key("PWD_KEY","pwd.key",self.ora_env_dict) - msg='''PWD_KEY not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - secret_volume = self.ora_env_dict["SECRET_VOLUME"] - common_os_pwd_file = self.ora_env_dict["COMMON_OS_PWD_FILE"] - pwd_key = self.ora_env_dict["PWD_KEY"] - passwd_file='''{0}/{1}'''.format(self.ora_env_dict["SECRET_VOLUME"],self.ora_env_dict["COMMON_OS_PWD_FILE"]) - if os.path.isfile(passwd_file): - msg='''Passwd file {0} exist. Password file Check passed!'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - msg='''Reading encrypted passwd from file {0}.'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - cmd='''openssl enc -d -aes-256-cbc -in \"{0}/{1}\" -out /tmp/{1} -pass file:\"{0}/{2}\"'''.format(secret_volume,common_os_pwd_file,pwd_key) - output,error,retcode=self.ocommon.execute_cmd(cmd,None,None) - self.ocommon.check_os_err(output,error,retcode,True) - passwd_file_flag = True - - if not passwd_file_flag: - s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()?" - passlen = 8 - password = "".join(random.sample(s,passlen )) - else: - fname='''/tmp/{0}'''.format(common_os_pwd_file) - fdata=self.ocommon.read_file(fname) - password=fdata - self.ocommon.remove_file(fname) - - if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict): - msg="ORACLE_PWD is passed as an env variable. Check Passed!" - self.ocommon.log_info_message(msg,self.file_name) - else: - self.ora_env_dict=self.ocommon.add_key("ORACLE_PWD",password,self.ora_env_dict) - msg="ORACLE_PWD set to HIDDEN_STRING generated using encrypted password file" - self.ocommon.log_info_message(msg,self.file_name) + """ + Set the password + """ + self.ocommon.get_password(None) + if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict): + msg='''ORACLE_PWD key is set. Check Passed!''' + self.ocommon.log_info_message(msg,self.file_name) def shard_user_check(self): """ @@ -396,7 +387,8 @@ def gsm_hostname_check(self): self.ocommon.log_info_message(msg,self.file_name) else: if self.ocommon.check_key("KUBE_SVC",self.ora_env_dict): - hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + ## hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + hostname='''{0}'''.format(socket.getfqdn()) else: hostname='''{0}'''.format(socket.gethostname()) msg='''ORACLE_HOSTNAME is not set, setting it to hostname {0} of the compute!'''.format(hostname) @@ -413,6 +405,13 @@ def catalog_params_check(self): if(reg_exp.match(key)): msg='''CATALOG PARAMS {0} is set to {1}'''.format(key,self.ora_env_dict[key]) self.ocommon.log_info_message(msg,self.file_name) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) + if stype: + if stype.lower() == 'user': + if not self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + self.ora_env_dict=self.ocommon.add_key("SHARDING_TYPE","USER",self.ora_env_dict) + if not self.ocommon.check_key("SHARD_SPACE",self.ora_env_dict): + self.ora_env_dict=self.ocommon.add_key("SHARD_SPACE",sspace,self.ora_env_dict) status=True if not status: @@ -554,10 +553,10 @@ def setup_gsm_calog(self): while counter < end_counter: for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks=self.process_clog_vars(key) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) catalog_db_status=self.check_setup_status(catalog_host,catalog_db,catalog_pdb,catalog_port) if catalog_db_status == 'completed': - self.configure_gsm_clog(catalog_host,catalog_db,catalog_pdb,catalog_port,catalog_name,catalog_region,catalog_chunks) + self.configure_gsm_clog(catalog_host,catalog_db,catalog_pdb,catalog_port,catalog_name,catalog_region,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname) break else: msg='''Catalog Status must return completed but returned value is {0}'''.format(status) @@ -581,6 +580,12 @@ def process_clog_vars(self,key): catalog_host=None catalog_name=None catalog_chunks=None + repl_type=None + repl_factor=None + repl_unit=None + stype=None + sspace=None + cfname=None self.ocommon.log_info_message("Inside process_clog_vars()",self.file_name) cvar_str=self.ora_env_dict[key] @@ -599,16 +604,32 @@ def process_clog_vars(self,key): if ckey == 'catalog_name': catalog_name = cvar_dict[ckey] if ckey == 'catalog_chunks': - catalog_chunks = cvar_dict[ckey] + catalog_chunks = cvar_dict[ckey] + if ckey == 'repl_type': + repl_type = cvar_dict[ckey] + if ckey == 'repl_factor': + repl_factor = cvar_dict[ckey] + if ckey == 'repl_unit': + repl_unit = cvar_dict[ckey] + if ckey == 'sharding_type': + stype = cvar_dict[ckey] + if ckey == 'shard_space': + sspace = cvar_dict[ckey] + if ckey == 'shard_configname': + cfname = cvar_dict[ckey] + ## Set the values if not set in above block if not catalog_port: catalog_port=1521 if not catalog_region: catalog_region="region1,region2" + if stype: + if not sspace: + sspace="shardspace1,shardspace2" ### Check values must be set if catalog_host and catalog_db and catalog_pdb and catalog_port and catalog_region and catalog_name: - return catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks + return catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname else: msg1='''catalog_db={0},catalog_pdb={1}'''.format((catalog_db or "Missing Value"),(catalog_pdb or "Missing Value")) msg2='''catalog_port={0},catalog_host={1}'''.format((catalog_port or "Missing Value"),(catalog_host or "Missing Value")) @@ -649,27 +670,101 @@ def catalog_regex(self): return re.compile('CATALOG_PARAMS') - def configure_gsm_clog(self,chost,ccdb,cpdb,cport,catalog_name,catalog_region,catalog_chunks): + def configure_gsm_clog(self,chost,ccdb,cpdb,cport,catalog_name,catalog_region,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname): """ This function configure the GSM catalog. """ self.ocommon.log_info_message("Inside configure_gsm_clog()",self.file_name) gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + replist=['native'] + + ### User Define Shardig Variables + shardingtype=None + shardspace=None + configname=None + + # if stype and sspace: + if stype: + if stype.lower() == 'user': + shardingtype="-sharding user" + #shardspace="" + shardspace=" -shardspace {0}".format(sspace) + if not self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + self.ora_env_dict=self.ocommon.add_key("SHARDING_TYPE","USER",self.ora_env_dict) + if not self.ocommon.check_key("SHARD_SPACE",self.ora_env_dict): + self.ora_env_dict=self.ocommon.add_key("SHARD_SPACE",sspace,self.ora_env_dict) + else: + shardspace="" + shardingtype="" + else: + shardspace="" + shardingtype="" + + if cfname: + configname=" -configname {0}".format(cfname) + else: + configname="" + + ### SNR Sharding + chunks=None + repl=None + repfactor=None + repunits=None + if catalog_chunks: chunks="-chunks {0}".format(catalog_chunks) else: chunks="" + + if repl_type and repl_type.lower() in replist: + self.ocommon.log_info_message("Repl_Type value Set to in block1:" + repl_type,self.file_name) + repl=" -repl {0}".format(repl_type) + else: + repl="" + + if repl_factor: + repfactor=" -repfactor {0}".format(repl_factor) + else: + repfactor="" + + if repl_unit: + repunits=" -repunits {0}".format(repl_unit) + else: + repunits="" + + invited_subnet="" + add_invited_subnet="" + if self.ocommon.check_key("INVITED_NODE_SUBNET_FLAG",self.ora_env_dict): + if self.ocommon.check_key("INVITED_NODE_SUBNET",self.ora_env_dict): + invited_subnet=self.ora_env_dict["INVITED_NODE_SUBNET"] + else: + #self.ocommon.log_info_message("The catalog Host name is :" + chost,self.file_name) + chost_ip=self.ocommon.get_ip(chost,None) + ip_parts=chost_ip.split('.') + invited_subnet=ip_parts[0] + "." + ip_parts[1] + '.*' + '.*' + add_invited_subnet='''add invitedsubnet {0};'''.format(invited_subnet) + cpasswd="HIDDEN_STRING" self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) gsmcmd=''' - create shardcatalog -database \"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})))\" {7} -user {3}/{4} -sdb {5} -region {6} -agent_port 8080 -agent_password {4} -autovncr off; + create shardcatalog -database \"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})))\" {7} -user {3}/{4} -sdb {5} -region {6} -agent_port 8080 -agent_password {4} {8} {9} {10} {11} {12} {13} -autovncr off; add invitednode {0}; + {14} exit; - '''.format(chost,cport,cpdb,cadmin,cpasswd,catalog_name,catalog_region,chunks) + '''.format(chost,cport,cpdb,cadmin,cpasswd,catalog_name,catalog_region,chunks,repl,repfactor,repunits,shardingtype,shardspace,configname,add_invited_subnet) + + counter=1 + while counter < 5: + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + if retcode != 0: + self.ocommon.log_info_message("Error occurred while creating the shard catalog, sleeping for 60 seconds",self.file_name) + counter = counter + 1 + time.sleep(60) + else: + break - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) ### Unsetting the encrypt value to None self.ocommon.unset_mask_str() @@ -697,9 +792,9 @@ def process_director_vars(self,key): if dtrname and dtrport and dtregion: return dtrname,dtrport,dtregion else: - msg1='''director_name={0},director_port={1}'''.format((director_name or "Missing Value"),(director_port or "Missing Value")) - msg2='''director_region={0}'''.format((director_region or "Missing Value")) - msg='''Director params {0} is not set correctly. One or more value is missing {1} {2}'''.format(SHARD_DIRECTOR_PARAMS,msg1,msg2) + msg1='''director_name={0},director_port={1}'''.format((dtrname or "Missing Value"),(dtrport or "Missing Value")) + msg2='''director_region={0}'''.format((dtregion or "Missing Value")) + msg='''Director params {0} is not set correctly. One or more value is missing {1} {2}'''.format(key,msg1,msg2) self.ocommon.log_error_message(msg,self.file_name) self.ocommon.prog_exit("Error occurred") @@ -734,6 +829,54 @@ def check_gsm_director(self,dname): return(self.ocommon.check_status_value(status)) + def check_gsm_region(self,region): + """ + This function check the GSM regions + """ + self.ocommon.log_info_message("Inside check_gsm_region()",self.file_name) + gsmcmd=self.get_gsm_config_cmd(None) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + matched_output=re.findall("(?:Regions\n)(?:.+\n)+",output) + status=False + try: + if self.ocommon.check_substr_match(matched_output[0],region): + status=True + except: + status=False + return(self.ocommon.check_status_value(status)) + + def check_gsm_shardspace(self,sspace): + """ + This function check the GSM shardspace + """ + self.ocommon.log_info_message("Inside check_gsm_shardspace()",self.file_name) + gsmcmd=self.get_gsm_config_cmd(None) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + matched_output=re.findall("(?:Shard spaces\n)(?:.+\n)+",output) + status=False + try: + if self.ocommon.check_substr_match(matched_output[0],sspace): + status=True + except: + status=False + return(self.ocommon.check_status_value(status)) + + def check_gsm_director_status(self,dname): + """ + This function check the GSM director status using 'gdsctl status' + """ + self.ocommon.log_info_message("Inside check_gsm_director_status()",self.file_name) + status=False + gsmcmd=''' + status; + exit; + ''' + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + if "Connected to GDS catalog Y".replace(" ","").lower() in output.replace(" ","").lower(): + return True + else: + return False + def add_gsm_director(self): """ This function add the GSM @@ -796,12 +939,12 @@ def setup_gsm_director(self): if shard_director_status != 'completed': self.configure_gsm_director(dtrname,dtrport,dtregion,gsmhost,cadmin) status = self.check_gsm_director(None) - if status == 'completed': - break - else: - msg='''GSM shard director setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) - time.sleep(60) - counter=counter+1 + if status == 'completed': + break + else: + msg='''GSM shard director setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) + time.sleep(60) + counter=counter+1 status = self.check_gsm_director(None) if status == 'completed': @@ -809,8 +952,8 @@ def setup_gsm_director(self): self.ocommon.log_info_message(msg,self.file_name) else: msg='''Waited 3 minute to complete shard director in GSM but setup did not complete or failed. Exiting...''' - self.ocommon.log_error_message(msg,self.file_name) - self.ocommon.prog_exit("127") + self.ocommon.log_error_message(msg,self.file_name) + self.ocommon.prog_exit("127") def configure_gsm_director(self,dtrname,dtrport,dtregion,gsmhost,cadmin): """ @@ -821,7 +964,10 @@ def configure_gsm_director(self,dtrname,dtrport,dtregion,gsmhost,cadmin): reg_exp= self.catalog_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks=self.process_clog_vars(key) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) + sregionFlag=self.check_gsm_region(dtregion) + if sregionFlag != 'completed': + self.configure_gsm_region(dtregion) self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) gsmcmd=''' add gsm -gsm {0} -listener {1} -pwd {2} -catalog {3}:{4}/{5} -region {6}; @@ -854,6 +1000,10 @@ def start_gsm_director(self): if status == 'completed': break; if status == 'completed': + filename=self.ora_env_dict["GSM_LOCK_STATUS_FILE"] + remfile='''rm -f {0}'''.format(filename) + if os.path.isfile(filename): + output,error,retcode=self.ocommon.execute_cmd(remfile,None,self.ora_env_dict) break else: msg='''GSM shard director failed to start.Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) @@ -915,31 +1065,37 @@ def setup_gsm_shardg(self,restype): elif restype == 'SHARD_GROUP': reg_exp = self.shardg_regex() else: - self.ocommon.log_error_message("No Key Specified! You can only pass ADD_SGROUP_PARAMS or SHARD_GROUP key to create a shard group",self.file_name) - self.ocommon.prog_exit("127") + self.ocommon.log_warn_message("No Key Specified! You can only pass ADD_SGROUP_PARAMS or SHARD_GROUP key to create a shard group",self.file_name) + self.ocommon.log_warn_message("Since no key specified for ADD_SGROUP_PARAMS and SHARD_GROUP, shardgroup will be created during shard creation",self.file_name) + sgListC=[] + sgListP=[] counter=1 end_counter=3 while counter < end_counter: for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): shard_group_status=None + self.ocommon.log_info_message("Key is set to : " + key,self.file_name) group_name,deploy_as,group_region=self.process_shardg_vars(key) - dtrname=self.get_director_name(group_region) - shard_group_status=self.check_shardg_status(group_name,dtrname) - if shard_group_status != 'completed': - self.configure_gsm_shardg(group_name,deploy_as,group_region) - - status = self.check_shardg_status(None,None) - if status == 'completed': - break - else: - msg='''GSM shard group setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) - time.sleep(60) - counter=counter+1 - - status = self.check_shardg_status(None,None) - if status == 'completed': + self.ocommon.log_info_message("Name: " + group_name + "deploy_as" + deploy_as + "group_region" + group_region,self.file_name) + if group_name is not None: + if group_name not in sgListC: + dtrname=self.get_director_name(group_region) + shard_group_status=self.check_shardg_status(group_name,dtrname) + if shard_group_status != 'completed': + self.configure_gsm_shardg(group_name,deploy_as,group_region,'add') + shard_group_status = self.check_shardg_status(group_name,None) + if shard_group_status == 'completed': + sgListC.append(group_name) + if group_name in sgListP: + sgListP.remove(group_name) + else: + sgListP=sgListP.append(group_name) + time.sleep(30) + counter=counter + 1 + + if sgListP == []: msg='''Shard group setup completed in GSM''' self.ocommon.log_info_message(msg,self.file_name) else: @@ -1026,20 +1182,23 @@ def process_shardg_vars(self,key): self.ocommon.log_error_message(msg,self.file_name) self.ocommon.prog_exit("Error occurred") + def check_shardg_status(self,group_name,dname): - """ - This function check the shard status in GSM - """ - self.ocommon.log_info_message("Inside check_shardg_status()",self.file_name) - status=False - if dname: - gsmcmd=self.get_gsm_config_cmd(dname) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - matched_output=re.findall("(?:Shard Groups\n)(?:.+\n)+",output) - if self.ocommon.check_substr_match(matched_output[0],group_name): - status=True - else: - status=False + """ + This function check the shard status in GSM + """ + self.ocommon.log_info_message("Inside check_shardg_status()",self.file_name) + status=False + + gsmcmd=self.get_gsm_config_cmd(dname) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + matched_output=re.findall("(?:Shard Groups\n)(?:.+\n)+",output) + if self.ocommon.check_substr_match(matched_output[0],group_name): + status=True + else: + status=False + + ''' else: reg_exp= self.shardg_regex() for key in self.ora_env_dict.keys(): @@ -1054,7 +1213,41 @@ def check_shardg_status(self,group_name,dname): status=True else: status=False - return(self.ocommon.check_status_value(status)) + ''' + + return(self.ocommon.check_status_value(status)) + +############################################# Director Related Block ############ + def get_director_name(self,region_name): + """ + This function get the director name based on the region + """ + self.ocommon.log_info_message("Inside get_director_name()",self.file_name) + status=False + director_name=None + reg_exp= self.director_regex() + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + dtrname,dtrport,dtregion=self.process_director_vars(key) + director_name=dtrname + gsm_status = self.check_gsm_director(dtrname) + if gsm_status == 'completed': + status = True + else: + status = False + if dtregion == region_name: + break + if status: + if director_name: + return director_name + else: + self.ocommon.log_error_message("No director exist to match the region",self.file_name) + self.ocommon.prog_exit("127") + else: + self.ocommon.log_error_message("Shard Director is not running!",self.file_name) + self.ocommon.prog_exit("127") + +######## def get_gsm_config_cmd(self,dname): """ @@ -1088,27 +1281,173 @@ def add_shardg_regex(self): self.ocommon.log_info_message("Inside shardg_regex()",self.file_name) return re.compile('ADD_SGROUP_PARAMS') - def configure_gsm_shardg(self,group_name,deploy_as,group_region): + def configure_gsm_shardg(self,group_name,deploy_as,group_region,type): """ This function configure the Shard Group. """ self.ocommon.log_info_message("Inside configure_gsm_shardg()",self.file_name) + cmd=None gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] cpasswd="HIDDEN_STRING" dtrname=self.get_director_name(group_region) + reg_exp= self.catalog_regex() + if type == 'modify': + cmd=''' modify shardgroup -shardgroup {0} '''.format(group_name) + else: + cmd=''' add shardgroup -shardgroup {0} '''.format(group_name) + + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) + if repl_type: + cmd=cmd + " -region {0} ".format(group_region) + else: + cmd=cmd + " -deploy_as {0} -region {1} ".format(deploy_as,group_region) + + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + gsmcmd=''' + connect {1}/{2}; + {3}; + exit; + '''.format("NA",cadmin,cpasswd,cmd) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + +############# Adding Shard Regions ############### + def configure_gsm_region(self,region): + """ + This function configure the Shard region. + """ + self.ocommon.log_info_message("Inside configure_gsm_region()",self.file_name) + cmd=None + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) gsmcmd=''' connect {1}/{2}; - add shardgroup -shardgroup {3} -deploy_as {4} -region {5} + add region -region {3}; exit; - '''.format("NA",cadmin,cpasswd,group_name,deploy_as,group_region) + '''.format("NA",cadmin,cpasswd,region) output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) ### Unsetting the encrypt value to None self.ocommon.unset_mask_str() + +##################### Adding Shard Space ############### + def process_sspace_vars(self,key): + """ + This function process shardG vars based on key and return values to configure the GSM + """ + sspace=None + chunks=None + repfactor=None + repunits=None + protectedmode=None + self.ocommon.log_info_message("Inside process_sspace_vars()",self.file_name) + cvar_str=self.ora_env_dict[key] + cvar_dict=dict(item.split("=") for item in cvar_str.split(";")) + for ckey in cvar_dict.keys(): + if ckey == 'sspace_name': + sspace = cvar_dict[ckey] + if ckey == 'chunks': + chunks = cvar_dict[ckey] + if ckey == 'repfactor': + repfactor = cvar_dict[ckey] + if ckey == 'repunits': + repunits = cvar_dict[ckey] + if ckey == 'protectedmode': + protectedmode = cvar_dict[ckey] + + ### Check values must be set + if sspace: + return sspace,chunks,repfactor,repunits,protectedmode + else: + msg1='''sspace={0}'''.format((sspace or "Missing Value")) + msg='''Shard space params {0} is not set correctly. One or more value is missing {1}'''.format(key,msg1) + self.ocommon.log_error_message(msg,self.file_name) + self.ocommon.prog_exit("Error occurred") + + def setup_gsm_sspace(self,restype): + """ + This function setup the shard sspace. + """ + self.ocommon.log_info_message("Inside setup_gsm_sspace()",self.file_name) + status=False + if restype == 'ADD_SSPACE_PARAMS': + reg_exp = self.add_shardg_regex() + elif restype == 'SHARD_SPACE': + reg_exp = self.shardg_regex() + else: + self.ocommon.log_warn_message("No Key Specified! You can only pass ADD_SSPACE_PARAMS or SHARD_SPACE key to create a shard space",self.file_name) + self.ocommon.log_warn_message("Since no ADD_SSPACE_PARAMS or SHARD_SPACE defined, shardspace will be created during shard creation",self.file_name) + counter=1 + end_counter=3 + while counter < end_counter: + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + shard_group_status=None + sspace,chunks,repfactor,repuntis,protectedmode=self.process_sspace_vars(key) + shard_sspace_status=self.check_gsm_shardspace(sspace) + if shard_group_status != 'completed': + self.configure_gsm_sspace(sspace,chunks,repfactor,repuntis,protectedmode,'add') + + status = self.check_sspace_status(sspace) + if status == 'completed': + break + else: + msg='''GSM shard space setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) + time.sleep(60) + counter=counter+1 + + status = self.check_sspace_status(None,None) + if status == 'completed': + msg='''Shard space setup completed in GSM''' + self.ocommon.log_info_message(msg,self.file_name) + else: + msg='''Waited 2 minute to complete catalog setup in GSM but setup did not complete or failed. Exiting...''' + self.ocommon.log_error_message(msg,self.file_name) + self.ocommon.prog_exit("127") + + + def configure_gsm_sspace(self,sspace,chunks,repfactor,repunits,protectedmode,type): + """ + This function configure the Shard Group. + """ + self.ocommon.log_info_message("Inside configure_gsm_sspace()",self.file_name) + cmd=None + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + if type == 'MODIFY': + cmd=''' modify shardpsace -shardspace {0} '''.format(sspace) + else: + cmd=''' add shardpsace -shardspace {0} '''.format(sspace) + if chunks is not None: + cmd = cmd + ''' -chunks {0}'''.format(chunks) + if repfactor: + cmd = cmd + ''' -repfactor {0}'''.format(repfactor) + if repunits is not None: + cmd = cmd + ''' -repunits {0}'''.format(repfactor) + if protectedmode is not None: + cmd = cmd + ''' -protectedmode {0}'''.format(protectedmode) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + gsmcmd=''' + connect {1}/{2}; + {3}; + exit; + '''.format("NA",cadmin,cpasswd,cmd) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + #########################################Shard Function Begins Here ############################## def setup_gsm_shard(self): """ @@ -1123,11 +1462,10 @@ def setup_gsm_shard(self): for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): shard_db_status=None - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) - + shard_db,shard_pdb,shard_port,shard_group,shard_host,sregion,sspace=self.process_shard_vars(key) shard_db_status=self.check_setup_status(shard_host,shard_db,shard_pdb,shard_port) if shard_db_status == 'completed': - self.configure_gsm_shard(shard_host,shard_db,shard_pdb,shard_port,shard_group) + self.configure_gsm_shard(shard_host,shard_db,shard_pdb,shard_port,shard_group,sregion,sspace) else: msg='''Shard db status must return completed but returned value is {0}'''.format(status) self.ocommon.log_info_message(msg,self.file_name) @@ -1164,12 +1502,25 @@ def add_gsm_shard(self): for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): shard_db_status=None - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) + shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space=self.process_shard_vars(key) shard_name='''{0}_{1}'''.format(shard_db,shard_pdb) shard_db_status=self.check_setup_status(shard_host,shard_db,shard_pdb,shard_port) self.ocommon.log_info_message("Shard Status : " + shard_db_status,self.file_name) if shard_db_status == 'completed': - self.configure_gsm_shard(shard_host,shard_db,shard_pdb,shard_port,shard_group) + self.configure_gsm_shard(shard_host,shard_db,shard_pdb,shard_port,shard_group,shard_region,shard_space) + counter2=1 + end_counter2=5 + while counter2 < end_counter2: + status1 = self.check_shard_status(shard_name) + if status1 == 'completed': + msg='''Shard DB setup completed in GSM''' + self.ocommon.log_info_message(msg,self.file_name) + break + else: + msg='''Shard DB is still not added in GSM. Sleeping for 60 seconds''' + self.ocommon.log_info_message(msg,self.file_name) + time.sleep(60) + counter2=counter2+1 else: msg='''Shard db status must return completed but returned value is {0}'''.format(status) self.ocommon.log_info_message(msg,self.file_name) @@ -1196,20 +1547,83 @@ def remove_gsm_shard(self): This function remove the shard in the GSM """ self.ocommon.log_info_message("Inside remove_gsm_shard()",self.file_name) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars("CATALOG_PARAMS") + numOfShards=self.count_online_shards() status=False - reg_exp= self.remove_shard_regex() + reg_exp=self.remove_shard_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): shard_db_status=None - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) + shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space=self.process_shard_vars(key) + shardname_to_delete=shard_db + "_" + shard_pdb + if repl_type is not None: + if(repl_type.upper() == 'NATIVE'): + self.move_shards_leader_rus(shardname_to_delete) + leaderCount=self.count_leader_shards(shardname_to_delete) + if(numOfShards < 4 or leaderCount > 0): + msg='''ruType=[{0}]. NumofShards=[{1}]. LeaderCount=[{2}]. Ignoring remove of shard [{3}]'''.format(repl_type,numOfShards,leaderCount,shardname_to_delete) + self.ocommon.log_info_message(msg,self.file_name) + break + + self.move_shard_rus(shardname_to_delete,None,None) + while self.count_shard_rus(shardname_to_delete) > 0: + self.ocommon.log_info_message("Waiting for all the shard chunks to be moved.",self.file_name) + time.sleep(15) shard_db_status=self.check_setup_status(shard_host,shard_db,shard_pdb,shard_port) if shard_db_status == 'completed': self.delete_gsm_shard(shard_host,shard_db,shard_pdb,shard_port,shard_group) + status=True else: msg='''Shard db status must return completed but returned value is {0}'''.format(status) self.ocommon.log_info_message(msg,self.file_name) + return status + + def move_shards_leader_rus(self,shardname_to_delete): + """ + This function move the shard leader RUs + """ + shards=self.get_online_shards() + leader_ru=self.get_rus(shardname_to_delete) + all_ru=self.get_rus(None) + count=0 + target_shards=[] + value=0 + + if len(shards) == 0: + msg="""No Shard is online so no RU is available to be moved""" + self.ocommon.log_info_message(msg,self.file_name) + else: + for line in leader_ru: + value=None + count += 1 + cols=line.split() + if len(cols) > 0: + if cols[0].lower() == shardname_to_delete.lower(): + if cols[1].isdigit: + value = int(cols[1]) + else: + continue + + target_shards.clear() + for line1 in all_ru: + cols1=line1.split() + print(cols1) + if len(cols1) > 5: + if cols1[0].lower() != shardname_to_delete.lower() and cols1[1].isdigit and cols1[2].lower() == 'follower': + if value is not None: + if int(cols1[1]) == value: + target_shards.append(cols1[0]) + break + + for shard in shards: + if shard.lower() != shardname_to_delete.lower(): + if shard in target_shards: + msg="Shard_name= " + shard + " Status=True" + " Value = " + str(value) + self.ocommon.log_info_message(msg,self.file_name) + self.move_shard_rus(shardname_to_delete,shard,value) + def move_shard_chunks(self): """ This function move the shard chunks @@ -1521,6 +1935,147 @@ def count_online_shards(self): return online_shard + def get_online_shards(self): + """ + This function return the returns the count of online shard + """ + self.ocommon.log_info_message("Inside get_online_shards()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmcmd=''' + connect {0}/{1}; + config shard; + exit; + '''.format(cadmin,cpasswd) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + shards=[] + online_shard = 0 + for line in output.split("\n"): + cols=line.split() + print(cols) + if len(cols) >= 5: + if cols[5].lower() == "online" and cols[2].lower() == "ok": + shards.append(cols[0]) + + return shards + + def get_rus(self,shardname_to_delete): + """ + This function return the returns the count of online shard + """ + self.ocommon.log_info_message("Inside get_online_shards()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + cmd=None + if shardname_to_delete is not None: + cmd='''status ru -leaders -shard {0}'''.format(shardname_to_delete) + else: + cmd='''status ru''' + + gsmcmd=''' + connect {0}/{1}; + {2}; + exit; + '''.format(cadmin,cpasswd,cmd) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + return output.split('\n') + + def move_shard_rus(self,sshard,tshard,runum): + """ + This function move the shard rus + """ + self.ocommon.log_info_message("Inside move_shard_rus()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + cmd1="" + cmd2="" + shardname=sshard + if tshard is not None and runum is not None: + cmd1='''switchover ru -RU {0} -shard {1}'''.format(runum,tshard) + else: + cmd1='''MOVE RU -RU ALL -SOURCE {0}'''.format(shardname) + + gsmcmd=''' + connect {1}/{2}; + configure -verbose off -save_config; + {3}; + status RU -shard {0}; + exit; + '''.format(shardname,cadmin,cpasswd,cmd1,cmd2) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + def count_shard_rus(self,shardname): + """ + This function return the returns the count of online shard chunks + """ + self.ocommon.log_info_message("Inside count_shard_chunks()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmcmd=''' + connect {0}/{1}; + status ru -shard {2}; + exit; + '''.format(cadmin,cpasswd,shardname) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + ru_count = 0 + lines = output.split("\n") + for line in lines: + if re.search(shardname, line, re.IGNORECASE): + ru_count = ru_count + 1 + + return ru_count + + def count_leader_shards(self,shardName): + """ + This function return the returns the count of online shard + """ + self.ocommon.log_info_message("Inside count_leader_shards()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmcmd=''' + connect {0}/{1}; + status ru -shard {2} -leaders; + exit; + '''.format(cadmin,cpasswd,shardName) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + leader_shard = 0 + lines = output.split("\n") + for line in lines: + if re.search('ok', line, re.IGNORECASE): + if re.search('Leader', line, re.IGNORECASE): + leader_shard = leader_shard + 1 + + return leader_shard + def validate_gsm_shard(self): """ This function validate the shard in the GSM @@ -1530,7 +2085,7 @@ def validate_gsm_shard(self): reg_exp= self.validate_shard_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) + shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space=self.process_shard_vars(key) shard_name='''{0}_{1}'''.format(shard_db,shard_pdb) status = self.check_shard_status(shard_name) if status == 'completed': @@ -1550,6 +2105,9 @@ def process_shard_vars(self,key): shard_port=None shard_group=None shard_host=None + shard_region=None + shard_space=None + shard_deploy_as=None self.ocommon.log_info_message("Inside process_shard_vars()",self.file_name) # self.ocommon.log_info_message(key,self.file_name) @@ -1570,14 +2128,30 @@ def process_shard_vars(self,key): shard_group = cvar_dict[ckey] if ckey == 'shard_host': shard_host = cvar_dict[ckey] + if ckey == 'shard_region': + #shard_region = self.validate_shard_param("region",cvar_dict[ckey]) + shard_region=cvar_dict[ckey] + if ckey == 'deploy_as': + shard_deploy_as=cvar_dict[ckey] + if ckey == 'shard_space': + #shard_space = self.validate_shard_param("shardspace",cvar_dict[ckey]) + shard_space=cvar_dict[ckey] # # self.ocommon.log_info_message("shard_host: " + shard_host, self.file_name) ## Set the values if not set in above block if not shard_port: shard_port=1521 + if self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + if self.ora_env_dict["SHARDING_TYPE"].upper() == 'USER': + shard_group="nogrp" + if not shard_deploy_as: + self.ora_env_dict=self.ocommon.add_key("SHARD_DEPLOY_AS","primary",self.ora_env_dict) + else: + self.ora_env_dict=self.ocommon.add_key("SHARD_DEPLOY_AS",shard_deploy_as,self.ora_env_dict) + ### Check values must be set if shard_host and shard_db and shard_pdb and shard_port and shard_group: - return shard_db,shard_pdb,shard_port,shard_group,shard_host + return shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space else: msg1='''shard_db={0},shard_pdb={1}'''.format((shard_db or "Missing Value"),(shard_pdb or "Missing Value")) msg2='''shard_port={0},shard_host={1}'''.format((shard_port or "Missing Value"),(shard_host or "Missing Value")) @@ -1586,6 +2160,39 @@ def process_shard_vars(self,key): self.ocommon.log_info_message(msg,self.file_name) self.ocommon.prog_exit("Error occurred") + def validate_shard_param(self,param_type,value): + """ + This function validaet the shard param such as region and shardspace + """ + status=False + reg_exp= self.catalog_regex() + stype=None + sspace=None + catalog_region=None + self.ocommon.log_info_message("Processing GSM params to verify the region and shardspace",self.file_name) + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) + + if param_type == 'region': + if stype: + status=self.ocommon.find_str_in_string(catalog_region,'comma',value) + if status: + + return value + else: + return "" + + if param_type == 'shardspace': + if sspace: + status=self.ocommon.find_str_in_string(sspace,'comma',value) + if status: + return value + else: + return "" + + return False + def process_chunks_vars(self,key): """ This function process the chunks vars @@ -1655,7 +2262,7 @@ def check_shard_status(self,shard_name): reg_exp= self.shard_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - shard_db,shard_pdb,shard_port,shard_region,shard_host=self.process_shard_vars(key) + shard_db,shard_pdb,shard_port,shard_region,shard_host,shard_region,shard_space=self.process_shard_vars(key) shard_name='''{0}_{1}'''.format(shard_db,shard_pdb) try: if self.ocommon.check_substr_match(matched_output[0],shard_name.lower()): @@ -1698,51 +2305,112 @@ def validate_shard_regex(self): self.ocommon.log_info_message("Inside remove_shard_regex()",self.file_name) return re.compile('VALIDATE_SHARD') - def configure_gsm_shard(self,shost,scdb,spdb,sdbport,sgroup): - """ - This function configure the shard db. - """ - spasswd="HIDDEN_STRING" - admuser= self.ora_env_dict["SHARD_ADMIN_USER"] - #dtrname,dtrport,dtregion=self.process_director_vars() - group_region=self.get_shardg_region_name(sgroup) - dtrname=self.get_director_name(group_region) - shard_name='''{0}_{1}'''.format(scdb,spdb) - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - gsmcmd=''' - connect {1}/{2}; - add cdb -connect {3}:{4}:{5} -pwd {2}; - add shard -cdb {5} -connect "(DESCRIPTION = (ADDRESS = (PROTOCOL = tcp)(HOST = {3})(PORT = {4})) (CONNECT_DATA = (SERVICE_NAME = {6}) (SERVER = DEDICATED)))" -shardgroup {7} -pwd {2}; - config vncr; - exit; - '''.format("NA",admuser,spasswd,shost,sdbport,scdb,spdb,sgroup,shard_name) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() - + def configure_gsm_shard(self,shost,scdb,spdb,sdbport,sgroup,sregion,sspace): + """ + This function configure the shard db. + """ + spasswd="HIDDEN_STRING" + admuser= self.ora_env_dict["SHARD_ADMIN_USER"] + #dtrname,dtrport,dtregion=self.process_director_vars() + #group_region=self.get_shardg_region_name(sgroup) + #dtrname=self.get_director_name(group_region) + shard_name='''{0}_{1}'''.format(scdb,spdb) + shard_region=None + shard_space=None + shard_group=None + deploy_as=None + + if sregion: + regionFlag=self.check_gsm_region(sregion) + if regionFlag != 'completed': + self.configure_gsm_region(sregion) + shard_region=" -region {0}".format(sregion) + else: + shard_region="" + if sspace: + shard_space=" -shardspace {0}".format(sspace) + else: + shard_space="" + + if self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + if self.ora_env_dict["SHARDING_TYPE"].upper() == 'USER': + sspaceFlag=self.check_gsm_shardspace(sspace) + if not sspaceFlag: + self.configure_gsm_sspace(sspace,None,None,None,None,'add') + shard_group="" + deploy_as,deploy_type=self.get_shard_deploy() + else: + shard_group,deploy_as=self.get_shardg_cmd(sgroup,sregion) + shard_region="" + else: + shard_group,deploy_as=self.get_shardg_cmd(sgroup,sregion) + shard_region="" + + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmcmd=''' + connect {1}/{2}; + add cdb -connect {3}:{4}/{5} -pwd {2}; + add shard -cdb {5} -connect "(DESCRIPTION = (ADDRESS = (PROTOCOL = tcp)(HOST = {3})(PORT = {4})) (CONNECT_DATA = (SERVICE_NAME = {6}) (SERVER = DEDICATED)))" {7} -pwd {2} {9} {10} {11}; + config vncr; + exit; + '''.format("NA",admuser,spasswd,shost,sdbport,scdb,spdb,shard_group,shard_name,shard_region,shard_space,deploy_as) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + def get_shard_deploy(self): + """ + get the shard deploy + """ + deploy_as=None + deploy_type=None + if self.ocommon.check_key("SHARD_DEPLOY_AS",self.ora_env_dict): + deploy_as="-deploy_as {0}".format(self.ora_env_dict["SHARD_DEPLOY_AS"]) + deploy_type=self.ora_env_dict["SHARD_DEPLOY_AS"] + else: + deploy_as="-deploy_as primary" + deploy_type='primary' + + return deploy_as,deploy_type + + def get_shardg_cmd(self,sgroup,sregion): + """ + Getting shard group cmd + """ + sgFlag=self.check_shardg_status(sgroup,None) + deploy_as,deploy_type=self.get_shard_deploy() + if sgFlag != 'completed': + self.configure_gsm_shardg(sgroup,deploy_type,sregion,'add') + else: + self.ocommon.log_info_message("Shardgroup exist " + sgroup, self.file_name) + + deploy_as="" + cmd=''' -shardgroup {0}'''.format(sgroup) + return cmd,deploy_as + def delete_gsm_shard(self,shost,scdb,spdb,sdbport,sgroup): - """ - This function delete the shard db. - """ - spasswd="HIDDEN_STRING" - admuser= self.ora_env_dict["SHARD_ADMIN_USER"] - #dtrname,dtrport,dtregion=self.process_director_vars() - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - shard_name='''{0}_{1}'''.format(scdb,spdb) - group_region=self.get_shardg_region_name(sgroup) - dtrname=self.get_director_name(group_region) - gsmcmd=''' - connect {1}/{2}; - remove shard -shard {8}; - remove cdb -cdb {5}; - remove invitednode {3}; - config vncr; - exit; - '''.format("NA",admuser,spasswd,shost,sdbport,scdb,spdb,sgroup,shard_name) - - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() + """ + This function delete the shard db. + """ + spasswd="HIDDEN_STRING" + admuser= self.ora_env_dict["SHARD_ADMIN_USER"] + #dtrname,dtrport,dtregion=self.process_director_vars() + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + shard_name='''{0}_{1}'''.format(scdb,spdb) + #group_region=self.get_shardg_region_name(sgroup) + #dtrname=self.get_director_name(group_region) + gsmcmd=''' + connect {1}/{2}; + remove shard -shard {8}; + remove cdb -cdb {5}; + remove invitednode {3}; + config vncr; + exit; + '''.format("NA",admuser,spasswd,shost,sdbport,scdb,spdb,sgroup,shard_name) + + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() def set_hostid_null(self): """ @@ -1753,7 +2421,7 @@ def set_hostid_null(self): reg_exp= self.catalog_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks=self.process_clog_vars(key) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) sqlpluslogin='''{0}/bin/sqlplus "sys/HIDDEN_STRING@{1}:{2}/{3} as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"],catalog_host,catalog_port,catalog_pdb,admuser) self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) msg='''Setting host Id null in catalog as auto vncr is disabled''' @@ -1770,232 +2438,238 @@ def set_hostid_null(self): self.ocommon.unset_mask_str() def invited_node_op(self): - """ - This function perform the invitedaddition and deletion - """ - self.ocommon.log_info_message("Inside invited_node_op()",self.file_name) - gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] - cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] - cpasswd="HIDDEN_STRING" - #dtrname,dtrport,dtregion=self.process_director_vars() - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - shard_host=self.ora_env_dict["INVITED_NODE_OP"] - gsmcmd=''' - connect {1}/{2}; - remove invitednode {3}; - add invitednode {3}; - exit; - '''.format("NA",cadmin,cpasswd,shard_host) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + """ + This function perform the invitedaddition and deletion + """ + self.ocommon.log_info_message("Inside invited_node_op()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + #dtrname,dtrport,dtregion=self.process_director_vars() + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + shard_host=self.ora_env_dict["INVITED_NODE_OP"] + gsmcmd=''' + connect {1}/{2}; + remove invitednode {3}; + add invitednode {3}; + exit; + '''.format("NA",cadmin,cpasswd,shard_host) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) def add_invited_node(self,op_str): - """ - This function add the invited in the GSM configuration - """ - self.ocommon.log_info_message("Inside add_invited_node()",self.file_name) - if op_str == "SHARD": - reg_exp = self.shard_regex() - else: - reg_exp = self.add_shard_regex() - - gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] - cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] - cpasswd="HIDDEN_STRING" - #dtrname,dtrport,dtregion=self.process_director_vars() - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - for key in self.ora_env_dict.keys(): - if(reg_exp.match(key)): - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) - group_region=self.get_shardg_region_name(shard_group) - dtrname=self.get_director_name(group_region) - gsmcmd=''' - connect {1}/{2}; - add invitednode {3}; - exit; - '''.format("NA",cadmin,cpasswd,shard_host) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + """ + This function add the invited in the GSM configuration + """ + self.ocommon.log_info_message("Inside add_invited_node()",self.file_name) + if op_str == "SHARD": + reg_exp = self.shard_regex() + else: + reg_exp = self.add_shard_regex() + + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + #dtrname,dtrport,dtregion=self.process_director_vars() + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space=self.process_shard_vars(key) + #group_region=self.get_shardg_region_name(shard_group) + #dtrname=self.get_director_name(group_region) + gsmcmd=''' + connect {1}/{2}; + add invitednode {3}; + exit; + '''.format("NA",cadmin,cpasswd,shard_host) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) def remove_invited_node(self,op_str): - """ - This function remove the invited in the GSM configuration - """ - self.ocommon.log_info_message("Inside remove_invited_node()",self.file_name) - if op_str == "SHARD": - reg_exp = self.shard_regex() - else: - reg_exp = self.add_shard_regex() - - gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] - cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] - cpasswd="HIDDEN_STRING" - #dtrname,dtrport,dtregion=self.process_director_vars() - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - - if self.ocommon.check_key("KUBE_SVC",self.ora_env_dict): - for key in self.ora_env_dict.keys(): - if(reg_exp.match(key)): - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) - temp_host= shard_host.split('.',1)[0] - group_region=self.get_shardg_region_name(shard_group) - dtrname=self.get_director_name(group_region) - gsmcmd=''' - connect {1}/{2}; - remove invitednode {3}; - exit; - '''.format("NA",cadmin,cpasswd,temp_host) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - else: - self.ocommon.log_info_message("KUBE_SVC is not set. No need to remove invited node!",self.file_name) + """ + This function remove the invited in the GSM configuration + """ + self.ocommon.log_info_message("Inside remove_invited_node()",self.file_name) + if op_str == "SHARD": + reg_exp = self.shard_regex() + else: + reg_exp = self.add_shard_regex() + + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + #dtrname,dtrport,dtregion=self.process_director_vars() + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + + if self.ocommon.check_key("KUBE_SVC",self.ora_env_dict): + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space=self.process_shard_vars(key) + temp_host= shard_host.split('.',1)[0] + #group_region=self.get_shardg_region_name(shard_group) + #dtrname=self.get_director_name(group_region) + gsmcmd=''' + connect {1}/{2}; + remove invitednode {3}; + exit; + '''.format("NA",cadmin,cpasswd,temp_host) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + else: + self.ocommon.log_info_message("KUBE_SVC is not set. No need to remove invited node!",self.file_name) def deploy_shard(self): - """ - This function deploy shard - """ - self.ocommon.log_info_message("Inside deploy_shard()",self.file_name) - gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] - cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] - cpasswd="HIDDEN_STRING" - gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) - #dtrname,dtrport,dtregion=self.process_director_vars() - #if op_str == "SHARD": - # reg_exp = self.shard_regex() - #else: - # reg_exp = self.add_shard_regex() - - #for key in self.ora_env_dict.keys(): - # if(reg_exp.match(key)): - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - gsmcmd=''' - connect {1}/{2}; - config shardspace; - config shardgroup; - config vncr; - deploy; - config shard; - exit; - '''.format("test",cadmin,cpasswd) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() - - def check_setup_status(self,host,ccdb,svc,port): - """ - This function check the shard status. - """ - systemStr='''{0}/bin/sqlplus "system/HIDDEN_STRING@{1}:{2}/{3}"'''.format(self.ora_env_dict["ORACLE_HOME"],host,port,ccdb) + """ + This function deploy shard + """ + self.ocommon.log_info_message("Inside deploy_shard()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + shrdg_sspace=None + #dtrname,dtrport,dtregion=self.process_director_vars() + #if op_str == "SHARD": + # reg_exp = self.shard_regex() + #else: + # reg_exp = self.add_shard_regex() + + #for key in self.ora_env_dict.keys(): + # if(reg_exp.match(key)): + if self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + if self.ora_env_dict["SHARDING_TYPE"].upper() == 'USER': + shardg_shardspace="config shardspace" + else: + shardg_shardspace="config shardgroup" - fname='''/tmp/{0}'''.format("shard_setup.txt") - self.ocommon.remove_file(fname) - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - msg='''Checking shardsetup table in CDB''' - self.ocommon.log_info_message(msg,self.file_name) - sqlcmd=''' - set heading off - set feedback off - set term off - SET NEWPAGE NONE - spool {0} - select * from shardsetup WHERE ROWNUM = 1; - spool off + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmcmd=''' + connect {1}/{2}; + {3}; + config vncr; + deploy; + config shard; exit; - '''.format(fname) - output,error,retcode=self.ocommon.run_sqlplus(systemStr,sqlcmd,None) - self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) - self.ocommon.check_sql_err(output,error,retcode,None) - - if os.path.isfile(fname): - fdata=self.ocommon.read_file(fname) - else: - fdata='nosetup' - - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() + '''.format("test",cadmin,cpasswd,shardg_shardspace) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() - if re.search('completed',fdata): - status = self.catalog_pdb_setup_check(host,ccdb,svc,port) - if status == 'completed': - return 'completed' - else: - return 'notcompleted' + def check_setup_status(self,host,ccdb,svc,port): + """ + This function check the shard status. + """ + systemStr='''{0}/bin/sqlplus "system/HIDDEN_STRING@{1}:{2}/{3}"'''.format(self.ora_env_dict["ORACLE_HOME"],host,port,ccdb) + + fname='''/tmp/{0}'''.format("shard_setup.txt") + self.ocommon.remove_file(fname) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + msg='''Checking shardsetup table in CDB''' + self.ocommon.log_info_message(msg,self.file_name) + sqlcmd=''' + set heading off + set feedback off + set term off + SET NEWPAGE NONE + spool {0} + select * from shardsetup WHERE ROWNUM = 1; + spool off + exit; + '''.format(fname) + output,error,retcode=self.ocommon.run_sqlplus(systemStr,sqlcmd,None) + self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.ocommon.check_sql_err(output,error,retcode,None) + + if os.path.isfile(fname): + fdata=self.ocommon.read_file(fname) + else: + fdata='nosetup' + + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + if re.search('completed',fdata): + status = self.catalog_pdb_setup_check(host,ccdb,svc,port) + if status == 'completed': + return 'completed' else: - return 'notcompleted' + return 'notcompleted' + else: + return 'notcompleted' def catalog_pdb_setup_check(self,host,ccdb,svc,port): - """ - This function check the shard status. - """ - systemStr='''{0}/bin/sqlplus "pdbadmin/HIDDEN_STRING@{1}:{2}/{3}"'''.format(self.ora_env_dict["ORACLE_HOME"],host,port,svc) - - fname='''/tmp/{0}'''.format("pdb_setup_check.txt") - self.ocommon.remove_file(fname) - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - msg='''Checking setup status in PDB''' - self.ocommon.log_info_message(msg,self.file_name) - sqlcmd=''' - set heading off - set feedback off - set term off - SET NEWPAGE NONE - spool {0} - select count(*) from dual; - spool off - exit; - '''.format(fname) - output,error,retcode=self.ocommon.run_sqlplus(systemStr,sqlcmd,None) - self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) - self.ocommon.check_sql_err(output,error,retcode,None) - - if os.path.isfile(fname): - fdata=self.ocommon.read_file(fname) - else: - fdata='nosetup' - - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() - - if re.search('1',fdata): - return 'completed' - else: - return 'notcompleted' + """ + This function check the shard status. + """ + systemStr='''{0}/bin/sqlplus "pdbadmin/HIDDEN_STRING@{1}:{2}/{3}"'''.format(self.ora_env_dict["ORACLE_HOME"],host,port,svc) + + fname='''/tmp/{0}'''.format("pdb_setup_check.txt") + self.ocommon.remove_file(fname) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + msg='''Checking setup status in PDB''' + self.ocommon.log_info_message(msg,self.file_name) + sqlcmd=''' + set heading off + set feedback off + set term off + SET NEWPAGE NONE + spool {0} + select count(*) from dual; + spool off + exit; + '''.format(fname) + output,error,retcode=self.ocommon.run_sqlplus(systemStr,sqlcmd,None) + self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.ocommon.check_sql_err(output,error,retcode,None) + + if os.path.isfile(fname): + fdata=self.ocommon.read_file(fname) + else: + fdata='nosetup' + + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + if re.search('1',fdata): + return 'completed' + else: + return 'notcompleted' ############################# Setup GSM Service ############################################### def setup_gsm_service(self): - """ - This function setup the shard service. - """ - self.ocommon.log_info_message("Inside setup_gsm_service()",self.file_name) - status=False - service_value="service_name=oltp_rw_svc;service_role=primary" - # self.ora_env_dict=self.ocommon.add_key("SERVICE1_PARAMS",service_value,self.ora_env_dict) - reg_exp= self.service_regex() - counter=1 - end_counter=3 - while counter < end_counter: - for key in self.ora_env_dict.keys(): - if(reg_exp.match(key)): - shard_service_status=None - service_name,service_role=self.process_service_vars(key) - shard_service_status=self.check_service_status(service_name) - if shard_service_status != 'completed': - self.configure_gsm_service(service_name,service_role) - status = self.check_service_status(None) - if status == 'completed': - break - else: - msg='''GSM service setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) - time.sleep(60) - counter=counter+1 + """ + This function setup the shard service. + """ + self.ocommon.log_info_message("Inside setup_gsm_service()",self.file_name) + status=False + service_value="service_name=oltp_rw_svc;service_role=primary" + # self.ora_env_dict=self.ocommon.add_key("SERVICE1_PARAMS",service_value,self.ora_env_dict) + reg_exp= self.service_regex() + counter=1 + end_counter=3 + while counter < end_counter: + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + shard_service_status=None + service_name,service_role=self.process_service_vars(key) + shard_service_status=self.check_service_status(service_name) + if shard_service_status != 'completed': + self.configure_gsm_service(service_name,service_role) + status = self.check_service_status(None) + if status == 'completed': + break + else: + msg='''GSM service setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) + time.sleep(60) + counter=counter+1 - status = self.check_service_status(None) - if status == 'completed': - msg='''Shard service setup completed in GSM''' - self.ocommon.log_info_message(msg,self.file_name) - else: - msg='''Waited 2 minute to complete catalog setup in GSM but setup did not complete or failed. Exiting...''' - self.ocommon.log_error_message(msg,self.file_name) - self.ocommon.prog_exit("127") + status = self.check_service_status(None) + if status == 'completed': + msg='''Shard service setup completed in GSM''' + self.ocommon.log_info_message(msg,self.file_name) + else: + msg='''Waited 2 minute to complete catalog setup in GSM but setup did not complete or failed. Exiting...''' + self.ocommon.log_error_message(msg,self.file_name) + self.ocommon.prog_exit("127") def process_service_vars(self,key): """ @@ -2067,27 +2741,27 @@ def service_regex(self): return re.compile('SERVICE[0-9]+_PARAMS') def configure_gsm_service(self,service_name,service_role): - """ - This function configure the service creation. - """ - self.ocommon.log_info_message("Inside configure_gsm_service()",self.file_name) - gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] - cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] - cpasswd="HIDDEN_STRING" - - #dtrname,dtrport,dtregion=self.process_director_vars() - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) - gsmcmd=''' - connect {1}/{2}; - add service -service {3} -role {4}; - start service -service {3}; - exit; - '''.format("test",cadmin,cpasswd,service_name,service_role) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() + """ + This function configure the service creation. + """ + self.ocommon.log_info_message("Inside configure_gsm_service()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + + #dtrname,dtrport,dtregion=self.process_director_vars() + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + gsmcmd=''' + connect {1}/{2}; + add service -service {3} -role {4}; + start service -service {3}; + exit; + '''.format("test",cadmin,cpasswd,service_name,service_role) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() ############################## GSM backup fIle function Begins Here ############################# def gsm_backup_file(self): @@ -2118,7 +2792,7 @@ def setup_sample_schema(self): reg_exp= self.catalog_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks=self.process_clog_vars(key) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) sqlpluslogin='''{0}/bin/sqlplus "sys/HIDDEN_STRING@{1}:{2}/{3} as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"],catalog_host,catalog_port,catalog_db) if self.ocommon.check_key("SAMPLE_SCHEMA",self.ora_env_dict): if self.ora_env_dict["SAMPLE_SCHEMA"] == 'DEPLOY': diff --git a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oralogger.py b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oralogger.py index d9e0484..9a51b54 100644 --- a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oralogger.py +++ b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/oralogger.py @@ -159,7 +159,7 @@ def handle(self,request): """ request.stdout_ = request.getStdOutValue() if request.stdout_ == LoggingType.STDOUT: - st = logging.FileHandler(request.stdoutfile_) + st = logging.FileHandler(request.stdoutfile_,mode="w") request.root.addHandler(st) st.setFormatter(request.formatter) self.print_message(request,st) diff --git a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/orapcatalog.py b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/orapcatalog.py index 52232cf..6638860 100644 --- a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/orapcatalog.py +++ b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/orapcatalog.py @@ -45,11 +45,46 @@ def setup(self): This function setup the catalog on Primary DB. """ if self.ocommon.check_key("CHECK_LIVENESS",self.ora_env_dict): + create_db_file_lck=self.ocommon.get_db_lock_location() + self.ora_env_dict["ORACLE_SID"] + ".create_lck" + exist_db_file_lck=self.ocommon.get_db_lock_location() + self.ora_env_dict["ORACLE_SID"] + ".exist_lck" + self.ocommon.log_info_message("DB create lock file set to :" + create_db_file_lck ,self.file_name) + self.ocommon.log_info_message("DB exist lock file set to :" + exist_db_file_lck ,self.file_name) + if os.path.exists(create_db_file_lck): + self.ocommon.log_info_message("provisioning is still in progress as file " + create_db_file_lck + " still exist!",self.file_name) + sys.exit(127) + elif os.path.exists(exist_db_file_lck): + self.ocommon.log_info_message("Database is up and running as file " + exist_db_file_lck + " exist!",self.file_name) + status = self.catalog_setup_check() + if not status: + self.ocommon.prog_exit("127") + self.ocommon.log_info_message("Catalog liveness check completed sucessfully!",self.file_name) + sys.exit(0) + else: + status = self.catalog_setup_check() + if not status: + self.ocommon.prog_exit("127") + self.ocommon.log_info_message("Catalog liveness check completed sucessfully!",self.file_name) + sys.exit(0) + elif self.ocommon.check_key("CHECK_READYNESS",self.ora_env_dict): status = self.catalog_setup_check() if not status: + self.ocommon.log_info_message("Catalog readyness check completed sucessfully!",self.file_name) + self.ocommon.prog_exit("127") + elif self.ocommon.check_key("RESET_PASSWORD",self.ora_env_dict): + exist_db_file_lck=self.ocommon.get_db_lock_location() + self.ora_env_dict["ORACLE_SID"] + ".exist_lck" + if os.path.exists(exist_db_file_lck): + self.ocommon.log_info_message("Catalog database up and running. Resetting password...",self.file_name) + else: + self.ocommon.log_info_message("Catalog doesn't seems to be ready. Unable to reset password",self.file_name) + self.ocommon.prog_exit("127") + elif self.ocommon.check_key("EXPORT_TDE_KEY",self.ora_env_dict): + exist_db_file_lck=self.ocommon.get_db_lock_location()+ self.ora_env_dict["ORACLE_SID"] + ".exist_lck" + if os.path.exists(exist_db_file_lck): + self.ocommon.log_info_message("Catalog database up and running.",self.file_name) + self.ocommon.export_tde_key(self.ora_env_dict["EXPORT_TDE_KEY"]) + else: + self.ocommon.log_info_message("Catalog doesn't seems to be ready. Unable to export the tde key",self.file_name) self.ocommon.prog_exit("127") - self.ocommon.log_info_message("Catalog liveness check completed sucessfully!",self.file_name) - sys.exit(0) else: self.setup_machine() self.db_checks() @@ -61,6 +96,8 @@ def setup(self): self.reset_passwd() self.setup_cdb_catalog() self.set_spfile_nonm_params() + self.ocommon.set_events("spfile") + self.set_dbparams_version() self.restart_db() self.alter_db() self.setup_pdb_catalog() @@ -118,65 +155,13 @@ def ohome_check(self): def passwd_check(self): """ - This funnction perform password related checks + Function to set the password """ - passwd_file_flag = False - if self.ocommon.check_key("SECRET_VOLUME",self.ora_env_dict) and self.ocommon.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict) and self.ocommon.check_key("PWD_KEY",self.ora_env_dict): - msg='''SECRET_VOLUME passed as an env variable and set to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - else: - self.ora_env_dict=self.ocommon.add_key("SECRET_VOLUME","/run/secrets",self.ora_env_dict) - msg='''SECRET_VOLUME not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict): - msg='''COMMON_OS_PWD_FILE passed as an env variable and set to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - else: - self.ora_env_dict=self.ocommon.add_key("COMMON_OS_PWD_FILE","common_os_pwdfile.enc",self.ora_env_dict) - msg='''COMMON_OS_PWD_FILE not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("PWD_KEY",self.ora_env_dict): - msg='''PWD_KEY passed as an env variable and set to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - else: - self.ora_env_dict=self.ocommon.add_key("PWD_KEY","pwd.key",self.ora_env_dict) - msg='''PWD_KEY not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - secret_volume = self.ora_env_dict["SECRET_VOLUME"] - common_os_pwd_file = self.ora_env_dict["COMMON_OS_PWD_FILE"] - pwd_key = self.ora_env_dict["PWD_KEY"] - passwd_file='''{0}/{1}'''.format(self.ora_env_dict["SECRET_VOLUME"],self.ora_env_dict["COMMON_OS_PWD_FILE"]) - if os.path.isfile(passwd_file): - msg='''Passwd file {0} exist. Password file Check passed!'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - msg='''Reading encrypted passwd from file {0}.'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - cmd='''openssl enc -d -aes-256-cbc -in \"{0}/{1}\" -out /tmp/{1} -pass file:\"{0}/{2}\"'''.format(secret_volume,common_os_pwd_file,pwd_key) - output,error,retcode=self.ocommon.execute_cmd(cmd,None,None) - self.ocommon.check_os_err(output,error,retcode,True) - passwd_file_flag = True - - if not passwd_file_flag: - s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()?" - passlen = 8 - password = "".join(random.sample(s,passlen )) - else: - fname='''/tmp/{0}'''.format(common_os_pwd_file) - fdata=self.ocommon.read_file(fname) - password=fdata - self.ocommon.remove_file(fname) - + self.ocommon.get_password(None) if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict): - msg="ORACLE_PWD is passed as an env variable. Check Passed!" - self.ocommon.log_info_message(msg,self.file_name) - else: - self.ora_env_dict=self.ocommon.add_key("ORACLE_PWD",password,self.ora_env_dict) - msg="ORACLE_PWD set to HIDDEN_STRING generated using encrypted password file" - self.ocommon.log_info_message(msg,self.file_name) - + msg='''ORACLE_PWD key is set. Check Passed!''' + self.ocommon.log_info_message(msg,self.file_name) + def set_user(self): """ This funnction set the user for pdb and cdb. @@ -232,7 +217,8 @@ def hostname_check(self): self.ocommon.log_info_message(msg,self.file_name) else: if self.ocommon.check_key("KUBE_SVC",self.ora_env_dict): - hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + # hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + hostname='''{0}'''.format(socket.getfqdn()) else: hostname='''{0}'''.format(socket.gethostname()) msg='''ORACLE_HOSTNAME is not set, setting it to hostname {0} of the compute!'''.format(hostname) @@ -317,18 +303,7 @@ def reset_passwd(self): """ This function reset the password. """ - password_script='''{0}/{1}'''.format(self.ora_env_dict["HOME"],"setPassword.sh") - self.ocommon.log_info_message("Executing password reset", self.file_name) - if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict) and self.ocommon.check_key("HOME",self.ora_env_dict) and os.path.isfile(password_script): - cmd='''{0} {1} '''.format(password_script,'HIDDEN_STRING') - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - output,error,retcode=self.ocommon.execute_cmd(cmd,None,None) - self.ocommon.check_os_err(output,error,retcode,True) - self.ocommon.unset_mask_str() - else: - msg='''Error Occurred! Either HOME DIR {0} does not exist, ORACLE_PWD {1} is not set or PASSWORD SCRIPT {2} does not exist'''.format(self.ora_env_dict["HOME"],self.ora_env_dict["ORACLE_PWD"],password_script) - self.ocommon.log_error_message(msg,self.file_name) - self.oracommon.prog_exit() + self.ocommon.reset_passwd() ########## RESET_PASSWORD function ENDS here ############################# @@ -424,7 +399,6 @@ def setup_cdb_catalog(self): alter system set db_recovery_file_dest=\"{2}\" scope=both; alter user gsmcatuser account unlock; alter user gsmcatuser identified by HIDDEN_STRING; - alter system set dg_broker_start=true scope=both; alter system set local_listener='{4}:{5}' scope=both; '''.format(dbf_dest,dbr_dest_size,dbr_dest,dpump_dir,host_name,db_port,obase,"dbconfig",dbuname) @@ -440,29 +414,31 @@ def set_spfile_nonm_params(self): This function setup the catalog. """ #sqlpluslogincmd='''{0}/bin/sqlplus "/as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"]) - if not self.ocommon.check_key("CLONE_DB",self.ora_env_dict): - ohome=self.ora_env_dict["ORACLE_HOME"] - inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - dbf_dest=self.ora_env_dict["DB_CREATE_FILE_DEST"] - obase=self.ora_env_dict["ORACLE_BASE"] - dbuname=self.ora_env_dict["DB_UNIQUE_NAME"] - - msg='''Setting up catalog CDB with spfile non modifiable parameters''' - self.ocommon.log_info_message(msg,self.file_name) - sqlcmd=''' - alter system set open_links_per_instance=16 scope=spfile; - alter system set db_file_name_convert='*','{0}/' scope=spfile; - alter system set dg_broker_config_file1=\"{1}/oradata/{2}/{3}/dr2{3}.dat\" scope=spfile; - alter system set dg_broker_config_file2=\"{1}/oradata/{2}/{3}/dr1{3}.dat\" scope=spfile; - alter system set wallet_root=\"{1}/oradata/{2}/{3}\" scope=spfile; - '''.format(dbf_dest,obase,"dbconfig",dbuname) - - output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) - self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) - self.ocommon.check_sql_err(output,error,retcode,True) - + if self.ocommon.check_key("CLONE_DB",self.ora_env_dict): + if self.ora_env_dict["CLONE_DB"] != 'true': + ohome=self.ora_env_dict["ORACLE_HOME"] + inst_sid=self.ora_env_dict["ORACLE_SID"] + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + dbf_dest=self.ora_env_dict["DB_CREATE_FILE_DEST"] + obase=self.ora_env_dict["ORACLE_BASE"] + dbuname=self.ora_env_dict["DB_UNIQUE_NAME"] + + msg='''Setting up catalog CDB with spfile non modifiable parameters''' + self.ocommon.log_info_message(msg,self.file_name) + sqlcmd=''' + alter system set open_links_per_instance=16 scope=spfile; + alter system set db_file_name_convert='*','{0}/' scope=spfile; + alter system set standby_file_management='AUTO' scope=spfile; + alter system set dg_broker_config_file1=\"{1}/oradata/{2}/{3}/dr2{3}.dat\" scope=spfile; + alter system set dg_broker_config_file2=\"{1}/oradata/{2}/{3}/dr1{3}.dat\" scope=spfile; + '''.format(dbf_dest,obase,"dbconfig",dbuname) + + output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) + self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.ocommon.check_sql_err(output,error,retcode,True) + + def set_dbparams_version(self): """ This function setup the shard parameter based on db version. @@ -470,7 +446,7 @@ def set_dbparams_version(self): ohome1=self.ora_env_dict["ORACLE_HOME"] version=self.ocommon.get_oraversion(ohome1).strip() self.ocommon.log_info_message(version,self.file_name) - if int(version) >= 21: + if int(version) > 21: ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) @@ -482,7 +458,7 @@ def set_dbparams_version(self): msg='''Setting up catalog CDB with spfile non modifiable parameters based on version''' self.ocommon.log_info_message(msg,self.file_name) sqlcmd=''' - alter system set wallet_root=\"{1}/oradata/{2}/{3}/admin\" scope=spfile; + alter system set wallet_root=\"{1}/oradata/{2}/{3}\" scope=spfile; '''.format(dbf_dest,obase,"dbconfig",dbuname) output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) @@ -492,14 +468,15 @@ def restart_db(self): """ restarting the db """ - if not self.ocommon.check_key("CLONE_DB",self.ora_env_dict): - ohome=self.ora_env_dict["ORACLE_HOME"] - inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) - self.ocommon.log_info_message("Calling shutdown_db() to shutdown the database",self.file_name) - self.ocommon.shutdown_db(self.ora_env_dict) - self.ocommon.log_info_message("Calling startup_mount() to mount the database",self.file_name) - self.ocommon.start_db(self.ora_env_dict) + if self.ocommon.check_key("CLONE_DB",self.ora_env_dict): + if self.ora_env_dict["CLONE_DB"] != 'true': + ohome=self.ora_env_dict["ORACLE_HOME"] + inst_sid=self.ora_env_dict["ORACLE_SID"] + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + self.ocommon.log_info_message("Calling shutdown_db() to shutdown the database",self.file_name) + self.ocommon.shutdown_db(self.ora_env_dict) + self.ocommon.log_info_message("Calling startup_mount() to mount the database",self.file_name) + self.ocommon.start_db(self.ora_env_dict) #self.ocommon.log_info_message("Enabling archivelog at DB level",self.file_name) #sqlcmd=''' @@ -546,6 +523,7 @@ def setup_pdb_catalog(self): alter system register; alter session set container={0}; create user {1} identified by HIDDEN_STRING; + alter user {1} account unlock; grant connect, create session, gsmadmin_role to {1}; grant inherit privileges on user SYS to GSMADMIN_INTERNAL; execute dbms_xdb.sethttpport(8080); @@ -570,7 +548,7 @@ def update_catalog_setup(self): ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] - systemStr=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + systemStr=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) msg='''Updating shardsetup table''' self.ocommon.log_info_message(msg,self.file_name) sqlcmd=''' @@ -694,7 +672,7 @@ def register_services(self): # Assigning variable ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) if self.ocommon.check_key("ORACLE_PDB",self.ora_env_dict): msg='''Setting up catalog PDB''' @@ -738,7 +716,7 @@ def backup_files(self): wallet_backup_cmd='''ls -ltr /bin''' self.ocommon.log_info_message("Check Version " + version,self.file_name) if int(version) >= 21: - obase1=self.ora_env_dict["ORACLE_BASE_HOME"] + obase1=self.ora_env_dict["ORACLE_BASE"] wallet_backup_cmd='''cp -r {3}/admin/ {0}/oradata/{1}/{2}/'''.format(obase,"dbconfig",dbuname,ohome) cmd_names=''' mkdir -p {0}/oradata/{1}/{2} diff --git a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/orapshard.py b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/orapshard.py index f5aa54e..d1b1273 100644 --- a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/orapshard.py +++ b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/orapshard.py @@ -49,9 +49,9 @@ def __init__(self,oralogger,orahandler,oraenv,oracommon): stack_trace = list() for trace in trace_back: stack_trace.append("File : %s , Line : %d, Func.Name : %s, Message : %s" % (trace[0], trace[1], trace[2], trace[3])) - ocommon.log_info_message(ex_type.__name__,self.file_name) - ocommon.log_info_message(ex_value,self.file_name) - ocommon.log_info_message(stack_trace,self.file_name) + self.ocommon.log_info_message(ex_type.__name__,self.file_name) + self.ocommon.log_info_message(ex_value,self.file_name) + self.ocommon.log_info_message(stack_trace,self.file_name) def setup(self): """ This function setup the shard on Primary DB. @@ -72,16 +72,31 @@ def setup(self): self.ocommon.shutdown_db(self.ora_env_dict) self.ocommon.start_db(self.ora_env_dict) elif self.ocommon.check_key("CHECK_LIVENESS",self.ora_env_dict): + create_db_file_lck=self.ocommon.get_db_lock_location() + self.ora_env_dict["ORACLE_SID"] + ".create_lck" + exist_db_file_lck=self.ocommon.get_db_lock_location() + self.ora_env_dict["ORACLE_SID"] + ".exist_lck" + self.ocommon.log_info_message("DB create lock file set to :" + create_db_file_lck ,self.file_name) + self.ocommon.log_info_message("DB exist lock file set to :" + exist_db_file_lck ,self.file_name) + if os.path.exists(create_db_file_lck): + self.ocommon.log_info_message("provisioning is still in progress as file " + create_db_file_lck + " still exist!",self.file_name) + sys.exit(127) + elif os.path.exists(exist_db_file_lck): + self.ocommon.log_info_message("Database is up and running as file " + exist_db_file_lck + " exist!",self.file_name) + status = self.shard_setup_check() + if not status: + self.ocommon.prog_exit("127") + self.ocommon.log_info_message("Shard liveness check completed sucessfully!",self.file_name) + sys.exit(0) + else: + status = self.shard_setup_check() + if not status: + self.ocommon.prog_exit("127") + self.ocommon.log_info_message("Shard liveness check completed sucessfully!",self.file_name) + sys.exit(0) + elif self.ocommon.check_key("CHECK_READYNESS",self.ora_env_dict): status = self.shard_setup_check() if not status: + self.ocommon.log_info_message("Shard readyness check completed sucessfully!",self.file_name) self.ocommon.prog_exit("127") - self.ocommon.log_info_message("Shard liveness check completed sucessfully!",self.file_name) - sys.exit(0) - elif self.ocommon.check_key("CREATE_DIR",self.ora_env_dict): - status = self.shard_setup_check() - if not status: - self.ocommon.prog_exit("127") - self.ocommon.create_dir(self.ora_env_dict["CREATE_DIR"],True,None,None) else: self.setup_machine() self.db_checks() @@ -93,6 +108,7 @@ def setup(self): self.reset_passwd() self.setup_cdb_shard() self.set_spfile_nonm_params() + self.ocommon.set_events("spfile") self.set_dbparams_version() self.restart_db() self.alter_db() @@ -153,63 +169,11 @@ def passwd_check(self): """ This funnction perform password related checks """ - passwd_file_flag = False - if self.ocommon.check_key("SECRET_VOLUME",self.ora_env_dict) and self.ocommon.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict) and self.ocommon.check_key("PWD_KEY",self.ora_env_dict): - msg='''SECRET_VOLUME passed as an env variable and set to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - else: - self.ora_env_dict=self.ocommon.add_key("SECRET_VOLUME","/run/secrets",self.ora_env_dict) - msg='''SECRET_VOLUME not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict): - msg='''COMMON_OS_PWD_FILE passed as an env variable and set to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - else: - self.ora_env_dict=self.ocommon.add_key("COMMON_OS_PWD_FILE","common_os_pwdfile.enc",self.ora_env_dict) - msg='''COMMON_OS_PWD_FILE not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("PWD_KEY",self.ora_env_dict): - msg='''PWD_KEY passed as an env variable and set to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - else: - self.ora_env_dict=self.ocommon.add_key("PWD_KEY","pwd.key",self.ora_env_dict) - msg='''PWD_KEY not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - secret_volume = self.ora_env_dict["SECRET_VOLUME"] - common_os_pwd_file = self.ora_env_dict["COMMON_OS_PWD_FILE"] - pwd_key = self.ora_env_dict["PWD_KEY"] - passwd_file='''{0}/{1}'''.format(self.ora_env_dict["SECRET_VOLUME"],self.ora_env_dict["COMMON_OS_PWD_FILE"]) - if os.path.isfile(passwd_file): - msg='''Passwd file {0} exist. Password file Check passed!'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - msg='''Reading encrypted passwd from file {0}.'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - cmd='''openssl enc -d -aes-256-cbc -in \"{0}/{1}\" -out /tmp/{1} -pass file:\"{0}/{2}\"'''.format(secret_volume,common_os_pwd_file,pwd_key) - output,error,retcode=self.ocommon.execute_cmd(cmd,None,None) - self.ocommon.check_os_err(output,error,retcode,True) - passwd_file_flag = True - - if not passwd_file_flag: - s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()?" - passlen = 8 - password = "".join(random.sample(s,passlen )) - else: - fname='''/tmp/{0}'''.format(common_os_pwd_file) - fdata=self.ocommon.read_file(fname) - password=fdata - self.ocommon.remove_file(fname) - + self.ocommon.get_password(None) if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict): - msg="ORACLE_PWD is passed as an env variable. Check Passed!" - self.ocommon.log_info_message(msg,self.file_name) - else: - self.ora_env_dict=self.ocommon.add_key("ORACLE_PWD",password,self.ora_env_dict) - msg="ORACLE_PWD set to HIDDEN_STRING generated using encrypted password file" - self.ocommon.log_info_message(msg,self.file_name) - + msg='''ORACLE_PWD key is set. Check Passed!''' + self.ocommon.log_info_message(msg,self.file_name) + def set_user(self): """ This funnction set the user for pdb and cdb. @@ -264,7 +228,8 @@ def hostname_check(self): self.ocommon.log_info_message(msg,self.file_name) else: if self.ocommon.check_key("KUBE_SVC",self.ora_env_dict): - hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + ## hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + hostname='''{0}'''.format(socket.getfqdn()) else: hostname='''{0}'''.format(socket.gethostname()) msg='''ORACLE_HOSTNAME is not set, setting it to hostname {0} of the compute!'''.format(hostname) @@ -349,18 +314,7 @@ def reset_passwd(self): """ This function reset the password. """ - password_script='''{0}/{1}'''.format(self.ora_env_dict["HOME"],"setPassword.sh") - self.ocommon.log_info_message("Executing password reset", self.file_name) - if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict) and self.ocommon.check_key("HOME",self.ora_env_dict) and os.path.isfile(password_script): - cmd='''{0} {1} '''.format(password_script,'HIDDEN_STRING') - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - output,error,retcode=self.ocommon.execute_cmd(cmd,None,None) - self.ocommon.check_os_err(output,error,retcode,True) - self.ocommon.unset_mask_str() - else: - msg='''Error Occurred! Either HOME DIR {0} does not exist, ORACLE_PWD {1} is not set or PASSWORD SCRIPT {2} does not exist'''.format(self.ora_env_dict["HOME"],self.ora_env_dict["ORACLE_PWD"],password_script) - self.ocommon.log_error_message(msg,self.file_name) - self.oracommon.prog_exit() + self.ocommon.reset_passwd() ########## RESET_PASSWORD function ENDS here ############################# @@ -436,7 +390,7 @@ def setup_cdb_shard(self): # Assigning variable ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) dbf_dest=self.ora_env_dict["DB_CREATE_FILE_DEST"] dbr_dest=self.ora_env_dict["DB_RECOVERY_FILE_DEST"] dbr_dest_size=self.ora_env_dict["DB_RECOVERY_FILE_DEST_SIZE"] @@ -454,6 +408,7 @@ def setup_cdb_shard(self): alter system set db_recovery_file_dest_size={1} scope=both; alter system set db_recovery_file_dest=\"{2}\" scope=both; alter system set db_file_name_convert='*','{0}/' scope=spfile; + alter system set standby_file_management='AUTO' scope=spfile; alter user gsmrootuser account unlock; grant sysdg to gsmrootuser; grant sysbackup to gsmrootuser; @@ -462,10 +417,9 @@ def setup_cdb_shard(self): alter user GSMUSER identified by HIDDEN_STRING container=all; grant sysdg to GSMUSER; grant sysbackup to GSMUSER; - alter system set dg_broker_start=true scope=both; create or replace directory DATA_PUMP_DIR as '{3}'; grant read,write on directory DATA_PUMP_DIR to GSMADMIN_INTERNAL; - alter system set local_listener='{4}:{5}' scope=both; + alter system set local_listener='{4}:{5}' scope=spfile; '''.format(dbf_dest,dbr_dest_size,dbr_dest,dpump_dir,host_name,db_port,obase,"dbconfig",dbuname) output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) @@ -479,27 +433,28 @@ def set_spfile_nonm_params(self): This function setup the catalog. """ #sqlpluslogincmd='''{0}/bin/sqlplus "/as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"]) - if not self.ocommon.check_key("CLONE_DB",self.ora_env_dict): - ohome=self.ora_env_dict["ORACLE_HOME"] - inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - dbf_dest=self.ora_env_dict["DB_CREATE_FILE_DEST"] - obase=self.ora_env_dict["ORACLE_BASE"] - dbuname=self.ora_env_dict["DB_UNIQUE_NAME"] - - msg='''Setting up catalog CDB with spfile non modifiable parameters''' - self.ocommon.log_info_message(msg,self.file_name) - sqlcmd=''' - alter system set open_links_per_instance=16 scope=spfile; - alter system set open_links=16 scope=spfile; - alter system set db_file_name_convert='*','{0}/' scope=spfile; - alter system set dg_broker_config_file1=\"{1}/oradata/{2}/{3}/dr2{3}.dat\" scope=spfile; - alter system set dg_broker_config_file2=\"{1}/oradata/{2}/{3}/dr1{3}.dat\" scope=spfile; - '''.format(dbf_dest,obase,"dbconfig",dbuname) - output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) - self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) - self.ocommon.check_sql_err(output,error,retcode,True) + if self.ocommon.check_key("CLONE_DB",self.ora_env_dict): + if self.ora_env_dict["CLONE_DB"] != 'true': + ohome=self.ora_env_dict["ORACLE_HOME"] + inst_sid=self.ora_env_dict["ORACLE_SID"] + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + dbf_dest=self.ora_env_dict["DB_CREATE_FILE_DEST"] + obase=self.ora_env_dict["ORACLE_BASE"] + dbuname=self.ora_env_dict["DB_UNIQUE_NAME"] + + msg='''Setting up catalog CDB with spfile non modifiable parameters''' + self.ocommon.log_info_message(msg,self.file_name) + sqlcmd=''' + alter system set open_links_per_instance=16 scope=spfile; + alter system set open_links=16 scope=spfile; + alter system set db_file_name_convert='*','{0}/' scope=spfile; + alter system set dg_broker_config_file1=\"{1}/oradata/{2}/{3}/dr2{3}.dat\" scope=spfile; + alter system set dg_broker_config_file2=\"{1}/oradata/{2}/{3}/dr1{3}.dat\" scope=spfile; + '''.format(dbf_dest,obase,"dbconfig",dbuname) + output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) + self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.ocommon.check_sql_err(output,error,retcode,True) def set_dbparams_version(self): """ @@ -508,7 +463,7 @@ def set_dbparams_version(self): ohome1=self.ora_env_dict["ORACLE_HOME"] version=self.ocommon.get_oraversion(ohome1).strip() self.ocommon.log_info_message(version,self.file_name) - if int(version) >= 21: + if int(version) > 21: ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) @@ -517,10 +472,11 @@ def set_dbparams_version(self): obase=self.ora_env_dict["ORACLE_BASE"] dbuname=self.ora_env_dict["DB_UNIQUE_NAME"] + msg='''Setting up catalog CDB with spfile non modifiable parameters based on version''' self.ocommon.log_info_message(msg,self.file_name) sqlcmd=''' - alter system set wallet_root=\"{1}/oradata/{2}/{3}/admin\" scope=spfile; + alter system set wallet_root=\"{1}/oradata/{2}/{3}/\" scope=spfile; '''.format(dbf_dest,obase,"dbconfig",dbuname) output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) @@ -531,14 +487,15 @@ def restart_db(self): """ restarting the db """ - if not self.ocommon.check_key("CLONE_DB",self.ora_env_dict): - ohome=self.ora_env_dict["ORACLE_HOME"] - inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) - self.ocommon.log_info_message("Calling shutdown_db() to shutdown the database",self.file_name) - self.ocommon.shutdown_db(self.ora_env_dict) - self.ocommon.log_info_message("Calling startup_mount() to mount the database",self.file_name) - self.ocommon.start_db(self.ora_env_dict) + if self.ocommon.check_key("CLONE_DB",self.ora_env_dict): + if self.ora_env_dict["CLONE_DB"] != 'true': + ohome=self.ora_env_dict["ORACLE_HOME"] + inst_sid=self.ora_env_dict["ORACLE_SID"] + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + self.ocommon.log_info_message("Calling shutdown_db() to shutdown the database",self.file_name) + self.ocommon.shutdown_db(self.ora_env_dict) + self.ocommon.log_info_message("Calling startup_mount() to mount the database",self.file_name) + self.ocommon.start_db(self.ora_env_dict) # self.ocommon.log_info_message("Enabling archivelog at DB level",self.file_name) # sqlcmd=''' @@ -648,7 +605,7 @@ def update_shard_setup(self): ########## SETUP_CDB_SHARD FUNCTION ENDS HERE ############################### ###################################### Run custom scripts ################################################## - def run_custom_scripts(): + def run_custom_scripts(self): """ Custom script to be excuted on every restart of enviornment """ @@ -776,7 +733,7 @@ def register_services(self): # Assigning variable ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) if self.ocommon.check_key("ORACLE_PDB",self.ora_env_dict): msg='''Setting up catalog PDB''' @@ -819,7 +776,7 @@ def backup_files(self): wallet_backup_cmd='''ls -ltr /bin''' self.ocommon.log_info_message("Check Version " + version,self.file_name) if int(version) >= 21: - obase1=self.ora_env_dict["ORACLE_BASE_HOME"] + obase1=self.ora_env_dict["ORACLE_BASE"] wallet_backup_cmd='''cp -r {3}/admin/ {0}/oradata/{1}/{2}/'''.format(obase,"dbconfig",dbuname,ohome) cmd_names=''' mkdir -p {0}/oradata/{1}/{2} diff --git a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/runOraShardSetup.sh b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/runOraShardSetup.sh index d26037c..765f49e 100644 --- a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/runOraShardSetup.sh +++ b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/runOraShardSetup.sh @@ -36,6 +36,7 @@ if [ -z ${DB_UNIQUE_NAME} ]; then export DB_UNIQUE_NAME=$NEW_ORACLE_SID fi +export ORACLE_HOSTNAME=$( hostname -f ) echo "Changing DB name" export ORACLE_SID=$NEW_ORACLE_SID @@ -46,7 +47,9 @@ sqlplus / as sysdba << EOF alter system set open_links_per_instance=16 scope=spfile; alter system set dg_broker_config_file1="$ORACLE_BASE/oradata/dbconfig/$DB_UNIQUE_NAME/dr2$DB_UNIQUE_NAME.dat" scope=spfile; alter system set dg_broker_config_file2="$ORACLE_BASE/oradata/dbconfig/$DB_UNIQUE_NAME/dr1$DB_UNIQUE_NAME.dat" scope=spfile; - alter system set db_file_name_convert='*','/' scope=spfile; + alter system set db_file_name_convert='*','$ORACLE_BASE/oradata/$DB_UNIQUE_NAME/' scope=spfile; + alter system set local_listener='$ORACLE_HOSTNAME' scope=spfile; + alter system set standby_file_management='auto' scope=spfile; shutdown immediate exit; EOF @@ -353,6 +356,15 @@ if [ -d $ORACLE_BASE/oradata/$OLD_ORACLE_SID ]; then else echo "Performing Cloning as cloned status file does not exist" cloneDB; + $ORACLE_BASE/checkDBStatus.sh + if [ $? -eq 0 ]; then + echo "DB is in READ WRITE State" + touch "$ORACLE_BASE/oradata/.${ORACLE_SID}.exist_lck" + $ORACLE_BASE/$LOCKING_SCRIPT --acquire --file "$ORACLE_BASE/oradata/.${ORACLE_SID}.exist_lck" + else + echo "DB is not in READ WRITE state" + exit 1; + fi fi else echo "Error: The $ORACLE_BASE/oradata/$OLD_ORACLE_SID (ORACLE_BASE/oradata/OLD_ORACLE_SID) dir does not exist. Error exiting ." diff --git a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/runOracle.sh b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/runOracle.sh index a404c0f..2266e99 100644 --- a/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/runOracle.sh +++ b/docker-based-sharding-deployment/dockerfiles/19.3.0/scripts/runOracle.sh @@ -44,8 +44,8 @@ EOF # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ################################### -if [ ! -z ${SHARD_SETUP} ]; then - if [ ${SHARD_SETUP,,} == "true" ]; then +if [ ! -z ${SHARD_SETUP} ]; then + if [ ${SHARD_SETUP,,} == "true" ]; then sh $ORACLE_BASE/scripts/sharding/runOraShardSetup.sh fi fi diff --git a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/demoapp.sql b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/demoapp.sql index 3e96bfc..a44cfe8 100644 --- a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/demoapp.sql +++ b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/demoapp.sql @@ -1,7 +1,7 @@ connect sys/'&1'@oshard-catalog-0:1521/CATCDB as sysdba alter session set container=CAT1PDB; alter session enable shard ddl; - create user app_schema identified by app_schema; + create user app_schema identified by '&1'; grant connect, resource, alter session to app_schema; grant execute on dbms_crypto to app_schema; grant create table, create procedure, create tablespace, create materialized view to app_schema; diff --git a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/main.py b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/main.py index da0c6a9..b7f0f17 100644 --- a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/main.py +++ b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/main.py @@ -20,7 +20,7 @@ def main(): # Checking Comand line Args try: - opts, args = getopt.getopt(sys.argv[1:], '', ['addshard=','deleteshard=','validateshard=','checkliveness=','resetlistener=','restartdb=','createdir=','optype=','addshardgroup=','deployshard=','movechunks=','checkonlineshard=','cancelchunks=','checkchunks=','checkgsmshard=','validatenochunks=','invitednode=','help']) + opts, args = getopt.getopt(sys.argv[1:], '', ['addshard=','deleteshard=','validateshard=','checkliveness=','resetlistener=','restartdb=','createdir=','optype=','addshardgroup=','deployshard=','movechunks=','checkonlineshard=','cancelchunks=','checkchunks=','checkgsmshard=','checkreadyness=','validatenochunks=','invitednode=','resetpassword=','exporttdekey=','importtdekey=','help']) except getopt.GetoptError: pass @@ -45,7 +45,7 @@ def main(): for opt, arg in opts: if opt in ('--help'): - oralogger.msg_ = '''{:^17}-{:^17} : You can pass parameter --addshard, --deleteshard, --validateshard, --checkliveness, --resetlistener, --restartdb, --createdir, --optype, --addshardgroup, --deployshard, '--checkonlineshard', '--cancelchunks', '--movechunks', '--checkchunks', '--checkgsmshard','--validatenochunks', '--invitednode', or --help''' + oralogger.msg_ = '''{:^17}-{:^17} : You can pass parameter --addshard, --deleteshard, --validateshard, --checkliveness, --resetlistener, --restartdb, --createdir, --optype, --addshardgroup, --deployshard, '--checkonlineshard', '--cancelchunks', '--movechunks', '--checkchunks', '--checkgsmshard','--validatenochunks', '--checkreadyness','--invitednode', '--resetpassword','--exporttdekey','--importtdekey',or --help''' stdout_handler.handle(oralogger) elif opt in ('--addshard'): file_name = oenv.logfile_name("ADD_SHARD") @@ -68,6 +68,12 @@ def main(): oralogger.filename_ = file_name ocommon.log_info_message("=======================================================================",file_name) oenv.add_custom_variable("CHECK_LIVENESS",arg) + elif opt in ('--checkreadyness'): + oralogger.stdout_ = None + file_name = oenv.logfile_name("CHECK_READYNESS") + oralogger.filename_ = file_name + ocommon.log_info_message("=======================================================================",file_name) + oenv.add_custom_variable("CHECK_READYNESS",arg) elif opt in ('--resetlistener'): file_name = oenv.logfile_name("RESET_LISTENER") oralogger.filename_ = file_name @@ -83,8 +89,6 @@ def main(): oralogger.filename_ = file_name ocommon.log_info_message("=======================================================================",file_name) oenv.add_custom_variable("CREATE_DIR",arg) - elif opt in ('--optype'): - oenv.add_custom_variable("OP_TYPE",arg) elif opt in ('--addshardgroup'): file_name = oenv.logfile_name("ADD_SGROUP_PARAMS") oralogger.filename_ = file_name @@ -130,6 +134,23 @@ def main(): oralogger.filename_ = file_name ocommon.log_info_message("=======================================================================",file_name) oenv.add_custom_variable("INVITED_NODE_OP",arg) + elif opt in ('--resetpassword'): + file_name = oenv.logfile_name("RESET_PASSWD") + oralogger.filename_ = file_name + ocommon.log_info_message("=======================================================================",file_name) + oenv.add_custom_variable("RESET_PASSWORD",arg) + elif opt in ('--exporttdekey'): + file_name = oenv.logfile_name("EXPORT_TDE_KEY") + oralogger.filename_ = file_name + ocommon.log_info_message("=======================================================================",file_name) + oenv.add_custom_variable("EXPORT_TDE_KEY",arg) + elif opt in ('--importtdekey'): + file_name = oenv.logfile_name("IMPORT_TDE_KEY") + oralogger.filename_ = file_name + ocommon.log_info_message("=======================================================================",file_name) + oenv.add_custom_variable("IMPORT_TDE_KEY",arg) + elif opt in ('--optype'): + oenv.add_custom_variable("OP_TYPE",arg) else: pass diff --git a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oracommon.py b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oracommon.py index f5c2f14..8c96b7f 100644 --- a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oracommon.py +++ b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oracommon.py @@ -13,7 +13,6 @@ import time import datetime import os -import commands import getopt import shlex import json @@ -22,12 +21,15 @@ import re import os.path import socket +import string +import random class OraCommon: def __init__(self,oralogger,orahandler,oraenv): self.ologger = oralogger self.ohandler = orahandler self.oenv = oraenv.get_instance() + self.ora_env_dict = oraenv.get_env_vars() self.file_name = os.path.basename(__file__) def run_sqlplus(self,cmd,sql_cmd,dbenv): @@ -41,7 +43,7 @@ def run_sqlplus(self,cmd,sql_cmd,dbenv): cmd=self.unmask_str(cmd) # message="Received Command : {0}\n{1}".format(cmd,sql_cmd) # self.log_info_message(message,self.file_name) - p = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,env=dbenv,shell=True) + p = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,env=dbenv,shell=True,universal_newlines=True) p.stdin.write(sql_cmd) # (stdout,stderr), retcode = p.communicate(sqlplus_script.encode('utf-8')), p.returncode (stdout,stderr),retcode = p.communicate(),p.returncode @@ -51,7 +53,7 @@ def run_sqlplus(self,cmd,sql_cmd,dbenv): self.log_error_message(error_msg,self.file_name) self.prog_exit(self) - return stdout,stderr,retcode + return stdout.replace("\n\n", "\n"),stderr,retcode def execute_cmd(self,cmd,env,dir): """ @@ -61,7 +63,7 @@ def execute_cmd(self,cmd,env,dir): message="Received Command : {0}".format(self.mask_str(cmd)) self.log_info_message(message,self.file_name) cmd=self.unmask_str(cmd) - out = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE,universal_newlines=True) (output,error),retcode = out.communicate(),out.returncode except: error_msg=sys.exc_info() @@ -280,6 +282,24 @@ def update_key(self,key,value,env_dict): return env_dict + def check_file(self,file,local,remote,user): + """ + check locally or remotely + Attributes: + file (string): file to be created + local (boolean): dir to craetes locally + remote (boolean): dir to be created remotely + node (string): remote node name on which dir to be created + user (string): remote user to be connected + """ + self.log_info_message("Inside check_file()",self.file_name) + if local: + if os.path.isfile(file): + return True + else: + return False + + def read_file(self,fname): """ Read the contents of a file and returns the contents to end user @@ -328,7 +348,7 @@ def create_dir(self,dir,local,remote,user): msg='''Dir {0} already exist'''.format(dir) self.log_info_message(msg,self.file_name) - if remote and node: + if remote: pass def create_file(self,file,local,remote,user): @@ -348,14 +368,14 @@ def create_file(self,file,local,remote,user): output,error,retcode=self.execute_cmd(cmd,None,None) self.check_os_err(output,error,retcode,True) - if remote and node: + if remote: pass def shutdown_db(self,env_dict): """ Shutdown the database """ - file="/home/oracle/shutDown.sh immediate" + file="/home/oracle/shutDown.sh" if not os.path.isfile(file): self.log_info_message("Inside shutdown_db()",self.file_name) sqlpluslogincmd='''{0}/bin/sqlplus "/as sysdba"'''.format(env_dict["ORACLE_HOME"]) @@ -367,7 +387,7 @@ def shutdown_db(self,env_dict): self.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) self.check_sql_err(output,error,retcode,True) else: - cmd='''sh {0}'''.format(file) + cmd='''sh {0} immediate'''.format(file) output,error,retcode=self.execute_cmd(cmd,None,None) self.check_os_err(output,error,retcode,True) @@ -432,6 +452,39 @@ def stop_gsm(self,env_dict): self.log_info_message("Calling check_sql_err() to validate the gsm command return status",self.file_name) self.check_sql_err(output,error,retcode,None) + def set_events(self,source): + """ + Seting events at DB level + """ + scope='' + accepted_scope = ['spfile', 'memory', 'both'] + + if self.check_key("DB_EVENTS",self.ora_env_dict): + events=str(self.ora_env_dict["DB_EVENTS"]).split(";") + + for event in events: + msg='''Setting up event {0}'''.format(event) + self.log_info_message(msg,self.file_name) + scope='' + ohome=self.ora_env_dict["ORACLE_HOME"] + inst_sid=self.ora_env_dict["ORACLE_SID"] + sqlpluslogincmd=self.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + self.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + source=event.split(":") + if len(source) > 1: + if source[1].split("=")[0] == "scope": + scope=source[1].split("=")[1] + + if scope not in accepted_scope: + sqlcmd=""" + alter system set events='{0}';""".format(source[0]) + else: + sqlcmd=""" + alter system set event='{0}' scope={1};""".format(source[0],scope) + output,error,retcode=self.run_sqlplus(sqlpluslogincmd,sqlcmd,None) + self.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.check_sql_err(output,error,retcode,True) + def start_gsm(self,env_dict): """ Start the GSM @@ -472,6 +525,23 @@ def check_substr_match(self,source_str,sub_str): else: return False + def find_str_in_string(self,source_str,delimeter,search_str): + """AI is creating summary for find_str_in_string + + Args: + source_str ([string]): [string where you need to search] + delimeter ([character]): [string delimeter] + search_str ([string]): [string to be searched] + """ + if delimeter == 'comma': + new_str=source_str.split(',') + for str in new_str: + if str.lower() == search_str.lower(): + return True + return False + + return False + def check_status_value(self,match): """ return completed or notcompleted @@ -539,7 +609,28 @@ def get_domain(self,ohost): get the domain name from hostname """ return ohost.partition('.')[2] + +######### Get the DOMAIN############## + def get_host_domain(self): + """ + Return Public Hostname + """ + domain=None + domain=socket.getfqdn().split('.',1)[1] + if domain is None: + domain="example.info" + + return domain + ######### get the public IP ############## + def get_ip(self,hostname,domain): + """ + Return the Ip based on hostname + """ + if not domain: + domain=self.get_host_domain() + + return socket.gethostbyname(hostname) def get_global_dbdomain(self,ohost,gdbname): """ @@ -607,24 +698,117 @@ def get_sys_passwd(self): return dbpasswd def get_password(self,key): - """ - get the password - """ - passwd_file_flag=False - self.log_info_message("Getting the OS password",self.file_name) - if key == 'ASM': - pass - elif key == 'OS': - pass - else: + """ + get the password + """ + passwd_file_flag=False + password=None + password_file=None if self.check_key("SECRET_VOLUME",self.ora_env_dict): + self.log_info_message("Secret_Volume set to : ",self.ora_env_dict["SECRET_VOLUME"]) msg='''SECRET_VOLUME passed as an env variable and set to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) else: self.ora_env_dict=self.add_key("SECRET_VOLUME","/run/secrets",self.ora_env_dict) msg='''SECRET_VOLUME not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) self.log_warn_message(msg,self.file_name) -######### Get Password ############## + if self.check_key("KEY_SECRET_VOLUME",self.ora_env_dict): + self.log_info_message("Secret_Volume set to : ",self.ora_env_dict["KEY_SECRET_VOLUME"]) + msg='''KEY_SECRET_VOLUME passed as an env variable and set to {0}'''.format(self.ora_env_dict["KEY_SECRET_VOLUME"]) + else: + if self.check_key("SECRET_VOLUME",self.ora_env_dict): + self.ora_env_dict=self.add_key("KEY_SECRET_VOLUME",self.ora_env_dict["SECRET_VOLUME"],self.ora_env_dict) + msg='''KEY_SECRET_VOLUME not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["KEY_SECRET_VOLUME"]) + self.log_warn_message(msg,self.file_name) + + if self.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict): + msg='''COMMON_OS_PWD_FILE passed as an env variable and set to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) + else: + self.ora_env_dict=self.add_key("COMMON_OS_PWD_FILE","common_os_pwdfile.enc",self.ora_env_dict) + msg='''COMMON_OS_PWD_FILE not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) + self.log_warn_message(msg,self.file_name) + + if self.check_key("PWD_KEY",self.ora_env_dict): + msg='''PWD_KEY passed as an env variable and set to {0}'''.format(self.ora_env_dict["PWD_KEY"]) + else: + self.ora_env_dict=self.add_key("PWD_KEY","pwd.key",self.ora_env_dict) + msg='''PWD_KEY not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["PWD_KEY"]) + self.log_warn_message(msg,self.file_name) + + if self.check_key("PASSWORD_FILE",self.ora_env_dict): + msg='''PASSWORD_FILE passed as an env variable and set to {0}'''.format(self.ora_env_dict["PASSWORD_FILE"]) + else: + self.ora_env_dict=self.add_key("PASSWORD_FILE","dbpasswd.file",self.ora_env_dict) + msg='''PASSWORD_FILE not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["PASSWORD_FILE"]) + self.log_warn_message(msg,self.file_name) + + secret_volume = self.ora_env_dict["SECRET_VOLUME"] + key_secret_volume= self.ora_env_dict["KEY_SECRET_VOLUME"] + common_os_pwd_file = self.ora_env_dict["COMMON_OS_PWD_FILE"] + pwd_volume=None + if self.check_key("PWD_VOLUME",self.ora_env_dict): + pwd_volume=self.ora_env_dict["PWD_VOLUME"] + else: + pwd_volume="/var/tmp" + pwd_key = self.ora_env_dict["PWD_KEY"] + passwd_file='''{0}/{1}'''.format(secret_volume,self.ora_env_dict["COMMON_OS_PWD_FILE"]) + dbpasswd_file='''{0}/{1}'''.format(secret_volume,self.ora_env_dict["PASSWORD_FILE"]) + key_file='''{0}/{1}'''.format(self.ora_env_dict["KEY_SECRET_VOLUME"],self.ora_env_dict["PWD_KEY"]) + key_secret_volume='''{0}'''.format(self.ora_env_dict["KEY_SECRET_VOLUME"]) + self.log_info_message("Password file set to : " + passwd_file,self.file_name) + self.log_info_message("key file set to : " + key_file,self.file_name) + self.log_info_message("dbpasswd file set to : " + dbpasswd_file,self.file_name) + self.log_info_message("key secret voluem set to file set to : " + key_secret_volume,self.file_name) + self.log_info_message("pwd volume set : " + pwd_volume,self.file_name) + #print(passwd_file) + if (os.path.isfile(passwd_file)) and (os.path.isfile(key_file)): + msg='''Passwd file {0} and key file {1} exist. Password file Check passed!'''.format(passwd_file,key_file) + self.log_info_message(msg,self.file_name) + msg='''Reading encrypted passwd from file {0}.'''.format(passwd_file) + self.log_info_message(msg,self.file_name) + cmd=None + if self.check_key("ENCRYPTION_TYPE",self.ora_env_dict): + if self.ora_env_dict["ENCRYPTION_TYPE"].lower() != "aes256": + cmd='''openssl enc -d -aes-256-cbc -in \"{0}/{1}\" -out {2}/{1} -pass file:\"{3}/{4}\"'''.formatformat(secret_volume,common_os_pwd_file,pwd_volume,key_secret_volume,pwd_key) + else: + cmd ='''openssl rsautl -decrypt -in \"{0}/{1}\" -out {2}/{1} -inkey \"{3}/{4}\"'''.format(secret_volume,common_os_pwd_file,pwd_volume,key_secret_volume,pwd_key) + + output,error,retcode=self.execute_cmd(cmd,None,None) + self.check_os_err(output,error,retcode,True) + passwd_file_flag = True + password_file='''{0}/{1}'''.format(pwd_volume,self.ora_env_dict["COMMON_OS_PWD_FILE"]) + elif os.path.isfile(dbpasswd_file): + msg='''Passwd file {0} exist. Password file Check passed!'''.format(dbpasswd_file) + self.log_info_message(msg,self.file_name) + msg='''Reading encrypted passwd from file {0}.'''.format(dbpasswd_file) + self.log_info_message(msg,self.file_name) + cmd='''openssl base64 -d -in \"{0}\" -out \"{2}/{1}\"'''.format(dbpasswd_file,self.ora_env_dict["PASSWORD_FILE"],pwd_volume) + output,error,retcode=self.execute_cmd(cmd,None,None) + self.check_os_err(output,error,retcode,True) + passwd_file_flag = True + password_file='''{1}/{0}'''.format(self.ora_env_dict["PASSWORD_FILE"],pwd_volume) + + if not passwd_file_flag: + # get random password pf length 8 with letters, digits, and symbols + characters1 = string.ascii_letters + string.digits + "_-%#" + str1 = ''.join(random.choice(string.ascii_uppercase) for i in range(4)) + str2 = ''.join(random.choice(characters1) for i in range(8)) + password=str1+str2 + else: + fname='''{0}'''.format(password_file) + fdata=self.read_file(fname) + password=fdata + self.remove_file(fname) + + if self.check_key("ORACLE_PWD",self.ora_env_dict): + msg="ORACLE_PWD is passed as an env variable. Check Passed!" + self.log_info_message(msg,self.file_name) + else: + self.ora_env_dict=self.add_key("ORACLE_PWD",password,self.ora_env_dict) + msg="ORACLE_PWD set to HIDDEN_STRING generated using encrypted password file" + self.log_info_message(msg,self.file_name) + +######### Get oraversion ############## def get_oraversion(self,home): """ get the software version @@ -634,3 +818,65 @@ def get_oraversion(self,home): self.check_os_err(output,error,retcode,True) return output + +####### Get db lock file location ####### + def get_db_lock_location(self): + """ + get the db location + """ + if self.check_key("DB_LOCK_FILE_LOCATION",self.ora_env_dict): + return self.ora_env_dict["DB_LOCK_FILE_LOCATION"] + else: + ### Please note that you should not change following path as SIDB team is maintaining lock files under following location + return "/tmp/." + +####### Get the TDE Key ############### + def export_tde_key(self,filename): + """ + This function export the tde. + """ + self.log_info_message("Inside gettdekey()",self.file_name) + sqlpluslogincmd='''{0}/bin/sqlplus "/as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + sqlcmd=''' + ALTER SESSION DISABLE SHARD DDL; + ADMINISTER KEY MANAGEMENT EXPORT ENCRYPTION KEYS WITH SECRET {0} TO {1} IDENTIFIED BY {0}; + '''.format('HIDDEN_STRING',filename) + self.log_info_message("Running the sqlplus command to export the tde: " + sqlcmd,self.file_name) + output,error,retcode=self.run_sqlplus(sqlpluslogincmd,sqlcmd,None) + self.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.check_sql_err(output,error,retcode,True) + +####### Get the TDE Key ############### + def import_tde_key(self,filename): + """ + This function import the TDE key. + """ + self.log_info_message("Inside importtdekey()",self.file_name) + sqlpluslogincmd='''{0}/bin/sqlplus "/as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + sqlcmd=''' + ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY {0}; + ADMINISTER KEY MANAGEMENT IMPORT ENCRYPTION KEYS WITH SECRET {0} FROM {1} IDENTIFIED BY {0} WITH BACKUP + '''.format('HIDDEN_STRING',filename) + self.log_info_message("Running the sqlplus command to import the tde key: " + sqlcmd,self.file_name) + output,error,retcode=self.run_sqlplus(sqlpluslogincmd,sqlcmd,None) + self.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.check_sql_err(output,error,retcode,True) +######## Reset the DB Password in database ######## + def reset_passwd(self): + """ + This function reset the password. + """ + password_script='''{0}/{1}'''.format(self.ora_env_dict["HOME"],"setPassword.sh") + self.log_info_message("Executing password reset", self.file_name) + if self.check_key("ORACLE_PWD",self.ora_env_dict) and self.check_key("HOME",self.ora_env_dict) and os.path.isfile(password_script): + cmd='''{0} {1} '''.format(password_script,'HIDDEN_STRING') + self.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + output,error,retcode=self.execute_cmd(cmd,None,None) + self.check_os_err(output,error,retcode,True) + self.unset_mask_str() + else: + msg='''Error Occurred! Either HOME DIR {0} does not exist, ORACLE_PWD {1} is not set or PASSWORD SCRIPT {2} does not exist'''.format(self.ora_env_dict["HOME"],self.ora_env_dict["ORACLE_PWD"],password_script) + self.log_error_message(msg,self.file_name) + self.oracommon.prog_exit() \ No newline at end of file diff --git a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oraenv.py b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oraenv.py index f33bb1a..dd96c48 100644 --- a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oraenv.py +++ b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oraenv.py @@ -15,6 +15,7 @@ class OraEnv: __instance = None __env_var_file = '/etc/rac_env_vars' + __env_var_file_flag = None __env_var_dict = {} __ora_asm_diskgroup_name = '+DATA' @@ -60,6 +61,8 @@ def read_variable(): @staticmethod def add_variable(): """ Add more variable ased on enviornment with default values in __env_var_dict""" + OraEnv.__env_var_dict["GSM_LOCK_STATUS_FILE"] = "/tmp/.gsm_status_lock_file" + OraEnv.__env_var_dict["SHARD_LOCK_STATUS_FILE"] = "/tmp/.shard_status_lock_file" if "ORA_ASM_DISKGROUP_NAME" not in OraEnv.__env_var_dict: OraEnv.__env_var_dict["ORA_ASM_DISKGROUP_NAME"] = "+DATA" @@ -102,6 +105,8 @@ def logfile_name(file_type): OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/shard_remove.log" elif file_type == "CHECK_LIVENESS": OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/shard_checkliveness.log" + elif file_type == "CHECK_READYNESS": + OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/shard_checkreadyness.log" elif file_type == "RESET_LISTENER": OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/reset_listener.log" elif file_type == "RESTART_DB": @@ -122,6 +127,12 @@ def logfile_name(file_type): OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/check_online_shard.log" elif file_type == "CHECK_GSM_SHARD": OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/check_gsm_shard.log" + elif file_type == "INVITED_NODE_OP": + OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/node_invited_op.log" + elif file_type == "RESET_PASSWD": + OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/reset_passwd_file.log" + elif file_type == "TDE_KEY": + OraEnv.__env_var_dict["LOG_FILE_NAME"] = OraEnv.logdir__ + "/tde_key.log" else: pass diff --git a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oragsm.py b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oragsm.py index 4a5266e..d8d1634 100644 --- a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oragsm.py +++ b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oragsm.py @@ -74,7 +74,16 @@ def setup(self): self.ocommon.log_info_message("No existing catalog and GDS setup found on this system. Setting up GDS and will configure catalog on this machine.",self.file_name) self.ocommon.prog_exit("127") else: - self.self.setup_gsm_shardg("ADD_SGROUP_PARAMS") + self.setup_gsm_shardg("ADD_SGROUP_PARAMS") + sys.exit(0) + elif self.ocommon.check_key("ADD_SSPACE_PARAMS",self.ora_env_dict): + self.catalog_checks() + status = self.catalog_setup_checks() + if not status: + self.ocommon.log_info_message("No existing catalog and GDS setup found on this system. Setting up GDS and will configure catalog on this machine.",self.file_name) + self.ocommon.prog_exit("127") + else: + self.setup_gsm_sspace("ADD_SSPACE_PARAMS") sys.exit(0) elif self.ocommon.check_key("REMOVE_SHARD",self.ora_env_dict): self.catalog_checks() @@ -83,8 +92,13 @@ def setup(self): self.ocommon.log_info_message("No existing catalog and GDS setup found on this system. Setting up GDS and will configure catalog on this machine.",self.file_name) self.ocommon.prog_exit("127") else: - self.remove_gsm_shard() + status=self.remove_gsm_shard() + + if status: sys.exit(0) + else: + sys.exit(1) + elif self.ocommon.check_key("MOVE_CHUNKS",self.ora_env_dict): self.catalog_checks() status = self.catalog_setup_checks() @@ -94,6 +108,9 @@ def setup(self): else: self.move_shard_chunks() sys.exit(0) + elif self.ocommon.check_key("TDE_KEY",self.ora_env_dict): + self.ocommon.get_tde_key() + sys.exit(0) elif self.ocommon.check_key("CANCEL_CHUNKS",self.ora_env_dict): self.catalog_checks() status = self.catalog_setup_checks() @@ -148,10 +165,18 @@ def setup(self): else: sys.exit(0) elif self.ocommon.check_key("CHECK_LIVENESS",self.ora_env_dict): + filename=self.ora_env_dict["GSM_LOCK_STATUS_FILE"] + if os.path.exists(filename): + self.ocommon.log_info_message("provisioning is still in progress as file " + filename + " still exist!",self.file_name) + sys.exit(0) status = self.catalog_setup_checks() if not status: self.ocommon.log_info_message("No existing catalog and GDS setup found on this system. Setting up GDS and will configure catalog on this machine.",self.file_name) self.ocommon.prog_exit("127") + status = self.check_gsm_director_status(None) + if not status: + self.ocommon.log_info_message("No GDS setup found on this system.",self.file_name) + self.ocommon.prog_exit("127") self.ocommon.log_info_message("GSM liveness check completed sucessfully!",self.file_name) sys.exit(0) elif self.ocommon.check_key("INVITED_NODE_OP",self.ora_env_dict): @@ -186,7 +211,11 @@ def setup(self): self.setup_gsm_director() self.start_gsm_director() self.status_gsm_director() - self.setup_gsm_shardg("SHARD_GROUP") + if self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + if self.ora_env_dict["SHARDING_TYPE"].upper() != 'USER': + self.setup_gsm_shardg("SHARD_GROUP") + else: + self.setup_gsm_shardg("SHARD_GROUP") self.gsm_backup_file() self.gsm_completion_message() ### Running Custom Scripts @@ -216,7 +245,13 @@ def setup(self): self.setup_gsm_director() self.start_gsm_director() self.status_gsm_director() - self.setup_gsm_shardg("SHARD_GROUP") + if self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + if self.ora_env_dict["SHARDING_TYPE"].upper() != 'USER': + self.setup_gsm_shardg("SHARD_GROUP") + if self.ora_env_dict["SHARDING_TYPE"].upper() == 'USER': + self.setup_gsm_sspace("SHARD_SPACE") + else: + self.setup_gsm_shardg("SHARD_GROUP") self.setup_gsm_shard() self.set_hostid_null() self.stop_gsm_director() @@ -247,8 +282,16 @@ def setup_machine(self): This function performs the compute before performing setup """ self.omachine.setup() + filename = self.ora_env_dict["GSM_LOCK_STATUS_FILE"] + touchfile = 'touch {0}'.format(filename) + if not os.path.isfile(filename): + self.ocommon.log_error_message("Setting file provisioning status file :" + filename ,self.file_name) + output,error,retcode=self.ocommon.execute_cmd(touchfile,None,self.ora_env_dict) + if retcode == 1: + self.ocommon.log_error_message("error occurred while touching the file :" + filename + ". Exiting!",self.file_name) + self.ocommon.prog_exit("127") - ########### SETUP_MACHINE ENDS here #################### + ########### ENDS here #################### def gsm_checks(self): """ @@ -259,7 +302,7 @@ def gsm_checks(self): self.shard_user_check() self.gsm_hostname_check() self.director_params_checks() - self.catalog_params_check() + self.catalog_params_check() self.shard_params_check() self.sgroup_params_check() @@ -295,65 +338,13 @@ def ohome_check(self): self.ocommon.prog_exit("127") def passwd_check(self): - """ - This funnction perform password related checks - """ - passwd_file_flag = False - if self.ocommon.check_key("SECRET_VOLUME",self.ora_env_dict): - msg='''SECRET_VOLUME passed as an env variable and set to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - else: - self.ora_env_dict=self.ocommon.add_key("SECRET_VOLUME","/run/secrets",self.ora_env_dict) - msg='''SECRET_VOLUME not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict): - msg='''COMMON_OS_PWD_FILE passed as an env variable and set to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - else: - self.ora_env_dict=self.ocommon.add_key("COMMON_OS_PWD_FILE","common_os_pwdfile.enc",self.ora_env_dict) - msg='''COMMON_OS_PWD_FILE not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("PWD_KEY",self.ora_env_dict): - msg='''PWD_KEY passed as an env variable and set to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - else: - self.ora_env_dict=self.ocommon.add_key("PWD_KEY","pwd.key",self.ora_env_dict) - msg='''PWD_KEY not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - secret_volume = self.ora_env_dict["SECRET_VOLUME"] - common_os_pwd_file = self.ora_env_dict["COMMON_OS_PWD_FILE"] - pwd_key = self.ora_env_dict["PWD_KEY"] - passwd_file='''{0}/{1}'''.format(self.ora_env_dict["SECRET_VOLUME"],self.ora_env_dict["COMMON_OS_PWD_FILE"]) - if os.path.isfile(passwd_file): - msg='''Passwd file {0} exist. Password file Check passed!'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - msg='''Reading encrypted passwd from file {0}.'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - cmd='''openssl enc -d -aes-256-cbc -in \"{0}/{1}\" -out /tmp/{1} -pass file:\"{0}/{2}\"'''.format(secret_volume,common_os_pwd_file,pwd_key) - output,error,retcode=self.ocommon.execute_cmd(cmd,None,None) - self.ocommon.check_os_err(output,error,retcode,True) - passwd_file_flag = True - - if not passwd_file_flag: - s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()?" - passlen = 8 - password = "".join(random.sample(s,passlen )) - else: - fname='''/tmp/{0}'''.format(common_os_pwd_file) - fdata=self.ocommon.read_file(fname) - password=fdata - self.ocommon.remove_file(fname) - - if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict): - msg="ORACLE_PWD is passed as an env variable. Check Passed!" - self.ocommon.log_info_message(msg,self.file_name) - else: - self.ora_env_dict=self.ocommon.add_key("ORACLE_PWD",password,self.ora_env_dict) - msg="ORACLE_PWD set to HIDDEN_STRING generated using encrypted password file" - self.ocommon.log_info_message(msg,self.file_name) + """ + Set the password + """ + self.ocommon.get_password(None) + if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict): + msg='''ORACLE_PWD key is set. Check Passed!''' + self.ocommon.log_info_message(msg,self.file_name) def shard_user_check(self): """ @@ -396,7 +387,8 @@ def gsm_hostname_check(self): self.ocommon.log_info_message(msg,self.file_name) else: if self.ocommon.check_key("KUBE_SVC",self.ora_env_dict): - hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + ## hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + hostname='''{0}'''.format(socket.getfqdn()) else: hostname='''{0}'''.format(socket.gethostname()) msg='''ORACLE_HOSTNAME is not set, setting it to hostname {0} of the compute!'''.format(hostname) @@ -413,6 +405,13 @@ def catalog_params_check(self): if(reg_exp.match(key)): msg='''CATALOG PARAMS {0} is set to {1}'''.format(key,self.ora_env_dict[key]) self.ocommon.log_info_message(msg,self.file_name) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) + if stype: + if stype.lower() == 'user': + if not self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + self.ora_env_dict=self.ocommon.add_key("SHARDING_TYPE","USER",self.ora_env_dict) + if not self.ocommon.check_key("SHARD_SPACE",self.ora_env_dict): + self.ora_env_dict=self.ocommon.add_key("SHARD_SPACE",sspace,self.ora_env_dict) status=True if not status: @@ -554,10 +553,10 @@ def setup_gsm_calog(self): while counter < end_counter: for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks=self.process_clog_vars(key) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) catalog_db_status=self.check_setup_status(catalog_host,catalog_db,catalog_pdb,catalog_port) if catalog_db_status == 'completed': - self.configure_gsm_clog(catalog_host,catalog_db,catalog_pdb,catalog_port,catalog_name,catalog_region,catalog_chunks) + self.configure_gsm_clog(catalog_host,catalog_db,catalog_pdb,catalog_port,catalog_name,catalog_region,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname) break else: msg='''Catalog Status must return completed but returned value is {0}'''.format(status) @@ -581,6 +580,12 @@ def process_clog_vars(self,key): catalog_host=None catalog_name=None catalog_chunks=None + repl_type=None + repl_factor=None + repl_unit=None + stype=None + sspace=None + cfname=None self.ocommon.log_info_message("Inside process_clog_vars()",self.file_name) cvar_str=self.ora_env_dict[key] @@ -599,16 +604,32 @@ def process_clog_vars(self,key): if ckey == 'catalog_name': catalog_name = cvar_dict[ckey] if ckey == 'catalog_chunks': - catalog_chunks = cvar_dict[ckey] + catalog_chunks = cvar_dict[ckey] + if ckey == 'repl_type': + repl_type = cvar_dict[ckey] + if ckey == 'repl_factor': + repl_factor = cvar_dict[ckey] + if ckey == 'repl_unit': + repl_unit = cvar_dict[ckey] + if ckey == 'sharding_type': + stype = cvar_dict[ckey] + if ckey == 'shard_space': + sspace = cvar_dict[ckey] + if ckey == 'shard_configname': + cfname = cvar_dict[ckey] + ## Set the values if not set in above block if not catalog_port: catalog_port=1521 if not catalog_region: catalog_region="region1,region2" + if stype: + if not sspace: + sspace="shardspace1,shardspace2" ### Check values must be set if catalog_host and catalog_db and catalog_pdb and catalog_port and catalog_region and catalog_name: - return catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks + return catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname else: msg1='''catalog_db={0},catalog_pdb={1}'''.format((catalog_db or "Missing Value"),(catalog_pdb or "Missing Value")) msg2='''catalog_port={0},catalog_host={1}'''.format((catalog_port or "Missing Value"),(catalog_host or "Missing Value")) @@ -649,27 +670,101 @@ def catalog_regex(self): return re.compile('CATALOG_PARAMS') - def configure_gsm_clog(self,chost,ccdb,cpdb,cport,catalog_name,catalog_region,catalog_chunks): + def configure_gsm_clog(self,chost,ccdb,cpdb,cport,catalog_name,catalog_region,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname): """ This function configure the GSM catalog. """ self.ocommon.log_info_message("Inside configure_gsm_clog()",self.file_name) gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + replist=['native'] + + ### User Define Shardig Variables + shardingtype=None + shardspace=None + configname=None + + # if stype and sspace: + if stype: + if stype.lower() == 'user': + shardingtype="-sharding user" + #shardspace="" + shardspace=" -shardspace {0}".format(sspace) + if not self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + self.ora_env_dict=self.ocommon.add_key("SHARDING_TYPE","USER",self.ora_env_dict) + if not self.ocommon.check_key("SHARD_SPACE",self.ora_env_dict): + self.ora_env_dict=self.ocommon.add_key("SHARD_SPACE",sspace,self.ora_env_dict) + else: + shardspace="" + shardingtype="" + else: + shardspace="" + shardingtype="" + + if cfname: + configname=" -configname {0}".format(cfname) + else: + configname="" + + ### SNR Sharding + chunks=None + repl=None + repfactor=None + repunits=None + if catalog_chunks: chunks="-chunks {0}".format(catalog_chunks) else: chunks="" + + if repl_type and repl_type.lower() in replist: + self.ocommon.log_info_message("Repl_Type value Set to in block1:" + repl_type,self.file_name) + repl=" -repl {0}".format(repl_type) + else: + repl="" + + if repl_factor: + repfactor=" -repfactor {0}".format(repl_factor) + else: + repfactor="" + + if repl_unit: + repunits=" -repunits {0}".format(repl_unit) + else: + repunits="" + + invited_subnet="" + add_invited_subnet="" + if self.ocommon.check_key("INVITED_NODE_SUBNET_FLAG",self.ora_env_dict): + if self.ocommon.check_key("INVITED_NODE_SUBNET",self.ora_env_dict): + invited_subnet=self.ora_env_dict["INVITED_NODE_SUBNET"] + else: + #self.ocommon.log_info_message("The catalog Host name is :" + chost,self.file_name) + chost_ip=self.ocommon.get_ip(chost,None) + ip_parts=chost_ip.split('.') + invited_subnet=ip_parts[0] + "." + ip_parts[1] + '.*' + '.*' + add_invited_subnet='''add invitedsubnet {0};'''.format(invited_subnet) + cpasswd="HIDDEN_STRING" self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) gsmcmd=''' - create shardcatalog -database \"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})))\" {7} -user {3}/{4} -sdb {5} -region {6} -agent_port 8080 -agent_password {4} -autovncr off; + create shardcatalog -database \"(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})))\" {7} -user {3}/{4} -sdb {5} -region {6} -agent_port 8080 -agent_password {4} {8} {9} {10} {11} {12} {13} -autovncr off; add invitednode {0}; + {14} exit; - '''.format(chost,cport,cpdb,cadmin,cpasswd,catalog_name,catalog_region,chunks) + '''.format(chost,cport,cpdb,cadmin,cpasswd,catalog_name,catalog_region,chunks,repl,repfactor,repunits,shardingtype,shardspace,configname,add_invited_subnet) + + counter=1 + while counter < 5: + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + if retcode != 0: + self.ocommon.log_info_message("Error occurred while creating the shard catalog, sleeping for 60 seconds",self.file_name) + counter = counter + 1 + time.sleep(60) + else: + break - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) ### Unsetting the encrypt value to None self.ocommon.unset_mask_str() @@ -697,9 +792,9 @@ def process_director_vars(self,key): if dtrname and dtrport and dtregion: return dtrname,dtrport,dtregion else: - msg1='''director_name={0},director_port={1}'''.format((director_name or "Missing Value"),(director_port or "Missing Value")) - msg2='''director_region={0}'''.format((director_region or "Missing Value")) - msg='''Director params {0} is not set correctly. One or more value is missing {1} {2}'''.format(SHARD_DIRECTOR_PARAMS,msg1,msg2) + msg1='''director_name={0},director_port={1}'''.format((dtrname or "Missing Value"),(dtrport or "Missing Value")) + msg2='''director_region={0}'''.format((dtregion or "Missing Value")) + msg='''Director params {0} is not set correctly. One or more value is missing {1} {2}'''.format(key,msg1,msg2) self.ocommon.log_error_message(msg,self.file_name) self.ocommon.prog_exit("Error occurred") @@ -734,6 +829,54 @@ def check_gsm_director(self,dname): return(self.ocommon.check_status_value(status)) + def check_gsm_region(self,region): + """ + This function check the GSM regions + """ + self.ocommon.log_info_message("Inside check_gsm_region()",self.file_name) + gsmcmd=self.get_gsm_config_cmd(None) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + matched_output=re.findall("(?:Regions\n)(?:.+\n)+",output) + status=False + try: + if self.ocommon.check_substr_match(matched_output[0],region): + status=True + except: + status=False + return(self.ocommon.check_status_value(status)) + + def check_gsm_shardspace(self,sspace): + """ + This function check the GSM shardspace + """ + self.ocommon.log_info_message("Inside check_gsm_shardspace()",self.file_name) + gsmcmd=self.get_gsm_config_cmd(None) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + matched_output=re.findall("(?:Shard spaces\n)(?:.+\n)+",output) + status=False + try: + if self.ocommon.check_substr_match(matched_output[0],sspace): + status=True + except: + status=False + return(self.ocommon.check_status_value(status)) + + def check_gsm_director_status(self,dname): + """ + This function check the GSM director status using 'gdsctl status' + """ + self.ocommon.log_info_message("Inside check_gsm_director_status()",self.file_name) + status=False + gsmcmd=''' + status; + exit; + ''' + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + if "Connected to GDS catalog Y".replace(" ","").lower() in output.replace(" ","").lower(): + return True + else: + return False + def add_gsm_director(self): """ This function add the GSM @@ -796,12 +939,12 @@ def setup_gsm_director(self): if shard_director_status != 'completed': self.configure_gsm_director(dtrname,dtrport,dtregion,gsmhost,cadmin) status = self.check_gsm_director(None) - if status == 'completed': - break - else: - msg='''GSM shard director setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) - time.sleep(60) - counter=counter+1 + if status == 'completed': + break + else: + msg='''GSM shard director setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) + time.sleep(60) + counter=counter+1 status = self.check_gsm_director(None) if status == 'completed': @@ -809,8 +952,8 @@ def setup_gsm_director(self): self.ocommon.log_info_message(msg,self.file_name) else: msg='''Waited 3 minute to complete shard director in GSM but setup did not complete or failed. Exiting...''' - self.ocommon.log_error_message(msg,self.file_name) - self.ocommon.prog_exit("127") + self.ocommon.log_error_message(msg,self.file_name) + self.ocommon.prog_exit("127") def configure_gsm_director(self,dtrname,dtrport,dtregion,gsmhost,cadmin): """ @@ -821,7 +964,10 @@ def configure_gsm_director(self,dtrname,dtrport,dtregion,gsmhost,cadmin): reg_exp= self.catalog_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks=self.process_clog_vars(key) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) + sregionFlag=self.check_gsm_region(dtregion) + if sregionFlag != 'completed': + self.configure_gsm_region(dtregion) self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) gsmcmd=''' add gsm -gsm {0} -listener {1} -pwd {2} -catalog {3}:{4}/{5} -region {6}; @@ -854,6 +1000,10 @@ def start_gsm_director(self): if status == 'completed': break; if status == 'completed': + filename=self.ora_env_dict["GSM_LOCK_STATUS_FILE"] + remfile='''rm -f {0}'''.format(filename) + if os.path.isfile(filename): + output,error,retcode=self.ocommon.execute_cmd(remfile,None,self.ora_env_dict) break else: msg='''GSM shard director failed to start.Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) @@ -915,31 +1065,37 @@ def setup_gsm_shardg(self,restype): elif restype == 'SHARD_GROUP': reg_exp = self.shardg_regex() else: - self.ocommon.log_error_message("No Key Specified! You can only pass ADD_SGROUP_PARAMS or SHARD_GROUP key to create a shard group",self.file_name) - self.ocommon.prog_exit("127") + self.ocommon.log_warn_message("No Key Specified! You can only pass ADD_SGROUP_PARAMS or SHARD_GROUP key to create a shard group",self.file_name) + self.ocommon.log_warn_message("Since no key specified for ADD_SGROUP_PARAMS and SHARD_GROUP, shardgroup will be created during shard creation",self.file_name) + sgListC=[] + sgListP=[] counter=1 end_counter=3 while counter < end_counter: for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): shard_group_status=None + self.ocommon.log_info_message("Key is set to : " + key,self.file_name) group_name,deploy_as,group_region=self.process_shardg_vars(key) - dtrname=self.get_director_name(group_region) - shard_group_status=self.check_shardg_status(group_name,dtrname) - if shard_group_status != 'completed': - self.configure_gsm_shardg(group_name,deploy_as,group_region) - - status = self.check_shardg_status(None,None) - if status == 'completed': - break - else: - msg='''GSM shard group setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) - time.sleep(60) - counter=counter+1 - - status = self.check_shardg_status(None,None) - if status == 'completed': + self.ocommon.log_info_message("Name: " + group_name + "deploy_as" + deploy_as + "group_region" + group_region,self.file_name) + if group_name is not None: + if group_name not in sgListC: + dtrname=self.get_director_name(group_region) + shard_group_status=self.check_shardg_status(group_name,dtrname) + if shard_group_status != 'completed': + self.configure_gsm_shardg(group_name,deploy_as,group_region,'add') + shard_group_status = self.check_shardg_status(group_name,None) + if shard_group_status == 'completed': + sgListC.append(group_name) + if group_name in sgListP: + sgListP.remove(group_name) + else: + sgListP=sgListP.append(group_name) + time.sleep(30) + counter=counter + 1 + + if sgListP == []: msg='''Shard group setup completed in GSM''' self.ocommon.log_info_message(msg,self.file_name) else: @@ -1026,20 +1182,23 @@ def process_shardg_vars(self,key): self.ocommon.log_error_message(msg,self.file_name) self.ocommon.prog_exit("Error occurred") + def check_shardg_status(self,group_name,dname): - """ - This function check the shard status in GSM - """ - self.ocommon.log_info_message("Inside check_shardg_status()",self.file_name) - status=False - if dname: - gsmcmd=self.get_gsm_config_cmd(dname) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - matched_output=re.findall("(?:Shard Groups\n)(?:.+\n)+",output) - if self.ocommon.check_substr_match(matched_output[0],group_name): - status=True - else: - status=False + """ + This function check the shard status in GSM + """ + self.ocommon.log_info_message("Inside check_shardg_status()",self.file_name) + status=False + + gsmcmd=self.get_gsm_config_cmd(dname) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + matched_output=re.findall("(?:Shard Groups\n)(?:.+\n)+",output) + if self.ocommon.check_substr_match(matched_output[0],group_name): + status=True + else: + status=False + + ''' else: reg_exp= self.shardg_regex() for key in self.ora_env_dict.keys(): @@ -1054,7 +1213,41 @@ def check_shardg_status(self,group_name,dname): status=True else: status=False - return(self.ocommon.check_status_value(status)) + ''' + + return(self.ocommon.check_status_value(status)) + +############################################# Director Related Block ############ + def get_director_name(self,region_name): + """ + This function get the director name based on the region + """ + self.ocommon.log_info_message("Inside get_director_name()",self.file_name) + status=False + director_name=None + reg_exp= self.director_regex() + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + dtrname,dtrport,dtregion=self.process_director_vars(key) + director_name=dtrname + gsm_status = self.check_gsm_director(dtrname) + if gsm_status == 'completed': + status = True + else: + status = False + if dtregion == region_name: + break + if status: + if director_name: + return director_name + else: + self.ocommon.log_error_message("No director exist to match the region",self.file_name) + self.ocommon.prog_exit("127") + else: + self.ocommon.log_error_message("Shard Director is not running!",self.file_name) + self.ocommon.prog_exit("127") + +######## def get_gsm_config_cmd(self,dname): """ @@ -1088,27 +1281,173 @@ def add_shardg_regex(self): self.ocommon.log_info_message("Inside shardg_regex()",self.file_name) return re.compile('ADD_SGROUP_PARAMS') - def configure_gsm_shardg(self,group_name,deploy_as,group_region): + def configure_gsm_shardg(self,group_name,deploy_as,group_region,type): """ This function configure the Shard Group. """ self.ocommon.log_info_message("Inside configure_gsm_shardg()",self.file_name) + cmd=None gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] cpasswd="HIDDEN_STRING" dtrname=self.get_director_name(group_region) + reg_exp= self.catalog_regex() + if type == 'modify': + cmd=''' modify shardgroup -shardgroup {0} '''.format(group_name) + else: + cmd=''' add shardgroup -shardgroup {0} '''.format(group_name) + + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) + if repl_type: + cmd=cmd + " -region {0} ".format(group_region) + else: + cmd=cmd + " -deploy_as {0} -region {1} ".format(deploy_as,group_region) + + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + gsmcmd=''' + connect {1}/{2}; + {3}; + exit; + '''.format("NA",cadmin,cpasswd,cmd) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + +############# Adding Shard Regions ############### + def configure_gsm_region(self,region): + """ + This function configure the Shard region. + """ + self.ocommon.log_info_message("Inside configure_gsm_region()",self.file_name) + cmd=None + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) gsmcmd=''' connect {1}/{2}; - add shardgroup -shardgroup {3} -deploy_as {4} -region {5} + add region -region {3}; exit; - '''.format("NA",cadmin,cpasswd,group_name,deploy_as,group_region) + '''.format("NA",cadmin,cpasswd,region) output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) ### Unsetting the encrypt value to None self.ocommon.unset_mask_str() + +##################### Adding Shard Space ############### + def process_sspace_vars(self,key): + """ + This function process shardG vars based on key and return values to configure the GSM + """ + sspace=None + chunks=None + repfactor=None + repunits=None + protectedmode=None + self.ocommon.log_info_message("Inside process_sspace_vars()",self.file_name) + cvar_str=self.ora_env_dict[key] + cvar_dict=dict(item.split("=") for item in cvar_str.split(";")) + for ckey in cvar_dict.keys(): + if ckey == 'sspace_name': + sspace = cvar_dict[ckey] + if ckey == 'chunks': + chunks = cvar_dict[ckey] + if ckey == 'repfactor': + repfactor = cvar_dict[ckey] + if ckey == 'repunits': + repunits = cvar_dict[ckey] + if ckey == 'protectedmode': + protectedmode = cvar_dict[ckey] + + ### Check values must be set + if sspace: + return sspace,chunks,repfactor,repunits,protectedmode + else: + msg1='''sspace={0}'''.format((sspace or "Missing Value")) + msg='''Shard space params {0} is not set correctly. One or more value is missing {1}'''.format(key,msg1) + self.ocommon.log_error_message(msg,self.file_name) + self.ocommon.prog_exit("Error occurred") + + def setup_gsm_sspace(self,restype): + """ + This function setup the shard sspace. + """ + self.ocommon.log_info_message("Inside setup_gsm_sspace()",self.file_name) + status=False + if restype == 'ADD_SSPACE_PARAMS': + reg_exp = self.add_shardg_regex() + elif restype == 'SHARD_SPACE': + reg_exp = self.shardg_regex() + else: + self.ocommon.log_warn_message("No Key Specified! You can only pass ADD_SSPACE_PARAMS or SHARD_SPACE key to create a shard space",self.file_name) + self.ocommon.log_warn_message("Since no ADD_SSPACE_PARAMS or SHARD_SPACE defined, shardspace will be created during shard creation",self.file_name) + counter=1 + end_counter=3 + while counter < end_counter: + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + shard_group_status=None + sspace,chunks,repfactor,repuntis,protectedmode=self.process_sspace_vars(key) + shard_sspace_status=self.check_gsm_shardspace(sspace) + if shard_group_status != 'completed': + self.configure_gsm_sspace(sspace,chunks,repfactor,repuntis,protectedmode,'add') + + status = self.check_sspace_status(sspace) + if status == 'completed': + break + else: + msg='''GSM shard space setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) + time.sleep(60) + counter=counter+1 + + status = self.check_sspace_status(None,None) + if status == 'completed': + msg='''Shard space setup completed in GSM''' + self.ocommon.log_info_message(msg,self.file_name) + else: + msg='''Waited 2 minute to complete catalog setup in GSM but setup did not complete or failed. Exiting...''' + self.ocommon.log_error_message(msg,self.file_name) + self.ocommon.prog_exit("127") + + + def configure_gsm_sspace(self,sspace,chunks,repfactor,repunits,protectedmode,type): + """ + This function configure the Shard Group. + """ + self.ocommon.log_info_message("Inside configure_gsm_sspace()",self.file_name) + cmd=None + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + if type == 'MODIFY': + cmd=''' modify shardpsace -shardspace {0} '''.format(sspace) + else: + cmd=''' add shardpsace -shardspace {0} '''.format(sspace) + if chunks is not None: + cmd = cmd + ''' -chunks {0}'''.format(chunks) + if repfactor: + cmd = cmd + ''' -repfactor {0}'''.format(repfactor) + if repunits is not None: + cmd = cmd + ''' -repunits {0}'''.format(repfactor) + if protectedmode is not None: + cmd = cmd + ''' -protectedmode {0}'''.format(protectedmode) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + gsmcmd=''' + connect {1}/{2}; + {3}; + exit; + '''.format("NA",cadmin,cpasswd,cmd) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + #########################################Shard Function Begins Here ############################## def setup_gsm_shard(self): """ @@ -1123,11 +1462,10 @@ def setup_gsm_shard(self): for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): shard_db_status=None - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) - + shard_db,shard_pdb,shard_port,shard_group,shard_host,sregion,sspace=self.process_shard_vars(key) shard_db_status=self.check_setup_status(shard_host,shard_db,shard_pdb,shard_port) if shard_db_status == 'completed': - self.configure_gsm_shard(shard_host,shard_db,shard_pdb,shard_port,shard_group) + self.configure_gsm_shard(shard_host,shard_db,shard_pdb,shard_port,shard_group,sregion,sspace) else: msg='''Shard db status must return completed but returned value is {0}'''.format(status) self.ocommon.log_info_message(msg,self.file_name) @@ -1164,12 +1502,25 @@ def add_gsm_shard(self): for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): shard_db_status=None - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) + shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space=self.process_shard_vars(key) shard_name='''{0}_{1}'''.format(shard_db,shard_pdb) shard_db_status=self.check_setup_status(shard_host,shard_db,shard_pdb,shard_port) self.ocommon.log_info_message("Shard Status : " + shard_db_status,self.file_name) if shard_db_status == 'completed': - self.configure_gsm_shard(shard_host,shard_db,shard_pdb,shard_port,shard_group) + self.configure_gsm_shard(shard_host,shard_db,shard_pdb,shard_port,shard_group,shard_region,shard_space) + counter2=1 + end_counter2=5 + while counter2 < end_counter2: + status1 = self.check_shard_status(shard_name) + if status1 == 'completed': + msg='''Shard DB setup completed in GSM''' + self.ocommon.log_info_message(msg,self.file_name) + break + else: + msg='''Shard DB is still not added in GSM. Sleeping for 60 seconds''' + self.ocommon.log_info_message(msg,self.file_name) + time.sleep(60) + counter2=counter2+1 else: msg='''Shard db status must return completed but returned value is {0}'''.format(status) self.ocommon.log_info_message(msg,self.file_name) @@ -1196,20 +1547,83 @@ def remove_gsm_shard(self): This function remove the shard in the GSM """ self.ocommon.log_info_message("Inside remove_gsm_shard()",self.file_name) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars("CATALOG_PARAMS") + numOfShards=self.count_online_shards() status=False - reg_exp= self.remove_shard_regex() + reg_exp=self.remove_shard_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): shard_db_status=None - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) + shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space=self.process_shard_vars(key) + shardname_to_delete=shard_db + "_" + shard_pdb + if repl_type is not None: + if(repl_type.upper() == 'NATIVE'): + self.move_shards_leader_rus(shardname_to_delete) + leaderCount=self.count_leader_shards(shardname_to_delete) + if(numOfShards < 4 or leaderCount > 0): + msg='''ruType=[{0}]. NumofShards=[{1}]. LeaderCount=[{2}]. Ignoring remove of shard [{3}]'''.format(repl_type,numOfShards,leaderCount,shardname_to_delete) + self.ocommon.log_info_message(msg,self.file_name) + break + + self.move_shard_rus(shardname_to_delete,None,None) + while self.count_shard_rus(shardname_to_delete) > 0: + self.ocommon.log_info_message("Waiting for all the shard chunks to be moved.",self.file_name) + time.sleep(15) shard_db_status=self.check_setup_status(shard_host,shard_db,shard_pdb,shard_port) if shard_db_status == 'completed': self.delete_gsm_shard(shard_host,shard_db,shard_pdb,shard_port,shard_group) + status=True else: msg='''Shard db status must return completed but returned value is {0}'''.format(status) self.ocommon.log_info_message(msg,self.file_name) + return status + + def move_shards_leader_rus(self,shardname_to_delete): + """ + This function move the shard leader RUs + """ + shards=self.get_online_shards() + leader_ru=self.get_rus(shardname_to_delete) + all_ru=self.get_rus(None) + count=0 + target_shards=[] + value=0 + + if len(shards) == 0: + msg="""No Shard is online so no RU is available to be moved""" + self.ocommon.log_info_message(msg,self.file_name) + else: + for line in leader_ru: + value=None + count += 1 + cols=line.split() + if len(cols) > 0: + if cols[0].lower() == shardname_to_delete.lower(): + if cols[1].isdigit: + value = int(cols[1]) + else: + continue + + target_shards.clear() + for line1 in all_ru: + cols1=line1.split() + print(cols1) + if len(cols1) > 5: + if cols1[0].lower() != shardname_to_delete.lower() and cols1[1].isdigit and cols1[2].lower() == 'follower': + if value is not None: + if int(cols1[1]) == value: + target_shards.append(cols1[0]) + break + + for shard in shards: + if shard.lower() != shardname_to_delete.lower(): + if shard in target_shards: + msg="Shard_name= " + shard + " Status=True" + " Value = " + str(value) + self.ocommon.log_info_message(msg,self.file_name) + self.move_shard_rus(shardname_to_delete,shard,value) + def move_shard_chunks(self): """ This function move the shard chunks @@ -1521,6 +1935,147 @@ def count_online_shards(self): return online_shard + def get_online_shards(self): + """ + This function return the returns the count of online shard + """ + self.ocommon.log_info_message("Inside get_online_shards()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmcmd=''' + connect {0}/{1}; + config shard; + exit; + '''.format(cadmin,cpasswd) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + shards=[] + online_shard = 0 + for line in output.split("\n"): + cols=line.split() + print(cols) + if len(cols) >= 5: + if cols[5].lower() == "online" and cols[2].lower() == "ok": + shards.append(cols[0]) + + return shards + + def get_rus(self,shardname_to_delete): + """ + This function return the returns the count of online shard + """ + self.ocommon.log_info_message("Inside get_online_shards()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + cmd=None + if shardname_to_delete is not None: + cmd='''status ru -leaders -shard {0}'''.format(shardname_to_delete) + else: + cmd='''status ru''' + + gsmcmd=''' + connect {0}/{1}; + {2}; + exit; + '''.format(cadmin,cpasswd,cmd) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + return output.split('\n') + + def move_shard_rus(self,sshard,tshard,runum): + """ + This function move the shard rus + """ + self.ocommon.log_info_message("Inside move_shard_rus()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + cmd1="" + cmd2="" + shardname=sshard + if tshard is not None and runum is not None: + cmd1='''switchover ru -RU {0} -shard {1}'''.format(runum,tshard) + else: + cmd1='''MOVE RU -RU ALL -SOURCE {0}'''.format(shardname) + + gsmcmd=''' + connect {1}/{2}; + configure -verbose off -save_config; + {3}; + status RU -shard {0}; + exit; + '''.format(shardname,cadmin,cpasswd,cmd1,cmd2) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + def count_shard_rus(self,shardname): + """ + This function return the returns the count of online shard chunks + """ + self.ocommon.log_info_message("Inside count_shard_chunks()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmcmd=''' + connect {0}/{1}; + status ru -shard {2}; + exit; + '''.format(cadmin,cpasswd,shardname) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + ru_count = 0 + lines = output.split("\n") + for line in lines: + if re.search(shardname, line, re.IGNORECASE): + ru_count = ru_count + 1 + + return ru_count + + def count_leader_shards(self,shardName): + """ + This function return the returns the count of online shard + """ + self.ocommon.log_info_message("Inside count_leader_shards()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmcmd=''' + connect {0}/{1}; + status ru -shard {2} -leaders; + exit; + '''.format(cadmin,cpasswd,shardName) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + leader_shard = 0 + lines = output.split("\n") + for line in lines: + if re.search('ok', line, re.IGNORECASE): + if re.search('Leader', line, re.IGNORECASE): + leader_shard = leader_shard + 1 + + return leader_shard + def validate_gsm_shard(self): """ This function validate the shard in the GSM @@ -1530,7 +2085,7 @@ def validate_gsm_shard(self): reg_exp= self.validate_shard_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) + shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space=self.process_shard_vars(key) shard_name='''{0}_{1}'''.format(shard_db,shard_pdb) status = self.check_shard_status(shard_name) if status == 'completed': @@ -1550,6 +2105,9 @@ def process_shard_vars(self,key): shard_port=None shard_group=None shard_host=None + shard_region=None + shard_space=None + shard_deploy_as=None self.ocommon.log_info_message("Inside process_shard_vars()",self.file_name) # self.ocommon.log_info_message(key,self.file_name) @@ -1570,14 +2128,30 @@ def process_shard_vars(self,key): shard_group = cvar_dict[ckey] if ckey == 'shard_host': shard_host = cvar_dict[ckey] + if ckey == 'shard_region': + #shard_region = self.validate_shard_param("region",cvar_dict[ckey]) + shard_region=cvar_dict[ckey] + if ckey == 'deploy_as': + shard_deploy_as=cvar_dict[ckey] + if ckey == 'shard_space': + #shard_space = self.validate_shard_param("shardspace",cvar_dict[ckey]) + shard_space=cvar_dict[ckey] # # self.ocommon.log_info_message("shard_host: " + shard_host, self.file_name) ## Set the values if not set in above block if not shard_port: shard_port=1521 + if self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + if self.ora_env_dict["SHARDING_TYPE"].upper() == 'USER': + shard_group="nogrp" + if not shard_deploy_as: + self.ora_env_dict=self.ocommon.add_key("SHARD_DEPLOY_AS","primary",self.ora_env_dict) + else: + self.ora_env_dict=self.ocommon.add_key("SHARD_DEPLOY_AS",shard_deploy_as,self.ora_env_dict) + ### Check values must be set if shard_host and shard_db and shard_pdb and shard_port and shard_group: - return shard_db,shard_pdb,shard_port,shard_group,shard_host + return shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space else: msg1='''shard_db={0},shard_pdb={1}'''.format((shard_db or "Missing Value"),(shard_pdb or "Missing Value")) msg2='''shard_port={0},shard_host={1}'''.format((shard_port or "Missing Value"),(shard_host or "Missing Value")) @@ -1586,6 +2160,39 @@ def process_shard_vars(self,key): self.ocommon.log_info_message(msg,self.file_name) self.ocommon.prog_exit("Error occurred") + def validate_shard_param(self,param_type,value): + """ + This function validaet the shard param such as region and shardspace + """ + status=False + reg_exp= self.catalog_regex() + stype=None + sspace=None + catalog_region=None + self.ocommon.log_info_message("Processing GSM params to verify the region and shardspace",self.file_name) + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) + + if param_type == 'region': + if stype: + status=self.ocommon.find_str_in_string(catalog_region,'comma',value) + if status: + + return value + else: + return "" + + if param_type == 'shardspace': + if sspace: + status=self.ocommon.find_str_in_string(sspace,'comma',value) + if status: + return value + else: + return "" + + return False + def process_chunks_vars(self,key): """ This function process the chunks vars @@ -1655,7 +2262,7 @@ def check_shard_status(self,shard_name): reg_exp= self.shard_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - shard_db,shard_pdb,shard_port,shard_region,shard_host=self.process_shard_vars(key) + shard_db,shard_pdb,shard_port,shard_region,shard_host,shard_region,shard_space=self.process_shard_vars(key) shard_name='''{0}_{1}'''.format(shard_db,shard_pdb) try: if self.ocommon.check_substr_match(matched_output[0],shard_name.lower()): @@ -1698,51 +2305,112 @@ def validate_shard_regex(self): self.ocommon.log_info_message("Inside remove_shard_regex()",self.file_name) return re.compile('VALIDATE_SHARD') - def configure_gsm_shard(self,shost,scdb,spdb,sdbport,sgroup): - """ - This function configure the shard db. - """ - spasswd="HIDDEN_STRING" - admuser= self.ora_env_dict["SHARD_ADMIN_USER"] - #dtrname,dtrport,dtregion=self.process_director_vars() - group_region=self.get_shardg_region_name(sgroup) - dtrname=self.get_director_name(group_region) - shard_name='''{0}_{1}'''.format(scdb,spdb) - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - gsmcmd=''' - connect {1}/{2}; - add cdb -connect {3}:{4}:{5} -pwd {2}; - add shard -cdb {5} -connect "(DESCRIPTION = (ADDRESS = (PROTOCOL = tcp)(HOST = {3})(PORT = {4})) (CONNECT_DATA = (SERVICE_NAME = {6}) (SERVER = DEDICATED)))" -shardgroup {7} -pwd {2}; - config vncr; - exit; - '''.format("NA",admuser,spasswd,shost,sdbport,scdb,spdb,sgroup,shard_name) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() - + def configure_gsm_shard(self,shost,scdb,spdb,sdbport,sgroup,sregion,sspace): + """ + This function configure the shard db. + """ + spasswd="HIDDEN_STRING" + admuser= self.ora_env_dict["SHARD_ADMIN_USER"] + #dtrname,dtrport,dtregion=self.process_director_vars() + #group_region=self.get_shardg_region_name(sgroup) + #dtrname=self.get_director_name(group_region) + shard_name='''{0}_{1}'''.format(scdb,spdb) + shard_region=None + shard_space=None + shard_group=None + deploy_as=None + + if sregion: + regionFlag=self.check_gsm_region(sregion) + if regionFlag != 'completed': + self.configure_gsm_region(sregion) + shard_region=" -region {0}".format(sregion) + else: + shard_region="" + if sspace: + shard_space=" -shardspace {0}".format(sspace) + else: + shard_space="" + + if self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + if self.ora_env_dict["SHARDING_TYPE"].upper() == 'USER': + sspaceFlag=self.check_gsm_shardspace(sspace) + if not sspaceFlag: + self.configure_gsm_sspace(sspace,None,None,None,None,'add') + shard_group="" + deploy_as,deploy_type=self.get_shard_deploy() + else: + shard_group,deploy_as=self.get_shardg_cmd(sgroup,sregion) + shard_region="" + else: + shard_group,deploy_as=self.get_shardg_cmd(sgroup,sregion) + shard_region="" + + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmcmd=''' + connect {1}/{2}; + add cdb -connect {3}:{4}/{5} -pwd {2}; + add shard -cdb {5} -connect "(DESCRIPTION = (ADDRESS = (PROTOCOL = tcp)(HOST = {3})(PORT = {4})) (CONNECT_DATA = (SERVICE_NAME = {6}) (SERVER = DEDICATED)))" {7} -pwd {2} {9} {10} {11}; + config vncr; + exit; + '''.format("NA",admuser,spasswd,shost,sdbport,scdb,spdb,shard_group,shard_name,shard_region,shard_space,deploy_as) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + def get_shard_deploy(self): + """ + get the shard deploy + """ + deploy_as=None + deploy_type=None + if self.ocommon.check_key("SHARD_DEPLOY_AS",self.ora_env_dict): + deploy_as="-deploy_as {0}".format(self.ora_env_dict["SHARD_DEPLOY_AS"]) + deploy_type=self.ora_env_dict["SHARD_DEPLOY_AS"] + else: + deploy_as="-deploy_as primary" + deploy_type='primary' + + return deploy_as,deploy_type + + def get_shardg_cmd(self,sgroup,sregion): + """ + Getting shard group cmd + """ + sgFlag=self.check_shardg_status(sgroup,None) + deploy_as,deploy_type=self.get_shard_deploy() + if sgFlag != 'completed': + self.configure_gsm_shardg(sgroup,deploy_type,sregion,'add') + else: + self.ocommon.log_info_message("Shardgroup exist " + sgroup, self.file_name) + + deploy_as="" + cmd=''' -shardgroup {0}'''.format(sgroup) + return cmd,deploy_as + def delete_gsm_shard(self,shost,scdb,spdb,sdbport,sgroup): - """ - This function delete the shard db. - """ - spasswd="HIDDEN_STRING" - admuser= self.ora_env_dict["SHARD_ADMIN_USER"] - #dtrname,dtrport,dtregion=self.process_director_vars() - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - shard_name='''{0}_{1}'''.format(scdb,spdb) - group_region=self.get_shardg_region_name(sgroup) - dtrname=self.get_director_name(group_region) - gsmcmd=''' - connect {1}/{2}; - remove shard -shard {8}; - remove cdb -cdb {5}; - remove invitednode {3}; - config vncr; - exit; - '''.format("NA",admuser,spasswd,shost,sdbport,scdb,spdb,sgroup,shard_name) - - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() + """ + This function delete the shard db. + """ + spasswd="HIDDEN_STRING" + admuser= self.ora_env_dict["SHARD_ADMIN_USER"] + #dtrname,dtrport,dtregion=self.process_director_vars() + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + shard_name='''{0}_{1}'''.format(scdb,spdb) + #group_region=self.get_shardg_region_name(sgroup) + #dtrname=self.get_director_name(group_region) + gsmcmd=''' + connect {1}/{2}; + remove shard -shard {8}; + remove cdb -cdb {5}; + remove invitednode {3}; + config vncr; + exit; + '''.format("NA",admuser,spasswd,shost,sdbport,scdb,spdb,sgroup,shard_name) + + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() def set_hostid_null(self): """ @@ -1753,7 +2421,7 @@ def set_hostid_null(self): reg_exp= self.catalog_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks=self.process_clog_vars(key) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) sqlpluslogin='''{0}/bin/sqlplus "sys/HIDDEN_STRING@{1}:{2}/{3} as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"],catalog_host,catalog_port,catalog_pdb,admuser) self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) msg='''Setting host Id null in catalog as auto vncr is disabled''' @@ -1770,232 +2438,238 @@ def set_hostid_null(self): self.ocommon.unset_mask_str() def invited_node_op(self): - """ - This function perform the invitedaddition and deletion - """ - self.ocommon.log_info_message("Inside invited_node_op()",self.file_name) - gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] - cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] - cpasswd="HIDDEN_STRING" - #dtrname,dtrport,dtregion=self.process_director_vars() - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - shard_host=self.ora_env_dict["INVITED_NODE_OP"] - gsmcmd=''' - connect {1}/{2}; - remove invitednode {3}; - add invitednode {3}; - exit; - '''.format("NA",cadmin,cpasswd,shard_host) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + """ + This function perform the invitedaddition and deletion + """ + self.ocommon.log_info_message("Inside invited_node_op()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + #dtrname,dtrport,dtregion=self.process_director_vars() + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + shard_host=self.ora_env_dict["INVITED_NODE_OP"] + gsmcmd=''' + connect {1}/{2}; + remove invitednode {3}; + add invitednode {3}; + exit; + '''.format("NA",cadmin,cpasswd,shard_host) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) def add_invited_node(self,op_str): - """ - This function add the invited in the GSM configuration - """ - self.ocommon.log_info_message("Inside add_invited_node()",self.file_name) - if op_str == "SHARD": - reg_exp = self.shard_regex() - else: - reg_exp = self.add_shard_regex() - - gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] - cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] - cpasswd="HIDDEN_STRING" - #dtrname,dtrport,dtregion=self.process_director_vars() - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - for key in self.ora_env_dict.keys(): - if(reg_exp.match(key)): - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) - group_region=self.get_shardg_region_name(shard_group) - dtrname=self.get_director_name(group_region) - gsmcmd=''' - connect {1}/{2}; - add invitednode {3}; - exit; - '''.format("NA",cadmin,cpasswd,shard_host) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + """ + This function add the invited in the GSM configuration + """ + self.ocommon.log_info_message("Inside add_invited_node()",self.file_name) + if op_str == "SHARD": + reg_exp = self.shard_regex() + else: + reg_exp = self.add_shard_regex() + + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + #dtrname,dtrport,dtregion=self.process_director_vars() + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space=self.process_shard_vars(key) + #group_region=self.get_shardg_region_name(shard_group) + #dtrname=self.get_director_name(group_region) + gsmcmd=''' + connect {1}/{2}; + add invitednode {3}; + exit; + '''.format("NA",cadmin,cpasswd,shard_host) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) def remove_invited_node(self,op_str): - """ - This function remove the invited in the GSM configuration - """ - self.ocommon.log_info_message("Inside remove_invited_node()",self.file_name) - if op_str == "SHARD": - reg_exp = self.shard_regex() - else: - reg_exp = self.add_shard_regex() - - gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] - cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] - cpasswd="HIDDEN_STRING" - #dtrname,dtrport,dtregion=self.process_director_vars() - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - - if self.ocommon.check_key("KUBE_SVC",self.ora_env_dict): - for key in self.ora_env_dict.keys(): - if(reg_exp.match(key)): - shard_db,shard_pdb,shard_port,shard_group,shard_host=self.process_shard_vars(key) - temp_host= shard_host.split('.',1)[0] - group_region=self.get_shardg_region_name(shard_group) - dtrname=self.get_director_name(group_region) - gsmcmd=''' - connect {1}/{2}; - remove invitednode {3}; - exit; - '''.format("NA",cadmin,cpasswd,temp_host) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - else: - self.ocommon.log_info_message("KUBE_SVC is not set. No need to remove invited node!",self.file_name) + """ + This function remove the invited in the GSM configuration + """ + self.ocommon.log_info_message("Inside remove_invited_node()",self.file_name) + if op_str == "SHARD": + reg_exp = self.shard_regex() + else: + reg_exp = self.add_shard_regex() + + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + #dtrname,dtrport,dtregion=self.process_director_vars() + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + + if self.ocommon.check_key("KUBE_SVC",self.ora_env_dict): + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + shard_db,shard_pdb,shard_port,shard_group,shard_host,shard_region,shard_space=self.process_shard_vars(key) + temp_host= shard_host.split('.',1)[0] + #group_region=self.get_shardg_region_name(shard_group) + #dtrname=self.get_director_name(group_region) + gsmcmd=''' + connect {1}/{2}; + remove invitednode {3}; + exit; + '''.format("NA",cadmin,cpasswd,temp_host) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + else: + self.ocommon.log_info_message("KUBE_SVC is not set. No need to remove invited node!",self.file_name) def deploy_shard(self): - """ - This function deploy shard - """ - self.ocommon.log_info_message("Inside deploy_shard()",self.file_name) - gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] - cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] - cpasswd="HIDDEN_STRING" - gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) - #dtrname,dtrport,dtregion=self.process_director_vars() - #if op_str == "SHARD": - # reg_exp = self.shard_regex() - #else: - # reg_exp = self.add_shard_regex() - - #for key in self.ora_env_dict.keys(): - # if(reg_exp.match(key)): - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - gsmcmd=''' - connect {1}/{2}; - config shardspace; - config shardgroup; - config vncr; - deploy; - config shard; - exit; - '''.format("test",cadmin,cpasswd) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() - - def check_setup_status(self,host,ccdb,svc,port): - """ - This function check the shard status. - """ - systemStr='''{0}/bin/sqlplus "system/HIDDEN_STRING@{1}:{2}/{3}"'''.format(self.ora_env_dict["ORACLE_HOME"],host,port,ccdb) + """ + This function deploy shard + """ + self.ocommon.log_info_message("Inside deploy_shard()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + shrdg_sspace=None + #dtrname,dtrport,dtregion=self.process_director_vars() + #if op_str == "SHARD": + # reg_exp = self.shard_regex() + #else: + # reg_exp = self.add_shard_regex() + + #for key in self.ora_env_dict.keys(): + # if(reg_exp.match(key)): + if self.ocommon.check_key("SHARDING_TYPE",self.ora_env_dict): + if self.ora_env_dict["SHARDING_TYPE"].upper() == 'USER': + shardg_shardspace="config shardspace" + else: + shardg_shardspace="config shardgroup" - fname='''/tmp/{0}'''.format("shard_setup.txt") - self.ocommon.remove_file(fname) - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - msg='''Checking shardsetup table in CDB''' - self.ocommon.log_info_message(msg,self.file_name) - sqlcmd=''' - set heading off - set feedback off - set term off - SET NEWPAGE NONE - spool {0} - select * from shardsetup WHERE ROWNUM = 1; - spool off + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmcmd=''' + connect {1}/{2}; + {3}; + config vncr; + deploy; + config shard; exit; - '''.format(fname) - output,error,retcode=self.ocommon.run_sqlplus(systemStr,sqlcmd,None) - self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) - self.ocommon.check_sql_err(output,error,retcode,None) - - if os.path.isfile(fname): - fdata=self.ocommon.read_file(fname) - else: - fdata='nosetup' - - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() + '''.format("test",cadmin,cpasswd,shardg_shardspace) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() - if re.search('completed',fdata): - status = self.catalog_pdb_setup_check(host,ccdb,svc,port) - if status == 'completed': - return 'completed' - else: - return 'notcompleted' + def check_setup_status(self,host,ccdb,svc,port): + """ + This function check the shard status. + """ + systemStr='''{0}/bin/sqlplus "system/HIDDEN_STRING@{1}:{2}/{3}"'''.format(self.ora_env_dict["ORACLE_HOME"],host,port,ccdb) + + fname='''/tmp/{0}'''.format("shard_setup.txt") + self.ocommon.remove_file(fname) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + msg='''Checking shardsetup table in CDB''' + self.ocommon.log_info_message(msg,self.file_name) + sqlcmd=''' + set heading off + set feedback off + set term off + SET NEWPAGE NONE + spool {0} + select * from shardsetup WHERE ROWNUM = 1; + spool off + exit; + '''.format(fname) + output,error,retcode=self.ocommon.run_sqlplus(systemStr,sqlcmd,None) + self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.ocommon.check_sql_err(output,error,retcode,None) + + if os.path.isfile(fname): + fdata=self.ocommon.read_file(fname) + else: + fdata='nosetup' + + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + if re.search('completed',fdata): + status = self.catalog_pdb_setup_check(host,ccdb,svc,port) + if status == 'completed': + return 'completed' else: - return 'notcompleted' + return 'notcompleted' + else: + return 'notcompleted' def catalog_pdb_setup_check(self,host,ccdb,svc,port): - """ - This function check the shard status. - """ - systemStr='''{0}/bin/sqlplus "pdbadmin/HIDDEN_STRING@{1}:{2}/{3}"'''.format(self.ora_env_dict["ORACLE_HOME"],host,port,svc) - - fname='''/tmp/{0}'''.format("pdb_setup_check.txt") - self.ocommon.remove_file(fname) - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - msg='''Checking setup status in PDB''' - self.ocommon.log_info_message(msg,self.file_name) - sqlcmd=''' - set heading off - set feedback off - set term off - SET NEWPAGE NONE - spool {0} - select count(*) from dual; - spool off - exit; - '''.format(fname) - output,error,retcode=self.ocommon.run_sqlplus(systemStr,sqlcmd,None) - self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) - self.ocommon.check_sql_err(output,error,retcode,None) - - if os.path.isfile(fname): - fdata=self.ocommon.read_file(fname) - else: - fdata='nosetup' - - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() - - if re.search('1',fdata): - return 'completed' - else: - return 'notcompleted' + """ + This function check the shard status. + """ + systemStr='''{0}/bin/sqlplus "pdbadmin/HIDDEN_STRING@{1}:{2}/{3}"'''.format(self.ora_env_dict["ORACLE_HOME"],host,port,svc) + + fname='''/tmp/{0}'''.format("pdb_setup_check.txt") + self.ocommon.remove_file(fname) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + msg='''Checking setup status in PDB''' + self.ocommon.log_info_message(msg,self.file_name) + sqlcmd=''' + set heading off + set feedback off + set term off + SET NEWPAGE NONE + spool {0} + select count(*) from dual; + spool off + exit; + '''.format(fname) + output,error,retcode=self.ocommon.run_sqlplus(systemStr,sqlcmd,None) + self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.ocommon.check_sql_err(output,error,retcode,None) + + if os.path.isfile(fname): + fdata=self.ocommon.read_file(fname) + else: + fdata='nosetup' + + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() + + if re.search('1',fdata): + return 'completed' + else: + return 'notcompleted' ############################# Setup GSM Service ############################################### def setup_gsm_service(self): - """ - This function setup the shard service. - """ - self.ocommon.log_info_message("Inside setup_gsm_service()",self.file_name) - status=False - service_value="service_name=oltp_rw_svc;service_role=primary" - # self.ora_env_dict=self.ocommon.add_key("SERVICE1_PARAMS",service_value,self.ora_env_dict) - reg_exp= self.service_regex() - counter=1 - end_counter=3 - while counter < end_counter: - for key in self.ora_env_dict.keys(): - if(reg_exp.match(key)): - shard_service_status=None - service_name,service_role=self.process_service_vars(key) - shard_service_status=self.check_service_status(service_name) - if shard_service_status != 'completed': - self.configure_gsm_service(service_name,service_role) - status = self.check_service_status(None) - if status == 'completed': - break - else: - msg='''GSM service setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) - time.sleep(60) - counter=counter+1 + """ + This function setup the shard service. + """ + self.ocommon.log_info_message("Inside setup_gsm_service()",self.file_name) + status=False + service_value="service_name=oltp_rw_svc;service_role=primary" + # self.ora_env_dict=self.ocommon.add_key("SERVICE1_PARAMS",service_value,self.ora_env_dict) + reg_exp= self.service_regex() + counter=1 + end_counter=3 + while counter < end_counter: + for key in self.ora_env_dict.keys(): + if(reg_exp.match(key)): + shard_service_status=None + service_name,service_role=self.process_service_vars(key) + shard_service_status=self.check_service_status(service_name) + if shard_service_status != 'completed': + self.configure_gsm_service(service_name,service_role) + status = self.check_service_status(None) + if status == 'completed': + break + else: + msg='''GSM service setup is still not completed in GSM. Sleeping for 60 seconds and sleeping count is {0}'''.format(counter) + time.sleep(60) + counter=counter+1 - status = self.check_service_status(None) - if status == 'completed': - msg='''Shard service setup completed in GSM''' - self.ocommon.log_info_message(msg,self.file_name) - else: - msg='''Waited 2 minute to complete catalog setup in GSM but setup did not complete or failed. Exiting...''' - self.ocommon.log_error_message(msg,self.file_name) - self.ocommon.prog_exit("127") + status = self.check_service_status(None) + if status == 'completed': + msg='''Shard service setup completed in GSM''' + self.ocommon.log_info_message(msg,self.file_name) + else: + msg='''Waited 2 minute to complete catalog setup in GSM but setup did not complete or failed. Exiting...''' + self.ocommon.log_error_message(msg,self.file_name) + self.ocommon.prog_exit("127") def process_service_vars(self,key): """ @@ -2067,27 +2741,27 @@ def service_regex(self): return re.compile('SERVICE[0-9]+_PARAMS') def configure_gsm_service(self,service_name,service_role): - """ - This function configure the service creation. - """ - self.ocommon.log_info_message("Inside configure_gsm_service()",self.file_name) - gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] - cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] - cpasswd="HIDDEN_STRING" - - #dtrname,dtrport,dtregion=self.process_director_vars() - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) - gsmcmd=''' - connect {1}/{2}; - add service -service {3} -role {4}; - start service -service {3}; - exit; - '''.format("test",cadmin,cpasswd,service_name,service_role) - output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) - - ### Unsetting the encrypt value to None - self.ocommon.unset_mask_str() + """ + This function configure the service creation. + """ + self.ocommon.log_info_message("Inside configure_gsm_service()",self.file_name) + gsmhost=self.ora_env_dict["ORACLE_HOSTNAME"] + cadmin=self.ora_env_dict["SHARD_ADMIN_USER"] + cpasswd="HIDDEN_STRING" + + #dtrname,dtrport,dtregion=self.process_director_vars() + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + gsmlogin='''{0}/bin/gdsctl'''.format(self.ora_env_dict["ORACLE_HOME"]) + gsmcmd=''' + connect {1}/{2}; + add service -service {3} -role {4}; + start service -service {3}; + exit; + '''.format("test",cadmin,cpasswd,service_name,service_role) + output,error,retcode=self.ocommon.exec_gsm_cmd(gsmcmd,None,self.ora_env_dict) + + ### Unsetting the encrypt value to None + self.ocommon.unset_mask_str() ############################## GSM backup fIle function Begins Here ############################# def gsm_backup_file(self): @@ -2118,7 +2792,7 @@ def setup_sample_schema(self): reg_exp= self.catalog_regex() for key in self.ora_env_dict.keys(): if(reg_exp.match(key)): - catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks=self.process_clog_vars(key) + catalog_db,catalog_pdb,catalog_port,catalog_region,catalog_host,catalog_name,catalog_chunks,repl_type,repl_factor,repl_unit,stype,sspace,cfname=self.process_clog_vars(key) sqlpluslogin='''{0}/bin/sqlplus "sys/HIDDEN_STRING@{1}:{2}/{3} as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"],catalog_host,catalog_port,catalog_db) if self.ocommon.check_key("SAMPLE_SCHEMA",self.ora_env_dict): if self.ora_env_dict["SAMPLE_SCHEMA"] == 'DEPLOY': diff --git a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oralogger.py b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oralogger.py index d9e0484..9a51b54 100644 --- a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oralogger.py +++ b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/oralogger.py @@ -159,7 +159,7 @@ def handle(self,request): """ request.stdout_ = request.getStdOutValue() if request.stdout_ == LoggingType.STDOUT: - st = logging.FileHandler(request.stdoutfile_) + st = logging.FileHandler(request.stdoutfile_,mode="w") request.root.addHandler(st) st.setFormatter(request.formatter) self.print_message(request,st) diff --git a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/orapcatalog.py b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/orapcatalog.py index 52232cf..6638860 100644 --- a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/orapcatalog.py +++ b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/orapcatalog.py @@ -45,11 +45,46 @@ def setup(self): This function setup the catalog on Primary DB. """ if self.ocommon.check_key("CHECK_LIVENESS",self.ora_env_dict): + create_db_file_lck=self.ocommon.get_db_lock_location() + self.ora_env_dict["ORACLE_SID"] + ".create_lck" + exist_db_file_lck=self.ocommon.get_db_lock_location() + self.ora_env_dict["ORACLE_SID"] + ".exist_lck" + self.ocommon.log_info_message("DB create lock file set to :" + create_db_file_lck ,self.file_name) + self.ocommon.log_info_message("DB exist lock file set to :" + exist_db_file_lck ,self.file_name) + if os.path.exists(create_db_file_lck): + self.ocommon.log_info_message("provisioning is still in progress as file " + create_db_file_lck + " still exist!",self.file_name) + sys.exit(127) + elif os.path.exists(exist_db_file_lck): + self.ocommon.log_info_message("Database is up and running as file " + exist_db_file_lck + " exist!",self.file_name) + status = self.catalog_setup_check() + if not status: + self.ocommon.prog_exit("127") + self.ocommon.log_info_message("Catalog liveness check completed sucessfully!",self.file_name) + sys.exit(0) + else: + status = self.catalog_setup_check() + if not status: + self.ocommon.prog_exit("127") + self.ocommon.log_info_message("Catalog liveness check completed sucessfully!",self.file_name) + sys.exit(0) + elif self.ocommon.check_key("CHECK_READYNESS",self.ora_env_dict): status = self.catalog_setup_check() if not status: + self.ocommon.log_info_message("Catalog readyness check completed sucessfully!",self.file_name) + self.ocommon.prog_exit("127") + elif self.ocommon.check_key("RESET_PASSWORD",self.ora_env_dict): + exist_db_file_lck=self.ocommon.get_db_lock_location() + self.ora_env_dict["ORACLE_SID"] + ".exist_lck" + if os.path.exists(exist_db_file_lck): + self.ocommon.log_info_message("Catalog database up and running. Resetting password...",self.file_name) + else: + self.ocommon.log_info_message("Catalog doesn't seems to be ready. Unable to reset password",self.file_name) + self.ocommon.prog_exit("127") + elif self.ocommon.check_key("EXPORT_TDE_KEY",self.ora_env_dict): + exist_db_file_lck=self.ocommon.get_db_lock_location()+ self.ora_env_dict["ORACLE_SID"] + ".exist_lck" + if os.path.exists(exist_db_file_lck): + self.ocommon.log_info_message("Catalog database up and running.",self.file_name) + self.ocommon.export_tde_key(self.ora_env_dict["EXPORT_TDE_KEY"]) + else: + self.ocommon.log_info_message("Catalog doesn't seems to be ready. Unable to export the tde key",self.file_name) self.ocommon.prog_exit("127") - self.ocommon.log_info_message("Catalog liveness check completed sucessfully!",self.file_name) - sys.exit(0) else: self.setup_machine() self.db_checks() @@ -61,6 +96,8 @@ def setup(self): self.reset_passwd() self.setup_cdb_catalog() self.set_spfile_nonm_params() + self.ocommon.set_events("spfile") + self.set_dbparams_version() self.restart_db() self.alter_db() self.setup_pdb_catalog() @@ -118,65 +155,13 @@ def ohome_check(self): def passwd_check(self): """ - This funnction perform password related checks + Function to set the password """ - passwd_file_flag = False - if self.ocommon.check_key("SECRET_VOLUME",self.ora_env_dict) and self.ocommon.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict) and self.ocommon.check_key("PWD_KEY",self.ora_env_dict): - msg='''SECRET_VOLUME passed as an env variable and set to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - else: - self.ora_env_dict=self.ocommon.add_key("SECRET_VOLUME","/run/secrets",self.ora_env_dict) - msg='''SECRET_VOLUME not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict): - msg='''COMMON_OS_PWD_FILE passed as an env variable and set to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - else: - self.ora_env_dict=self.ocommon.add_key("COMMON_OS_PWD_FILE","common_os_pwdfile.enc",self.ora_env_dict) - msg='''COMMON_OS_PWD_FILE not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("PWD_KEY",self.ora_env_dict): - msg='''PWD_KEY passed as an env variable and set to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - else: - self.ora_env_dict=self.ocommon.add_key("PWD_KEY","pwd.key",self.ora_env_dict) - msg='''PWD_KEY not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - secret_volume = self.ora_env_dict["SECRET_VOLUME"] - common_os_pwd_file = self.ora_env_dict["COMMON_OS_PWD_FILE"] - pwd_key = self.ora_env_dict["PWD_KEY"] - passwd_file='''{0}/{1}'''.format(self.ora_env_dict["SECRET_VOLUME"],self.ora_env_dict["COMMON_OS_PWD_FILE"]) - if os.path.isfile(passwd_file): - msg='''Passwd file {0} exist. Password file Check passed!'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - msg='''Reading encrypted passwd from file {0}.'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - cmd='''openssl enc -d -aes-256-cbc -in \"{0}/{1}\" -out /tmp/{1} -pass file:\"{0}/{2}\"'''.format(secret_volume,common_os_pwd_file,pwd_key) - output,error,retcode=self.ocommon.execute_cmd(cmd,None,None) - self.ocommon.check_os_err(output,error,retcode,True) - passwd_file_flag = True - - if not passwd_file_flag: - s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()?" - passlen = 8 - password = "".join(random.sample(s,passlen )) - else: - fname='''/tmp/{0}'''.format(common_os_pwd_file) - fdata=self.ocommon.read_file(fname) - password=fdata - self.ocommon.remove_file(fname) - + self.ocommon.get_password(None) if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict): - msg="ORACLE_PWD is passed as an env variable. Check Passed!" - self.ocommon.log_info_message(msg,self.file_name) - else: - self.ora_env_dict=self.ocommon.add_key("ORACLE_PWD",password,self.ora_env_dict) - msg="ORACLE_PWD set to HIDDEN_STRING generated using encrypted password file" - self.ocommon.log_info_message(msg,self.file_name) - + msg='''ORACLE_PWD key is set. Check Passed!''' + self.ocommon.log_info_message(msg,self.file_name) + def set_user(self): """ This funnction set the user for pdb and cdb. @@ -232,7 +217,8 @@ def hostname_check(self): self.ocommon.log_info_message(msg,self.file_name) else: if self.ocommon.check_key("KUBE_SVC",self.ora_env_dict): - hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + # hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + hostname='''{0}'''.format(socket.getfqdn()) else: hostname='''{0}'''.format(socket.gethostname()) msg='''ORACLE_HOSTNAME is not set, setting it to hostname {0} of the compute!'''.format(hostname) @@ -317,18 +303,7 @@ def reset_passwd(self): """ This function reset the password. """ - password_script='''{0}/{1}'''.format(self.ora_env_dict["HOME"],"setPassword.sh") - self.ocommon.log_info_message("Executing password reset", self.file_name) - if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict) and self.ocommon.check_key("HOME",self.ora_env_dict) and os.path.isfile(password_script): - cmd='''{0} {1} '''.format(password_script,'HIDDEN_STRING') - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - output,error,retcode=self.ocommon.execute_cmd(cmd,None,None) - self.ocommon.check_os_err(output,error,retcode,True) - self.ocommon.unset_mask_str() - else: - msg='''Error Occurred! Either HOME DIR {0} does not exist, ORACLE_PWD {1} is not set or PASSWORD SCRIPT {2} does not exist'''.format(self.ora_env_dict["HOME"],self.ora_env_dict["ORACLE_PWD"],password_script) - self.ocommon.log_error_message(msg,self.file_name) - self.oracommon.prog_exit() + self.ocommon.reset_passwd() ########## RESET_PASSWORD function ENDS here ############################# @@ -424,7 +399,6 @@ def setup_cdb_catalog(self): alter system set db_recovery_file_dest=\"{2}\" scope=both; alter user gsmcatuser account unlock; alter user gsmcatuser identified by HIDDEN_STRING; - alter system set dg_broker_start=true scope=both; alter system set local_listener='{4}:{5}' scope=both; '''.format(dbf_dest,dbr_dest_size,dbr_dest,dpump_dir,host_name,db_port,obase,"dbconfig",dbuname) @@ -440,29 +414,31 @@ def set_spfile_nonm_params(self): This function setup the catalog. """ #sqlpluslogincmd='''{0}/bin/sqlplus "/as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"]) - if not self.ocommon.check_key("CLONE_DB",self.ora_env_dict): - ohome=self.ora_env_dict["ORACLE_HOME"] - inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - dbf_dest=self.ora_env_dict["DB_CREATE_FILE_DEST"] - obase=self.ora_env_dict["ORACLE_BASE"] - dbuname=self.ora_env_dict["DB_UNIQUE_NAME"] - - msg='''Setting up catalog CDB with spfile non modifiable parameters''' - self.ocommon.log_info_message(msg,self.file_name) - sqlcmd=''' - alter system set open_links_per_instance=16 scope=spfile; - alter system set db_file_name_convert='*','{0}/' scope=spfile; - alter system set dg_broker_config_file1=\"{1}/oradata/{2}/{3}/dr2{3}.dat\" scope=spfile; - alter system set dg_broker_config_file2=\"{1}/oradata/{2}/{3}/dr1{3}.dat\" scope=spfile; - alter system set wallet_root=\"{1}/oradata/{2}/{3}\" scope=spfile; - '''.format(dbf_dest,obase,"dbconfig",dbuname) - - output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) - self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) - self.ocommon.check_sql_err(output,error,retcode,True) - + if self.ocommon.check_key("CLONE_DB",self.ora_env_dict): + if self.ora_env_dict["CLONE_DB"] != 'true': + ohome=self.ora_env_dict["ORACLE_HOME"] + inst_sid=self.ora_env_dict["ORACLE_SID"] + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + dbf_dest=self.ora_env_dict["DB_CREATE_FILE_DEST"] + obase=self.ora_env_dict["ORACLE_BASE"] + dbuname=self.ora_env_dict["DB_UNIQUE_NAME"] + + msg='''Setting up catalog CDB with spfile non modifiable parameters''' + self.ocommon.log_info_message(msg,self.file_name) + sqlcmd=''' + alter system set open_links_per_instance=16 scope=spfile; + alter system set db_file_name_convert='*','{0}/' scope=spfile; + alter system set standby_file_management='AUTO' scope=spfile; + alter system set dg_broker_config_file1=\"{1}/oradata/{2}/{3}/dr2{3}.dat\" scope=spfile; + alter system set dg_broker_config_file2=\"{1}/oradata/{2}/{3}/dr1{3}.dat\" scope=spfile; + '''.format(dbf_dest,obase,"dbconfig",dbuname) + + output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) + self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.ocommon.check_sql_err(output,error,retcode,True) + + def set_dbparams_version(self): """ This function setup the shard parameter based on db version. @@ -470,7 +446,7 @@ def set_dbparams_version(self): ohome1=self.ora_env_dict["ORACLE_HOME"] version=self.ocommon.get_oraversion(ohome1).strip() self.ocommon.log_info_message(version,self.file_name) - if int(version) >= 21: + if int(version) > 21: ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) @@ -482,7 +458,7 @@ def set_dbparams_version(self): msg='''Setting up catalog CDB with spfile non modifiable parameters based on version''' self.ocommon.log_info_message(msg,self.file_name) sqlcmd=''' - alter system set wallet_root=\"{1}/oradata/{2}/{3}/admin\" scope=spfile; + alter system set wallet_root=\"{1}/oradata/{2}/{3}\" scope=spfile; '''.format(dbf_dest,obase,"dbconfig",dbuname) output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) @@ -492,14 +468,15 @@ def restart_db(self): """ restarting the db """ - if not self.ocommon.check_key("CLONE_DB",self.ora_env_dict): - ohome=self.ora_env_dict["ORACLE_HOME"] - inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) - self.ocommon.log_info_message("Calling shutdown_db() to shutdown the database",self.file_name) - self.ocommon.shutdown_db(self.ora_env_dict) - self.ocommon.log_info_message("Calling startup_mount() to mount the database",self.file_name) - self.ocommon.start_db(self.ora_env_dict) + if self.ocommon.check_key("CLONE_DB",self.ora_env_dict): + if self.ora_env_dict["CLONE_DB"] != 'true': + ohome=self.ora_env_dict["ORACLE_HOME"] + inst_sid=self.ora_env_dict["ORACLE_SID"] + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + self.ocommon.log_info_message("Calling shutdown_db() to shutdown the database",self.file_name) + self.ocommon.shutdown_db(self.ora_env_dict) + self.ocommon.log_info_message("Calling startup_mount() to mount the database",self.file_name) + self.ocommon.start_db(self.ora_env_dict) #self.ocommon.log_info_message("Enabling archivelog at DB level",self.file_name) #sqlcmd=''' @@ -546,6 +523,7 @@ def setup_pdb_catalog(self): alter system register; alter session set container={0}; create user {1} identified by HIDDEN_STRING; + alter user {1} account unlock; grant connect, create session, gsmadmin_role to {1}; grant inherit privileges on user SYS to GSMADMIN_INTERNAL; execute dbms_xdb.sethttpport(8080); @@ -570,7 +548,7 @@ def update_catalog_setup(self): ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] - systemStr=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + systemStr=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) msg='''Updating shardsetup table''' self.ocommon.log_info_message(msg,self.file_name) sqlcmd=''' @@ -694,7 +672,7 @@ def register_services(self): # Assigning variable ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) if self.ocommon.check_key("ORACLE_PDB",self.ora_env_dict): msg='''Setting up catalog PDB''' @@ -738,7 +716,7 @@ def backup_files(self): wallet_backup_cmd='''ls -ltr /bin''' self.ocommon.log_info_message("Check Version " + version,self.file_name) if int(version) >= 21: - obase1=self.ora_env_dict["ORACLE_BASE_HOME"] + obase1=self.ora_env_dict["ORACLE_BASE"] wallet_backup_cmd='''cp -r {3}/admin/ {0}/oradata/{1}/{2}/'''.format(obase,"dbconfig",dbuname,ohome) cmd_names=''' mkdir -p {0}/oradata/{1}/{2} diff --git a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/orapshard.py b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/orapshard.py index f5aa54e..d1b1273 100644 --- a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/orapshard.py +++ b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/orapshard.py @@ -49,9 +49,9 @@ def __init__(self,oralogger,orahandler,oraenv,oracommon): stack_trace = list() for trace in trace_back: stack_trace.append("File : %s , Line : %d, Func.Name : %s, Message : %s" % (trace[0], trace[1], trace[2], trace[3])) - ocommon.log_info_message(ex_type.__name__,self.file_name) - ocommon.log_info_message(ex_value,self.file_name) - ocommon.log_info_message(stack_trace,self.file_name) + self.ocommon.log_info_message(ex_type.__name__,self.file_name) + self.ocommon.log_info_message(ex_value,self.file_name) + self.ocommon.log_info_message(stack_trace,self.file_name) def setup(self): """ This function setup the shard on Primary DB. @@ -72,16 +72,31 @@ def setup(self): self.ocommon.shutdown_db(self.ora_env_dict) self.ocommon.start_db(self.ora_env_dict) elif self.ocommon.check_key("CHECK_LIVENESS",self.ora_env_dict): + create_db_file_lck=self.ocommon.get_db_lock_location() + self.ora_env_dict["ORACLE_SID"] + ".create_lck" + exist_db_file_lck=self.ocommon.get_db_lock_location() + self.ora_env_dict["ORACLE_SID"] + ".exist_lck" + self.ocommon.log_info_message("DB create lock file set to :" + create_db_file_lck ,self.file_name) + self.ocommon.log_info_message("DB exist lock file set to :" + exist_db_file_lck ,self.file_name) + if os.path.exists(create_db_file_lck): + self.ocommon.log_info_message("provisioning is still in progress as file " + create_db_file_lck + " still exist!",self.file_name) + sys.exit(127) + elif os.path.exists(exist_db_file_lck): + self.ocommon.log_info_message("Database is up and running as file " + exist_db_file_lck + " exist!",self.file_name) + status = self.shard_setup_check() + if not status: + self.ocommon.prog_exit("127") + self.ocommon.log_info_message("Shard liveness check completed sucessfully!",self.file_name) + sys.exit(0) + else: + status = self.shard_setup_check() + if not status: + self.ocommon.prog_exit("127") + self.ocommon.log_info_message("Shard liveness check completed sucessfully!",self.file_name) + sys.exit(0) + elif self.ocommon.check_key("CHECK_READYNESS",self.ora_env_dict): status = self.shard_setup_check() if not status: + self.ocommon.log_info_message("Shard readyness check completed sucessfully!",self.file_name) self.ocommon.prog_exit("127") - self.ocommon.log_info_message("Shard liveness check completed sucessfully!",self.file_name) - sys.exit(0) - elif self.ocommon.check_key("CREATE_DIR",self.ora_env_dict): - status = self.shard_setup_check() - if not status: - self.ocommon.prog_exit("127") - self.ocommon.create_dir(self.ora_env_dict["CREATE_DIR"],True,None,None) else: self.setup_machine() self.db_checks() @@ -93,6 +108,7 @@ def setup(self): self.reset_passwd() self.setup_cdb_shard() self.set_spfile_nonm_params() + self.ocommon.set_events("spfile") self.set_dbparams_version() self.restart_db() self.alter_db() @@ -153,63 +169,11 @@ def passwd_check(self): """ This funnction perform password related checks """ - passwd_file_flag = False - if self.ocommon.check_key("SECRET_VOLUME",self.ora_env_dict) and self.ocommon.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict) and self.ocommon.check_key("PWD_KEY",self.ora_env_dict): - msg='''SECRET_VOLUME passed as an env variable and set to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - else: - self.ora_env_dict=self.ocommon.add_key("SECRET_VOLUME","/run/secrets",self.ora_env_dict) - msg='''SECRET_VOLUME not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["SECRET_VOLUME"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("COMMON_OS_PWD_FILE",self.ora_env_dict): - msg='''COMMON_OS_PWD_FILE passed as an env variable and set to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - else: - self.ora_env_dict=self.ocommon.add_key("COMMON_OS_PWD_FILE","common_os_pwdfile.enc",self.ora_env_dict) - msg='''COMMON_OS_PWD_FILE not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["COMMON_OS_PWD_FILE"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - if self.ocommon.check_key("PWD_KEY",self.ora_env_dict): - msg='''PWD_KEY passed as an env variable and set to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - else: - self.ora_env_dict=self.ocommon.add_key("PWD_KEY","pwd.key",self.ora_env_dict) - msg='''PWD_KEY not passed as an env variable. Setting default to {0}'''.format(self.ora_env_dict["PWD_KEY"]) - - self.ocommon.log_warn_message(msg,self.file_name) - - secret_volume = self.ora_env_dict["SECRET_VOLUME"] - common_os_pwd_file = self.ora_env_dict["COMMON_OS_PWD_FILE"] - pwd_key = self.ora_env_dict["PWD_KEY"] - passwd_file='''{0}/{1}'''.format(self.ora_env_dict["SECRET_VOLUME"],self.ora_env_dict["COMMON_OS_PWD_FILE"]) - if os.path.isfile(passwd_file): - msg='''Passwd file {0} exist. Password file Check passed!'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - msg='''Reading encrypted passwd from file {0}.'''.format(passwd_file) - self.ocommon.log_info_message(msg,self.file_name) - cmd='''openssl enc -d -aes-256-cbc -in \"{0}/{1}\" -out /tmp/{1} -pass file:\"{0}/{2}\"'''.format(secret_volume,common_os_pwd_file,pwd_key) - output,error,retcode=self.ocommon.execute_cmd(cmd,None,None) - self.ocommon.check_os_err(output,error,retcode,True) - passwd_file_flag = True - - if not passwd_file_flag: - s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()?" - passlen = 8 - password = "".join(random.sample(s,passlen )) - else: - fname='''/tmp/{0}'''.format(common_os_pwd_file) - fdata=self.ocommon.read_file(fname) - password=fdata - self.ocommon.remove_file(fname) - + self.ocommon.get_password(None) if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict): - msg="ORACLE_PWD is passed as an env variable. Check Passed!" - self.ocommon.log_info_message(msg,self.file_name) - else: - self.ora_env_dict=self.ocommon.add_key("ORACLE_PWD",password,self.ora_env_dict) - msg="ORACLE_PWD set to HIDDEN_STRING generated using encrypted password file" - self.ocommon.log_info_message(msg,self.file_name) - + msg='''ORACLE_PWD key is set. Check Passed!''' + self.ocommon.log_info_message(msg,self.file_name) + def set_user(self): """ This funnction set the user for pdb and cdb. @@ -264,7 +228,8 @@ def hostname_check(self): self.ocommon.log_info_message(msg,self.file_name) else: if self.ocommon.check_key("KUBE_SVC",self.ora_env_dict): - hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + ## hostname='''{0}.{1}'''.format(socket.gethostname(),self.ora_env_dict["KUBE_SVC"]) + hostname='''{0}'''.format(socket.getfqdn()) else: hostname='''{0}'''.format(socket.gethostname()) msg='''ORACLE_HOSTNAME is not set, setting it to hostname {0} of the compute!'''.format(hostname) @@ -349,18 +314,7 @@ def reset_passwd(self): """ This function reset the password. """ - password_script='''{0}/{1}'''.format(self.ora_env_dict["HOME"],"setPassword.sh") - self.ocommon.log_info_message("Executing password reset", self.file_name) - if self.ocommon.check_key("ORACLE_PWD",self.ora_env_dict) and self.ocommon.check_key("HOME",self.ora_env_dict) and os.path.isfile(password_script): - cmd='''{0} {1} '''.format(password_script,'HIDDEN_STRING') - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - output,error,retcode=self.ocommon.execute_cmd(cmd,None,None) - self.ocommon.check_os_err(output,error,retcode,True) - self.ocommon.unset_mask_str() - else: - msg='''Error Occurred! Either HOME DIR {0} does not exist, ORACLE_PWD {1} is not set or PASSWORD SCRIPT {2} does not exist'''.format(self.ora_env_dict["HOME"],self.ora_env_dict["ORACLE_PWD"],password_script) - self.ocommon.log_error_message(msg,self.file_name) - self.oracommon.prog_exit() + self.ocommon.reset_passwd() ########## RESET_PASSWORD function ENDS here ############################# @@ -436,7 +390,7 @@ def setup_cdb_shard(self): # Assigning variable ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) dbf_dest=self.ora_env_dict["DB_CREATE_FILE_DEST"] dbr_dest=self.ora_env_dict["DB_RECOVERY_FILE_DEST"] dbr_dest_size=self.ora_env_dict["DB_RECOVERY_FILE_DEST_SIZE"] @@ -454,6 +408,7 @@ def setup_cdb_shard(self): alter system set db_recovery_file_dest_size={1} scope=both; alter system set db_recovery_file_dest=\"{2}\" scope=both; alter system set db_file_name_convert='*','{0}/' scope=spfile; + alter system set standby_file_management='AUTO' scope=spfile; alter user gsmrootuser account unlock; grant sysdg to gsmrootuser; grant sysbackup to gsmrootuser; @@ -462,10 +417,9 @@ def setup_cdb_shard(self): alter user GSMUSER identified by HIDDEN_STRING container=all; grant sysdg to GSMUSER; grant sysbackup to GSMUSER; - alter system set dg_broker_start=true scope=both; create or replace directory DATA_PUMP_DIR as '{3}'; grant read,write on directory DATA_PUMP_DIR to GSMADMIN_INTERNAL; - alter system set local_listener='{4}:{5}' scope=both; + alter system set local_listener='{4}:{5}' scope=spfile; '''.format(dbf_dest,dbr_dest_size,dbr_dest,dpump_dir,host_name,db_port,obase,"dbconfig",dbuname) output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) @@ -479,27 +433,28 @@ def set_spfile_nonm_params(self): This function setup the catalog. """ #sqlpluslogincmd='''{0}/bin/sqlplus "/as sysdba"'''.format(self.ora_env_dict["ORACLE_HOME"]) - if not self.ocommon.check_key("CLONE_DB",self.ora_env_dict): - ohome=self.ora_env_dict["ORACLE_HOME"] - inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) - self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) - dbf_dest=self.ora_env_dict["DB_CREATE_FILE_DEST"] - obase=self.ora_env_dict["ORACLE_BASE"] - dbuname=self.ora_env_dict["DB_UNIQUE_NAME"] - - msg='''Setting up catalog CDB with spfile non modifiable parameters''' - self.ocommon.log_info_message(msg,self.file_name) - sqlcmd=''' - alter system set open_links_per_instance=16 scope=spfile; - alter system set open_links=16 scope=spfile; - alter system set db_file_name_convert='*','{0}/' scope=spfile; - alter system set dg_broker_config_file1=\"{1}/oradata/{2}/{3}/dr2{3}.dat\" scope=spfile; - alter system set dg_broker_config_file2=\"{1}/oradata/{2}/{3}/dr1{3}.dat\" scope=spfile; - '''.format(dbf_dest,obase,"dbconfig",dbuname) - output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) - self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) - self.ocommon.check_sql_err(output,error,retcode,True) + if self.ocommon.check_key("CLONE_DB",self.ora_env_dict): + if self.ora_env_dict["CLONE_DB"] != 'true': + ohome=self.ora_env_dict["ORACLE_HOME"] + inst_sid=self.ora_env_dict["ORACLE_SID"] + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) + dbf_dest=self.ora_env_dict["DB_CREATE_FILE_DEST"] + obase=self.ora_env_dict["ORACLE_BASE"] + dbuname=self.ora_env_dict["DB_UNIQUE_NAME"] + + msg='''Setting up catalog CDB with spfile non modifiable parameters''' + self.ocommon.log_info_message(msg,self.file_name) + sqlcmd=''' + alter system set open_links_per_instance=16 scope=spfile; + alter system set open_links=16 scope=spfile; + alter system set db_file_name_convert='*','{0}/' scope=spfile; + alter system set dg_broker_config_file1=\"{1}/oradata/{2}/{3}/dr2{3}.dat\" scope=spfile; + alter system set dg_broker_config_file2=\"{1}/oradata/{2}/{3}/dr1{3}.dat\" scope=spfile; + '''.format(dbf_dest,obase,"dbconfig",dbuname) + output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) + self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) + self.ocommon.check_sql_err(output,error,retcode,True) def set_dbparams_version(self): """ @@ -508,7 +463,7 @@ def set_dbparams_version(self): ohome1=self.ora_env_dict["ORACLE_HOME"] version=self.ocommon.get_oraversion(ohome1).strip() self.ocommon.log_info_message(version,self.file_name) - if int(version) >= 21: + if int(version) > 21: ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) @@ -517,10 +472,11 @@ def set_dbparams_version(self): obase=self.ora_env_dict["ORACLE_BASE"] dbuname=self.ora_env_dict["DB_UNIQUE_NAME"] + msg='''Setting up catalog CDB with spfile non modifiable parameters based on version''' self.ocommon.log_info_message(msg,self.file_name) sqlcmd=''' - alter system set wallet_root=\"{1}/oradata/{2}/{3}/admin\" scope=spfile; + alter system set wallet_root=\"{1}/oradata/{2}/{3}/\" scope=spfile; '''.format(dbf_dest,obase,"dbconfig",dbuname) output,error,retcode=self.ocommon.run_sqlplus(sqlpluslogincmd,sqlcmd,None) self.ocommon.log_info_message("Calling check_sql_err() to validate the sql command return status",self.file_name) @@ -531,14 +487,15 @@ def restart_db(self): """ restarting the db """ - if not self.ocommon.check_key("CLONE_DB",self.ora_env_dict): - ohome=self.ora_env_dict["ORACLE_HOME"] - inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) - self.ocommon.log_info_message("Calling shutdown_db() to shutdown the database",self.file_name) - self.ocommon.shutdown_db(self.ora_env_dict) - self.ocommon.log_info_message("Calling startup_mount() to mount the database",self.file_name) - self.ocommon.start_db(self.ora_env_dict) + if self.ocommon.check_key("CLONE_DB",self.ora_env_dict): + if self.ora_env_dict["CLONE_DB"] != 'true': + ohome=self.ora_env_dict["ORACLE_HOME"] + inst_sid=self.ora_env_dict["ORACLE_SID"] + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + self.ocommon.log_info_message("Calling shutdown_db() to shutdown the database",self.file_name) + self.ocommon.shutdown_db(self.ora_env_dict) + self.ocommon.log_info_message("Calling startup_mount() to mount the database",self.file_name) + self.ocommon.start_db(self.ora_env_dict) # self.ocommon.log_info_message("Enabling archivelog at DB level",self.file_name) # sqlcmd=''' @@ -648,7 +605,7 @@ def update_shard_setup(self): ########## SETUP_CDB_SHARD FUNCTION ENDS HERE ############################### ###################################### Run custom scripts ################################################## - def run_custom_scripts(): + def run_custom_scripts(self): """ Custom script to be excuted on every restart of enviornment """ @@ -776,7 +733,7 @@ def register_services(self): # Assigning variable ohome=self.ora_env_dict["ORACLE_HOME"] inst_sid=self.ora_env_dict["ORACLE_SID"] - sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) + sqlpluslogincmd=self.ocommon.get_sqlplus_str(ohome,inst_sid,"sys",None,None,None,None,None,None,None) self.ocommon.set_mask_str(self.ora_env_dict["ORACLE_PWD"]) if self.ocommon.check_key("ORACLE_PDB",self.ora_env_dict): msg='''Setting up catalog PDB''' @@ -819,7 +776,7 @@ def backup_files(self): wallet_backup_cmd='''ls -ltr /bin''' self.ocommon.log_info_message("Check Version " + version,self.file_name) if int(version) >= 21: - obase1=self.ora_env_dict["ORACLE_BASE_HOME"] + obase1=self.ora_env_dict["ORACLE_BASE"] wallet_backup_cmd='''cp -r {3}/admin/ {0}/oradata/{1}/{2}/'''.format(obase,"dbconfig",dbuname,ohome) cmd_names=''' mkdir -p {0}/oradata/{1}/{2} diff --git a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/runOraShardSetup.sh b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/runOraShardSetup.sh index d26037c..765f49e 100644 --- a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/runOraShardSetup.sh +++ b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/runOraShardSetup.sh @@ -36,6 +36,7 @@ if [ -z ${DB_UNIQUE_NAME} ]; then export DB_UNIQUE_NAME=$NEW_ORACLE_SID fi +export ORACLE_HOSTNAME=$( hostname -f ) echo "Changing DB name" export ORACLE_SID=$NEW_ORACLE_SID @@ -46,7 +47,9 @@ sqlplus / as sysdba << EOF alter system set open_links_per_instance=16 scope=spfile; alter system set dg_broker_config_file1="$ORACLE_BASE/oradata/dbconfig/$DB_UNIQUE_NAME/dr2$DB_UNIQUE_NAME.dat" scope=spfile; alter system set dg_broker_config_file2="$ORACLE_BASE/oradata/dbconfig/$DB_UNIQUE_NAME/dr1$DB_UNIQUE_NAME.dat" scope=spfile; - alter system set db_file_name_convert='*','/' scope=spfile; + alter system set db_file_name_convert='*','$ORACLE_BASE/oradata/$DB_UNIQUE_NAME/' scope=spfile; + alter system set local_listener='$ORACLE_HOSTNAME' scope=spfile; + alter system set standby_file_management='auto' scope=spfile; shutdown immediate exit; EOF @@ -353,6 +356,15 @@ if [ -d $ORACLE_BASE/oradata/$OLD_ORACLE_SID ]; then else echo "Performing Cloning as cloned status file does not exist" cloneDB; + $ORACLE_BASE/checkDBStatus.sh + if [ $? -eq 0 ]; then + echo "DB is in READ WRITE State" + touch "$ORACLE_BASE/oradata/.${ORACLE_SID}.exist_lck" + $ORACLE_BASE/$LOCKING_SCRIPT --acquire --file "$ORACLE_BASE/oradata/.${ORACLE_SID}.exist_lck" + else + echo "DB is not in READ WRITE state" + exit 1; + fi fi else echo "Error: The $ORACLE_BASE/oradata/$OLD_ORACLE_SID (ORACLE_BASE/oradata/OLD_ORACLE_SID) dir does not exist. Error exiting ." diff --git a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/runOracle.sh b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/runOracle.sh index 5c21bae..2266e99 100644 --- a/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/runOracle.sh +++ b/docker-based-sharding-deployment/dockerfiles/21.3.0/scripts/runOracle.sh @@ -45,7 +45,7 @@ EOF ################################### if [ ! -z ${SHARD_SETUP} ]; then - if [ ${SHARD_SETUP,,} == "true" ]; then + if [ ${SHARD_SETUP,,} == "true" ]; then sh $ORACLE_BASE/scripts/sharding/runOraShardSetup.sh fi fi