Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
437acff
add logic to set atp db properties
jshum2479 Feb 25, 2019
3ad57bc
remove debug prints
jshum2479 Feb 25, 2019
7b4e7a2
formatting only
jshum2479 Feb 25, 2019
b9691c6
refactor
jshum2479 Feb 25, 2019
e5b5ab2
add run_rcu logic for ATP
jshum2479 Feb 26, 2019
186ab59
Add run_rcu logic to support create rcu schema for atp
jshum2479 Mar 5, 2019
d3dbf8b
change to put the atp properties inside the model domainInfo
jshum2479 Mar 5, 2019
1b3d8e3
add support to generalize taking db connect info from model
jshum2479 Mar 6, 2019
c657e99
fix regular rcu db in yaml problem
jshum2479 Mar 7, 2019
158abcb
refactoring
jshum2479 Mar 7, 2019
119fa9f
refactoring
jshum2479 Mar 7, 2019
caac7df
remove obsolete atp_properties_file
Mar 11, 2019
8b073f9
Add validation for rcudbinfo parameters
jshum2479 Mar 12, 2019
b5d6b8f
add logic to set atp db properties
jshum2479 Feb 25, 2019
a64cf8e
remove debug prints
jshum2479 Feb 25, 2019
c871f8e
formatting only
jshum2479 Feb 25, 2019
c203452
refactor
jshum2479 Feb 25, 2019
7285914
add run_rcu logic for ATP
jshum2479 Feb 26, 2019
9cca685
Add run_rcu logic to support create rcu schema for atp
jshum2479 Mar 5, 2019
3767e46
change to put the atp properties inside the model domainInfo
jshum2479 Mar 5, 2019
7145c03
add support to generalize taking db connect info from model
jshum2479 Mar 6, 2019
e78b39b
fix regular rcu db in yaml problem
jshum2479 Mar 7, 2019
ed56400
refactoring
jshum2479 Mar 7, 2019
6488e3a
refactoring
jshum2479 Mar 7, 2019
72bb9bc
remove obsolete atp_properties_file
Mar 11, 2019
004ac3c
Add validation for rcudbinfo parameters
jshum2479 Mar 12, 2019
c407614
Merge remote-tracking branch 'origin/atptest' into atptest
Mar 12, 2019
2aba223
fix merge error
Mar 12, 2019
b9a4163
Add STB back to the tyepdef and created method to check rcu is requir…
jshum2479 Mar 12, 2019
83795d1
set fanEnabled=false in python instead of requiring setting env befor…
jshum2479 Mar 13, 2019
1461309
correct typo
jshum2479 Mar 13, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
164 changes: 148 additions & 16 deletions core/src/main/java/oracle/weblogic/deploy/create/RCURunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@
import oracle.weblogic.deploy.util.ScriptRunnerException;
import oracle.weblogic.deploy.util.StringUtils;

import org.python.core.PyDictionary;
import org.python.core.PyString;


