Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
61 changes: 47 additions & 14 deletions bin/owm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,12 @@

#############################################################################################################################
# Name : owm.sh
# Description : Discovers a Weblogic Domain Environment and move it to Oracle Cloud.
# Description : Discovers a Weblogic Domain Environment and moves it to Oracle Cloud.
#############################################################################################################################
scriptName=$(basename "$0")
scriptPath=$(dirname "$0")
toolHome=$(builtin cd "$scriptPath/.." ||exit; pwd)
LOG_FILE_NAME="owm.log"
# echo $scriptPath
# echo $toolHome
ON_PREM_ENV_FILE="$toolHome/config/on-prem.env"

[ "$user_functions_loaded" ] || source "$scriptPath/shared.sh"
Expand All @@ -31,23 +29,53 @@ discover(){
fi
}

discover_local(){
log "info" "<discoverDomain><discover_local><entry> args: $*"
file_timestamp=`date +%Y%m%d%H%M`
SCRIPT_PATH="$toolHome/bin/discoverWLS.sh"
discover "local" "$SCRIPT_PATH" "-domain_home $domain_home" "-java_home $java_home" "-model_file $toolHome/out/Discovered_$file_timestamp.json" "-skip_archive"
discover_local() {
log "info" "<discoverDomain><discover_local><entry> args: $*>"
file_timestamp=$(date +%Y%m%d%H%M)
# WDT discover tool
SCRIPT_PATH="$toolHome/deps/wdt/bin/discoverDomain.sh"
# Output JSON model
MODEL_PATH="$toolHome/out/Discovered_${file_timestamp}.json"

# Ensure java_home came from on-prem.env
if [ -z "$java_home" ]; then
log "error" "java_home is not set in on-prem.env"
exit 2
fi
export JAVA_HOME="$java_home"
log "info" "Using JAVA_HOME = $JAVA_HOME"

# Execute WDT Discover
discover "local" "$SCRIPT_PATH" \
"-domain_home $domain_home" \
"-java_home $JAVA_HOME" \
"-model_file $MODEL_PATH" \
"-skip_archive"
exit_code=$?
log "info" "Executed discover WebLogic with exit code [$exit_code]"
log "info" "Executed WDT Discover with exit code [$exit_code]"
if [ $exit_code -ne 0 ] && [ $exit_code -ne 1 ]; then
log "error" "<discoverDomain><discover_local><error> Error executing discover domain"
exit 2
log "error" "<discoverDomain><discover_local><error> Error executing WDT discover domain"
exit $exit_code
fi
log "info" "<discoverDomain><discover_infra_local><exit> WebLogic Inventory File : $toolHome/out/Discovered_$file_timestamp.json"
DISCOVERED_DOMAIN_JSON="$toolHome/out/Discovered_$file_timestamp.json"
log "info" "<discoverDomain><discover_local><exit> WebLogic Inventory File: $MODEL_PATH"

# Post-process WDT JSON:
# - Insert AdminConsolePort (Admin Server only)
# - Insert DomainPath & OraclePath in the topology section
PYTHON_SCRIPT="$toolHome/lib/python/patch_discover_wls_model.py"
python3 "$PYTHON_SCRIPT" "$MODEL_PATH" "$ON_PREM_ENV_FILE"
exit_code=$?
if [ $exit_code -ne 0 ]; then
log "error" "<discoverDomain><discover_local><error> JSON post-processing failed with exit code $exit_code"
exit $exit_code
fi
log "info" "Successfully updated WebLogic Inventory File with AdminConsolePort, DomainPath, OraclePath"

# Update migration metadata
DISCOVERED_DOMAIN_JSON="$MODEL_PATH"
update_migration_data_json "wls_json" "$DISCOVERED_DOMAIN_JSON"
}


discover_remote(){
# http # Future version HTTP Proxy
# ${x:=default_value}
Expand Down Expand Up @@ -243,6 +271,11 @@ fi
case "$1" in
"wls")
load_config "$ON_PREM_ENV_FILE"

# Ensure JAVA_HOME is exported
if [ -n "$java_home" ]; then
export JAVA_HOME="$java_home"
fi
discover_local
;;
"remote")
Expand Down
2 changes: 1 addition & 1 deletion bin/shared.sh
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ readonly DEPS_WDT_HOME=$DEPS_DIR/wdt
readonly DEPS_OCI_SDK_HOME=$DEPS_DIR/oci
readonly LOG_DIR=$toolHome/logs
LOG_FILE="$LOG_DIR/$LOG_FILE_NAME"
readonly WDT_DOWNLOAD_RELEASE_URL="https://github.com/oracle/weblogic-deploy-tooling/releases/download/release-4.3.5/weblogic-deploy.tar.gz"
readonly WDT_DOWNLOAD_RELEASE_URL="https://github.com/oracle/weblogic-deploy-tooling/releases/download/release-4.3.8/weblogic-deploy.tar.gz"
#readonly JQ_DOWNLOAD_RELEASE_URL="https://github.com/jqlang/jq/releases/download/jq-1.7.1/jq-linux-amd64"
readonly OCI_JAVA_SDK_DOWNLOAD_RELEASE_URL="https://github.com/oracle/oci-java-sdk/releases/download/v3.49.0/oci-java-sdk-3.49.0.zip"
readonly REPO_ARCHIVE_PATH=${3:-$toolHome/out}
Expand Down
239 changes: 239 additions & 0 deletions lib/python/patch_discover_wls_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
"""
Copyright (c) 2025, Oracle Corporation and/or its affiliates.
Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.

Post-processing script for WebLogic Deploy Tooling (WDT) discovery output.

This script updates the discovered WDT model JSON file by adding the following
fields required for WebLogic migration to OCI:

1. AdminConsolePort
- Added only under topology.Server.<AdminServerName>

2. DomainPath
- Appended as the final entry in the topology section

3. OraclePath
- Appended immediately after DomainPath

DomainPath and OraclePath are loaded from the provided on-prem.env file,
using keys:
domain_home=<path>
oracle_home=<path>

AdminConsolePort is dynamically determined from on-prem WebLogic config.xml
using the following priority:

1. If <administration-port-enabled>true</administration-port-enabled>:
- server-level in admin server block <administration-port>
- domain-level <administration-port>
- else DEFAULT_ADMINISTRATION_PORT (9002)

2. If SSL is enabled on AdminServer:
- <network-access-point name="SecuredExternAdmin"><listen-port>
- <ssl><listen-port>

3. From server-start arguments:
-Dweblogic.management.server=host:port

4. <network-access-point name="ExternAdmin"><listen-port>

5. Fallback:
<listen-port>

AdminServer is determined strictly from:
topology.AdminServerName

Usage:
patch_discover_wls_model.py <model.json> <on-prem.env>
"""

import json
import os
import re
import sys

DEFAULT_ADMINISTRATION_PORT = 9002

# ---------------------------------------------------------
# ENV loader
# ---------------------------------------------------------
def load_env_var(file_path, key):
if not os.path.exists(file_path):
return None

pattern = re.compile(
r'^\s*(?:export\s+)?' + re.escape(key) + r'\s*=\s*(.+?)\s*$',
re.IGNORECASE,
)

with open(file_path, "r", encoding="utf-8") as f:
for line in f:
stripped = line.strip()
if not stripped or stripped.startswith("#"):
continue
m = pattern.match(stripped)
if m:
return m.group(1).strip()

return None


def load_paths_from_env(env_file):
domain_home = load_env_var(env_file, "domain_home")
oracle_home = load_env_var(env_file, "oracle_home")

if not domain_home or not oracle_home:
print("ERROR: domain_home or oracle_home missing in on-prem.env", file=sys.stderr)
return None, None

return domain_home, oracle_home


# ---------------------------------------------------------
# Admin port logic
# ---------------------------------------------------------
def get_admin_port_from_model(model, admin_server_name):

topology = model.get("topology", {})
servers = topology.get("Server", {})

admin_server = servers.get(admin_server_name)
if not admin_server:
print(f"ERROR: AdminServer '{admin_server_name}' not found in model", file=sys.stderr)
return None