/**
* This class does all the work to drop and recreate the RCU schemas besed on the domain type definition.
*/
Expand All @@ -44,12 +48,19 @@ public class RCURunner {
private static final String DB_ROLE = "SYSDBA";
private static final String SCHEMA_PREFIX_SWITCH = "-schemaPrefix";
private static final String COMPONENT_SWITCH = "-component";
private static final String TABLESPACE_SWITCH = "-tablespace";
private static final String TEMPTABLESPACE_SWITCH = "-tempTablespace";
private static final String RCU_VARIABLES_SWITCH = "-variables";
private static final String READ_STDIN_SWITCH = "-f";
private static final String USE_SSL_SWITCH = "-useSSL";
private static final String SERVER_DN_SWITCH = "-serverDN";
private static final String SSLARGS = "-sslArgs";

private static final String SERVICE_TABLE_COMPONENT = "STB";
private static final String WLS_COMPONENT = "WLS";
private static final String WLS_RUNTIME_COMPONENT = "WLS_RUNTIME";

private static final Pattern SCHEMA_DOES_NOT_EXIST_PATTERN = Pattern.compile("(ORA-01918|RCU-6013)");
private static final Pattern SCHEMA_DOES_NOT_EXIST_PATTERN = Pattern.compile("(ORA-01918|RCU-6013|ORA-12899)");

private static final int RCU_CREATE_COMMON_ARG_COUNT = 13;

Expand All @@ -61,6 +72,12 @@ public class RCURunner {
private String rcuDb;
private String rcuPrefix;
private List<String> rcuSchemas;
private boolean ATP_DB = false;
private String atpSSlArgs = null;
private String atpAdminUser = null;
private String atpDefaultTablespace = null;
private String atpTemporaryTablespace = null;
private String rcuVariables = null;

/**
* The constructor.
Expand All @@ -74,19 +91,74 @@ public class RCURunner {
* @throws CreateException if a parameter validation error occurs
*/
public RCURunner(String domainType, String oracleHome, String javaHome, String rcuDb, String rcuPrefix,
List<String> rcuSchemas) throws CreateException {
List<String> rcuSchemas, String rcuVariables) throws CreateException {

this.oracleHome = validateExistingDirectory(oracleHome, "ORACLE_HOME");
this.javaHome = validateExistingDirectory(javaHome, "JAVA_HOME");
this.rcuDb = validateNonEmptyString(rcuDb, "rcu_db");
this.rcuPrefix = validateNonEmptyString(rcuPrefix, "rcu_prefix");
this.rcuSchemas = validateNonEmptyListOfStrings(rcuSchemas, "rcu_schema_list");
if (this.rcuSchemas.contains(SERVICE_TABLE_COMPONENT)) {
LOGGER.warning("WLSDPLY-12000", CLASS, domainType, SERVICE_TABLE_COMPONENT);
this.rcuSchemas.remove(SERVICE_TABLE_COMPONENT);
}
this.rcuVariables = rcuVariables;
// if (this.rcuSchemas.contains(SERVICE_TABLE_COMPONENT)) {
// LOGGER.warning("WLSDPLY-12000", CLASS, domainType, SERVICE_TABLE_COMPONENT);
// this.rcuSchemas.remove(SERVICE_TABLE_COMPONENT);
// }
}

/**
* The constructor - used only by ATP database
*
* @param domainType the domain type
* @param oracleHome the ORACLE_HOME location
* @param javaHome the JAVA_HOME location
* @throws CreateException if a parameter validation error occurs
*/
public RCURunner(String domainType, String oracleHome, String javaHome, List<String> rcuSchemas,
PyDictionary rcuProperties, String rcuVariables)
throws CreateException {


String tnsAdmin = rcuProperties.get(new PyString("oracle.net.tns_admin")).toString();
String keyStorePassword = rcuProperties.get(new PyString("javax.net.ssl.keyStorePassword")).toString();
String trustStorePassword = rcuProperties.get(new PyString("javax.net.ssl.trustStorePassword")).toString();

StringBuffer sslArgs = new StringBuffer();
sslArgs.append("oracle.net.tns_admin=");
sslArgs.append(tnsAdmin);
sslArgs.append(",oracle.net.ssl_version=1.2");
sslArgs.append(",javax.net.ssl.trustStore=");
sslArgs.append(tnsAdmin + "/truststore.jks");
sslArgs.append(",javax.net.ssl.trustStoreType=JKS");
sslArgs.append(",javax.net.ssl.trustStorePassword=");
sslArgs.append(trustStorePassword);
sslArgs.append(",javax.net.ssl.keyStore=");
sslArgs.append(tnsAdmin + "/keystore.jks");
sslArgs.append(",javax.net.ssl.keyStoreType=JKS");
sslArgs.append(",javax.net.ssl.keyStorePassword=");
sslArgs.append(keyStorePassword);
sslArgs.append(",oracle.jdbc.fanEnabled=false");
sslArgs.append(",oracle.net.ssl_server_dn_match=true");

ATP_DB = true;
atpSSlArgs = sslArgs.toString();

this.oracleHome = validateExistingDirectory(oracleHome, "ORACLE_HOME");
this.javaHome = validateExistingDirectory(javaHome, "JAVA_HOME");
this.rcuDb = "jdbc:oracle:thin:@" + rcuProperties.get(new PyString("tns.entry")).toString();
this.rcuPrefix = rcuProperties.get(new PyString("rcu_prefix")).toString();
this.rcuSchemas = validateNonEmptyListOfStrings(rcuSchemas, "rcu_schema_list");
this.atpAdminUser = rcuProperties.get(new PyString("atp.admin.user")).toString();
this.atpDefaultTablespace = rcuProperties.get(new PyString("atp.default.tablespace")).toString();
this.atpTemporaryTablespace = rcuProperties.get(new PyString("atp.temp.tablespace")).toString();
this.rcuVariables = rcuVariables;

// if (!this.rcuSchemas.contains(SERVICE_TABLE_COMPONENT)) {
// LOGGER.warning("WLSDPLY-12000", CLASS, domainType, SERVICE_TABLE_COMPONENT);
// this.rcuSchemas.add(SERVICE_TABLE_COMPONENT);
// }
}


/**
* Run RCU to drop and recreate the RCU schemas.
*
Expand Down Expand Up @@ -130,6 +202,9 @@ public void runRcu(String rcuSysPass, String rcuSchemaPass) throws CreateExcepti
runner = new ScriptRunner(createEnv, RCU_CREATE_LOG_BASENAME);
try {
exitCode = runner.executeScript(rcuScript, scriptStdinLines, scriptArgs);
if (ATP_DB && exitCode != 0 && isSchemaNotExistError(runner)) {
exitCode = 0;
}
} catch (ScriptRunnerException sre) {
CreateException ce = new CreateException("WLSDPLY-12003", sre, CLASS, sre.getLocalizedMessage());
LOGGER.throwing(CLASS, METHOD, ce);
Expand All @@ -146,9 +221,19 @@ public void runRcu(String rcuSysPass, String rcuSchemaPass) throws CreateExcepti
// Private helper methods //
///////////////////////////////////////////////////////////////////////////

private void addATPEnv(Map<String, String> env) {
if (ATP_DB) {
env.put("RCU_SSL_MODE", "true");
env.put("SKIP_CONNECTSTRING_VALIDATION", "true");
env.put("RCU_SKIP_PRE_REQS", "ALL");
}
}


private Map<String, String> getRcuDropEnv() {
Map<String, String> env = new HashMap<>(1);
env.put("JAVA_HOME", this.javaHome.getAbsolutePath());
addATPEnv(env);
return env;
}

Expand All @@ -164,10 +249,23 @@ private String[] getRcuDropArgs() {
dropArgs.add(ORACLE_DB_TYPE);
dropArgs.add(DB_CONNECT_SWITCH);
dropArgs.add(rcuDb);
dropArgs.add(DB_USER_SWITCH);
dropArgs.add(DB_USER);
dropArgs.add(DB_ROLE_SWITCH);
dropArgs.add(DB_ROLE);

if (ATP_DB) {
dropArgs.add(DB_USER_SWITCH);
dropArgs.add(this.atpAdminUser);
dropArgs.add(USE_SSL_SWITCH);
dropArgs.add("true");
dropArgs.add(SERVER_DN_SWITCH);
dropArgs.add("CN=ignored");
dropArgs.add(SSLARGS);
dropArgs.add(atpSSlArgs);

} else {
dropArgs.add(DB_USER_SWITCH);
dropArgs.add(DB_USER);
dropArgs.add(DB_ROLE_SWITCH);
dropArgs.add(DB_ROLE);
}
dropArgs.add(SCHEMA_PREFIX_SWITCH);
dropArgs.add(rcuPrefix);

Expand All @@ -176,8 +274,8 @@ private String[] getRcuDropArgs() {
dropArgs.add(rcuSchema);
}
// Add STB to the drop list since it is never specified in the create list...
dropArgs.add(COMPONENT_SWITCH);
dropArgs.add(SERVICE_TABLE_COMPONENT);
// dropArgs.add(COMPONENT_SWITCH);
// dropArgs.add(SERVICE_TABLE_COMPONENT);

dropArgs.add(READ_STDIN_SWITCH);

Expand All @@ -193,16 +291,37 @@ private String[] getRcuCreateArgs() {
createArgs.add(ORACLE_DB_TYPE);
createArgs.add(DB_CONNECT_SWITCH);
createArgs.add(rcuDb);
createArgs.add(DB_USER_SWITCH);
createArgs.add(DB_USER);
createArgs.add(DB_ROLE_SWITCH);
createArgs.add(DB_ROLE);
if (ATP_DB) {
createArgs.add(DB_USER_SWITCH);
createArgs.add(this.atpAdminUser);
createArgs.add(USE_SSL_SWITCH);
createArgs.add("true");
createArgs.add(SERVER_DN_SWITCH);
createArgs.add("CN=ignored");
createArgs.add(SSLARGS);
createArgs.add(atpSSlArgs);
} else {
createArgs.add(DB_USER_SWITCH);
createArgs.add(DB_USER);
createArgs.add(DB_ROLE_SWITCH);
createArgs.add(DB_ROLE);
}
createArgs.add(SCHEMA_PREFIX_SWITCH);
createArgs.add(rcuPrefix);

for (String rcuSchema : rcuSchemas) {
createArgs.add(COMPONENT_SWITCH);
createArgs.add(rcuSchema);
if (ATP_DB) {
createArgs.add(TABLESPACE_SWITCH);
createArgs.add(this.atpDefaultTablespace);
createArgs.add(TEMPTABLESPACE_SWITCH);
createArgs.add(this.atpTemporaryTablespace);
}
}
if (rcuVariables != null) {
createArgs.add(RCU_VARIABLES_SWITCH);
createArgs.add(this.rcuVariables);
}
createArgs.add(READ_STDIN_SWITCH);

Expand Down Expand Up @@ -256,6 +375,19 @@ private static boolean isSchemaNotExistError(ScriptRunner runner) {
return schemaDoesNotExist;
}

private static boolean isValueTooLargeError(ScriptRunner runner) {
List<String> stdoutBuffer = runner.getStdoutBuffer();
boolean schemaDoesNotExist = false;
for (String line : stdoutBuffer) {
Matcher matcher = SCHEMA_DOES_NOT_EXIST_PATTERN.matcher(line);
if (matcher.find()) {
schemaDoesNotExist = true;
break;
}
}
return schemaDoesNotExist;
}

private static File validateExistingDirectory(String directoryName, String directoryTypeName)
throws CreateException {
final String METHOD = "validateExistingDirectory";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ public class WLSDeployArchive {

public static final String WLSDPLY_ARCHIVE_BINARY_DIR = "wlsdeploy";


/**
* Top-level archive subdirectory where the atp wallet is stored
*/
public static final String ARCHIVE_ATP_WALLET_PATH = "atpwallet";

/**
* Top-level archive subdirectory where the model is stored and the subdirectory to which it will be extracted.
*/
Expand All @@ -39,6 +45,7 @@ public class WLSDeployArchive {
*/
public static final String ARCHIVE_APPS_TARGET_DIR = WLSDPLY_ARCHIVE_BINARY_DIR + "/applications";


/**
* Top-level archive subdirectory where the shared libraries are stored and the subdirectory to
* which they will be extracted.
Expand Down Expand Up @@ -129,7 +136,8 @@ public static boolean isPathIntoArchive(String path) {
LOGGER.entering(CLASS, METHOD, path);
boolean result = false;
if (!StringUtils.isEmpty(path)) {
result = path.startsWith(WLSDPLY_ARCHIVE_BINARY_DIR + ZIP_SEP);
result =
path.startsWith(WLSDPLY_ARCHIVE_BINARY_DIR + ZIP_SEP) || path.startsWith(ARCHIVE_ATP_WALLET_PATH + ZIP_SEP);
}
LOGGER.exiting(CLASS, METHOD, result);
return result;
Expand Down Expand Up @@ -362,7 +370,6 @@ public String extractFile(String path, File extractToLocation) throws WLSDeployA
public String extractFile(String path, File extractToLocation, boolean stripLeadingPathDirectories)
throws WLSDeployArchiveIOException {
final String METHOD = "extractFile";

LOGGER.entering(CLASS, METHOD, path, extractToLocation, stripLeadingPathDirectories);
validateNonEmptyString(path, "path", METHOD);
validateExistingDirectory(extractToLocation, "extractToLocation", getArchiveFileName(), METHOD);
Expand Down Expand Up @@ -504,6 +511,25 @@ public List<String> listApplications() throws WLSDeployArchiveIOException {
return result;
}

/**
* Get the path of the ATP wallet in the archive.
*
* @return path of the ATP wallet
* @throws WLSDeployArchiveIOException if an error occurs reading the archive
*/
public String getATPWallet() throws WLSDeployArchiveIOException {
final String METHOD = "getATPWallet";

LOGGER.entering(CLASS, METHOD);
List<String> result = getZipFile().listZipEntries(ARCHIVE_ATP_WALLET_PATH + ZIP_SEP);
LOGGER.exiting(CLASS, METHOD, result);
if (result.size()>0) {
return result.get(0);
} else {
return null;
}
}

/**
* Extract the specified application from the archive to the domain home directory.
*
Expand Down
Loading