admin_port_enabled = topology.get("AdministrationPortEnabled", False)

# ------------------------------------------------------------------
# 1 — Administration Port Enabled
# ------------------------------------------------------------------
if admin_port_enabled:

# 1a — server-level
port = admin_server.get("AdministrationPort")
if port:
return str(port)

# 1b — domain-level
port = topology.get("AdministrationPort")
if port:
return str(port)

# 1c — default
return str(DEFAULT_ADMINISTRATION_PORT)

# ------------------------------------------------------------------
# 2 — SSL enabled
# ------------------------------------------------------------------
ssl = admin_server.get("SSL")
if ssl:

# 2a — NAP "SecuredExternAdmin"
naps = admin_server.get("NetworkAccessPoint", {})
if naps:
sec = naps.get("SecuredExternAdmin", {})
port = sec.get("ListenPort")
if port:
return str(port)

# 2b — SSL.ListenPort
port = ssl.get("ListenPort")
if port:
return str(port)

# ------------------------------------------------------------------
# 3 — ServerStart Arguments
# ------------------------------------------------------------------
ss = admin_server.get("ServerStart")
if ss:
args = ss.get("Arguments", "")
m = re.search(r"-Dweblogic\.management\.server=.*?:(\d+)", args)
if m:
return m.group(1)

# ------------------------------------------------------------------
# 4 — NAP "ExternAdmin"
# ------------------------------------------------------------------
naps = admin_server.get("NetworkAccessPoint", {})
if naps:
ext = naps.get("ExternAdmin", {})
port = ext.get("ListenPort")
if port:
return str(port)

# ------------------------------------------------------------------
# 5 — fallback ListenPort
# ------------------------------------------------------------------
port = admin_server.get("ListenPort")
if port:
return str(port)

return None


# ---------------------------------------------------------
# Patch model JSON
# ---------------------------------------------------------
def patch_model(json_file, env_file):

domain_home, oracle_home = load_paths_from_env(env_file)
if not domain_home or not oracle_home:
return 1

# Load model JSON
try:
with open(json_file, "r", encoding="utf-8") as f:
model = json.load(f)
except Exception as e:
print(f"ERROR: Failed to load JSON: {e}", file=sys.stderr)
return 1

topology = model.setdefault("topology", {})
servers = topology.get("Server", {})

# Insert DomainPath + OraclePath
topology["DomainPath"] = domain_home
topology["OraclePath"] = oracle_home

# Ensure AdminServerName exists
admin_server_name = topology.get("AdminServerName")
if not admin_server_name:
print("ERROR: topology.AdminServerName missing", file=sys.stderr)
return 1

if admin_server_name not in servers:
print(f"ERROR: AdminServerName '{admin_server_name}' not found under topology.Server",
file=sys.stderr)
return 1

# Retrieve AdminConsolePort
port = get_admin_port_from_model(model, admin_server_name)
if not port:
print("ERROR: Unable to determine AdminConsolePort from model", file=sys.stderr)
return 1

servers[admin_server_name]["AdminConsolePort"] = port
print(f"INFO: AdminConsolePort = {port}")

# Write JSON back to disk
try:
with open(json_file, "w", encoding="utf-8") as f:
json.dump(model, f, indent=4)
except Exception as e:
print(f"ERROR: Failed writing JSON: {e}", file=sys.stderr)
return 1

print("SUCCESS: Updated model saved to", json_file)
return 0


# ---------------------------------------------------------
# Main
# ---------------------------------------------------------
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: patch_discover_wls_model.py <model.json> <on-prem.env>")
sys.exit(1)

sys.exit(patch_model(sys.argv[1], sys.argv[2]))