From 457f5024068d855a153c2e8ae43298367c64c1eb Mon Sep 17 00:00:00 2001 From: DEBOJYOTI GHOSH Date: Fri, 28 Oct 2022 18:12:18 +0530 Subject: [PATCH 1/4] For WCContent Kubernetes release 22.4.1 Signed-off-by: DEBOJYOTI GHOSH --- .../ingress-per-domain/Chart.yaml | 0 .../templates/nginx-ingress.yaml | 155 + .../templates/traefik-ingress.yaml | 153 + .../tls/nginx-admin-tls.yaml | 11 +- .../tls/nginx-capture-tls.yaml | 11 +- .../ingress-per-domain/tls/nginx-ibr-tls.yaml | 11 +- .../ingress-per-domain/tls/nginx-ipm-tls.yaml | 11 +- .../ingress-per-domain/tls/nginx-ucm-tls.yaml | 12 +- .../tls/nginx-wccadf-tls.yaml | 11 +- .../tls/traefik-admin-tls.yaml | 0 .../tls/traefik-capture-tls.yaml | 2 +- .../tls/traefik-ibr-tls.yaml | 0 .../tls/traefik-ipm-tls.yaml | 2 +- .../tls/traefik-ucm-tls.yaml | 0 .../tls/traefik-wccadf-tls.yaml | 2 +- .../ingress-per-domain/values.yaml | 2 +- .../kubernetes/charts/traefik/values.yaml | 16 +- .../charts/weblogic-operator/.helmignore | 12 + .../charts/weblogic-operator/Chart.yaml | 10 + .../templates/_domain-namespaces.tpl | 134 + .../_operator-clusterrole-domain-admin.tpl | 40 + .../_operator-clusterrole-general.tpl | 39 + .../_operator-clusterrole-namespace.tpl | 40 + .../_operator-clusterrole-nonresource.tpl | 15 + .../_operator-clusterrole-operator-admin.tpl | 34 + ...ator-clusterrolebinding-auth-delegator.tpl | 30 + ..._operator-clusterrolebinding-discovery.tpl | 30 + .../_operator-clusterrolebinding-general.tpl | 35 + ...perator-clusterrolebinding-nonresource.tpl | 21 + .../templates/_operator-cm.tpl | 70 + .../templates/_operator-dep.tpl | 164 + .../templates/_operator-external-svc.tpl | 32 + .../templates/_operator-internal-svc.tpl | 21 + .../templates/_operator-role.tpl | 17 + .../_operator-rolebinding-namespace.tpl | 35 + .../templates/_operator-rolebinding.tpl | 22 + .../templates/_operator-secret.tpl | 25 + .../weblogic-operator/templates/_operator.tpl | 30 + .../weblogic-operator/templates/_utils.tpl | 493 +++ .../templates/_validate-inputs.tpl | 63 + .../weblogic-operator/templates/main.yaml | 11 + .../charts/weblogic-operator/values.yaml | 235 ++ .../kubernetes/common/createFMWJRFDomain.py | 332 ++ .../common/createFMWRestrictedJRFDomain.py | 291 ++ .../kubernetes/common/domain-template.yaml | 119 + .../common/jrf-domain-template.yaml | 123 + .../kubernetes/common/utility.sh | 986 +++++ .../kubernetes/common/validate.sh | 506 +++ .../kubernetes/common/wdt-and-wit-utility.sh | 441 +++ ...create-azure-storage-credentials-secret.sh | 92 + .../create-docker-credentials-secret.sh | 106 + .../create-oracle-db-service/README.md | 76 + .../common/checkDbState.sh | 21 + .../common/oracle.db.yaml | 78 + .../create-image-pull-secret.sh | 60 + .../start-db-service.sh | 124 + .../stop-db-service.sh | 46 + .../create-rcu-credentials/README.md | 56 + .../create-rcu-credentials.sh | 139 + .../kubernetes/create-rcu-schema/README.md | 221 ++ .../common/createRepository.sh | 68 + .../common/dropRepository.sh | 62 + .../create-rcu-schema/common/rcu.yaml | 20 + .../common/template/rcu.yaml.template | 22 + .../create-image-pull-secret.sh | 59 + .../create-rcu-schema/create-rcu-schema.sh | 204 + .../create-rcu-schema/drop-rcu-schema.sh | 108 + .../common/configureIPMConnection.py | 86 + .../common/configureWCCADFDomain.py | 14 +- .../configure-ipm-connection.sh | 94 + .../configure-wccadf-domain.sh | 47 +- .../create-domain-inputs.yaml | 14 +- .../domain-home-on-pv/create-domain.sh | 21 +- .../oke-start-managed-servers-wrapper.sh | 2 +- .../start-managed-servers-wrapper.sh | 51 +- .../README.md | 50 + .../create-weblogic-credentials.sh | 121 + .../create-weblogic-domain-pv-pvc/README.md | 222 ++ .../create-pv-pvc-inputs.yaml | 44 + .../create-pv-pvc.sh | 267 ++ .../pv-template.yaml | 21 + .../pvc-template.yaml | 17 + .../kubernetes/delete-domain/README.md | 27 + .../delete-weblogic-domain-resources.sh | 283 ++ .../kubernetes/domain-lifecycle/README.md | 186 + .../domain-lifecycle/clusterStatus.sh | 130 + .../kubernetes/domain-lifecycle/helper.sh | 1053 ++++++ .../domain-lifecycle/introspectDomain.sh | 105 + .../domain-lifecycle/restartServer.sh | 106 + .../domain-lifecycle/rollCluster.sh | 123 + .../kubernetes/domain-lifecycle/rollDomain.sh | 105 + .../domain-lifecycle/scaleCluster.sh | 122 + .../domain-lifecycle/startCluster.sh | 129 + .../domain-lifecycle/startDomain.sh | 97 + .../domain-lifecycle/startServer.sh | 242 ++ .../domain-lifecycle/stopCluster.sh | 119 + .../kubernetes/domain-lifecycle/stopDomain.sh | 95 + .../kubernetes/domain-lifecycle/stopServer.sh | 248 ++ .../elasticsearch-and-kibana/README.md | 32 + .../elasticsearch_and_kibana.yaml | 119 + .../templates/nginx-ingress.yaml | 104 - .../templates/traefik-ingress.yaml | 102 - .../logging-services/logstash/README.md | 59 + .../logging-services/logstash/logstash.conf | 25 + .../logging-services/logstash/logstash.yaml | 39 + .../weblogic-logging-exporter/README.md | 131 + .../WebLogicLoggingExporter.yaml | 13 + .../kubernetes/monitoring-service/README.md | 307 ++ .../config/config.yml.template | 64 + .../weblogic-server-dashboard-import.json | 3312 +++++++++++++++++ .../config/weblogic-server-dashboard.json | 51 +- .../monitoring-service/config/weblogic.xml | 18 + .../monitoring-service/delete-monitoring.sh | 122 + ...ometheus-roleBinding-domain-namespace.yaml | 20 + ...metheus-roleSpecific-domain-namespace.yaml | 23 + .../wls-exporter-ServiceMonitor.yaml | 43 + .../wls-exporter-ServiceMonitor.yaml.template | 44 + .../monitoring-service/monitoring-inputs.yaml | 92 + .../deploy-weblogic-monitoring-exporter.py | 156 + .../deploy-weblogic-monitoring-exporter.sh | 40 + ...eploy-weblogic-server-grafana-dashboard.sh | 30 + .../scripts/get-wls-exporter.sh | 58 + .../undeploy-weblogic-monitoring-exporter.py | 148 + .../undeploy-weblogic-monitoring-exporter.sh | 42 + .../monitoring-service/scripts/utils.sh | 103 + .../monitoring-service/setup-monitoring.sh | 191 + .../kubernetes/monitoring-service/values.yaml | 13 + .../kubernetes/rest/README.md | 38 + .../rest/generate-external-rest-identity.sh | 200 + .../kubernetes/scaling/scalingAction.sh | 504 +++ .../content/wccontent-domains/_index.md | 10 +- .../configure-load-balancer/_index.md | 2 +- .../configure-load-balancer/apache.md | 249 -- .../configure-load-balancer/nginx.md | 199 +- .../configure-load-balancer/traefik.md | 108 +- .../adminguide/elasticsearch-integration.md | 134 +- .../weblogic-logging-exporter-setup.md | 33 +- .../images/wle-startup-class2.png | Bin 83172 -> 85757 bytes .../weblogic-monitoring-exporter-setup.md | 360 +- .../images/wme-deploy1.png | Bin 220664 -> 0 bytes .../images/wme-deploy2.png | Bin 90627 -> 0 bytes .../images/wme-deploy3.png | Bin 122246 -> 0 bytes .../images/wme-gp-add-datasource.png | Bin 120555 -> 0 bytes .../images/wme-gp-import-json.png | Bin 34638 -> 0 bytes .../images/wme-service-discovery.png | Bin 71674 -> 0 bytes .../images/wme-test-url.png | Bin 78476 -> 0 bytes .../appendix/quickstart-deployment-guide.md | 95 +- .../create-or-update-image/_index.md | 2 +- .../_index.md | 4 +- .../create-wccontent-domains/_index.md | 112 +- .../images/wcc-provider-ucm-ibr.png | Bin 0 -> 165685 bytes .../prepare-your-environment/_index.md | 162 +- .../installguide/prerequisites/_index.md | 14 +- .../wccontent-domains/oracle-cloud/_index.md | 2 +- .../configure-load-balancer/_index.md | 2 +- .../configure-load-balancer/nginx.md | 510 +++ .../configure-load-balancer/traefik.md | 357 +- .../oracle-cloud/configure-mount-share.md | 51 + .../create-wccontent-domains/_index.md | 417 ++- .../images/oke-wcc-provider-ucm-ibr.png | Bin 0 -> 294556 bytes .../prepare-environment-wcc-domain/_index.md | 55 +- .../oracle-cloud/prepare-oke-environment.md | 14 +- .../upgrade-operator-release.md | 2 +- .../wccontent-domains/release-notes.md | 1 + 164 files changed, 18366 insertions(+), 1430 deletions(-) rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/Chart.yaml (100%) mode change 100755 => 100644 create mode 100644 OracleWebCenterContent/kubernetes/charts/ingress-per-domain/templates/nginx-ingress.yaml create mode 100644 OracleWebCenterContent/kubernetes/charts/ingress-per-domain/templates/traefik-ingress.yaml rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/nginx-admin-tls.yaml (65%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/nginx-capture-tls.yaml (64%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/nginx-ibr-tls.yaml (64%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/nginx-ipm-tls.yaml (65%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/nginx-ucm-tls.yaml (63%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/nginx-wccadf-tls.yaml (64%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/traefik-admin-tls.yaml (100%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/traefik-capture-tls.yaml (89%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/traefik-ibr-tls.yaml (100%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/traefik-ipm-tls.yaml (89%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/traefik-ucm-tls.yaml (100%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/tls/traefik-wccadf-tls.yaml (89%) mode change 100755 => 100644 rename OracleWebCenterContent/kubernetes/{ => charts}/ingress-per-domain/values.yaml (94%) mode change 100755 => 100644 create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/.helmignore create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/Chart.yaml create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_domain-namespaces.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-domain-admin.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-general.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-namespace.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-nonresource.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-operator-admin.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-auth-delegator.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-discovery.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-general.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-nonresource.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-cm.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-external-svc.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-internal-svc.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-role.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding-namespace.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-secret.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_utils.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_validate-inputs.tpl create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/main.yaml create mode 100644 OracleWebCenterContent/kubernetes/charts/weblogic-operator/values.yaml create mode 100644 OracleWebCenterContent/kubernetes/common/createFMWJRFDomain.py create mode 100644 OracleWebCenterContent/kubernetes/common/createFMWRestrictedJRFDomain.py create mode 100644 OracleWebCenterContent/kubernetes/common/domain-template.yaml create mode 100644 OracleWebCenterContent/kubernetes/common/jrf-domain-template.yaml create mode 100644 OracleWebCenterContent/kubernetes/common/utility.sh create mode 100644 OracleWebCenterContent/kubernetes/common/validate.sh create mode 100644 OracleWebCenterContent/kubernetes/common/wdt-and-wit-utility.sh create mode 100644 OracleWebCenterContent/kubernetes/create-kubernetes-secrets/create-azure-storage-credentials-secret.sh create mode 100644 OracleWebCenterContent/kubernetes/create-kubernetes-secrets/create-docker-credentials-secret.sh create mode 100644 OracleWebCenterContent/kubernetes/create-oracle-db-service/README.md create mode 100644 OracleWebCenterContent/kubernetes/create-oracle-db-service/common/checkDbState.sh create mode 100644 OracleWebCenterContent/kubernetes/create-oracle-db-service/common/oracle.db.yaml create mode 100644 OracleWebCenterContent/kubernetes/create-oracle-db-service/create-image-pull-secret.sh create mode 100644 OracleWebCenterContent/kubernetes/create-oracle-db-service/start-db-service.sh create mode 100644 OracleWebCenterContent/kubernetes/create-oracle-db-service/stop-db-service.sh create mode 100644 OracleWebCenterContent/kubernetes/create-rcu-credentials/README.md create mode 100644 OracleWebCenterContent/kubernetes/create-rcu-credentials/create-rcu-credentials.sh create mode 100644 OracleWebCenterContent/kubernetes/create-rcu-schema/README.md create mode 100644 OracleWebCenterContent/kubernetes/create-rcu-schema/common/createRepository.sh create mode 100644 OracleWebCenterContent/kubernetes/create-rcu-schema/common/dropRepository.sh create mode 100644 OracleWebCenterContent/kubernetes/create-rcu-schema/common/rcu.yaml create mode 100644 OracleWebCenterContent/kubernetes/create-rcu-schema/common/template/rcu.yaml.template create mode 100644 OracleWebCenterContent/kubernetes/create-rcu-schema/create-image-pull-secret.sh create mode 100644 OracleWebCenterContent/kubernetes/create-rcu-schema/create-rcu-schema.sh create mode 100644 OracleWebCenterContent/kubernetes/create-rcu-schema/drop-rcu-schema.sh create mode 100644 OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/common/configureIPMConnection.py create mode 100644 OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/configure-ipm-connection.sh create mode 100644 OracleWebCenterContent/kubernetes/create-weblogic-domain-credentials/README.md create mode 100644 OracleWebCenterContent/kubernetes/create-weblogic-domain-credentials/create-weblogic-credentials.sh create mode 100644 OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/README.md create mode 100644 OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/create-pv-pvc-inputs.yaml create mode 100644 OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/create-pv-pvc.sh create mode 100644 OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/pv-template.yaml create mode 100644 OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/pvc-template.yaml create mode 100644 OracleWebCenterContent/kubernetes/delete-domain/README.md create mode 100644 OracleWebCenterContent/kubernetes/delete-domain/delete-weblogic-domain-resources.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/README.md create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/clusterStatus.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/helper.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/introspectDomain.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/restartServer.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/rollCluster.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/rollDomain.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/scaleCluster.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/startCluster.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/startDomain.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/startServer.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/stopCluster.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/stopDomain.sh create mode 100644 OracleWebCenterContent/kubernetes/domain-lifecycle/stopServer.sh create mode 100644 OracleWebCenterContent/kubernetes/elasticsearch-and-kibana/README.md create mode 100644 OracleWebCenterContent/kubernetes/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml delete mode 100755 OracleWebCenterContent/kubernetes/ingress-per-domain/templates/nginx-ingress.yaml delete mode 100755 OracleWebCenterContent/kubernetes/ingress-per-domain/templates/traefik-ingress.yaml create mode 100644 OracleWebCenterContent/kubernetes/logging-services/logstash/README.md create mode 100644 OracleWebCenterContent/kubernetes/logging-services/logstash/logstash.conf create mode 100644 OracleWebCenterContent/kubernetes/logging-services/logstash/logstash.yaml create mode 100644 OracleWebCenterContent/kubernetes/logging-services/weblogic-logging-exporter/README.md create mode 100644 OracleWebCenterContent/kubernetes/logging-services/weblogic-logging-exporter/WebLogicLoggingExporter.yaml create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/README.md create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/config/config.yml.template create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic-server-dashboard-import.json rename docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/weblogic_dashboard.json => OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic-server-dashboard.json (98%) create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic.xml create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/delete-monitoring.sh create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/manifests/prometheus-roleBinding-domain-namespace.yaml create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/manifests/prometheus-roleSpecific-domain-namespace.yaml create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/manifests/wls-exporter-ServiceMonitor.yaml create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/manifests/wls-exporter-ServiceMonitor.yaml.template create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/monitoring-inputs.yaml create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-monitoring-exporter.py create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-monitoring-exporter.sh create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-server-grafana-dashboard.sh create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/scripts/get-wls-exporter.sh create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/scripts/undeploy-weblogic-monitoring-exporter.py create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/scripts/undeploy-weblogic-monitoring-exporter.sh create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/scripts/utils.sh create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/setup-monitoring.sh create mode 100644 OracleWebCenterContent/kubernetes/monitoring-service/values.yaml create mode 100644 OracleWebCenterContent/kubernetes/rest/README.md create mode 100644 OracleWebCenterContent/kubernetes/rest/generate-external-rest-identity.sh create mode 100644 OracleWebCenterContent/kubernetes/scaling/scalingAction.sh delete mode 100644 docs-source/content/wccontent-domains/adminguide/configure-load-balancer/apache.md delete mode 100644 docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-deploy1.png delete mode 100644 docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-deploy2.png delete mode 100644 docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-deploy3.png delete mode 100644 docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-gp-add-datasource.png delete mode 100644 docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-gp-import-json.png delete mode 100644 docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-service-discovery.png delete mode 100644 docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-test-url.png create mode 100644 docs-source/content/wccontent-domains/installguide/create-wccontent-domains/images/wcc-provider-ucm-ibr.png create mode 100644 docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/nginx.md create mode 100644 docs-source/content/wccontent-domains/oracle-cloud/configure-mount-share.md create mode 100644 docs-source/content/wccontent-domains/oracle-cloud/create-wccontent-domains/images/oke-wcc-provider-ucm-ibr.png diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/Chart.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/Chart.yaml old mode 100755 new mode 100644 similarity index 100% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/Chart.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/Chart.yaml diff --git a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/templates/nginx-ingress.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/templates/nginx-ingress.yaml new file mode 100644 index 000000000..46ec33313 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/templates/nginx-ingress.yaml @@ -0,0 +1,155 @@ +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- if eq .Values.type "NGINX" }} +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ .Values.wlsDomain.domainUID }}-nginx + namespace: {{ .Release.Namespace }} + + annotations: + kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/affinity: "cookie" + nginx.ingress.kubernetes.io/affinity-mode: persistent +{{- if eq .Values.tls "SSL" }} + nginx.ingress.kubernetes.io/configuration-snippet: | + more_set_input_headers "X-Forwarded-Proto: https"; + more_set_input_headers "WL-Proxy-SSL: true"; + nginx.ingress.kubernetes.io/ingress.allow-http: "false" +{{- end }} +spec: + rules: + - host: '{{ .Values.nginx.hostname }}' + http: + paths: + - path: /console + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.adminServerPort }} + - path: /em + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.adminServerPort }} + - path: /wls-exporter + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.adminServerPort }} + - path: /cs + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /adfAuthentication + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /_ocsh + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /_dav + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /idcws + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /idcnativews + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /wsm-pm + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /ibr + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ibrClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ibrManagedServerPort }} + - path: /ibr/adfAuthentication + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ibrClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ibrManagedServerPort }} + - path: /weblogic/ready + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /imaging + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ipmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ipmManagedServerPort }} + - path: /dc-console + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.captureClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.captureManagedServerPort }} + - path: /dc-client + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.captureClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.captureManagedServerPort }} + - path: /wcc + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.wccadfClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.wccadfManagedServerPort }} + +{{- if eq .Values.tls "SSL" }} + tls: + - hosts: + - '{{ .Values.nginx.hostnameorip }}' + secretName: domain1-tls-cert +{{- end }} + +{{- end }} + diff --git a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/templates/traefik-ingress.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/templates/traefik-ingress.yaml new file mode 100644 index 000000000..e62fadbe4 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/templates/traefik-ingress.yaml @@ -0,0 +1,153 @@ +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- if eq .Values.type "TRAEFIK" }} +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: {{ .Values.wlsDomain.domainUID }}-traefik + namespace: {{ .Release.Namespace }} + labels: + weblogic.resourceVersion: domain-v2 + annotations: + kubernetes.io/ingress.class: traefik +{{- if eq .Values.tls "SSL" }} + traefik.ingress.kubernetes.io/router.entrypoints: websecure + traefik.ingress.kubernetes.io/router.tls: "true" + traefik.ingress.kubernetes.io/router.middlewares: wccns-wls-proxy-ssl@kubernetescrd +{{- end }} +spec: + rules: + - host: '{{ .Values.traefik.hostname }}' + http: + paths: + - path: /console + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.adminServerPort }} + - path: /em + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.adminServerPort }} + - path: /wls-exporter + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.adminServerPort }} + - path: /cs + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /adfAuthentication + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /_ocsh + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /_dav + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /idcws + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /idcnativews + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /wsm-pm + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /ibr + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ibrClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ibrManagedServerPort }} + - path: /ibr/adfAuthentication + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ibrClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ibrManagedServerPort }} + - path: /weblogic/ready + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ucmManagedServerPort }} + - path: /imaging + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ipmClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.ipmManagedServerPort }} + - path: /dc-console + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.captureClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.captureManagedServerPort }} + - path: /dc-client + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.captureClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.captureManagedServerPort }} + - path: /wcc + pathType: ImplementationSpecific + backend: + service: + name: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.wccadfClusterName | lower | replace "_" "-" }}' + port: + number: {{ .Values.wlsDomain.wccadfManagedServerPort }} + +{{- if eq .Values.tls "SSL" }} + tls: + - hosts: + - '{{ .Values.traefik.hostnameorip }}' + secretName: domain1-tls-cert +{{- end }} + +{{- end }} + diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-admin-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-admin-tls.yaml old mode 100755 new mode 100644 similarity index 65% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-admin-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-admin-tls.yaml index c6f448a3b..490664ace --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-admin-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-admin-tls.yaml @@ -1,8 +1,8 @@ -# Copyright (c) 2021, Oracle and/or its affiliates. +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wcc-admin-ingress @@ -20,8 +20,11 @@ spec: http: paths: - path: + pathType: ImplementationSpecific backend: - serviceName: wccinfra-adminserver-nginx-ssl - servicePort: 7002 + service: + name: wccinfra-adminserver-nginx-ssl + port: + number: 7002 diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-capture-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-capture-tls.yaml old mode 100755 new mode 100644 similarity index 64% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-capture-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-capture-tls.yaml index 7aa3f4d34..ecb428a19 --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-capture-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-capture-tls.yaml @@ -1,8 +1,8 @@ -# Copyright (c) 2022, Oracle and/or its affiliates. +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wcc-capture-ingress @@ -20,8 +20,11 @@ spec: http: paths: - path: + pathType: ImplementationSpecific backend: - serviceName: wccinfra-cluster-capture-cluster - servicePort: 16401 + service: + name: wccinfra-cluster-capture-cluster + port: + number: 16401 diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-ibr-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ibr-tls.yaml old mode 100755 new mode 100644 similarity index 64% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-ibr-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ibr-tls.yaml index 281014f29..a6a713b4f --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-ibr-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ibr-tls.yaml @@ -1,8 +1,8 @@ -# Copyright (c) 2021, Oracle and/or its affiliates. +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wcc-ibr-ingress @@ -20,8 +20,11 @@ spec: http: paths: - path: + pathType: ImplementationSpecific backend: - serviceName: wccinfra-cluster-ibr-cluster - servicePort: 16251 + service: + name: wccinfra-cluster-ibr-cluster + port: + number: 16251 diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-ipm-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ipm-tls.yaml old mode 100755 new mode 100644 similarity index 65% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-ipm-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ipm-tls.yaml index d16320cf9..d317f31a4 --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-ipm-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ipm-tls.yaml @@ -1,8 +1,8 @@ -# Copyright (c) 2022, Oracle and/or its affiliates. +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wcc-ipm-ingress @@ -20,8 +20,11 @@ spec: http: paths: - path: + pathType: ImplementationSpecific backend: - serviceName: wccinfra-cluster-ipm-cluster - servicePort: 16001 + service: + name: wccinfra-cluster-ipm-cluster + port: + number: 16001 diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-ucm-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ucm-tls.yaml old mode 100755 new mode 100644 similarity index 63% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-ucm-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ucm-tls.yaml index c61fab0d6..09b516d2f --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-ucm-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ucm-tls.yaml @@ -1,8 +1,8 @@ -# Copyright (c) 2021, Oracle and/or its affiliates. +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wcc-ucm-ingress @@ -20,8 +20,12 @@ spec: http: paths: - path: + pathType: ImplementationSpecific backend: - serviceName: wccinfra-cluster-ucm-cluster - servicePort: 16201 + service: + name: wccinfra-cluster-ucm-cluster + port: + number: 16201 + diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-wccadf-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-wccadf-tls.yaml old mode 100755 new mode 100644 similarity index 64% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-wccadf-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-wccadf-tls.yaml index 4c2f92252..9cf9e86d8 --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/nginx-wccadf-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-wccadf-tls.yaml @@ -1,8 +1,8 @@ -# Copyright (c) 2022, Oracle and/or its affiliates. +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wcc-wccadf-ingress @@ -20,8 +20,11 @@ spec: http: paths: - path: + pathType: ImplementationSpecific backend: - serviceName: wccinfra-cluster-wccadf-cluster - servicePort: 16226 + service: + name: wccinfra-cluster-wccadf-cluster + port: + number: 16226 diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-admin-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-admin-tls.yaml old mode 100755 new mode 100644 similarity index 100% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-admin-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-admin-tls.yaml diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-capture-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-capture-tls.yaml old mode 100755 new mode 100644 similarity index 89% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-capture-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-capture-tls.yaml index 462294d91..2ad361af4 --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-capture-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-capture-tls.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Oracle and/or its affiliates. +# Copyright (c) 2021, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-ibr-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ibr-tls.yaml old mode 100755 new mode 100644 similarity index 100% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-ibr-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ibr-tls.yaml diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-ipm-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ipm-tls.yaml old mode 100755 new mode 100644 similarity index 89% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-ipm-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ipm-tls.yaml index de91cd423..8a4296c79 --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-ipm-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ipm-tls.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Oracle and/or its affiliates. +# Copyright (c) 2021, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-ucm-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ucm-tls.yaml old mode 100755 new mode 100644 similarity index 100% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-ucm-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ucm-tls.yaml diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-wccadf-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-wccadf-tls.yaml old mode 100755 new mode 100644 similarity index 89% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-wccadf-tls.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-wccadf-tls.yaml index a5fca0995..3e57366bd --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/tls/traefik-wccadf-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-wccadf-tls.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2022, Oracle and/or its affiliates. +# Copyright (c) 2021, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/values.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/values.yaml old mode 100755 new mode 100644 similarity index 94% rename from OracleWebCenterContent/kubernetes/ingress-per-domain/values.yaml rename to OracleWebCenterContent/kubernetes/charts/ingress-per-domain/values.yaml index 77d69ddd3..937516d33 --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/values.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/values.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2021, 2022, Oracle and/or its affiliates. +# Copyright (c) 2021, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # Default values for ingress-per-domain. diff --git a/OracleWebCenterContent/kubernetes/charts/traefik/values.yaml b/OracleWebCenterContent/kubernetes/charts/traefik/values.yaml index 6754ecb18..f680d34e3 100755 --- a/OracleWebCenterContent/kubernetes/charts/traefik/values.yaml +++ b/OracleWebCenterContent/kubernetes/charts/traefik/values.yaml @@ -1,9 +1,9 @@ -# Copyright (c) 2021, Oracle and/or its affiliates. +# Copyright (c) 2020, 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. - +# image: name: traefik - tag: 2.2.8 + tag: 2.6.0 pullPolicy: IfNotPresent ingressRoute: dashboard: @@ -45,9 +45,11 @@ ports: port: 8443 # # hostPort: 8443 expose: true - exposedPort: 30443 - + exposedPort: 30443 # The port protocol (TCP/UDP) protocol: TCP - nodePort: 30443 - + nodePort: 30443 +additionalArguments: + - "--log.level=INFO" + + diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/.helmignore b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/.helmignore new file mode 100644 index 000000000..1397cc19f --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/.helmignore @@ -0,0 +1,12 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +.git/ +.gitignore +*.bak +*.tmp +*.orig +*~ +.project +.idea/ diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/Chart.yaml b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/Chart.yaml new file mode 100644 index 000000000..5814294bf --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/Chart.yaml @@ -0,0 +1,10 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +apiVersion: v1 +name: weblogic-operator +description: Helm chart for configuring the WebLogic operator. + +type: application +version: 3.4.2 +appVersion: 3.4.2 diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_domain-namespaces.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_domain-namespaces.tpl new file mode 100644 index 000000000..08988c28d --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_domain-namespaces.tpl @@ -0,0 +1,134 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.domainNamespaces" }} +{{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +{{- $args := include "utils.cloneDictionary" . | fromYaml -}} +{{- $key := .Release.Namespace -}} +{{- $ignore := set $args "domainNamespace" $key -}} +{{- include "operator.operatorRoleBindingNamespace" $args -}} +{{- else if eq (default "List" .domainNamespaceSelectionStrategy) "List" }} +{{- $args := include "utils.cloneDictionary" . | fromYaml -}} +{{- range $key := $args.domainNamespaces -}} +{{- $ignore := set $args "domainNamespace" $key -}} +{{- include "operator.operatorRoleBindingNamespace" $args -}} +{{- end }} +{{- else if eq .domainNamespaceSelectionStrategy "LabelSelector" }} +{{- $args := include "utils.cloneDictionary" . | fromYaml -}} +{{- /* + Split terms on commas not contained in parentheses. Unfortunately, the regular expression + support included with Helm templates does not include lookarounds. +*/ -}} +{{- $working := dict "rejected" (list) "terms" (list $args.domainNamespaceLabelSelector) }} +{{- if contains "," $args.domainNamespaceLabelSelector }} +{{- $cs := regexSplit "," $args.domainNamespaceLabelSelector -1 }} +{{- $ignore := set $working "st" (list) }} +{{- $ignore := set $working "item" "" }} +{{- range $c := $cs }} +{{- if and (contains "(" $c) (not (contains ")" $c)) }} +{{- $ignore := set $working "item" (print $working.item $c) }} +{{- else if not (eq $working.item "") }} +{{- $ignore := set $working "st" (append $working.st (print $working.item "," $c)) }} +{{- if contains ")" $c }} +{{- $ignore := set $working "item" "" }} +{{- end }} +{{- else }} +{{- $ignore := set $working "st" (append $working.st $c) }} +{{- end }} +{{- end }} +{{- $ignore := set $working "terms" $working.st }} +{{- end }} +{{- $namespaces := (lookup "v1" "Namespace" "" "").items }} +{{- range $t := $working.terms }} +{{- $term := trim $t }} +{{- range $index, $namespace := $namespaces }} +{{- /* + Label selector patterns + Equality-based: =, ==, != + Set-based: x in (a, b), x notin (a, b) + Existence: x, !x +*/ -}} +{{- if not $namespace.metadata.labels }} +{{- $ignore := set $namespace.metadata "labels" (dict) }} +{{- end }} +{{- if hasPrefix "!" $term }} +{{- if hasKey $namespace.metadata.labels (trimPrefix "!" $term) }} +{{- $ignore := set $working "rejected" (append $working.rejected $namespace.metadata.name) }} +{{- end }} +{{- else if contains "!=" $term }} +{{- $split := regexSplit "!=" $term 2 }} +{{- $key := nospace (first $split) }} +{{- if hasKey $namespace.metadata.labels $key }} +{{- if eq (last $split | nospace) (get $namespace.metadata.labels $key) }} +{{- $ignore := set $working "rejected" (append $working.rejected $namespace.metadata.name) }} +{{- end }} +{{- end }} +{{- else if contains "==" $term }} +{{- $split := regexSplit "==" $term 2 }} +{{- $key := nospace (first $split) }} +{{- if or (not (hasKey $namespace.metadata.labels $key)) (not (eq (last $split | nospace) (get $namespace.metadata.labels $key))) }} +{{- $ignore := set $working "rejected" (append $working.rejected $namespace.metadata.name) }} +{{- end }} +{{- else if contains "=" $term }} +{{- $split := regexSplit "=" $term 2 }} +{{- $key := nospace (first $split) }} +{{- if or (not (hasKey $namespace.metadata.labels $key)) (not (eq (last $split | nospace) (get $namespace.metadata.labels $key))) }} +{{- $ignore := set $working "rejected" (append $working.rejected $namespace.metadata.name) }} +{{- end }} +{{- else if contains " notin " $term }} +{{- $split := regexSplit " notin " $term 2 }} +{{- $key := nospace (first $split) }} +{{- if hasKey $namespace.metadata.labels $key }} +{{- $second := nospace (last $split) }} +{{- $parenContents := substr 1 (int (sub (len $second) 1)) $second }} +{{- $values := regexSplit "," $parenContents -1 }} +{{- range $value := $values }} +{{- if eq ($value | nospace) (get $namespace.metadata.labels $key) }} +{{- $ignore := set $working "rejected" (append $working.rejected $namespace.metadata.name) }} +{{- end }} +{{- end }} +{{- end }} +{{- else if contains " in " $term }} +{{- $split := regexSplit " in " $term 2 }} +{{- $key := nospace (first $split) }} +{{- if not (hasKey $namespace.metadata.labels $key) }} +{{- $ignore := set $working "rejected" (append $working.rejected $namespace.metadata.name) }} +{{- else }} +{{- $second := nospace (last $split) }} +{{- $parenContents := substr 1 (int (sub (len $second) 1)) $second }} +{{- $values := regexSplit "," $parenContents -1 }} +{{- $ignore := set $working "found" false }} +{{- range $value := $values }} +{{- if eq ($value | nospace) (get $namespace.metadata.labels $key) }} +{{- $ignore := set $working "found" true }} +{{- end }} +{{- end }} +{{- if not $working.found }} +{{- $ignore := set $working "rejected" (append $working.rejected $namespace.metadata.name) }} +{{- end }} +{{- end }} +{{- else }} +{{- if not (hasKey $namespace.metadata.labels $term) }} +{{- $ignore := set $working "rejected" (append $working.rejected $namespace.metadata.name) }} +{{- end }} +{{- end }} +{{- end }} +{{- end }} +{{- range $index, $namespace := $namespaces }} +{{- $key := $namespace.metadata.name -}} +{{- if not (has $key $working.rejected) }} +{{- $ignore := set $args "domainNamespace" $key -}} +{{- include "operator.operatorRoleBindingNamespace" $args -}} +{{- end }} +{{- end }} +{{- else if eq .domainNamespaceSelectionStrategy "RegExp" }} +{{- $args := include "utils.cloneDictionary" . | fromYaml -}} +{{- range $index, $namespace := (lookup "v1" "Namespace" "" "").items }} +{{- if regexMatch $args.domainNamespaceRegExp $namespace.metadata.name }} +{{- $key := $namespace.metadata.name -}} +{{- $ignore := set $args "domainNamespace" $key -}} +{{- include "operator.operatorRoleBindingNamespace" $args -}} +{{- end }} +{{- end }} +{{- end }} +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-domain-admin.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-domain-admin.tpl new file mode 100644 index 000000000..94cab9df7 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-domain-admin.tpl @@ -0,0 +1,40 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorClusterRoleDomainAdmin" }} +--- +{{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +kind: "Role" +{{- else }} +kind: "ClusterRole" +{{- end }} +apiVersion: "rbac.authorization.k8s.io/v1" +metadata: + {{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} + name: "weblogic-operator-role-domain-admin" + namespace: {{ .Release.Namespace | quote }} + {{- else }} + name: {{ list .Release.Namespace "weblogic-operator-clusterrole-domain-admin" | join "-" | quote }} + {{- end }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +rules: +- apiGroups: [""] + resources: ["configmaps"] + verbs: ["get", "list", "watch", "create", "update", "patch", "delete", "deletecollection"] +- apiGroups: [""] + resources: ["secrets", "pods", "events"] + verbs: ["get", "list", "watch"] +- apiGroups: [""] + resources: ["pods/log"] + verbs: ["get", "list"] +- apiGroups: [""] + resources: ["pods/exec"] + verbs: ["get", "create"] +- apiGroups: ["weblogic.oracle"] + resources: ["domains"] + verbs: ["get", "list", "watch", "create", "update", "patch", "delete", "deletecollection"] +- apiGroups: ["weblogic.oracle"] + resources: ["domains/status"] + verbs: ["get", "watch"] +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-general.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-general.tpl new file mode 100644 index 000000000..2eba13b95 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-general.tpl @@ -0,0 +1,39 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorClusterRoleGeneral" }} +--- +{{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +kind: "Role" +{{- else }} +kind: "ClusterRole" +{{- end }} +apiVersion: "rbac.authorization.k8s.io/v1" +metadata: + {{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} + name: "weblogic-operator-role-general" + namespace: {{ .Release.Namespace | quote }} + {{- else }} + name: {{ list .Release.Namespace "weblogic-operator-clusterrole-general" | join "-" | quote }} + {{- end }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +rules: +{{- if not (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +- apiGroups: [""] + resources: ["namespaces"] + verbs: ["get", "list", "watch"] +- apiGroups: ["apiextensions.k8s.io"] + resources: ["customresourcedefinitions"] + verbs: ["get", "list", "watch", "create", "update", "patch"] +{{- end }} +- apiGroups: ["weblogic.oracle"] + resources: ["domains", "domains/status"] + verbs: ["get", "list", "watch", "update", "patch"] +- apiGroups: ["authentication.k8s.io"] + resources: ["tokenreviews"] + verbs: ["create"] +- apiGroups: ["authorization.k8s.io"] + resources: ["selfsubjectrulesreviews"] + verbs: ["create"] +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-namespace.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-namespace.tpl new file mode 100644 index 000000000..6310779bb --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-namespace.tpl @@ -0,0 +1,40 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorClusterRoleNamespace" }} +--- +{{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +kind: "Role" +{{- else }} +kind: "ClusterRole" +{{- end }} +apiVersion: "rbac.authorization.k8s.io/v1" +metadata: + {{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} + name: "weblogic-operator-role-namespace" + namespace: {{ .Release.Namespace | quote }} + {{- else }} + name: {{ list .Release.Namespace "weblogic-operator-clusterrole-namespace" | join "-" | quote }} + {{- end }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +rules: +- apiGroups: [""] + resources: ["services", "configmaps", "pods", "events"] + verbs: ["get", "list", "watch", "create", "update", "patch", "delete", "deletecollection"] +- apiGroups: [""] + resources: ["secrets"] + verbs: ["get", "list", "watch"] +- apiGroups: [""] + resources: ["pods/log"] + verbs: ["get", "list"] +- apiGroups: [""] + resources: ["pods/exec"] + verbs: ["get", "create"] +- apiGroups: ["batch"] + resources: ["jobs"] + verbs: ["get", "list", "watch", "create", "update", "patch", "delete", "deletecollection"] +- apiGroups: ["policy"] + resources: ["poddisruptionbudgets"] + verbs: ["get", "list", "watch", "create", "update", "patch", "delete", "deletecollection"] +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-nonresource.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-nonresource.tpl new file mode 100644 index 000000000..e3b6a2785 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-nonresource.tpl @@ -0,0 +1,15 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorClusterRoleNonResource" }} +--- +kind: "ClusterRole" +apiVersion: "rbac.authorization.k8s.io/v1" +metadata: + name: {{ list .Release.Namespace "weblogic-operator-clusterrole-nonresource" | join "-" | quote }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +rules: +- nonResourceURLs: ["/version/*"] + verbs: ["get"] +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-operator-admin.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-operator-admin.tpl new file mode 100644 index 000000000..46faed184 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrole-operator-admin.tpl @@ -0,0 +1,34 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorClusterRoleOperatorAdmin" }} +--- +{{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +kind: "Role" +{{- else }} +kind: "ClusterRole" +{{- end }} +apiVersion: "rbac.authorization.k8s.io/v1" +metadata: + {{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} + name: "weblogic-operator-role-operator-admin" + namespace: {{ .Release.Namespace | quote }} + {{- else }} + name: {{ list .Release.Namespace "weblogic-operator-clusterrole-operator-admin" | join "-" | quote }} + {{- end }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +rules: +- apiGroups: [""] + resources: ["configmaps", "secrets"] + verbs: ["get", "list", "watch", "create", "update", "patch", "delete", "deletecollection"] +- apiGroups: [""] + resources: ["pods", "events"] + verbs: ["get", "list", "watch"] +- apiGroups: [""] + resources: ["pods/log"] + verbs: ["get", "list"] +- apiGroups: [""] + resources: ["pods/exec"] + verbs: ["get", "create"] +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-auth-delegator.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-auth-delegator.tpl new file mode 100644 index 000000000..783f970e7 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-auth-delegator.tpl @@ -0,0 +1,30 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.clusterRoleBindingAuthDelegator" }} +--- +apiVersion: "rbac.authorization.k8s.io/v1" +{{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +kind: "RoleBinding" +{{- else }} +kind: "ClusterRoleBinding" +{{- end }} +metadata: + labels: + weblogic.operatorName: {{ .Release.Namespace | quote}} + {{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} + name: "weblogic-operator-rolebinding-auth-delegator" + namespace: {{ .Release.Namespace | quote }} + {{- else }} + name: {{ list .Release.Namespace "weblogic-operator-clusterrolebinding-auth-delegator" | join "-" | quote }} + {{- end }} +roleRef: + apiGroup: "rbac.authorization.k8s.io" + kind: "ClusterRole" + name: "system:auth-delegator" +subjects: +- kind: "ServiceAccount" + apiGroup: "" + name: {{ .serviceAccount | quote }} + namespace: {{ .Release.Namespace | quote }} +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-discovery.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-discovery.tpl new file mode 100644 index 000000000..48c505fa5 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-discovery.tpl @@ -0,0 +1,30 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.clusterRoleBindingDiscovery" }} +--- +apiVersion: "rbac.authorization.k8s.io/v1" +{{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +kind: "RoleBinding" +{{- else }} +kind: "ClusterRoleBinding" +{{- end }} +metadata: + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} + {{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} + name: "weblogic-operator-rolebinding-discovery" + namespace: {{ .Release.Namespace | quote }} + {{- else }} + name: {{ list .Release.Namespace "weblogic-operator-clusterrolebinding-discovery" | join "-" | quote }} + {{- end }} +roleRef: + apiGroup: "rbac.authorization.k8s.io" + kind: "ClusterRole" + name: "system:discovery" +subjects: +- kind: "ServiceAccount" + apiGroup: "" + name: {{ .serviceAccount | quote }} + namespace: {{ .Release.Namespace | quote }} +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-general.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-general.tpl new file mode 100644 index 000000000..f2994da33 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-general.tpl @@ -0,0 +1,35 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.clusterRoleBindingGeneral" }} +--- +apiVersion: "rbac.authorization.k8s.io/v1" +{{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +kind: "RoleBinding" +{{- else }} +kind: "ClusterRoleBinding" +{{- end }} +metadata: + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} + {{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} + name: "weblogic-operator-rolebinding-general" + namespace: {{ .Release.Namespace | quote }} + {{- else }} + name: {{ list .Release.Namespace "weblogic-operator-clusterrolebinding-general" | join "-" | quote }} + {{- end }} +roleRef: + apiGroup: "rbac.authorization.k8s.io" + {{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} + kind: "Role" + name: "weblogic-operator-role-general" + {{- else }} + kind: "ClusterRole" + name: {{ list .Release.Namespace "weblogic-operator-clusterrole-general" | join "-" | quote }} + {{- end }} +subjects: +- kind: "ServiceAccount" + apiGroup: "" + name: {{ .serviceAccount | quote }} + namespace: {{ .Release.Namespace | quote }} +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-nonresource.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-nonresource.tpl new file mode 100644 index 000000000..d998ab0e9 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-clusterrolebinding-nonresource.tpl @@ -0,0 +1,21 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.clusterRoleBindingNonResource" }} +--- +apiVersion: "rbac.authorization.k8s.io/v1" +kind: "ClusterRoleBinding" +metadata: + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} + name: {{ list .Release.Namespace "weblogic-operator-clusterrolebinding-nonresource" | join "-" | quote }} +roleRef: + apiGroup: "rbac.authorization.k8s.io" + kind: "ClusterRole" + name: {{ list .Release.Namespace "weblogic-operator-clusterrole-nonresource" | join "-" | quote }} +subjects: +- kind: "ServiceAccount" + apiGroup: "" + name: {{ .serviceAccount | quote }} + namespace: {{ .Release.Namespace | quote }} +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-cm.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-cm.tpl new file mode 100644 index 000000000..8f7f2ff51 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-cm.tpl @@ -0,0 +1,70 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorConfigMap" }} +--- +apiVersion: "v1" +data: + {{- if .externalRestEnabled }} + {{- if (hasKey . "externalRestIdentitySecret") }} + externalRestIdentitySecret: {{ .externalRestIdentitySecret | quote }} + {{- else }} + externalOperatorCert: {{ .externalOperatorCert | quote }} + {{- end }} + {{- end }} + {{- $configmap := (lookup "v1" "ConfigMap" .Release.Namespace "weblogic-operator-cm") }} + {{- if (and $configmap $configmap.data) }} + {{- $internalOperatorCert := index $configmap.data "internalOperatorCert" }} + {{- if $internalOperatorCert }} + internalOperatorCert: {{ $internalOperatorCert }} + {{- end }} + {{- end }} + serviceaccount: {{ .serviceAccount | quote }} + domainNamespaceSelectionStrategy: {{ (default "List" .domainNamespaceSelectionStrategy) | quote }} + domainNamespaces: {{ .domainNamespaces | uniq | sortAlpha | join "," | quote }} + {{- if .dedicated }} + dedicated: {{ .dedicated | quote }} + {{- end }} + {{- if .domainNamespaceLabelSelector }} + domainNamespaceLabelSelector: {{ .domainNamespaceLabelSelector | quote }} + {{- end }} + {{- if .domainNamespaceRegExp }} + domainNamespaceRegExp: {{ .domainNamespaceRegExp | quote }} + {{- end }} + {{- if .dns1123Fields }} + dns1123Fields: {{ .dns1123Fields | quote }} + {{- end }} + {{- if .featureGates }} + featureGates: {{ .featureGates | quote }} + {{- end }} + {{- if .introspectorJobNameSuffix }} + introspectorJobNameSuffix: {{ .introspectorJobNameSuffix | quote }} + {{- end }} + {{- if .externalServiceNameSuffix }} + externalServiceNameSuffix: {{ .externalServiceNameSuffix | quote }} + {{- end }} + {{- if .clusterSizePaddingValidationEnabled }} + clusterSizePaddingValidationEnabled: {{ .clusterSizePaddingValidationEnabled | quote }} + {{- end }} + {{- if .tokenReviewAuthentication }} + tokenReviewAuthentication: {{ .tokenReviewAuthentication | quote }} + {{- end }} + {{- if (hasKey . "istioLocalhostBindingsEnabled") }} + istioLocalhostBindingsEnabled: {{ .istioLocalhostBindingsEnabled | quote }} + {{- end }} + {{- if .kubernetesPlatform }} + kubernetesPlatform: {{ .kubernetesPlatform | quote }} + {{- end }} + {{- if .domainPresenceFailureRetryMaxCount }} + domainPresenceFailureRetryMaxCount: {{ .domainPresenceFailureRetryMaxCount | quote }} + {{- end }} + {{- if .domainPresenceFailureRetrySeconds }} + domainPresenceFailureRetrySeconds: {{ .domainPresenceFailureRetrySeconds | quote }} + {{- end }} +kind: "ConfigMap" +metadata: + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} + name: "weblogic-operator-cm" + namespace: {{ .Release.Namespace | quote }} +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl new file mode 100644 index 000000000..6faacc095 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-dep.tpl @@ -0,0 +1,164 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorDeployment" }} +--- +apiVersion: "apps/v1" +kind: "Deployment" +metadata: + name: "weblogic-operator" + namespace: {{ .Release.Namespace | quote }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +spec: + strategy: + type: Recreate + selector: + matchLabels: + weblogic.operatorName: {{ .Release.Namespace | quote }} + replicas: 1 + template: + metadata: + {{- with .annotations }} + annotations: + {{- end }} + {{- range $key, $value := .annotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} + app: "weblogic-operator" + {{- range $key, $value := .labels }} + {{ $key }}: {{ $value | quote }} + {{- end }} + spec: + serviceAccountName: {{ .serviceAccount | quote }} + {{- if .runAsUser }} + securityContext: + runAsUser: {{ .runAsUser }} + {{- end }} + {{- with .nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: "weblogic-operator" + image: {{ .image | quote }} + imagePullPolicy: {{ .imagePullPolicy | quote }} + command: ["bash"] + args: ["/operator/operator.sh"] + env: + - name: "OPERATOR_NAMESPACE" + valueFrom: + fieldRef: + fieldPath: "metadata.namespace" + - name: "OPERATOR_POD_NAME" + valueFrom: + fieldRef: + fieldPath: "metadata.name" + - name: "OPERATOR_POD_UID" + valueFrom: + fieldRef: + fieldPath: "metadata.uid" + - name: "OPERATOR_VERBOSE" + value: "false" + - name: "JAVA_LOGGING_LEVEL" + value: {{ .javaLoggingLevel | quote }} + - name: "KUBERNETES_PLATFORM" + value: {{ .kubernetesPlatform | quote }} + - name: "JAVA_LOGGING_MAXSIZE" + value: {{ .javaLoggingFileSizeLimit | default 20000000 | quote }} + - name: "JAVA_LOGGING_COUNT" + value: {{ .javaLoggingFileCount | default 10 | quote }} + {{- if .remoteDebugNodePortEnabled }} + - name: "REMOTE_DEBUG_PORT" + value: {{ .internalDebugHttpPort | quote }} + - name: "DEBUG_SUSPEND" + {{- if .suspendOnDebugStartup }} + value: "y" + {{- else }} + value: "n" + {{- end }} + {{- end }} + {{- if .mockWLS }} + - name: "MOCK_WLS" + value: "true" + {{- end }} + resources: + requests: + cpu: {{ .cpuRequests | default "250m" }} + memory: {{ .memoryRequests | default "512Mi" }} + limits: + {{- if .cpuLimits}} + cpu: {{ .cpuLimits }} + {{- end }} + {{- if .memoryLimits}} + memory: {{ .memoryLimits }} + {{- end }} + volumeMounts: + - name: "weblogic-operator-cm-volume" + mountPath: "/operator/config" + - name: "weblogic-operator-debug-cm-volume" + mountPath: "/operator/debug-config" + - name: "weblogic-operator-secrets-volume" + mountPath: "/operator/secrets" + readOnly: true + {{- if .elkIntegrationEnabled }} + - mountPath: "/logs" + name: "log-dir" + readOnly: false + {{- end }} + {{- if not .remoteDebugNodePortEnabled }} + livenessProbe: + exec: + command: + - "bash" + - "/operator/livenessProbe.sh" + initialDelaySeconds: 40 + periodSeconds: 5 + readinessProbe: + exec: + command: + - "bash" + - "/operator/readinessProbe.sh" + initialDelaySeconds: 2 + periodSeconds: 10 + {{- end }} + {{- if .elkIntegrationEnabled }} + - name: "logstash" + image: {{ .logStashImage | quote }} + args: [ "-f", "/logs/logstash.conf" ] + volumeMounts: + - name: "log-dir" + mountPath: "/logs" + env: + - name: "ELASTICSEARCH_HOST" + value: {{ .elasticSearchHost | quote }} + - name: "ELASTICSEARCH_PORT" + value: {{ .elasticSearchPort | quote }} + {{- end }} + {{- if .imagePullSecrets }} + imagePullSecrets: + {{ .imagePullSecrets | toYaml }} + {{- end }} + volumes: + - name: "weblogic-operator-cm-volume" + configMap: + name: "weblogic-operator-cm" + - name: "weblogic-operator-debug-cm-volume" + configMap: + name: "weblogic-operator-debug-cm" + optional: true + - name: "weblogic-operator-secrets-volume" + secret: + secretName: "weblogic-operator-secrets" + {{- if .elkIntegrationEnabled }} + - name: "log-dir" + emptyDir: + medium: "Memory" + {{- end }} +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-external-svc.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-external-svc.tpl new file mode 100644 index 000000000..18b0876a9 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-external-svc.tpl @@ -0,0 +1,32 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorExternalService" }} +{{- if or .externalRestEnabled .remoteDebugNodePortEnabled }} +--- +apiVersion: "v1" +kind: "Service" +metadata: + name: "external-weblogic-operator-svc" + namespace: {{ .Release.Namespace | quote }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +spec: + type: "NodePort" + selector: + app: "weblogic-operator" + ports: + {{- if .externalRestEnabled }} + - name: "rest" + port: 8081 + appProtocol: https + nodePort: {{ .externalRestHttpsPort }} + {{- end }} + {{- if .remoteDebugNodePortEnabled }} + - name: "debug" + port: {{ .internalDebugHttpPort }} + appProtocol: http + nodePort: {{ .externalDebugHttpPort }} + {{- end }} +{{- end }} +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-internal-svc.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-internal-svc.tpl new file mode 100644 index 000000000..b03aa8aee --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-internal-svc.tpl @@ -0,0 +1,21 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorInternalService" }} +--- +apiVersion: "v1" +kind: "Service" +metadata: + name: "internal-weblogic-operator-svc" + namespace: {{ .Release.Namespace | quote }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +spec: + type: "ClusterIP" + selector: + app: "weblogic-operator" + ports: + - port: 8082 + name: "rest" + appProtocol: https +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-role.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-role.tpl new file mode 100644 index 000000000..e0c386b98 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-role.tpl @@ -0,0 +1,17 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorRole" }} +--- +kind: "Role" +apiVersion: "rbac.authorization.k8s.io/v1" +metadata: + name: "weblogic-operator-role" + namespace: {{ .Release.Namespace | quote }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +rules: +- apiGroups: [""] + resources: ["events", "secrets", "configmaps"] + verbs: ["get", "list", "watch", "create", "update", "patch", "delete", "deletecollection"] +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding-namespace.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding-namespace.tpl new file mode 100644 index 000000000..d55ed3f47 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding-namespace.tpl @@ -0,0 +1,35 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorRoleBindingNamespace" }} +--- +{{- if .enableClusterRoleBinding }} +kind: "ClusterRoleBinding" +{{- else }} +kind: "RoleBinding" +{{- end }} +apiVersion: "rbac.authorization.k8s.io/v1" +metadata: + {{- if .enableClusterRoleBinding }} + name: {{ list .Release.Namespace "weblogic-operator-clusterrolebinding-namespace" | join "-" | quote }} + {{- else }} + name: "weblogic-operator-rolebinding-namespace" + namespace: {{ .domainNamespace | quote }} + {{- end }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +subjects: +- kind: "ServiceAccount" + name: {{ .serviceAccount | quote }} + namespace: {{ .Release.Namespace | quote }} + apiGroup: "" +roleRef: + {{- if (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} + kind: "Role" + name: "weblogic-operator-role-namespace" + {{- else }} + kind: "ClusterRole" + name: {{ list .Release.Namespace "weblogic-operator-clusterrole-namespace" | join "-" | quote }} + {{- end }} + apiGroup: "rbac.authorization.k8s.io" +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding.tpl new file mode 100644 index 000000000..98a09424e --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-rolebinding.tpl @@ -0,0 +1,22 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorRoleBinding" }} +--- +kind: "RoleBinding" +apiVersion: "rbac.authorization.k8s.io/v1" +metadata: + name: "weblogic-operator-rolebinding" + namespace: {{ .Release.Namespace | quote }} + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} +subjects: +- kind: "ServiceAccount" + name: {{ .serviceAccount | quote }} + namespace: {{ .Release.Namespace | quote }} + apiGroup: "" +roleRef: + kind: "Role" + name: "weblogic-operator-role" + apiGroup: "rbac.authorization.k8s.io" +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-secret.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-secret.tpl new file mode 100644 index 000000000..6a7442718 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator-secret.tpl @@ -0,0 +1,25 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operatorSecrets" }} +--- +apiVersion: "v1" +kind: "Secret" +data: + {{- if (and .externalRestEnabled (hasKey . "externalOperatorKey")) }} + externalOperatorKey: {{ .externalOperatorKey | quote }} + {{- end }} + {{- $secret := (lookup "v1" "Secret" .Release.Namespace "weblogic-operator-secrets") }} + {{- if (and $secret $secret.data) }} + {{- $internalOperatorKey := index $secret.data "internalOperatorKey" }} + {{- if $internalOperatorKey }} + internalOperatorKey: {{ $internalOperatorKey }} + {{- end }} + {{- end }} +metadata: + labels: + weblogic.operatorName: {{ .Release.Namespace | quote }} + name: "weblogic-operator-secrets" + namespace: {{ .Release.Namespace | quote }} +type: "Opaque" +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator.tpl new file mode 100644 index 000000000..c24d7eebf --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_operator.tpl @@ -0,0 +1,30 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.operator" -}} +{{- include "operator.operatorClusterRoleGeneral" . }} +{{- include "operator.operatorClusterRoleNamespace" . }} +{{- if not (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +{{- include "operator.operatorClusterRoleNonResource" . }} +{{- end }} +{{- include "operator.operatorClusterRoleOperatorAdmin" . }} +{{- include "operator.operatorClusterRoleDomainAdmin" . }} +{{- include "operator.clusterRoleBindingGeneral" . }} +{{- include "operator.clusterRoleBindingAuthDelegator" . }} +{{- include "operator.clusterRoleBindingDiscovery" . }} +{{- if not (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +{{- include "operator.clusterRoleBindingNonResource" . }} +{{- end }} +{{- include "operator.operatorRole" . }} +{{- include "operator.operatorRoleBinding" . }} +{{- include "operator.operatorConfigMap" . }} +{{- include "operator.operatorSecrets" . }} +{{- include "operator.operatorDeployment" . }} +{{- include "operator.operatorInternalService" . }} +{{- include "operator.operatorExternalService" . }} +{{- if .enableClusterRoleBinding }} +{{- include "operator.operatorRoleBindingNamespace" . }} +{{- else }} +{{- include "operator.domainNamespaces" . }} +{{- end }} +{{- end }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_utils.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_utils.tpl new file mode 100644 index 000000000..9f2ed825c --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_utils.tpl @@ -0,0 +1,493 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{/* +Start validation +*/}} +{{- define "utils.startValidation" -}} +{{- $scope := . -}} +{{- $context := dict "scope" $scope "path" list -}} +{{- $stack := list $context -}} +{{- $ignore := set $scope "validationContextStack" $stack -}} +{{- $ignore := include "utils.setCurrentValidationContext" $scope -}} +{{- end -}} + +{{/* +End validation +If there were any validation errors, report them and kill the helm chart installation. +*/}} +{{- define "utils.endValidation" -}} +{{- $scope := . -}} +{{- if hasKey $scope "validationErrors" -}} +{{- fail $scope.validationErrors -}} +{{- end -}} +{{- end -}} + +{{/* +Push a new validation context +*/}} +{{- define "utils.pushValidationContext" -}} +{{- $scope := index . 0 }} +{{- $scopeName := index . 1 }} +{{- $newScope := index $scope.validationScope $scopeName -}} +{{- $newPath := append $scope.validationPath $scopeName -}} +{{- $newContext := dict "scope" $newScope "path" $newPath -}} +{{- $newStack := append $scope.validationContextStack $newContext -}} +{{- $ignore := set $scope "validationContextStack" $newStack -}} +{{- $ignore := include "utils.setCurrentValidationContext" $scope -}} +{{- end -}} + +{{/* +Pop the validation context +*/}} +{{- define "utils.popValidationContext" -}} +{{- $scope := . }} +{{- $stack := $scope.validationContextStack -}} +{{- $ignore := set $scope "validationContextStack" (initial $stack) -}} +{{- $ignore := include "utils.setCurrentValidationContext" $scope -}} +{{- end -}} + +{{/* +Set the current validation context from the stack +*/}} +{{- define "utils.setCurrentValidationContext" -}} +{{- $scope := . }} +{{- $context := $scope.validationContextStack | last -}} +{{- $ignore := set $scope "validationScope" (index $context "scope") -}} +{{- $ignore := set $scope "validationPath" (index $context "path") -}} +{{- end -}} + +{{/* +Record a validation error (it will get reported later by utils.reportValidationErrors) +*/}} +{{- define "utils.recordValidationError" -}} +{{- $scope := index . 0 -}} +{{- $errorMsg := index . 1 -}} +{{- $path := $scope.validationPath -}} +{{- $pathStr := $path | join "." | trim -}} +{{- $scopedErrorMsg := (list "\n" $pathStr $errorMsg) | compact | join " " -}} +{{- if hasKey $scope "validationErrors" -}} +{{- $newValidationErrors := cat $scope.validationErrors $scopedErrorMsg -}} +{{- $ignore := set $scope "validationErrors" $newValidationErrors -}} +{{- else -}} +{{- $newValidationErrors := $scopedErrorMsg -}} +{{- $ignore := set $scope "validationErrors" $newValidationErrors -}} +{{- end -}} +{{- end -}} + +{{/* +Returns whether any errors have been reported +*/}} +{{- define "utils.haveValidationErrors" -}} +{{- if hasKey . "validationErrors" -}} + true +{{- end -}} +{{- end -}} + +{{/* +Determine whether a dictionary has a non-null value for a key +*/}} +{{- define "utils.dictionaryHasNonNullValue" -}} +{{- $dict := index . 0 -}} +{{- $name := index . 1 -}} +{{- if and (hasKey $dict $name) (not ( eq (typeOf (index $dict $name)) "" )) -}} + true +{{- end -}} +{{- end -}} + +{{/* +Verify that a value of a specific kind has been specified. +*/}} +{{- define "utils.verifyValue" -}} +{{- $requiredKind := index . 0 -}} +{{- $scope := index . 1 -}} +{{- $name := index . 2 -}} +{{- $isRequired := index . 3 -}} +{{- if $scope.trace -}} +{{- $errorMsg := cat "TRACE" $name $requiredKind $isRequired -}} +{{- $ignore := include "utils.recordValidationError" (list $scope $errorMsg) -}} +{{- end -}} +{{- $parent := $scope.validationScope -}} +{{- if include "utils.dictionaryHasNonNullValue" (list $parent $name) -}} +{{- $value := index $parent $name -}} +{{- $actualKind := kindOf $value -}} +{{- if eq $requiredKind $actualKind -}} + true +{{- else -}} +{{- $errorMsg := cat $name "must be a" $requiredKind ":" $actualKind -}} +{{- include "utils.recordValidationError" (list $scope $errorMsg) -}} +{{- end -}} +{{- else -}} +{{- if $isRequired -}} +{{- $errorMsg := cat $requiredKind $name "must be specified" -}} +{{- include "utils.recordValidationError" (list $scope $errorMsg) -}} +{{- else -}} + true +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Verify that a list value has been specified +*/}} +{{- define "utils.verifyListValue" -}} +{{- $requiredKind := index . 0 -}} +{{- $scope := index . 1 -}} +{{- $name := index . 2 -}} +{{- $isRequired := index . 3 -}} +{{- $parent := $scope.validationScope -}} +{{- $args := . -}} +{{- if include "utils.verifyValue" (list "slice" $scope $name $isRequired) -}} +{{- $status := dict -}} +{{- if hasKey $parent $name -}} +{{- $list := index $parent $name -}} +{{- range $value := $list -}} +{{- $actualKind := kindOf $value -}} +{{- if not (eq $requiredKind $actualKind) -}} +{{- $errorMsg := cat $name "must only contain" $requiredKind "elements:" $actualKind -}} +{{- include "utils.recordValidationError" (list $scope $errorMsg) -}} +{{- $ignore := set $status "error" true -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- if not (hasKey $status "error") -}} + true +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Verify a string value +*/}} +{{- define "utils.baseVerifyString" -}} +{{- include "utils.verifyValue" (prepend . "string") -}} +{{- end -}} + +{{/* +Verify a required string value +*/}} +{{- define "utils.verifyString" -}} +{{- include "utils.baseVerifyString" (append . true) -}} +{{- end -}} + +{{/* +Verify an optional string value +*/}} +{{- define "utils.verifyOptionalString" -}} +{{- include "utils.baseVerifyString" (append . false) -}} +{{- end -}} + +{{/* +Verify a boolean value +*/}} +{{- define "utils.baseVerifyBoolean" -}} +{{- include "utils.verifyValue" (prepend . "bool") -}} +{{- end -}} + +{{/* +Verify a required boolean value +*/}} +{{- define "utils.verifyBoolean" -}} +{{- include "utils.baseVerifyBoolean" (append . true) -}} +{{- end -}} + +{{/* +Verify an optional boolean value +*/}} +{{- define "utils.verifyOptionalBoolean" -}} +{{- include "utils.baseVerifyBoolean" (append . false) -}} +{{- end -}} + +{{/* +Verify an integer value +*/}} +{{- define "utils.baseVerifyInteger" -}} +{{- include "utils.verifyValue" (prepend . "float64") -}} +{{- end -}} + +{{/* +Verify a required integer value +*/}} +{{- define "utils.verifyInteger" -}} +{{- include "utils.baseVerifyInteger" (append . true) -}} +{{- end -}} + +{{/* +Verify an optional required integer value +*/}} +{{- define "utils.verifyOptionalInteger" -}} +{{- include "utils.baseVerifyInteger" (append . false) -}} +{{- end -}} + +{{/* +Verify a dictionary value +*/}} +{{- define "utils.baseVerifyDictionary" -}} +{{- include "utils.verifyValue" (prepend . "map") -}} +{{- end -}} + +{{/* +Verify a required dictionary value +*/}} +{{- define "utils.verifyDictionary" -}} +{{- include "utils.baseVerifyDictionary" (append . true) -}} +{{- end -}} + +{{/* +Verify an optional dictionary value +*/}} +{{- define "utils.verifyOptionalDictionary" -}} +{{- include "utils.baseVerifyDictionary" (append . false) -}} +{{- end -}} + +{{/* +Verify a enum string value +*/}} +{{- define "utils.baseVerifyEnum" -}} +{{- $scope := index . 0 -}} +{{- $name := index . 1 -}} +{{- $legalValues := index . 2 -}} +{{- $isRequired := index . 3 -}} +{{- if include "utils.baseVerifyString" (list $scope $name $isRequired) -}} +{{- $parent := $scope.validationScope -}} +{{- if include "utils.dictionaryHasNonNullValue" (list $parent $name) -}} +{{- $value := index $parent $name -}} +{{- if has $value $legalValues -}} + true +{{- else -}} +{{ $errorMsg := cat $name "must be one of the following values" $legalValues ":" $value -}} +{{- include "utils.recordValidationError" (list $scope $errorMsg) -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Verify a required enum string value +*/}} +{{- define "utils.verifyEnum" -}} +{{- include "utils.baseVerifyEnum" (append . true) -}} +{{- end -}} + +{{/* +Verify an optional enum string value +*/}} +{{- define "utils.verifyOptionalEnum" -}} +{{- include "utils.baseVerifyEnum" (append . false) -}} +{{- end -}} + +{{/* +Verify a kubernetes resource name string value +*/}} +{{- define "utils.baseVerifyResourceName" -}} +{{/* https://kubernetes.io/docs/concepts/overview/working-with-objects/names */}} +{{/* names: only lower case, numbers, dot, dash, max 253 */}} +{{/* https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#syntax-and-character-set */}} +{{/* labels/selectors - upper & lower case, numbers, dot, dash, underscore, max 63 */}} +{{- $scope := index . 0 -}} +{{- $name := index . 1 -}} +{{- $max := index . 2 -}} +{{- $isRequired := index . 3 -}} +{{- if include "utils.baseVerifyString" (list $scope $name $isRequired) -}} +{{- $parent := $scope.validationScope -}} +{{- if include "utils.dictionaryHasNonNullValue" (list $parent $name) -}} +{{- $value := index $parent $name -}} +{{- $len := len $value -}} +{{- if and (le $len $max) (regexMatch "^[a-z0-9.-]+$" $value) -}} + true +{{- else -}} +{{- $errorMsg := cat $name "must only contain lower case letters, numbers, dashes and dots, and must not contain more than" $max "characters: " $value -}} +{{- include "utils.recordValidationError" (list $scope $errorMsg) -}} +{{- end -}} +{{- end -}} +{{- else -}} +{{- end -}} +{{- end -}} + +{{/* +Verify a required kubernetes resource name string value +*/}} +{{- define "utils.verifyResourceName" -}} +{{- include "utils.baseVerifyResourceName" (append . true) -}} +{{- end -}} + +{{/* +Verify an optional kubernetes resource name string value +*/}} +{{- define "utils.verifyOptionalResourceName" -}} +{{- include "utils.baseVerifyResourceName" (append . false) -}} +{{- end -}} + +{{/* +Verify external service name suffix string value +*/}} +{{- define "utils.verifyExternalServiceNameSuffix" -}} +{{- include "utils.baseVerifyResourceName" (append . false) -}} +{{- end -}} + +{{/* +Verify introspector job name suffix string value +*/}} +{{- define "utils.verifyIntrospectorJobNameSuffix" -}} +{{- include "utils.baseVerifyResourceName" (append . false) -}} +{{- end -}} + +{{/* +Verify a list of strings value +*/}} +{{- define "utils.baseVerifyStringList" -}} +{{- include "utils.verifyListValue" (prepend . "string") -}} +{{- end -}} + +{{/* +Verify a required list of strings value +*/}} +{{- define "utils.verifyStringList" -}} +{{- include "utils.baseVerifyStringList" (append . true) -}} +{{- end -}} + +{{/* +Verify an optional list of strings value +*/}} +{{- define "utils.verifyOptionalStringList" -}} +{{- include "utils.baseVerifyStringList" (append . false) -}} +{{- end -}} + +{{/* +Verify a list of dictionaries value +*/}} +{{- define "utils.baseVerifyDictionaryList" -}} +{{- include "utils.verifyListValue" (prepend . "map") -}} +{{- end -}} + +{{/* +Verify a required list of dictionaries value +*/}} +{{- define "utils.verifyDictionaryList" -}} +{{- include "utils.baseVerifyDictionaryList" (append . true) -}} +{{- end -}} + +{{/* +Verify an optional list of dictionaries value +*/}} +{{- define "utils.verifyOptionalDictionaryList" -}} +{{- include "utils.baseVerifyDictionaryList" (append . false) -}} +{{- end -}} + +{{/* +Merge a set of dictionaries into a single dictionary. + +The scope must be a list of dictionaries, starting with the least specific +and ending with the most specific. + +First it makes an empty destinaction dictionary, then iterates over the dictionaries, +overlaying their values on the destination dictionary. + +If a value is null, then it removes that key from the destination dictionary. + +If the value is already present in the destination dictionary, and the old and +new values are both dictionaries, it merges them into the destination. +*/}} +{{- define "utils.mergeDictionaries" -}} +{{- $dest := dict -}} +{{- range $src := . -}} +{{- if not (empty $src) -}} +{{- range $key, $value := $src -}} +{{- $ignore := include "utils.mergeDictionaryValue" (list $dest $key $value) -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- toYaml $dest -}} +{{- end -}} + +{{/* +Merge a value into a dictionary. +This is like helm's 'merge' function, except that it handles null entries too. +*/}} +{{- define "utils.mergeDictionaryValue" -}} +{{- $dest := index . 0 -}} +{{- $key := index . 1 -}} +{{- $newValue := index . 2 -}} +{{- $newType := typeOf $newValue -}} +{{- if hasKey $dest $key -}} +{{- if eq $newType "" -}} +{{/* # if the value already existed, and the new value is null, remove the old value */}} +{{- $ignore := unset $dest $key -}} +{{- else -}} +{{- $oldValue := index $dest $key -}} +{{- $oldKind := kindOf $oldValue -}} +{{- $newKind := kindOf $newValue -}} +{{- if (and (eq $oldKind "map") (eq $newKind "map")) -}} +{{/* # if both values are maps, merge them */}} +{{- $merged := include "utils.mergeDictionaries" (list $oldValue $newValue) | fromYaml -}} +{{- $ignore := set $dest $key $merged -}} +{{- else -}} +{{/* # replace the old value with the new one */}} +{{- $ignore := set $dest $key $newValue -}} +{{- end -}} +{{- end -}} +{{- else -}} +{{- if not (eq $newType "") -}} +{{/* #if there was no old value, and the new value isn't null, use the new value */}} +{{- $ignore := set $dest $key $newValue -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Make a writable copy of a dictionary. +TBD - does helm provide a clone method we can use instead? +*/}} +{{- define "utils.cloneDictionary" -}} +{{- include "utils.mergeDictionaries" (list .) -}} +{{- end -}} + +{{/* +Verify that a list of values (exclude) can not be defined if another value (key) is already defined +*/}} +{{- define "utils.mutexValue" -}} +{{- $scope := index . 0 -}} +{{- $key := index . 1 -}} +{{- $exclude := index . 2 -}} +{{- $type := index . 3 -}} +{{- $parent := $scope.validationScope -}} +{{- $args := . -}} +{{- $status := dict -}} +{{- if hasKey $parent $key -}} +{{- range $value := $exclude -}} +{{- if hasKey $parent $value -}} +{{- $errorMsg := cat $value "can not be present when" $key "is defined" " " -}} +{{- include "utils.recordValidationError" (list $scope $errorMsg) -}} +{{- $ignore := set $status "error" true -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- if not (hasKey $status "error") -}} + true +{{- end -}} +{{- end -}} + +{{/* +Verify that a list of strings can not be defined if another string is already defined +*/}} +{{- define "utils.mutexString" -}} +{{- include "utils.mutexValue" (append . "string") -}} +{{- end -}} + +{{/* +Verify that a Kubernetes resource exists in a given namespace +*/}} +{{- define "utils.verifyK8SResource" -}} +{{- $scope := index . 0 -}} +{{- $name := index . 1 -}} +{{- $type := index . 2 -}} +{{- $namespace := index . 3 -}} +{{- $foundNS := (lookup "v1" "Namespace" "" $namespace) }} +{{- if $foundNS }} +{{- $foundResource := (lookup "v1" $type $namespace $name) }} +{{- if not $foundResource }} +{{- $errorMsg := cat $type $name " not found in namespace " $namespace -}} +{{- include "utils.recordValidationError" (list $scope $errorMsg) -}} +{{- end -}} +{{- end -}} +{{- end -}} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_validate-inputs.tpl b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_validate-inputs.tpl new file mode 100644 index 000000000..a6ee7dd02 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/_validate-inputs.tpl @@ -0,0 +1,63 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- define "operator.validateInputs" -}} +{{- $scope := include "utils.cloneDictionary" . | fromYaml -}} +{{- $ignore:= include "utils.startValidation" $scope -}} +{{- $ignore := include "utils.pushValidationContext" (list $scope "Release") -}} +{{- $ignore := include "utils.verifyResourceName" (list $scope "Namespace" 63) -}} +{{- $ignore := include "utils.popValidationContext" $scope -}} +{{- $ignore := include "utils.verifyString" (list $scope "serviceAccount") -}} +{{- $ignore := include "utils.verifyK8SResource" (list $scope .serviceAccount "ServiceAccount" .Release.Namespace) -}} +{{- $ignore := include "utils.verifyString" (list $scope "image") -}} +{{- $ignore := include "utils.verifyEnum" (list $scope "imagePullPolicy" (list "Always" "IfNotPresent" "Never")) -}} +{{- $ignore := include "utils.verifyOptionalDictionaryList" (list $scope "imagePullSecrets") -}} +{{- $ignore := include "utils.verifyEnum" (list $scope "javaLoggingLevel" (list "SEVERE" "WARNING" "INFO" "CONFIG" "FINE" "FINER" "FINEST")) -}} +{{- if include "utils.verifyBoolean" (list $scope "externalRestEnabled") -}} +{{- if $scope.externalRestEnabled -}} +{{- $ignore := include "utils.verifyInteger" (list $scope "externalRestHttpsPort") -}} +{{- $ignore := include "utils.mutexString" (list $scope "externalRestIdentitySecret" (list "externalOperatorKey" "externalOperatorCert")) -}} +{{- if (or (hasKey $scope "externalOperatorCert") (hasKey $scope "externalOperatorKey")) -}} +{{- $ignore := include "utils.verifyString" (list $scope "externalOperatorCert") -}} +{{- $ignore := include "utils.verifyString" (list $scope "externalOperatorKey") -}} +{{- else }} +{{- $ignore := include "utils.verifyString" (list $scope "externalRestIdentitySecret") -}} +{{- end -}} +{{- end -}} +{{- end -}} +{{- if include "utils.verifyBoolean" (list $scope "remoteDebugNodePortEnabled") -}} +{{- if $scope.remoteDebugNodePortEnabled -}} +{{- $ignore := include "utils.verifyBoolean" (list $scope "suspendOnDebugStartup") -}} +{{- $ignore := include "utils.verifyInteger" (list $scope "internalDebugHttpPort") -}} +{{- $ignore := include "utils.verifyInteger" (list $scope "externalDebugHttpPort") -}} +{{- end -}} +{{- end -}} +{{- $ignore := include "utils.verifyOptionalBoolean" (list $scope "enableClusterRoleBinding") -}} +{{- if and .enableClusterRoleBinding (or (eq (default "List" .domainNamespaceSelectionStrategy) "Dedicated") (and .dedicated (eq (default "List" .domainNamespaceSelectionStrategy) "List"))) }} +{{- $errorMsg := "The enableClusterRoleBinding value may not be true when either dedicated is true or domainNamespaceSelectionStrategy is Dedicated" -}} +{{- include "utils.recordValidationError" (list $scope $errorMsg) -}} +{{- end -}} +{{- if eq (default "List" $scope.domainNamespaceSelectionStrategy) "List" -}} +{{- $ignore := include "utils.verifyStringList" (list $scope "domainNamespaces") -}} +{{- end -}} +{{- if include "utils.verifyBoolean" (list $scope "elkIntegrationEnabled") -}} +{{- if $scope.elkIntegrationEnabled -}} +{{- $ignore := include "utils.verifyString" (list $scope "logStashImage") -}} +{{- $ignore := include "utils.verifyString" (list $scope "elasticSearchHost") -}} +{{- $ignore := include "utils.verifyInteger" (list $scope "elasticSearchPort") -}} +{{- end -}} +{{- end -}} +{{- $ignore := include "utils.verifyOptionalBoolean" (list $scope "dedicated") -}} +{{- $ignore := include "utils.verifyOptionalEnum" (list $scope "domainNamespaceSelectionStrategy" (list "List" "LabelSelector" "RegExp" "Dedicated")) -}} +{{- if eq (default "List" $scope.domainNamespaceSelectionStrategy) "LabelSelector" -}} +{{- $ignore := include "utils.verifyString" (list $scope "domainNamespaceLabelSelector") -}} +{{- end -}} +{{- if eq (default "List" $scope.domainNamespaceSelectionStrategy) "RegExp" -}} +{{- $ignore := include "utils.verifyString" (list $scope "domainNamespaceRegExp") -}} +{{- end -}} +{{- $ignore := include "utils.verifyOptionalBoolean" (list $scope "mockWLS") -}} +{{- $ignore := include "utils.verifyIntrospectorJobNameSuffix" (list $scope "introspectorJobNameSuffix" 25) -}} +{{- $ignore := include "utils.verifyExternalServiceNameSuffix" (list $scope "externalServiceNameSuffix" 10) -}} +{{- $ignore := include "utils.verifyOptionalBoolean" (list $scope "clusterSizePaddingValidationEnabled") -}} +{{- $ignore := include "utils.endValidation" $scope -}} +{{- end -}} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/main.yaml b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/main.yaml new file mode 100644 index 000000000..fb7e731f9 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/templates/main.yaml @@ -0,0 +1,11 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +{{- $scope := include "utils.cloneDictionary" .Values | fromYaml -}} +{{- $ignore := set $scope "Files" .Files -}} +{{- $ignore := set $scope "Chart" .Chart -}} +{{- $ignore := set $scope "Release" .Release -}} +{{- $ignore := set $scope "APIVersions" .Capabilities.APIVersions -}} + +{{ include "operator.validateInputs" $scope }} +{{- include "operator.operator" $scope }} diff --git a/OracleWebCenterContent/kubernetes/charts/weblogic-operator/values.yaml b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/values.yaml new file mode 100644 index 000000000..fd151bff1 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/charts/weblogic-operator/values.yaml @@ -0,0 +1,235 @@ +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# serviceAccount specifies the name of the ServiceAccount in the operator's namespace that the +# operator will use to make requests to the Kubernetes API server. +# The customer is responsible for creating the ServiceAccount in the same namespace as this Helm release. +# If not specified, the the operator will use the Helm release namespace's 'default' ServiceAccount. +serviceAccount: "default" + +# domainNamespaceSelectionStrategy specifies how the operator will select the set of namespaces +# that it will manage. Legal values are: List, LabelSelector, RegExp, and Dedicated. If set to 'List', +# then the operator will manage the set of namespaces listed by the 'domainNamespaces' value. +# If set to 'LabelSelector', then the operator will manage the set of namespaces discovered by a list +# of namespaces using the value specified by 'domainNamespaceLabelSelector' as a label selector. +# If set to 'RegExp', then the operator will manage the set of namespaces discovered by a list +# of namespaces using the value specified by 'domainNamespaceRegExp' as a regular expression matched +# against the namespace names. +# If set to 'Dedicated', then operator will manage WebLogic Domains only in the same namespace +# where the operator itself is deployed, which is the namespace of the Helm release. +domainNamespaceSelectionStrategy: List + +# This value is deprecated. Please use 'domainNamespaceSelectionStrategy: Dedicated'. +# dedicated specifies if this operator will manage WebLogic Domains only in the same namespace in +# which the operator itself is deployed. If set to 'true', then the 'domainNamespaces' value below +# is ignored. This value is ignored if 'domainNamespaceSelectionStrategy' is set to a value other +# than 'List'. +# dedicated: false + +# domainNamespaces specifies list of WebLogic Domain namespaces that this operator manages. This value +# is ignored if 'domainNamespaceSelectionStrategy' is not 'List'. The customer is responsible for creating these +# namespaces. If not specified, then the operator will manage WebLogic Domains in the Kubernetes 'default' namespace. +# +# Example: In the configuration below, the operator will manage namespace1 and namespace2. +# +# domainNamespaces: +# - "namespace1" +# - "namespace2" +domainNamespaces: +- "default" + +# domainNamespaceLabelSelector specifies the label selector value that the operator will use when listing +# namespaces in search of the namespaces that contain WebLogic Domains that this operator will manage. Ignored +# if 'domainNamespaceSelectionStrategy' is not 'LabelSelector'. +# +# Example: manage any namespace with a label named "weblogic-operator". +# +# domainNamespaceLabelSelector: "weblogic-operator" +# +# domainNamespaceLabelSelector: + +# domainNamespaceRegExp specifies a regular expression that will be matched against namespace names when listing +# namespaces in search of the namespaces that contain WebLogic Domains that this operator will manage. Ignored +# if 'domainNamespaceSelectionStrategy' is not 'RegExp'. +# +# Example: manage any namespace where the namespace name starts with "prod". +# +# domainNamespaceRegExp: "^prod" +# +# domainNamespaceRegExp: + +# enableClusterRoleBinding specifies whether the roles necessary for the operator to manage domains +# will be granted using a ClusterRoleBinding rather than using RoleBindings in each managed namespace. +enableClusterRoleBinding: false + +# image specifies the container image containing the operator. +image: "ghcr.io/oracle/weblogic-kubernetes-operator:3.4.2" + +# imagePullPolicy specifies the image pull policy for the operator's container image. +imagePullPolicy: IfNotPresent + +# imagePullSecrets contains an optional list of Kubernetes Secrets, in the operator's namespace, +# that are needed to access the registry containing the operator's container image. +# The customer is responsible for creating the Secret. +# If no Secrets are required, then omit this property. +# +# Example: a Secret is needed, and has been stored in 'my-operator-secret' +# +# imagePullSecrets: +# - name: "my-operator-secret" + +# externalRestEnabled specifies whether the the operator's REST interface is exposed +# outside of the Kubernetes cluster on the port specified by the 'externalRestHttpsPort' +# property. +# +# If set to true, then the customer must provide the SSL certificate and private key for +# the operator's external REST interface by specifying the 'externalOperatorCert' and +# 'externalOperatorKey' properties. +externalRestEnabled: false + +# externalRestHttpsPort specifies the node port that should be allocated for the external operator REST HTTPS interface. +# This parameter is required if 'externalRestEnabled' is true. +# Otherwise, it is ignored. +externalRestHttpsPort: 31001 + +# The name of the Secret used to store the certificate and private key to use for the external operator REST HTTPS interface. +# The Secret has to be created in the same namespace of the WebLogic operator. +# This parameter is required if 'externalRestEnabled' is true. Otherwise, it is ignored. +# As example, an external REST identity can be created using the following sample script +# kubernetes/samples/scripts/rest/generate-external-rest-identity.sh +# externalRestIdentitySecret: + +# elkIntegrationEnabled specifies whether or not ELK integration is enabled. +elkIntegrationEnabled: false + +# logStashImage specifies the container image containing logstash. +# This parameter is ignored if 'elkIntegrationEnabled' is false. +logStashImage: "logstash:6.8.23" + +# elasticSearchHost specifies the hostname of where elasticsearch is running. +# This parameter is ignored if 'elkIntegrationEnabled' is false. +elasticSearchHost: "elasticsearch.default.svc.cluster.local" + +# elasticSearchPort specifies the port number of where elasticsearch is running. +# This parameter is ignored if 'elkIntegrationEnabled' is false. +elasticSearchPort: 9200 + +# featureGates specifies a set of key=value pairs separated by commas that describe whether a given +# operator feature is enabled. You enable a feature by including a key=value pair where the key is the +# feature name and the value is "true". This will allow the operator team to release features that +# are not yet ready to be enabled by default, but that are ready for testing by customers. Once a feature is +# stable then it will be enabled by default and can not be disabled using this configuration. +# featureGates: "...,AuxiliaryImage=true" + +# javaLoggingLevel specifies the Java logging level for the operator. This affects the operator pod's +# log output and the contents of log files in the container's /logs/ directory. +# Valid values are: "SEVERE", "WARNING", "INFO", "CONFIG", "FINE", "FINER", and "FINEST". +javaLoggingLevel: "INFO" + +# javaLoggingFileSizeLimit specifies the maximum size in bytes for an individual Java logging file in the operator container's +# /logs/ directory. +javaLoggingFileSizeLimit: 20000000 + +# javaLoggingFileCount specifies the number of Java logging files to preserve in the operator container's /logs/ +# directory as the files are rotated. +javaLoggingFileCount: 10 + +# labels specifies a set of key-value labels that will be added to each pod running the operator. +# See https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ +#labels: + +# annotations specifies a set of key-value annotations that will be added to each pod running the operator. +# See https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ +#annotations: + +# nodeSelector specifies a matching rule that the Kubernetes scheduler will use when selecting the node +# where the operator will run. If the nodeSelector value is specified, then this content will be added to +# the operator's deployment. See https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector +# for more information on node selectors. +#nodeSelector: + +# affinity specifies a set of matching rules related to the presence of other workloads that the Kubernetes scheduler +# will use when selecting the node where the operator will run. If the affinity value is specified, then this content +# will be added to the operator's deployment. See https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity +# for more information on affinity and anti-affinity. +#affinity: + +# Values related to debugging the operator. +# Customers should not need to use the following properties + +# remoteDebugNodePortEnabled specifies whether or not the operator will provide a Java remote debug interface on the +# provided port. If the 'suspendOnDebugStartup' property is specified, the operator will suspend execution +# until a remote debugger has attached. +# The 'internalDebugHttpPort' property controls the port number inside the Kubernetes +# cluster and the 'externalDebugHttpPort' property controls the port number outside +# the Kubernetes cluster. +remoteDebugNodePortEnabled: false + +#suspendOnDebugStartup specifies whether the operator will suspend on startup when a Java remote debugging is enabled. +suspendOnDebugStartup: false + +# internalDebugHttpPort specifies the port number inside the Kubernetes cluster for the operator's Java +# remote debug interface. +# This parameter is required if 'remoteDebugNodePortEnabled' is true. +# Otherwise, it is ignored. +internalDebugHttpPort: 30999 + +# externalDebugHttpPort specifies the node port that should be allocated for the operator's +# Java remote debug interface. +# This parameter is required if 'remoteDebugNodePortEnabled' is true. +# Otherwise, it is ignored. +externalDebugHttpPort: 30999 + +# dns1123Fields overrides the default list of field names that the operator +# converts to DNS-1123 legal values when replacing variable references in the +# Domain resource. The default list can be found inside the class LegalNames +# in the oracle.kubernetes.operator.helpers package. +# Supply a comma separated list of field names to customize the list of fields +# such as "name, claimName, volumeName", or leave it commented out to use +# the default list of field names. +# dns1123Fields: "" + +# introspectorJobNameSuffix overrides the default suffix that the operator uses +# to append to the domainUID to form the name of the domain introspector job name. +# Note that the resultant job name should not be more than 58 characters due to +# the Kubernetes limit to the name of a job and Kubernetes appends five additional +# characters to the name of the pod that is created by the job controller. +# The default suffix is '-introspector'. +# The default suffix in pre-3.1.0 is "-introspect-domain-job" +introspectorJobNameSuffix: "-introspector" + +# externalServiceNameSuffix overrides the default suffix that the operator uses +# to append to the domainUID and the WebLogic admin server name, to form the name +# of the domain's admin server external service. +# Note that the resultant name should not be more than 63 characters due to +# the Kubernetes limit to the name of a service. +# The default suffix is '-ext'. +# The default suffix in pre-3.1.0 is "-external". +externalServiceNameSuffix: "-ext" + +# clusterSizePaddingValidationEnabled specifies if additional one or two characters +# need to be reserved to account for longer managed server names because of an increased +# cluster size. +# The default value is true. +clusterSizePaddingValidationEnabled: true + +# tokenReviewAuthentication, if set to true, specifies whether the the operator's REST API should use +# 1. Kubernetes token review API for authenticating users, and +# 2. Kubernetes subject access review API for authorizing a user's operation (get, list, +# patch, etc) on a resource. +# 3. Update the Domain resource using the operator's privileges. +# This parameter, if set to false, will use the caller's bearer token for any update +# to the Domain resource so that it is done using the caller's privileges. +# The default value is false. +#tokenReviewAuthentication: false + +# domainPresenceFailureRetryMaxCount and domainPresenceFailureRetrySeconds specify the number of introspector job +# retries for a Domain and the interval in seconds between these retries, respectively. +# Defaults to 5 retries and 10 seconds between each retry. +# domainPresenceFailureRetryMaxCount: 5 +# domainPresenceFailureRetrySeconds: 10 + +# runAsUser specifies the UID to run the operator container process. If not specified, +# it defaults to the user specified in the operator's container image. +#runAsUser: 1000 + diff --git a/OracleWebCenterContent/kubernetes/common/createFMWJRFDomain.py b/OracleWebCenterContent/kubernetes/common/createFMWJRFDomain.py new file mode 100644 index 000000000..bde936ca5 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/common/createFMWJRFDomain.py @@ -0,0 +1,332 @@ +# Copyright (c) 2014, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +import os +import sys + +import com.oracle.cie.domain.script.jython.WLSTException as WLSTException + +class Infra12213Provisioner: + + MACHINES = { + 'machine1' : { + 'NMType': 'SSL', + 'ListenAddress': 'localhost', + 'ListenPort': 5658 + } + } + + JRF_12213_TEMPLATES = { + 'baseTemplate' : '@@ORACLE_HOME@@/wlserver/common/templates/wls/wls.jar', + 'extensionTemplates' : [ + '@@ORACLE_HOME@@/oracle_common/common/templates/wls/oracle.jrf_template.jar', + '@@ORACLE_HOME@@/oracle_common/common/templates/wls/oracle.jrf.ws.async_template.jar', + '@@ORACLE_HOME@@/oracle_common/common/templates/wls/oracle.wsmpm_template.jar', + '@@ORACLE_HOME@@/oracle_common/common/templates/wls/oracle.ums_template.jar', + '@@ORACLE_HOME@@/em/common/templates/wls/oracle.em_wls_template.jar' + ], + 'serverGroupsToTarget' : [ 'JRF-MAN-SVR', 'WSMPM-MAN-SVR' ] + } + + def __init__(self, oracleHome, javaHome, domainParentDir, adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, clusterName): + self.oracleHome = self.validateDirectory(oracleHome) + self.javaHome = self.validateDirectory(javaHome) + self.domainParentDir = self.validateDirectory(domainParentDir, create=True) + return + + def createInfraDomain(self, domainName, user, password, db, dbPrefix, dbPassword, adminListenPort, adminName, + managedNameBase, managedServerPort, prodMode, managedCount, clusterName, + exposeAdminT3Channel=None, t3ChannelPublicAddress=None, t3ChannelPort=None): + domainHome = self.createBaseDomain(domainName, user, password, adminListenPort, adminName, managedNameBase, + managedServerPort, prodMode, managedCount, clusterName + ) + self.extendDomain(domainHome, db, dbPrefix, dbPassword, exposeAdminT3Channel, t3ChannelPublicAddress, + t3ChannelPort) + + def createBaseDomain(self, domainName, user, password, adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, clusterName): + baseTemplate = self.replaceTokens(self.JRF_12213_TEMPLATES['baseTemplate']) + + readTemplate(baseTemplate) + setOption('DomainName', domainName) + setOption('JavaHome', self.javaHome) + if (prodMode == 'true'): + setOption('ServerStartMode', 'prod') + else: + setOption('ServerStartMode', 'dev') + set('Name', domainName) + + admin_port = int(adminListenPort) + ms_port = int(managedServerPort) + ms_count = int(managedCount) + + # Create Admin Server + # ======================= + print 'Creating Admin Server...' + cd('/Servers/AdminServer') + #set('ListenAddress', '%s-%s' % (domain_uid, admin_server_name_svc)) + set('ListenPort', admin_port) + set('Name', adminName) + + # Define the user password for weblogic + # ===================================== + cd('/Security/' + domainName + '/User/weblogic') + set('Name', user) + set('Password', password) + + # Create a cluster + # ====================== + print 'Creating cluster...' + cd('/') + cl=create(clusterName, 'Cluster') + + # Create managed servers + for index in range(0, ms_count): + cd('/') + msIndex = index+1 + cd('/') + name = '%s%s' % (managedNameBase, msIndex) + create(name, 'Server') + cd('/Servers/%s/' % name ) + print('managed server name is %s' % name); + set('ListenPort', ms_port) + set('NumOfRetriesBeforeMSIMode', 0) + set('RetryIntervalBeforeMSIMode', 1) + set('Cluster', clusterName) + + # Create Node Manager + # ======================= + print 'Creating Node Managers...' + for machine in self.MACHINES: + cd('/') + create(machine, 'Machine') + cd('Machine/' + machine) + create(machine, 'NodeManager') + cd('NodeManager/' + machine) + for param in self.MACHINES[machine]: + set(param, self.MACHINES[machine][param]) + + + setOption('OverwriteDomain', 'true') + domainHome = self.domainParentDir + '/' + domainName + print 'Will create Base domain at ' + domainHome + + print 'Writing base domain...' + writeDomain(domainHome) + closeTemplate() + print 'Base domain created at ' + domainHome + return domainHome + + + def extendDomain(self, domainHome, db, dbPrefix, dbPassword, exposeAdminT3Channel, t3ChannelPublicAddress, + t3ChannelPort): + print 'Extending domain at ' + domainHome + print 'Database ' + db + readDomain(domainHome) + setOption('AppDir', self.domainParentDir + '/applications') + + print 'ExposeAdminT3Channel %s with %s:%s ' % (exposeAdminT3Channel, t3ChannelPublicAddress, t3ChannelPort) + if 'true' == exposeAdminT3Channel: + self.enable_admin_channel(t3ChannelPublicAddress, t3ChannelPort) + + print 'Applying JRF templates...' + for extensionTemplate in self.JRF_12213_TEMPLATES['extensionTemplates']: + addTemplate(self.replaceTokens(extensionTemplate)) + + print 'Extension Templates added' + + print 'Configuring the Service Table DataSource...' + fmwDb = 'jdbc:oracle:thin:@' + db + print 'fmwDatabase ' + fmwDb + cd('/JDBCSystemResource/LocalSvcTblDataSource/JdbcResource/LocalSvcTblDataSource') + cd('JDBCDriverParams/NO_NAME_0') + set('DriverName', 'oracle.jdbc.OracleDriver') + set('URL', fmwDb) + set('PasswordEncrypted', dbPassword) + + stbUser = dbPrefix + '_STB' + cd('Properties/NO_NAME_0/Property/user') + set('Value', stbUser) + + print 'Getting Database Defaults...' + getDatabaseDefaults() + + print 'Targeting Server Groups...' + managedName= '%s%s' % (managedNameBase, 1) + print "Set CoherenceClusterSystemResource to defaultCoherenceCluster for server:" + managedName + serverGroupsToTarget = list(self.JRF_12213_TEMPLATES['serverGroupsToTarget']) + cd('/') + setServerGroups(managedName, serverGroupsToTarget) + print "Set CoherenceClusterSystemResource to defaultCoherenceCluster for server:" + managedName + cd('/Servers/' + managedName) + set('CoherenceClusterSystemResource', 'defaultCoherenceCluster') + + print 'Targeting Cluster ...' + cd('/') + print "Set CoherenceClusterSystemResource to defaultCoherenceCluster for cluster:" + clusterName + cd('/Cluster/' + clusterName) + set('CoherenceClusterSystemResource', 'defaultCoherenceCluster') + print "Set WLS clusters as target of defaultCoherenceCluster:" + clusterName + cd('/CoherenceClusterSystemResource/defaultCoherenceCluster') + set('Target', clusterName) + + print 'Preparing to update domain...' + updateDomain() + print 'Domain updated successfully' + closeDomain() + return + + + ########################################################################### + # Helper Methods # + ########################################################################### + + def validateDirectory(self, dirName, create=False): + directory = os.path.realpath(dirName) + if not os.path.exists(directory): + if create: + os.makedirs(directory) + else: + message = 'Directory ' + directory + ' does not exist' + raise WLSTException(message) + elif not os.path.isdir(directory): + message = 'Directory ' + directory + ' is not a directory' + raise WLSTException(message) + return self.fixupPath(directory) + + + def fixupPath(self, path): + result = path + if path is not None: + result = path.replace('\\', '/') + return result + + + def replaceTokens(self, path): + result = path + if path is not None: + result = path.replace('@@ORACLE_HOME@@', oracleHome) + return result + + def enable_admin_channel(self, admin_channel_address, admin_channel_port): + if admin_channel_address == None or admin_channel_port == 'None': + return + cd('/') + admin_server_name = get('AdminServerName') + print('setting admin server t3channel for ' + admin_server_name) + cd('/Servers/' + admin_server_name) + create('T3Channel', 'NetworkAccessPoint') + cd('/Servers/' + admin_server_name + '/NetworkAccessPoint/T3Channel') + set('ListenPort', int(admin_channel_port)) + set('PublicPort', int(admin_channel_port)) + set('PublicAddress', admin_channel_address) + +############################# +# Entry point to the script # +############################# + +def usage(): + print sys.argv[0] + ' -oh -jh -parent -name ' + \ + '-user -password ' + \ + '-rcuDb -rcuPrefix -rcuSchemaPwd ' \ + '-adminListenPort -adminName ' \ + '-managedNameBase -managedServerPort -prodMode ' \ + '-managedServerCount -clusterName ' \ + '-exposeAdminT3Channel -t3ChannelPublicAddress
' \ + '-t3ChannelPort ' + sys.exit(0) + +# Uncomment for Debug only +#print str(sys.argv[0]) + " called with the following sys.argv array:" +#for index, arg in enumerate(sys.argv): +# print "sys.argv[" + str(index) + "] = " + str(sys.argv[index]) + +if len(sys.argv) < 16: + usage() + +#oracleHome will be passed by command line parameter -oh. +oracleHome = None +#javaHome will be passed by command line parameter -jh. +javaHome = None +#domainParentDir will be passed by command line parameter -parent. +domainParentDir = None +#domainUser is hard-coded to weblogic. You can change to other name of your choice. Command line paramter -user. +domainUser = 'weblogic' +#domainPassword will be passed by Command line parameter -password. +domainPassword = None +#rcuDb will be passed by command line parameter -rcuDb. +rcuDb = None +#change rcuSchemaPrefix to your infra schema prefix. Command line parameter -rcuPrefix. +rcuSchemaPrefix = 'DEV12' +#change rcuSchemaPassword to your infra schema password. Command line parameter -rcuSchemaPwd. +rcuSchemaPassword = None +exposeAdminT3Channel = None +t3ChannelPort = None +t3ChannelPublicAddress = None +i = 1 +while i < len(sys.argv): + if sys.argv[i] == '-oh': + oracleHome = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-jh': + javaHome = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-parent': + domainParentDir = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-name': + domainName = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-user': + domainUser = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-password': + domainPassword = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-rcuDb': + rcuDb = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-rcuPrefix': + rcuSchemaPrefix = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-rcuSchemaPwd': + rcuSchemaPassword = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-adminListenPort': + adminListenPort = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-adminName': + adminName = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-managedNameBase': + managedNameBase = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-managedServerPort': + managedServerPort = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-prodMode': + prodMode = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-managedServerCount': + managedCount = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-clusterName': + clusterName = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-t3ChannelPublicAddress': + t3ChannelPublicAddress = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-t3ChannelPort': + t3ChannelPort = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-exposeAdminT3Channel': + exposeAdminT3Channel = sys.argv[i + 1] + i += 2 + else: + print 'Unexpected argument switch at position ' + str(i) + ': ' + str(sys.argv[i]) + usage() + sys.exit(1) + +provisioner = Infra12213Provisioner(oracleHome, javaHome, domainParentDir, adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, clusterName) +provisioner.createInfraDomain(domainName, domainUser, domainPassword, rcuDb, rcuSchemaPrefix, rcuSchemaPassword, + adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, + clusterName, exposeAdminT3Channel, t3ChannelPublicAddress, t3ChannelPort) \ No newline at end of file diff --git a/OracleWebCenterContent/kubernetes/common/createFMWRestrictedJRFDomain.py b/OracleWebCenterContent/kubernetes/common/createFMWRestrictedJRFDomain.py new file mode 100644 index 000000000..acfe5da80 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/common/createFMWRestrictedJRFDomain.py @@ -0,0 +1,291 @@ +# Copyright (c) 2014, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +import os +import sys + +import com.oracle.cie.domain.script.jython.WLSTException as WLSTException + +class Infra12213Provisioner: + + MACHINES = { + 'machine1' : { + 'NMType': 'SSL', + 'ListenAddress': 'localhost', + 'ListenPort': 5658 + } + } + + JRF_12213_TEMPLATES = { + 'baseTemplate' : '@@ORACLE_HOME@@/wlserver/common/templates/wls/wls.jar', + 'extensionTemplates' : [ + '@@ORACLE_HOME@@/oracle_common/common/templates/wls/oracle.jrf_restricted_template.jar', + '@@ORACLE_HOME@@/em/common/templates/wls/oracle.em_wls_restricted_template.jar' + ], + 'serverGroupsToTarget' : [ 'JRF-MAN-SVR', 'WSMPM-MAN-SVR' ] + } + + def __init__(self, oracleHome, javaHome, domainParentDir, adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, clusterName): + self.oracleHome = self.validateDirectory(oracleHome) + self.javaHome = self.validateDirectory(javaHome) + self.domainParentDir = self.validateDirectory(domainParentDir, create=True) + return + + def createInfraDomain(self, domainName, user, password, adminListenPort, adminName, + managedNameBase, managedServerPort, prodMode, managedCount, clusterName, + exposeAdminT3Channel=None, t3ChannelPublicAddress=None, t3ChannelPort=None): + domainHome = self.createBaseDomain(domainName, user, password, adminListenPort, adminName, managedNameBase, + managedServerPort, prodMode, managedCount, clusterName + ) + self.extendDomain(domainHome, exposeAdminT3Channel, t3ChannelPublicAddress, t3ChannelPort) + + def createBaseDomain(self, domainName, user, password, adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, clusterName): + baseTemplate = self.replaceTokens(self.JRF_12213_TEMPLATES['baseTemplate']) + + readTemplate(baseTemplate) + setOption('DomainName', domainName) + setOption('JavaHome', self.javaHome) + if (prodMode == 'true'): + setOption('ServerStartMode', 'prod') + else: + setOption('ServerStartMode', 'dev') + set('Name', domainName) + + admin_port = int(adminListenPort) + ms_port = int(managedServerPort) + ms_count = int(managedCount) + + # Create Admin Server + # ======================= + print 'Creating Admin Server...' + cd('/Servers/AdminServer') + #set('ListenAddress', '%s-%s' % (domain_uid, admin_server_name_svc)) + set('ListenPort', admin_port) + set('Name', adminName) + + # Define the user password for weblogic + # ===================================== + cd('/Security/' + domainName + '/User/weblogic') + set('Name', user) + set('Password', password) + + # Create a cluster + # ====================== + print 'Creating cluster...' + cd('/') + cl=create(clusterName, 'Cluster') + + # Create managed servers + for index in range(0, ms_count): + cd('/') + msIndex = index+1 + cd('/') + name = '%s%s' % (managedNameBase, msIndex) + create(name, 'Server') + cd('/Servers/%s/' % name ) + print('managed server name is %s' % name); + set('ListenPort', ms_port) + set('NumOfRetriesBeforeMSIMode', 0) + set('RetryIntervalBeforeMSIMode', 1) + set('Cluster', clusterName) + + # Create Node Manager + # ======================= + print 'Creating Node Managers...' + for machine in self.MACHINES: + cd('/') + create(machine, 'Machine') + cd('Machine/' + machine) + create(machine, 'NodeManager') + cd('NodeManager/' + machine) + for param in self.MACHINES[machine]: + set(param, self.MACHINES[machine][param]) + + + setOption('OverwriteDomain', 'true') + domainHome = self.domainParentDir + '/' + domainName + print 'Will create Base domain at ' + domainHome + + print 'Writing base domain...' + writeDomain(domainHome) + closeTemplate() + print 'Base domain created at ' + domainHome + return domainHome + + + def extendDomain(self, domainHome, exposeAdminT3Channel, t3ChannelPublicAddress, + t3ChannelPort): + print 'Extending domain at ' + domainHome + readDomain(domainHome) + setOption('AppDir', self.domainParentDir + '/applications') + + print 'ExposeAdminT3Channel %s with %s:%s ' % (exposeAdminT3Channel, t3ChannelPublicAddress, t3ChannelPort) + if 'true' == exposeAdminT3Channel: + self.enable_admin_channel(t3ChannelPublicAddress, t3ChannelPort) + + print 'Applying JRF templates...' + for extensionTemplate in self.JRF_12213_TEMPLATES['extensionTemplates']: + addTemplate(self.replaceTokens(extensionTemplate)) + + print 'Extension Templates added' + + print 'Preparing to update domain...' + updateDomain() + print 'Domain updated successfully' + closeDomain() + return + + + ########################################################################### + # Helper Methods # + ########################################################################### + + def validateDirectory(self, dirName, create=False): + directory = os.path.realpath(dirName) + if not os.path.exists(directory): + if create: + os.makedirs(directory) + else: + message = 'Directory ' + directory + ' does not exist' + raise WLSTException(message) + elif not os.path.isdir(directory): + message = 'Directory ' + directory + ' is not a directory' + raise WLSTException(message) + return self.fixupPath(directory) + + + def fixupPath(self, path): + result = path + if path is not None: + result = path.replace('\\', '/') + return result + + + def replaceTokens(self, path): + result = path + if path is not None: + result = path.replace('@@ORACLE_HOME@@', oracleHome) + return result + + def enable_admin_channel(self, admin_channel_address, admin_channel_port): + if admin_channel_address == None or admin_channel_port == 'None': + return + cd('/') + admin_server_name = get('AdminServerName') + print('setting admin server t3channel for ' + admin_server_name) + cd('/Servers/' + admin_server_name) + create('T3Channel', 'NetworkAccessPoint') + cd('/Servers/' + admin_server_name + '/NetworkAccessPoint/T3Channel') + set('ListenPort', int(admin_channel_port)) + set('PublicPort', int(admin_channel_port)) + set('PublicAddress', admin_channel_address) + +############################# +# Entry point to the script # +############################# + +def usage(): + print sys.argv[0] + ' -oh -jh -parent -name ' + \ + '-user -password ' + \ + '-rcuDb -rcuPrefix -rcuSchemaPwd ' \ + '-adminListenPort -adminName ' \ + '-managedNameBase -managedServerPort -prodMode ' \ + '-managedServerCount -clusterName ' \ + '-exposeAdminT3Channel -t3ChannelPublicAddress
' \ + '-t3ChannelPort ' + sys.exit(0) + +# Uncomment for Debug only +#print str(sys.argv[0]) + " called with the following sys.argv array:" +#for index, arg in enumerate(sys.argv): +# print "sys.argv[" + str(index) + "] = " + str(sys.argv[index]) + +if len(sys.argv) < 16: + usage() + +#oracleHome will be passed by command line parameter -oh. +oracleHome = None +#javaHome will be passed by command line parameter -jh. +javaHome = None +#domainParentDir will be passed by command line parameter -parent. +domainParentDir = None +#domainUser is hard-coded to weblogic. You can change to other name of your choice. Command line paramter -user. +domainUser = 'weblogic' +#domainPassword will be passed by Command line parameter -password. +domainPassword = None +#rcuDb will be passed by command line parameter -rcuDb. +rcuDb = None +#change rcuSchemaPrefix to your infra schema prefix. Command line parameter -rcuPrefix. +rcuSchemaPrefix = 'DEV12' +#change rcuSchemaPassword to your infra schema password. Command line parameter -rcuSchemaPwd. +rcuSchemaPassword = None +exposeAdminT3Channel = None +t3ChannelPort = None +t3ChannelPublicAddress = None +i = 1 +while i < len(sys.argv): + if sys.argv[i] == '-oh': + oracleHome = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-jh': + javaHome = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-parent': + domainParentDir = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-name': + domainName = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-user': + domainUser = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-password': + domainPassword = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-rcuDb': + rcuDb = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-rcuPrefix': + rcuSchemaPrefix = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-rcuSchemaPwd': + rcuSchemaPassword = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-adminListenPort': + adminListenPort = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-adminName': + adminName = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-managedNameBase': + managedNameBase = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-managedServerPort': + managedServerPort = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-prodMode': + prodMode = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-managedServerCount': + managedCount = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-clusterName': + clusterName = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-t3ChannelPublicAddress': + t3ChannelPublicAddress = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-t3ChannelPort': + t3ChannelPort = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-exposeAdminT3Channel': + exposeAdminT3Channel = sys.argv[i + 1] + i += 2 + else: + print 'Unexpected argument switch at position ' + str(i) + ': ' + str(sys.argv[i]) + usage() + sys.exit(1) + +provisioner = Infra12213Provisioner(oracleHome, javaHome, domainParentDir, adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, clusterName) +provisioner.createInfraDomain(domainName, domainUser, domainPassword, adminListenPort, adminName, managedNameBase, managedServerPort, prodMode, managedCount, + clusterName, exposeAdminT3Channel, t3ChannelPublicAddress, t3ChannelPort) diff --git a/OracleWebCenterContent/kubernetes/common/domain-template.yaml b/OracleWebCenterContent/kubernetes/common/domain-template.yaml new file mode 100644 index 000000000..2d081de7d --- /dev/null +++ b/OracleWebCenterContent/kubernetes/common/domain-template.yaml @@ -0,0 +1,119 @@ +# Copyright (c) 2017, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: %DOMAIN_UID% + namespace: %NAMESPACE% + labels: + weblogic.domainUID: %DOMAIN_UID% +spec: + # The WebLogic Domain Home + domainHome: %DOMAIN_HOME% + + # The domain home source type + # Set to PersistentVolume for domain-in-pv, Image for domain-in-image, or FromModel for model-in-image + domainHomeSourceType: %DOMAIN_HOME_SOURCE_TYPE% + + # The WebLogic Server image that the Operator uses to start the domain + image: "%WEBLOGIC_IMAGE%" + + # imagePullPolicy defaults to "Always" if image version is :latest + imagePullPolicy: "%WEBLOGIC_IMAGE_PULL_POLICY%" + + # Identify which Secret contains the credentials for pulling an image + %WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%imagePullSecrets: + %WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%- name: %WEBLOGIC_IMAGE_PULL_SECRET_NAME% + + # Identify which Secret contains the WebLogic Admin credentials (note that there is an example of + # how to create that Secret at the end of this file) + webLogicCredentialsSecret: + name: %WEBLOGIC_CREDENTIALS_SECRET_NAME% + + # Whether to include the server out file into the pod's stdout, default is true + includeServerOutInPodLog: %INCLUDE_SERVER_OUT_IN_POD_LOG% + + # Whether to enable log home + %LOG_HOME_ON_PV_PREFIX%logHomeEnabled: %LOG_HOME_ENABLED% + + # Whether to write HTTP access log file to log home + %LOG_HOME_ON_PV_PREFIX%httpAccessLogInLogHome: %HTTP_ACCESS_LOG_IN_LOG_HOME% + + # The in-pod location for domain log, server logs, server out, introspector out, and Node Manager log files + %LOG_HOME_ON_PV_PREFIX%logHome: %LOG_HOME% + # An (optional) in-pod location for data storage of default and custom file stores. + # If not specified or the value is either not set or empty (e.g. dataHome: "") then the + # data storage directories are determined from the WebLogic domain home configuration. + dataHome: "%DATA_HOME%" + + + # serverStartPolicy legal values are "NEVER", "IF_NEEDED", or "ADMIN_ONLY" + # This determines which WebLogic Servers the Operator will start up when it discovers this Domain + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server and clustered servers up to the replica count + serverStartPolicy: "%SERVER_START_POLICY%" + + serverPod: + # an (optional) list of environment variable to be set on the servers + env: + - name: JAVA_OPTIONS + value: "%JAVA_OPTIONS%" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx512m " + %OPTIONAL_SERVERPOD_RESOURCES% + %LOG_HOME_ON_PV_PREFIX%volumes: + %LOG_HOME_ON_PV_PREFIX%- name: weblogic-domain-storage-volume + %LOG_HOME_ON_PV_PREFIX% persistentVolumeClaim: + %LOG_HOME_ON_PV_PREFIX% claimName: %DOMAIN_PVC_NAME% + %LOG_HOME_ON_PV_PREFIX%volumeMounts: + %LOG_HOME_ON_PV_PREFIX%- mountPath: %DOMAIN_ROOT_DIR% + %LOG_HOME_ON_PV_PREFIX% name: weblogic-domain-storage-volume + + # adminServer is used to configure the desired behavior for starting the administration server. + adminServer: + # serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + %EXPOSE_ANY_CHANNEL_PREFIX%adminService: + %EXPOSE_ANY_CHANNEL_PREFIX% channels: + # The Admin Server's NodePort + %EXPOSE_ADMIN_PORT_PREFIX% - channelName: default + %EXPOSE_ADMIN_PORT_PREFIX% nodePort: %ADMIN_NODE_PORT% + # Uncomment to export the T3Channel as a service + %EXPOSE_T3_CHANNEL_PREFIX% - channelName: T3Channel + + # clusters is used to configure the desired behavior for starting member servers of a cluster. + # If you use this entry, then the rules will be applied to ALL servers that are members of the named clusters. + clusters: + - clusterName: %CLUSTER_NAME% + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: %INITIAL_MANAGED_SERVER_REPLICAS% + # The number of managed servers to start for unlisted clusters + # replicas: 1 + + # Istio + %ISTIO_PREFIX%configuration: + %ISTIO_PREFIX% istio: + %ISTIO_PREFIX% enabled: %ISTIO_ENABLED% + %ISTIO_PREFIX% readinessPort: %ISTIO_READINESS_PORT% + diff --git a/OracleWebCenterContent/kubernetes/common/jrf-domain-template.yaml b/OracleWebCenterContent/kubernetes/common/jrf-domain-template.yaml new file mode 100644 index 000000000..ccd35b84f --- /dev/null +++ b/OracleWebCenterContent/kubernetes/common/jrf-domain-template.yaml @@ -0,0 +1,123 @@ +# Copyright (c) 2017, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# This is an example of how to define a Domain resource. +# +apiVersion: "weblogic.oracle/v8" +kind: Domain +metadata: + name: %DOMAIN_UID% + namespace: %NAMESPACE% + labels: + weblogic.domainUID: %DOMAIN_UID% +spec: + # The WebLogic Domain Home + domainHome: %DOMAIN_HOME% + + # The domain home source type + # Set to PersistentVolume for domain-in-pv, Image for domain-in-image, or FromModel for model-in-image + domainHomeSourceType: %DOMAIN_HOME_SOURCE_TYPE% + + # The WebLogic Server image that the Operator uses to start the domain + image: "%WEBLOGIC_IMAGE%" + + # imagePullPolicy defaults to "Always" if image version is :latest + imagePullPolicy: "%WEBLOGIC_IMAGE_PULL_POLICY%" + + # Identify which Secret contains the credentials for pulling an image + %WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%imagePullSecrets: + %WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%- name: %WEBLOGIC_IMAGE_PULL_SECRET_NAME% + + # Identify which Secret contains the WebLogic Admin credentials (note that there is an example of + # how to create that Secret at the end of this file) + webLogicCredentialsSecret: + name: %WEBLOGIC_CREDENTIALS_SECRET_NAME% + + # Whether to include the server out file into the pod's stdout, default is true + includeServerOutInPodLog: %INCLUDE_SERVER_OUT_IN_POD_LOG% + + # Whether to enable log home + %LOG_HOME_ON_PV_PREFIX%logHomeEnabled: %LOG_HOME_ENABLED% + + # Whether to write HTTP access log file to log home + %LOG_HOME_ON_PV_PREFIX%httpAccessLogInLogHome: %HTTP_ACCESS_LOG_IN_LOG_HOME% + + # The in-pod location for domain log, server logs, server out, introspector out, and Node Manager log files + %LOG_HOME_ON_PV_PREFIX%logHome: %LOG_HOME% + # An (optional) in-pod location for data storage of default and custom file stores. + # If not specified or the value is either not set or empty (e.g. dataHome: "") then the + # data storage directories are determined from the WebLogic domain home configuration. + dataHome: "%DATA_HOME%" + + # serverStartPolicy legal values are "NEVER", "IF_NEEDED", or "ADMIN_ONLY" + # This determines which WebLogic Servers the Operator will start up when it discovers this Domain + # - "NEVER" will not start any server in the domain + # - "ADMIN_ONLY" will start up only the administration server (no managed servers will be started) + # - "IF_NEEDED" will start all non-clustered servers, including the administration server and clustered servers up to the replica count + serverStartPolicy: "%SERVER_START_POLICY%" + + serverPod: + # an (optional) list of environment variable to be set on the servers + env: + - name: JAVA_OPTIONS + value: "%JAVA_OPTIONS%" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx1024m " + %OPTIONAL_SERVERPOD_RESOURCES% + %LOG_HOME_ON_PV_PREFIX%volumes: + %LOG_HOME_ON_PV_PREFIX%- name: weblogic-domain-storage-volume + %LOG_HOME_ON_PV_PREFIX% persistentVolumeClaim: + %LOG_HOME_ON_PV_PREFIX% claimName: %DOMAIN_PVC_NAME% + %LOG_HOME_ON_PV_PREFIX%volumeMounts: + %LOG_HOME_ON_PV_PREFIX%- mountPath: %DOMAIN_ROOT_DIR% + %LOG_HOME_ON_PV_PREFIX% name: weblogic-domain-storage-volume + + # adminServer is used to configure the desired behavior for starting the administration server. + adminServer: + # serverStartState legal values are "RUNNING" or "ADMIN" + # "RUNNING" means the listed server will be started up to "RUNNING" mode + # "ADMIN" means the listed server will be start up to "ADMIN" mode + serverStartState: "RUNNING" + %EXPOSE_ANY_CHANNEL_PREFIX%adminService: + %EXPOSE_ANY_CHANNEL_PREFIX% channels: + # The Admin Server's NodePort + %EXPOSE_ADMIN_PORT_PREFIX% - channelName: default + %EXPOSE_ADMIN_PORT_PREFIX% nodePort: %ADMIN_NODE_PORT% + # Uncomment to export the T3Channel as a service + %EXPOSE_T3_CHANNEL_PREFIX% - channelName: T3Channel + serverPod: + # an (optional) list of environment variable to be set on the admin servers + env: + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms512m -Xmx1024m " + + # clusters is used to configure the desired behavior for starting member servers of a cluster. + # If you use this entry, then the rules will be applied to ALL servers that are members of the named clusters. + clusters: + - clusterName: %CLUSTER_NAME% + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: %INITIAL_MANAGED_SERVER_REPLICAS% + # The number of managed servers to start for unlisted clusters + # replicas: 1 + + # Istio + %ISTIO_PREFIX%configuration: + %ISTIO_PREFIX% istio: + %ISTIO_PREFIX% enabled: %ISTIO_ENABLED% + %ISTIO_PREFIX% readinessPort: %ISTIO_READINESS_PORT% + diff --git a/OracleWebCenterContent/kubernetes/common/utility.sh b/OracleWebCenterContent/kubernetes/common/utility.sh new file mode 100644 index 000000000..a7ae01450 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/common/utility.sh @@ -0,0 +1,986 @@ +#!/usr/bin/env bash +# Copyright (c) 2018, 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# +# Utility functions that are shared by multiple scripts +# + +# +# Function to exit and print an error message +# $1 - text of message +function fail { + printError $* + exit 1 +} + +# Function to print an error message +function printError { + echo [ERROR] $* +} + +# Function to see if there is more than 1 input file. +# This could happen if the user has a properties file from +# running wdt discover domain on a on-prem domain +function checkInputFiles { + if [[ "${valuesInputFile}" =~ [,] ]] ; then + echo "Found a comma separated list of input files" + IFS=',' + read -a temp <<< "${valuesInputFile}" + + # We want to keep valuesInputFile pointing to the yaml since + # the validate function expects it. + local extension=$(echo "${temp[0]}" | sed 's/^.*\.//') + if [ ${extension} == 'yaml' ]; then + valuesInputFile=${temp[0]} + valuesInputFile1=${temp[1]} + else + valuesInputFile=${temp[1]} + valuesInputFile1=${temp[0]} + fi + fi +} + +# +# Function to parse a yaml file and generate the bash exports +# $1 - Input filename +# $2 - Output filename +function parseYaml { + local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') + sed -ne "s|^\($s\):|\1|" \ + -e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \ + -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 | + awk -F$fs '{ + if (length($3) > 0) { + # javaOptions may contain tokens that are not allowed in export command + # we need to handle it differently. + if ($2=="javaOptions") { + printf("%s=%s\n", $2, $3); + } else { + printf("export %s=\"%s\"\n", $2, $3); + } + } + }' > $2 +} + +# +# Function to parse a properties file and generate the bash exports +# $1 - Input filename +# $2 - Output filename +function parseProperties { + while IFS='=' read -r key value + do + echo "export ${key}=\"${value}\"" >> $2 + done < $1 +} + +# +# Function to remove a file if it exists +# +function removeFileIfExists { + if [ -f $1 ]; then + rm $1 + fi +} + +# +# Function to parse the common parameter inputs file +# +function parseCommonInputs { + exportValuesFile=$(mktemp /tmp/export-values-XXXXXXXXX.sh) + tmpFile=$(mktemp /tmp/javaoptions_tmp-XXXXXXXXX.dat) + parseYaml ${valuesInputFile} ${exportValuesFile} + + if [ ! -z ${valuesInputFile1} ]; then + parseProperties ${valuesInputFile1} ${exportValuesFile} + fi + + if [ ! -f ${exportValuesFile} ]; then + echo Unable to locate the parsed output of ${valuesInputFile}. + fail 'The file ${exportValuesFile} could not be found.' + fi + + # Define the environment variables that will be used to fill in template values + echo Input parameters being used + cat ${exportValuesFile} + echo + + # If we have 2 input files, we need to create a combined inputs file + # exportsValueFile contains all the properties already + # We just need to remove the term export from the file + if [ ! -z ${valuesInputFile1} ]; then + propsFile="domain.properties" + cat ${exportValuesFile} > ${propsFile} + sed -i 's/export //g' ${propsFile} + sed -i 's/"//g' ${propsFile} + valuesInputFile=${propsFile} + cat ${valuesInputFile} + fi + + # javaOptions may contain tokens that are not allowed in export command + # we need to handle it differently. + # we set the javaOptions variable that can be used later + tmpStr=`grep "javaOptions" ${exportValuesFile}` + javaOptions=${tmpStr//"javaOptions="/} + + # We exclude javaOptions from the exportValuesFile + grep -v "javaOptions" ${exportValuesFile} > ${tmpFile} + source ${tmpFile} + + rm ${exportValuesFile} ${tmpFile} +} + +# +# Function to delete a kubernetes object +# $1 object type +# $2 object name +# $3 yaml file +function deleteK8sObj { + # If the yaml file does not exist yet, unable to do the delete + if [ ! -f $3 ]; then + fail "Unable to delete object type $1 with name $2 because file $3 does not exist" + fi + + echo Checking if object type $1 with name $2 exists + K8SOBJ=`kubectl get $1 -n ${namespace} | grep $2 | wc | awk ' { print $1; }'` + if [ "${K8SOBJ}" = "1" ]; then + echo Deleting $2 using $3 + kubectl delete -f $3 + fi +} + +# +# Function to lowercase a value +# $1 - value to convert to lowercase +function toLower { + local lc=`echo $1 | tr "[:upper:]" "[:lower:]"` + echo "$lc" +} + +# +# Function to lowercase a value and make it a legal DNS1123 name +# $1 - value to convert to lowercase +function toDNS1123Legal { + local val=`echo $1 | tr "[:upper:]" "[:lower:]"` + val=${val//"_"/"-"} + echo "$val" +} + +# +# Check the state of a persistent volume. +# $1 - name of volume +# $2 - expected state of volume +function checkPvState { + + echo "Checking if the persistent volume ${1:?} is ${2:?}" + local pv_state=`kubectl get pv $1 -o jsonpath='{.status.phase}'` + attempts=0 + while [ ! "$pv_state" = "$2" ] && [ ! $attempts -eq 10 ]; do + attempts=$((attempts + 1)) + sleep 1 + pv_state=`kubectl get pv $1 -o jsonpath='{.status.phase}'` + done + if [ "$pv_state" != "$2" ]; then + fail "The persistent volume state should be $2 but is $pv_state" + fi +} + +# +# Check the state of a persistent volume claim. +# $1 - name of volume claim +# $2 - expected state of volume claim +function checkPvcState { + echo "Checking if the persistent volume claim ${1:?} is ${2:?}" + local end_secs=$((SECONDS + 30)) + local pvc_state=`kubectl get pvc $1 -o jsonpath='{.status.phase}'` + while [ ! "$pvc_state" = "$2" ] && [ $SECONDS -le $end_secs ]; do + sleep 1 + pvc_state=`kubectl get pvc $1 -o jsonpath='{.status.phase}'` + done + if [ "$pvc_state" != "$2" ]; then + fail "The persistent volume state should be $2 but is $pvc_state" + fi +} + +# +# Function to check if a persistent volume exists +# $1 - name of volume +function checkPvExists { + + echo "Checking if the persistent volume ${1} exists" + PV_EXISTS=`kubectl get pv | grep ${1} | wc | awk ' { print $1; } '` + if [ "${PV_EXISTS}" = "1" ]; then + echo "The persistent volume ${1} already exists" + PV_EXISTS="true" + else + echo "The persistent volume ${1} does not exist" + PV_EXISTS="false" + fi +} + +# +# Function to check if a persistent volume claim exists +# $1 - name of persistent volume claim +# $2 - NameSpace +function checkPvcExists { + echo "Checking if the persistent volume claim ${1} in NameSpace ${2} exists" + PVC_EXISTS=`kubectl get pvc -n ${2} | grep ${1} | wc | awk ' { print $1; } '` + if [ "${PVC_EXISTS}" = "1" ]; then + echo "The persistent volume claim ${1} already exists in NameSpace ${2}" + PVC_EXISTS="true" + else + echo "The persistent volume claim ${1} does not exist in NameSpace ${2}" + PVC_EXISTS="false" + fi +} + +# Copy the inputs file from the command line into the output directory +# for the domain/operator unless the output directory already has an +# inputs file and the file is the same as the one from the commandline. +# $1 the inputs file from the command line +# $2 the file in the output directory that needs to be made the same as $1 +function copyInputsFileToOutputDirectory { + local from=$1 + local to=$2 + local doCopy="true" + if [ -f "${to}" ]; then + local difference=`diff ${from} ${to}` + if [ -z "${difference}" ]; then + # the output file already exists and is the same as the inputs file. + # don't make a copy. + doCopy="false" + fi + fi + if [ "${doCopy}" = "true" ]; then + cp ${from} ${to} + fi +} + +# +# Function to obtain the IP address of the kubernetes cluster. This information +# is used to form the URL's for accessing services that were deployed. +# +function getKubernetesClusterIP { + + # Get name of the current context + local CUR_CTX=`kubectl config current-context | awk ' { print $1; } '` + + # Get the name of the current cluster + local CUR_CLUSTER_CMD="kubectl config view -o jsonpath='{.contexts[?(@.name == \"${CUR_CTX}\")].context.cluster}' | awk ' { print $1; } '" + local CUR_CLUSTER=`eval ${CUR_CLUSTER_CMD}` + + # Get the server address for the current cluster + local SVR_ADDR_CMD="kubectl config view -o jsonpath='{.clusters[?(@.name == \"${CUR_CLUSTER}\")].cluster.server}' | awk ' { print $1; } '" + local SVR_ADDR=`eval ${SVR_ADDR_CMD}` + + # Server address is expected to be of the form http://address:port. Delimit + # string on the colon to obtain the address. + local array=(${SVR_ADDR//:/ }) + K8S_IP="${array[1]/\/\//}" + +} + +# +# Function to set the serverPodResources variable for including into the generated +# domain.yaml, base on the serverPod resource requests and limits input values, +# if specified. +# The serverPodResources variable remains unset if none of the input values are provided. +# +function buildServerPodResources { + + if [ -n "${serverPodMemoryRequest}" ]; then + local memoryRequest=" memory\: \"${serverPodMemoryRequest}\"\n" + fi + if [ -n "${serverPodCpuRequest}" ]; then + local cpuRequest=" cpu\: \"${serverPodCpuRequest}\"\n" + fi + if [ -n "${memoryRequest}" ] || [ -n "${cpuRequest}" ]; then + local requests=" requests\: \n$memoryRequest $cpuRequest" + fi + + if [ -n "${serverPodMemoryLimit}" ]; then + local memoryLimit=" memory\: \"${serverPodMemoryLimit}\"\n" + fi + if [ -n "${serverPodCpuLimit}" ]; then + local cpuLimit=" cpu\: \"${serverPodCpuLimit}\"\n" + fi + if [ -n "${memoryLimit}" ] || [ -n "${cpuLimit}" ]; then + local limits=" limits\: \n$memoryLimit $cpuLimit" + fi + + if [ -n "${requests}" ] || [ -n "${limits}" ]; then + # build resources element and remove last '\n' + serverPodResources=$(echo "resources\:\n${requests}${limits}" | sed -e 's/\\n$//') + fi +} + +# +# Function to generate the properties and yaml files for creating a domain +# +function createFiles { + + update=false + if [ "$#" == 1 ]; then + echo Trying to update the domain + update=true + fi + + # Make sure the output directory has a copy of the inputs file. + # The user can either pre-create the output directory, put the inputs + # file there, and create the domain from it, or the user can put the + # inputs file some place else and let this script create the output directory + # (if needed) and copy the inputs file there. + echo createFiles - valuesInputFile is ${valuesInputFile} + copyInputsFileToOutputDirectory ${valuesInputFile} "${domainOutputDir}/create-domain-inputs.yaml" + + if [ "${domainHomeInImage}" == "true" ]; then + if [ -z "${domainHomeImageBase}" ]; then + fail "Please specify domainHomeImageBase in your input YAML" + fi + else + if [ -z "${image}" ]; then + fail "Please specify image in your input YAML" + fi + fi + + dcrOutput="${domainOutputDir}/domain.yaml" + + domainName=${domainUID} + + enabledPrefix="" # uncomment the feature + disabledPrefix="# " # comment out the feature + + exposeAnyChannelPrefix="${disabledPrefix}" + if [ "${exposeAdminT3Channel}" = true ]; then + exposeAdminT3ChannelPrefix="${enabledPrefix}" + exposeAnyChannelPrefix="${enabledPrefix}" + # set t3PublicAddress if not set + if [ -z "${t3PublicAddress}" ]; then + getKubernetesClusterIP + t3PublicAddress="${K8S_IP}" + fi + else + exposeAdminT3ChannelPrefix="${disabledPrefix}" + fi + + if [ "${exposeAdminNodePort}" = true ]; then + exposeAdminNodePortPrefix="${enabledPrefix}" + exposeAnyChannelPrefix="${enabledPrefix}" + else + exposeAdminNodePortPrefix="${disabledPrefix}" + fi + + if [ "${istioEnabled}" == "true" ]; then + istioPrefix="${enabledPrefix}" + else + istioPrefix="${disabledPrefix}" + fi + + # The FromModel, MII (model-in-image), and WDT_DOMAIN_TYPE updates in this script + # must remain even though they are not referenced by a sample. They're used by the + # Operator integration test code. If you're interested in MII, + # see './kubernetes/samples/scripts/create-weblogic-domain/model-in-image'. + + # MII settings are used for model-in-image integration testing + if [ "${domainHomeSourceType}" == "FromModel" ]; then + miiPrefix="${enabledPrefix}" + else + miiPrefix="${disabledPrefix}" + fi + + # MII settings are used for model-in-image integration testing + if [ -z "${miiConfigMap}" ]; then + miiConfigMapPrefix="${disabledPrefix}" + else + miiConfigMapPrefix="${enabledPrefix}" + fi + + # For some parameters, use the default value if not defined. + if [ -z "${domainPVMountPath}" ]; then + domainPVMountPath="/shared" + fi + + if [ -z "${logHome}" ]; then + logHome="${domainPVMountPath}/logs/${domainUID}" + fi + + if [ -z "${httpAccessLogInLogHome}" ]; then + httpAccessLogInLogHome="true" + fi + + if [ -z "${dataHome}" ]; then + dataHome="" + fi + + if [ -z "${persistentVolumeClaimName}" ]; then + persistentVolumeClaimName="${domainUID}-weblogic-sample-pvc" + fi + + if [ -z "${weblogicCredentialsSecretName}" ]; then + weblogicCredentialsSecretName="${domainUID}-weblogic-credentials" + fi + + if [ "${domainHomeInImage}" == "true" ]; then + domainPropertiesOutput="${domainOutputDir}/domain.properties" + domainHome="${domainHome:-/u01/oracle/user_projects/domains/${domainName}}" + + # Generate the properties file that will be used when creating the weblogic domain + echo Generating ${domainPropertiesOutput} from ${domainPropertiesInput} + + cp ${domainPropertiesInput} ${domainPropertiesOutput} + sed -i -e "s:%DOMAIN_NAME%:${domainName}:g" ${domainPropertiesOutput} + sed -i -e "s:%DOMAIN_HOME%:${domainHome}:g" ${domainPropertiesOutput} + sed -i -e "s:%ADMIN_PORT%:${adminPort}:g" ${domainPropertiesOutput} + sed -i -e "s:%ADMIN_SERVER_SSL_PORT%:${adminServerSSLPort}:g" ${domainPropertiesOutput} + sed -i -e "s:%ADMIN_SERVER_NAME%:${adminServerName}:g" ${domainPropertiesOutput} + sed -i -e "s:%MANAGED_SERVER_PORT%:${managedServerPort}:g" ${domainPropertiesOutput} + sed -i -e "s:%MANAGED_SERVER_SSL_PORT%:${managedServerSSLPort}:g" ${domainPropertiesOutput} + sed -i -e "s:%MANAGED_SERVER_NAME_BASE%:${managedServerNameBase}:g" ${domainPropertiesOutput} + sed -i -e "s:%CONFIGURED_MANAGED_SERVER_COUNT%:${configuredManagedServerCount}:g" ${domainPropertiesOutput} + sed -i -e "s:%CLUSTER_NAME%:${clusterName}:g" ${domainPropertiesOutput} + sed -i -e "s:%SSL_ENABLED%:${sslEnabled}:g" ${domainPropertiesOutput} + sed -i -e "s:%PRODUCTION_MODE_ENABLED%:${productionModeEnabled}:g" ${domainPropertiesOutput} + sed -i -e "s:%CLUSTER_TYPE%:${clusterType}:g" ${domainPropertiesOutput} + sed -i -e "s;%JAVA_OPTIONS%;${javaOptions};g" ${domainPropertiesOutput} + sed -i -e "s:%T3_CHANNEL_PORT%:${t3ChannelPort}:g" ${domainPropertiesOutput} + sed -i -e "s:%T3_PUBLIC_ADDRESS%:${t3PublicAddress}:g" ${domainPropertiesOutput} + sed -i -e "s:%EXPOSE_T3_CHANNEL%:${exposeAdminT3Channel}:g" ${domainPropertiesOutput} + sed -i -e "s:%FMW_DOMAIN_TYPE%:${fmwDomainType}:g" ${domainPropertiesOutput} + sed -i -e "s:%WDT_DOMAIN_TYPE%:${wdtDomainType}:g" ${domainPropertiesOutput} + sed -i -e "s:%ADMIN_USER_NAME%:${username}:g" ${domainPropertiesOutput} + sed -i -e "s:%ADMIN_USER_PASS%:${password}:g" ${domainPropertiesOutput} + sed -i -e "s:%RCU_SCHEMA_PREFIX%:${rcuSchemaPrefix}:g" ${domainPropertiesOutput} + sed -i -e "s:%RCU_SCHEMA_PASSWORD%:${rcuSchemaPassword}:g" ${domainPropertiesOutput} + sed -i -e "s|%RCU_DB_CONN_STRING%|${rcuDatabaseURL}|g" ${domainPropertiesOutput} + + if [ -z "${image}" ]; then + # calculate the internal name to tag the generated image + defaultImageName="domain-home-in-image" + baseTag=${domainHomeImageBase#*:} + defaultImageName=${defaultImageName}:${baseTag:-"latest"} + sed -i -e "s|%IMAGE_NAME%|${defaultImageName}|g" ${domainPropertiesOutput} + export BUILD_IMAGE_TAG=${defaultImageName} + else + sed -i -e "s|%IMAGE_NAME%|${image}|g" ${domainPropertiesOutput} + export BUILD_IMAGE_TAG=${image} + fi + else + # we're in the domain in PV case + + wdtVersion="${WDT_VERSION:-${wdtVersion}}" + httpsProxy="${https_proxy}" + + createJobOutput="${domainOutputDir}/create-domain-job.yaml" + deleteJobOutput="${domainOutputDir}/delete-domain-job.yaml" + + if [ -z "${domainHome}" ]; then + domainHome="${domainPVMountPath}/domains/${domainUID}" + fi + + # Use the default value if not defined. + if [ -z "${createDomainScriptsMountPath}" ]; then + createDomainScriptsMountPath="/u01/weblogic" + fi + + if [ "${update}" == "true" ]; then + createDomainScriptName="update-domain-job.sh" + elif [ -z "${createDomainScriptName}" ]; then + createDomainScriptName="create-domain-job.sh" + fi + echo createDomainScriptName is ${createDomainScriptName} + + # Must escape the ':' value in image for sed to properly parse and replace + image=$(echo ${image} | sed -e "s/\:/\\\:/g") + + # Generate the yaml to create the kubernetes job that will create the weblogic domain + echo Generating ${createJobOutput} + + cp ${createJobInput} ${createJobOutput} + sed -i -e "s:%NAMESPACE%:$namespace:g" ${createJobOutput} + sed -i -e "s:%WEBLOGIC_CREDENTIALS_SECRET_NAME%:${weblogicCredentialsSecretName}:g" ${createJobOutput} + sed -i -e "s:%WEBLOGIC_IMAGE%:${image}:g" ${createJobOutput} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_POLICY%:${imagePullPolicy}:g" ${createJobOutput} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_NAME%:${imagePullSecretName}:g" ${createJobOutput} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%:${imagePullSecretPrefix}:g" ${createJobOutput} + sed -i -e "s:%DOMAIN_UID%:${domainUID}:g" ${createJobOutput} + sed -i -e "s:%DOMAIN_NAME%:${domainName}:g" ${createJobOutput} + sed -i -e "s:%DOMAIN_HOME%:${domainHome}:g" ${createJobOutput} + sed -i -e "s:%SSL_ENABLED%:${sslEnabled}:g" ${createJobOutput} + sed -i -e "s:%PRODUCTION_MODE_ENABLED%:${productionModeEnabled}:g" ${createJobOutput} + sed -i -e "s:%ADMIN_SERVER_NAME%:${adminServerName}:g" ${createJobOutput} + sed -i -e "s:%ADMIN_SERVER_NAME_SVC%:${adminServerNameSVC}:g" ${createJobOutput} + sed -i -e "s:%ADMIN_PORT%:${adminPort}:g" ${createJobOutput} + sed -i -e "s:%ADMIN_SERVER_SSL_PORT%:${adminServerSSLPort}:g" ${createJobOutput} + sed -i -e "s:%CONFIGURED_MANAGED_SERVER_COUNT%:${configuredManagedServerCount}:g" ${createJobOutput} + sed -i -e "s:%MANAGED_SERVER_NAME_BASE%:${managedServerNameBase}:g" ${createJobOutput} + sed -i -e "s:%MANAGED_SERVER_NAME_BASE_SVC%:${managedServerNameBaseSVC}:g" ${createJobOutput} + sed -i -e "s:%MANAGED_SERVER_PORT%:${managedServerPort}:g" ${createJobOutput} + sed -i -e "s:%MANAGED_SERVER_SSL_PORT%:${managedServerSSLPort}:g" ${createJobOutput} + sed -i -e "s:%T3_CHANNEL_PORT%:${t3ChannelPort}:g" ${createJobOutput} + sed -i -e "s:%T3_PUBLIC_ADDRESS%:${t3PublicAddress}:g" ${createJobOutput} + sed -i -e "s:%CLUSTER_NAME%:${clusterName}:g" ${createJobOutput} + sed -i -e "s:%CLUSTER_TYPE%:${clusterType}:g" ${createJobOutput} + sed -i -e "s:%DOMAIN_PVC_NAME%:${persistentVolumeClaimName}:g" ${createJobOutput} + sed -i -e "s:%DOMAIN_ROOT_DIR%:${domainPVMountPath}:g" ${createJobOutput} + sed -i -e "s:%CREATE_DOMAIN_SCRIPT_DIR%:${createDomainScriptsMountPath}:g" ${createJobOutput} + sed -i -e "s:%CREATE_DOMAIN_SCRIPT%:${createDomainScriptName}:g" ${createJobOutput} + # extra entries for FMW Infra domains + sed -i -e "s:%RCU_CREDENTIALS_SECRET_NAME%:${rcuCredentialsSecret}:g" ${createJobOutput} + sed -i -e "s:%CUSTOM_RCUPREFIX%:${rcuSchemaPrefix}:g" ${createJobOutput} + sed -i -e "s|%CUSTOM_CONNECTION_STRING%|${rcuDatabaseURL}|g" ${createJobOutput} + sed -i -e "s:%EXPOSE_T3_CHANNEL_PREFIX%:${exposeAdminT3Channel}:g" ${createJobOutput} + sed -i -e "s:%FRONTEND_HOST%:${frontEndHost}:g" ${createJobOutput} + sed -i -e "s:%FRONTEND_PORT%:${frontEndPort}:g" ${createJobOutput} + # entries for Istio + sed -i -e "s:%ISTIO_PREFIX%:${istioPrefix}:g" ${createJobOutput} + sed -i -e "s:%ISTIO_ENABLED%:${istioEnabled}:g" ${createJobOutput} + sed -i -e "s:%ISTIO_READINESS_PORT%:${istioReadinessPort}:g" ${createJobOutput} + sed -i -e "s:%WDT_VERSION%:${wdtVersion}:g" ${createJobOutput} + sed -i -e "s|%DOMAIN_TYPE%|${domain_type}|g" ${createJobOutput} + sed -i -e "s|%PROXY_VAL%|${httpsProxy}|g" ${createJobOutput} + + # Generate the yaml to create the kubernetes job that will delete the weblogic domain_home folder + echo Generating ${deleteJobOutput} + + cp ${deleteJobInput} ${deleteJobOutput} + sed -i -e "s:%NAMESPACE%:$namespace:g" ${deleteJobOutput} + sed -i -e "s:%WEBLOGIC_IMAGE%:${image}:g" ${deleteJobOutput} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_POLICY%:${imagePullPolicy}:g" ${deleteJobOutput} + sed -i -e "s:%WEBLOGIC_CREDENTIALS_SECRET_NAME%:${weblogicCredentialsSecretName}:g" ${deleteJobOutput} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_NAME%:${imagePullSecretName}:g" ${deleteJobOutput} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%:${imagePullSecretPrefix}:g" ${deleteJobOutput} + sed -i -e "s:%DOMAIN_UID%:${domainUID}:g" ${deleteJobOutput} + sed -i -e "s:%DOMAIN_NAME%:${domainName}:g" ${deleteJobOutput} + sed -i -e "s:%DOMAIN_HOME%:${domainHome}:g" ${deleteJobOutput} + sed -i -e "s:%DOMAIN_PVC_NAME%:${persistentVolumeClaimName}:g" ${deleteJobOutput} + sed -i -e "s:%DOMAIN_ROOT_DIR%:${domainPVMountPath}:g" ${deleteJobOutput} + fi + + if [ "${domainHomeSourceType}" == "FromModel" ]; then + echo domainHomeSourceType is FromModel + # leave domainHomeSourceType to FromModel + if [ "${logHomeOnPV}" == "true" ]; then + logHomeOnPVPrefix="${enabledPrefix}" + else + logHomeOnPVPrefix="${disabledPrefix}" + fi + elif [ "${domainHomeInImage}" == "true" ]; then + domainHomeSourceType="Image" + if [ "${logHomeOnPV}" == "true" ]; then + logHomeOnPVPrefix="${enabledPrefix}" + else + logHomeOnPVPrefix="${disabledPrefix}" + fi + else + domainHomeSourceType="PersistentVolume" + logHomeOnPVPrefix="${enabledPrefix}" + logHomeOnPV=true + fi + + # Generate the yaml file for creating the domain resource + # We want to use wdt's extractDomainResource.sh to get the domain resource + # for domain on pv use case. For others, generate domain resource here + + if [ "${domainHomeSourceType}" != "PersistentVolume" ] || [ "${wdtDomainType}" != "WLS" ] || + [ "${useWdt}" != true ]; then + echo Generating ${dcrOutput} + + cp ${dcrInput} ${dcrOutput} + sed -i -e "s:%DOMAIN_UID%:${domainUID}:g" ${dcrOutput} + sed -i -e "s:%NAMESPACE%:$namespace:g" ${dcrOutput} + sed -i -e "s:%DOMAIN_HOME%:${domainHome}:g" ${dcrOutput} + sed -i -e "s:%DOMAIN_HOME_SOURCE_TYPE%:${domainHomeSourceType}:g" ${dcrOutput} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_POLICY%:${imagePullPolicy}:g" ${dcrOutput} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%:${imagePullSecretPrefix}:g" ${dcrOutput} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_NAME%:${imagePullSecretName}:g" ${dcrOutput} + sed -i -e "s:%WEBLOGIC_CREDENTIALS_SECRET_NAME%:${weblogicCredentialsSecretName}:g" ${dcrOutput} + sed -i -e "s:%INCLUDE_SERVER_OUT_IN_POD_LOG%:${includeServerOutInPodLog}:g" ${dcrOutput} + sed -i -e "s:%LOG_HOME_ON_PV_PREFIX%:${logHomeOnPVPrefix}:g" ${dcrOutput} + sed -i -e "s:%LOG_HOME_ENABLED%:${logHomeOnPV}:g" ${dcrOutput} + sed -i -e "s:%LOG_HOME%:${logHome}:g" ${dcrOutput} + sed -i -e "s:%HTTP_ACCESS_LOG_IN_LOG_HOME%:${httpAccessLogInLogHome}:g" ${dcrOutput} + sed -i -e "s:%DATA_HOME%:${dataHome}:g" ${dcrOutput} + sed -i -e "s:%SERVER_START_POLICY%:${serverStartPolicy}:g" ${dcrOutput} + sed -i -e "s;%JAVA_OPTIONS%;${javaOptions};g" ${dcrOutput} + sed -i -e "s:%DOMAIN_PVC_NAME%:${persistentVolumeClaimName}:g" ${dcrOutput} + sed -i -e "s:%DOMAIN_ROOT_DIR%:${domainPVMountPath}:g" ${dcrOutput} + + if [ "${istioEnabled}" == "true" ]; then + exposeAdminNodePortPrefix="${disabledPrefix}" + fi + + sed -i -e "s:%EXPOSE_T3_CHANNEL_PREFIX%:${exposeAdminT3ChannelPrefix}:g" ${dcrOutput} + sed -i -e "s:%EXPOSE_ANY_CHANNEL_PREFIX%:${exposeAnyChannelPrefix}:g" ${dcrOutput} + sed -i -e "s:%EXPOSE_ADMIN_PORT_PREFIX%:${exposeAdminNodePortPrefix}:g" ${dcrOutput} + sed -i -e "s:%ADMIN_NODE_PORT%:${adminNodePort}:g" ${dcrOutput} + sed -i -e "s:%CLUSTER_NAME%:${clusterName}:g" ${dcrOutput} + sed -i -e "s:%INITIAL_MANAGED_SERVER_REPLICAS%:${initialManagedServerReplicas}:g" ${dcrOutput} + sed -i -e "s:%ISTIO_PREFIX%:${istioPrefix}:g" ${dcrOutput} + sed -i -e "s:%ISTIO_ENABLED%:${istioEnabled}:g" ${dcrOutput} + sed -i -e "s:%ISTIO_READINESS_PORT%:${istioReadinessPort}:g" ${dcrOutput} + # MII settings are used for model-in-image integration testing + sed -i -e "s:%MII_PREFIX%:${miiPrefix}:g" ${dcrOutput} + sed -i -e "s:%MII_CONFIG_MAP_PREFIX%:${miiConfigMapPrefix}:g" ${dcrOutput} + sed -i -e "s:%MII_CONFIG_MAP%:${miiConfigMap}:g" ${dcrOutput} + sed -i -e "s:%WDT_DOMAIN_TYPE%:${wdtDomainType}:g" ${dcrOutput} + + buildServerPodResources + if [ -z "${serverPodResources}" ]; then + sed -i -e "/%OPTIONAL_SERVERPOD_RESOURCES%/d" ${dcrOutput} + else + if [[ $(uname) -eq "Darwin" ]]; then + serverPodResources=$(echo "${serverPodResources}" | sed -e 's/\\n/%NEWLINE%/g') + sed -i -e "s:%OPTIONAL_SERVERPOD_RESOURCES%:${serverPodResources}:g" ${dcrOutput} + sed -i -e $'s|%NEWLINE%|\\\n|g' ${dcrOutput} + else + sed -i -e "s:%OPTIONAL_SERVERPOD_RESOURCES%:${serverPodResources}:g" ${dcrOutput} + fi + fi + + if [ "${domainHomeInImage}" == "true" ]; then + + # now we know which image to use, update the domain yaml file + if [ -z $image ]; then + sed -i -e "s|%WEBLOGIC_IMAGE%|${defaultImageName}|g" ${dcrOutput} + else + sed -i -e "s|%WEBLOGIC_IMAGE%|${image}|g" ${dcrOutput} + fi + else + sed -i -e "s:%WEBLOGIC_IMAGE%:${image}:g" ${dcrOutput} + fi + fi + + # Remove any "...yaml-e" and "...properties-e" files left over from running sed + rm -f ${domainOutputDir}/*.yaml-e + rm -f ${domainOutputDir}/*.properties-e + +} + + +# +# Function to markup the wdt model file +# +function updateModelFile { + # Update the wdt model file with kubernetes section + modelFile="${domainOutputDir}/tmp/wdt_model.yaml" + cat ${scriptDir}/wdt_k8s_model_template.yaml >> ${modelFile} + + sed -i -e "s:%DOMAIN_UID%:${domainUID}:g" ${modelFile} + sed -i -e "s:%NAMESPACE%:$namespace:g" ${modelFile} + sed -i -e "s:%DOMAIN_HOME%:${domainHome}:g" ${modelFile} + sed -i -e "s:%DOMAIN_HOME_SOURCE_TYPE%:${domainHomeSourceType}:g" ${modelFile} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_POLICY%:${imagePullPolicy}:g" ${modelFile} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%:${imagePullSecretPrefix}:g" ${modelFile} + sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_NAME%:${imagePullSecretName}:g" ${modelFile} + sed -i -e "s:%WEBLOGIC_CREDENTIALS_SECRET_NAME%:${weblogicCredentialsSecretName}:g" ${modelFile} + sed -i -e "s:%INCLUDE_SERVER_OUT_IN_POD_LOG%:${includeServerOutInPodLog}:g" ${modelFile} + sed -i -e "s:%LOG_HOME_ON_PV_PREFIX%:${logHomeOnPVPrefix}:g" ${modelFile} + sed -i -e "s:%LOG_HOME_ENABLED%:${logHomeOnPV}:g" ${modelFile} + sed -i -e "s:%LOG_HOME%:${logHome}:g" ${modelFile} + sed -i -e "s:%HTTP_ACCESS_LOG_IN_LOG_HOME%:${httpAccessLogInLogHome}:g" ${modelFile} + sed -i -e "s:%DATA_HOME%:${dataHome}:g" ${modelFile} + sed -i -e "s:%SERVER_START_POLICY%:${serverStartPolicy}:g" ${modelFile} + sed -i -e "s;%JAVA_OPTIONS%;${javaOptions};g" ${modelFile} + sed -i -e "s:%DOMAIN_PVC_NAME%:${persistentVolumeClaimName}:g" ${modelFile} + sed -i -e "s:%DOMAIN_ROOT_DIR%:${domainPVMountPath}:g" ${modelFile} + + if [ "${istioEnabled}" == "true" ]; then + exposeAdminNodePortPrefix="${disabledPrefix}" + fi + + sed -i -e "s:%EXPOSE_T3_CHANNEL_PREFIX%:${exposeAdminT3ChannelPrefix}:g" ${modelFile} + sed -i -e "s:%EXPOSE_ANY_CHANNEL_PREFIX%:${exposeAnyChannelPrefix}:g" ${modelFile} + sed -i -e "s:%EXPOSE_ADMIN_PORT_PREFIX%:${exposeAdminNodePortPrefix}:g" ${modelFile} + sed -i -e "s:%ADMIN_NODE_PORT%:${adminNodePort}:g" ${modelFile} + sed -i -e "s:%CLUSTER_NAME%:${clusterName}:g" ${modelFile} + sed -i -e "s:%INITIAL_MANAGED_SERVER_REPLICAS%:${initialManagedServerReplicas}:g" ${modelFile} + sed -i -e "s:%ISTIO_PREFIX%:${istioPrefix}:g" ${modelFile} + sed -i -e "s:%ISTIO_ENABLED%:${istioEnabled}:g" ${modelFile} + sed -i -e "s:%ISTIO_READINESS_PORT%:${istioReadinessPort}:g" ${modelFile} + # MII settings are used for model-in-image integration testing + sed -i -e "s:%MII_PREFIX%:${miiPrefix}:g" ${modelFile} + sed -i -e "s:%MII_CONFIG_MAP_PREFIX%:${miiConfigMapPrefix}:g" ${modelFile} + sed -i -e "s:%MII_CONFIG_MAP%:${miiConfigMap}:g" ${modelFile} + sed -i -e "s:%WDT_DOMAIN_TYPE%:${wdtDomainType}:g" ${modelFile} + + buildServerPodResources + if [ -z "${serverPodResources}" ]; then + sed -i -e "/%OPTIONAL_SERVERPOD_RESOURCES%/d" ${modelFile} + else + if [[ $(uname) -eq "Darwin" ]]; then + serverPodResources=$(echo "${serverPodResources}" | sed -e 's/\\n/%NEWLINE%/g') + sed -i -e "s:%OPTIONAL_SERVERPOD_RESOURCES%:${serverPodResources}:g" ${modelFile} + sed -i -e $'s|%NEWLINE%|\\\n|g' ${modelFile} + else + sed -i -e "s:%OPTIONAL_SERVERPOD_RESOURCES%:${serverPodResources}:g" ${modelFile} + fi + fi + + sed -i -e "s:%WEBLOGIC_IMAGE%:${image}:g" ${modelFile} +} + +# +# Function to create the domain recource +# +function createDomainResource { + kubectl apply -f ${dcrOutput} + + attempts=0 + while [ "$DCR_AVAIL" != "1" ] && [ ! $attempts -eq 10 ]; do + attempts=$((attempts + 1)) + sleep 1 + DCR_AVAIL=`kubectl get domain ${domainUID} -n ${namespace} | grep ${domainUID} | wc | awk ' { print $1; } '` + done + if [ "${DCR_AVAIL}" != "1" ]; then + fail "The domain resource ${domainUID} was not found" + fi +} + +# +# Function to create a domain +# $1 - boolean value indicating the location of the domain home +# true means domain home in image +# false means domain home on PV +# +function createDomain { + if [ "$#" != 1 ]; then + fail "The function must be called with domainHomeInImage parameter." + fi + + domainHomeInImage="${1}" + if [ "true" != "${domainHomeInImage}" ] && [ "false" != "${domainHomeInImage}" ]; then + fail "The value of domainHomeInImage must be true or false: ${domainHomeInImage}" + fi + + # Setup the environment for running this script and perform initial validation checks + initialize + + # Generate files for creating the domain + createFiles + + # Check that the domain secret exists and contains the required elements + validateDomainSecret + + # Validate the domain's persistent volume claim + if [ "${doValidation}" == true ] && [ "${domainHomeInImage}" == false -o "${logHomeOnPV}" == true ]; then + validateDomainPVC + fi + + # Create the WebLogic domain home + createDomainHome + + if [ "${executeIt}" = true ]; then + createDomainResource + fi + + # Print a summary + printSummary +} + +# +# Function to update a domain +# $1 - boolean value indicating the location of the domain home +# true means domain home in image +# false means domain home on PV +# +function updateDomain { + + domainHomeInImage="false" + + # Setup the environment for running this script and perform initial validation checks + initialize + + # Generate files for creating the domain + createFiles update + + # Check that the domain secret exists and contains the required elements + validateDomainSecret + + # Validate the domain's persistent volume claim + if [ "${doValidation}" == true ]; then + validateDomainPVC + fi + + # Create the WebLogic domain home + updateDomainHome + + if [ "${executeIt}" = true ]; then + createDomainResource + fi + + # Print a summary + printSummary +} + +# checks if a given pod in a NameSpace has been deleted +function checkPodDelete(){ + + pod=$1 + ns=$2 + status="Terminating" + + if [ -z ${1} ]; then + echo "No Pod name provided " + exit -1 + fi + + if [ -z ${2} ]; then + echo "No NameSpace provided " + exit -2 + fi + + echo "Checking Status for Pod [$pod] in namespace [${ns}]" + max=10 + count=1 + while [ $count -le $max ] ; do + sleep 5 + pod=`kubectl get po/$1 -n ${ns} | grep -v NAME | awk '{print $1}'` + if [ -z ${pod} ]; then + status="Terminated" + echo "Pod [$1] removed from nameSpace [${ns}]" + break; + fi + count=`expr $count + 1` + echo "Pod [$pod] Status [${status}]" + done + + if [ $count -gt $max ] ; then + echo "[ERROR] The Pod[$1] in NameSpace [$ns] could not be deleted in 50s"; + exit 1 + fi +} + +# Checks if all container(s) in a pod are running state based on READY column +#NAME READY STATUS RESTARTS AGE +#domain1-adminserver 1/1 Running 0 4m + +function checkPodState(){ + + status="NotReady" + max=60 + count=1 + + pod=$1 + ns=$2 + state=${3:-1/1} + + echo "Checking Pod READY column for State [$state]" + pname=`kubectl get po -n ${ns} | grep -w ${pod} | awk '{print $1}'` + if [ -z ${pname} ]; then + echo "No such pod [$pod] exists in NameSpace [$ns] " + exit -1 + fi + + rcode=`kubectl get po ${pname} -n ${ns} | grep -w ${pod} | awk '{print $2}'` + [[ ${rcode} -eq "${state}" ]] && status="Ready" + + while [ ${status} != "Ready" -a $count -le $max ] ; do + sleep 5 + rcode=`kubectl get po/$pod -n ${ns} | grep -v NAME | awk '{print $2}'` + [[ ${rcode} -eq "1/1" ]] && status="Ready" + echo "Pod [$1] Status is ${status} Iter [$count/$max]" + count=`expr $count + 1` + done + if [ $count -gt $max ] ; then + echo "[ERROR] Unable to start the Pod [$pod] after 300s "; + exit 1 + fi + + pname=`kubectl get po -n ${ns} | grep -w ${pod} | awk '{print $1}'` + kubectl -n ${ns} get po ${pname} +} + +# Checks if a pod is available in a given namespace +function checkPod(){ + + max=20 + count=1 + + pod=$1 + ns=$2 + + pname=`kubectl get po -n ${ns} | grep -w ${pod} | awk '{print $1}'` + if [ -z ${pname} ]; then + echo "No such pod [$pod] exists in NameSpace [$ns]" + sleep 10 + fi + + rcode=`kubectl get po -n ${ns} | grep -w ${pod} | awk '{print $1}'` + if [ ! -z ${rcode} ]; then + echo "[$pod] already initialized .. " + return 0 + fi + + echo "The POD [${pod}] has not been initialized ..." + while [ -z ${rcode} ]; do + [[ $count -gt $max ]] && break + echo "Pod[$pod] is being initialized ..." + sleep 5 + rcode=`kubectl get po -n ${ns} | grep $pod | awk '{print $1}'` + count=`expr $count + 1` + done + + if [ $count -gt $max ] ; then + echo "[ERROR] Could not find Pod [$pod] after 120s"; + exit 1 + fi +} + +# Checks if a service is available in a given namespace +function checkService(){ + svc=$1 + ns=$2 + startSecs=$SECONDS + maxWaitSecs=20 + while [ -z "`kubectl get service -n ${ns} | grep -w ${svc}`" ]; do + if [ $((SECONDS - startSecs)) -lt $maxWaitSecs ]; then + echo "Service [$svc] not found after $((SECONDS - startSecs)) seconds, retrying ..." + sleep 5 + else + echo "[Error] Could not find Service [$svc] after $((SECONDS - startSecs)) seconds" + exit 1 + fi + done + echo "Service [$svc] found" +} + +# Get pod name when pod available in a given namespace +function getPodName(){ + + local max=$((SECONDS + 120)) + + local pod=$1 + local ns=$2 + + local pname="" + while [ $SECONDS -le $max ] ; do + pname=`kubectl get po -n ${ns} | grep -w ${pod} | awk '{print $1}'` + [ -z "${pname}" ] || break + sleep 1 + done + + if [ -z "${pname}" ] ; then + echo "[ERROR] Could not find Pod [$pod] after $max seconds"; + exit 1 + fi + + echo "${pname}" +} + +# Checks if a pod is available in a given namespace +function detectPod() { + ns=$1 + startSecs=$SECONDS + maxWaitSecs=10 + while [ -z "`kubectl get pod -n ${ns} -o jsonpath={.items[0].metadata.name}`" ]; do + if [ $((SECONDS - startSecs)) -lt $maxWaitSecs ]; then + echo "Pod not found after $((SECONDS - startSecs)) seconds, retrying ..." + sleep 2 + else + echo "[Error] Could not find Pod after $((SECONDS - startSecs)) seconds" + exit 1 + fi + done + retVal=`kubectl get pod -n ${ns} -o jsonpath={.items[0].metadata.name}` + echo "$retVal" +} diff --git a/OracleWebCenterContent/kubernetes/common/validate.sh b/OracleWebCenterContent/kubernetes/common/validate.sh new file mode 100644 index 000000000..b6f06337c --- /dev/null +++ b/OracleWebCenterContent/kubernetes/common/validate.sh @@ -0,0 +1,506 @@ +#!/usr/bin/env bash +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Description +# Common validation functions shared by all other scripts that process inputs properties. +# + +# +# Function to note that a validate error has occurred +# +function validationError { + printError $* + validateErrors=true +} + +# +# Function to cause the script to fail if there were any validation errors +# +function failIfValidationErrors { + if [ "$validateErrors" = true ]; then + fail 'The errors listed above must be resolved before the script can continue' + fi +} + +# +# Function to validate that a list of required input parameters were specified +# +function validateInputParamsSpecified { + for p in $*; do + local name=$p + local val=${!name} + if [ -z "$val" ]; then + validationError "The ${name} parameter in ${valuesInputFile} is missing, null or empty" + fi + done +} + +# +# Function to validate that a list of input parameters have boolean values. +# It assumes that validateInputParamsSpecified will also be called for these params. +# +function validateBooleanInputParamsSpecified { + validateInputParamsSpecified $* + for p in $*; do + local name=$p + local val=${!name} + if ! [ -z $val ]; then + if [ "true" != "$val" ] && [ "false" != "$val" ]; then + validationError "The value of $name must be true or false: $val" + fi + fi + done +} + +# +# Function to validate that a list of input parameters have integer values. +# +function validateIntegerInputParamsSpecified { + validateInputParamsSpecified $* + for p in $*; do + local name=$p + local val=${!name} + if ! [ -z $val ]; then + local intVal="" + printf -v intVal '%d' "$val" 2>/dev/null + if ! [ "${val}" == "${intVal}" ]; then + validationError "The value of $name must be an integer: $val" + fi + fi + done +} + +# +# Function to check if a value is lowercase +# $1 - name of object being checked +# $2 - value to check +function validateLowerCase { + local lcVal=$(toLower $2) + if [ "$lcVal" != "$2" ]; then + validationError "The value of $1 must be lowercase: $2" + fi +} + +# +# Function to check if a value is a valid WLS domain name. +# must include only alphanumeric characters, hyphens (-) +# or underscore characters (_) and contain at least one letter +# but must start with an alphanumeric or underscore character. +# +# $1 - name of object being checked +# $2 - value to check +validateWlsDomainName() { + echo "validateWlsDomainName called with $2" + if ! [[ "$2" =~ ^[a-z_][a-z0-9_.-]*$ ]] ; then + validationError "$1 with value of $2 is not a valid WebLogic domain name. "\ + "A valid WebLogic domain name must include only alphanumeric characters, hyphens (-) "\ + "or underscore characters (_) but must start with an alphanumeric or underscore character." + else + if ! [[ "$2" =~ ^.*[a-z0-9].*$ ]] ; then + validationError "$1 with value of $2 is not a valid WebLogic domain name. "\ + "A valid WebLogic domain name must contain at least one alphanumeric character." + fi + fi +} + +# +# Function to check if a value is lowercase and legal DNS name +# $1 - name of object being checked +# $2 - value to check +function validateDNS1123LegalName { + local val=$(toDNS1123Legal $2) + if [ "$val" != "$2" ]; then + validationError "The value of $1 contains invalid charaters: $2" + fi +} + +# +# Function to validate the namespace +# +function validateNamespace { + validateLowerCase "namespace" ${namespace} +} + +# +# Function to validate the version of the inputs file +# +function validateVersion { + local requiredVersion=${requiredInputsVersion} + if [ "${version}" != "${requiredVersion}" ]; then + validationError "Invalid version: \"${version}\". Must be ${requiredVersion}." + fi +} + +# +# Function to ensure the domain uid is a legal DNS name +# Because the domain uid is also used as a WebLogic domain +# name, it must also be a valid WebLogic domain name. +# +function validateDomainUid { + validateLowerCase "domainUID" "${domainUID}" + validateDNS1123LegalName "domainUID" "${domainUID}" + validateWlsDomainName "domainUID" "${domainUID}" +} + +# +# Function to ensure the namespace is lowercase +# +function validateNamespace { + validateLowerCase "namespace" ${namespace} +} + +# +# Create an instance of clusterName to be used in cases where a legal DNS name is required. +# +function validateClusterName { + clusterNameSVC=$(toDNS1123Legal $clusterName) +} + +# +# Create an instance of adminServerName to be used in cases where a legal DNS name is required. +# +function validateAdminServerName { + adminServerNameSVC=$(toDNS1123Legal $adminServerName) +} + +# +# Create an instance of adminServerName to be used in cases where a legal DNS name is required. +# +function validateManagedServerNameBase { + managedServerNameBaseSVC=$(toDNS1123Legal $managedServerNameBase) +} + +# +# Function to validate the secret name +# +function validateWeblogicCredentialsSecretName { + validateLowerCase "weblogicCredentialsSecretName" ${weblogicCredentialsSecretName} +} + +# +# Function to validate the weblogic image pull policy +# +function validateWeblogicImagePullPolicy { + if [ ! -z ${imagePullPolicy} ]; then + case ${imagePullPolicy} in + "IfNotPresent") + ;; + "Always") + ;; + "Never") + ;; + *) + validationError "Invalid value for imagePullPolicy: ${imagePullPolicy}. Valid values are IfNotPresent, Always, and Never." + ;; + esac + else + # Set the default + imagePullPolicy="IfNotPresent" + fi + failIfValidationErrors +} + +# +# Function to validate the fmwDomainType +# +function validateFmwDomainType { + if [ ! -z ${fmwDomainType} ]; then + case ${fmwDomainType} in + "JRF") + ;; + "RestrictedJRF") + ;; + *) + validationError "Invalid value for fmwDomainType: ${fmwDomainType}. Valid values are JRF or restrictedJRF." + ;; + esac + else + # Set the default + fmwDomainType="JRF" + fi + failIfValidationErrors +} + +# +# Function to validate the weblogic image pull secret name +# +function validateWeblogicImagePullSecretName { + if [ ! -z ${imagePullSecretName} ]; then + validateLowerCase imagePullSecretName ${imagePullSecretName} + imagePullSecretPrefix="" + if [ "${generateOnly}" = false ]; then + validateWeblogicImagePullSecret + fi + else + # Set name blank when not specified, and comment out the yaml + imagePullSecretName="" + imagePullSecretPrefix="#" + fi +} + +# +# Function to validate the weblogic image pull secret exists +# +function validateWeblogicImagePullSecret { + # The kubernetes secret for pulling images from a container registry is optional. + # If it was specified, make sure it exists. + validateSecretExists ${imagePullSecretName} ${namespace} + failIfValidationErrors +} + +# try to execute kubectl to see whether kubectl is available +function validateKubectlAvailable { + if ! [ -x "$(command -v kubectl)" ]; then + validationError "kubectl is not installed" + fi +} + +# Function to validate the server start policy value +# +function validateServerStartPolicy { + validateInputParamsSpecified serverStartPolicy + if [ ! -z "${serverStartPolicy}" ]; then + case ${serverStartPolicy} in + "NEVER") + ;; + "ALWAYS") + ;; + "IF_NEEDED") + ;; + "ADMIN_ONLY") + ;; + *) + validationError "Invalid value for serverStartPolicy: ${serverStartPolicy}. Valid values are 'NEVER', 'ALWAYS', 'IF_NEEDED', and 'ADMIN_ONLY'." + ;; + esac + fi +} + +# +# Function to validate the weblogic domain storage reclaim policy +# +function validateWeblogicDomainStorageReclaimPolicy { + validateInputParamsSpecified weblogicDomainStorageReclaimPolicy + if [ ! -z "${weblogicDomainStorageReclaimPolicy}" ]; then + case ${weblogicDomainStorageReclaimPolicy} in + "Retain") + ;; + "Delete") + if [ "${weblogicDomainStoragePath:0:5}" != "/tmp/" ]; then + validationError "ERROR - Invalid value for weblogicDomainStorageReclaimPolicy ${weblogicDomainStorageReclaimPolicy} with weblogicDomainStoragePath ${weblogicDomainStoragePath} that is not /tmp/" + fi + ;; + "Recycle") + ;; + *) + validationError "Invalid value for weblogicDomainStorageReclaimPolicy: ${weblogicDomainStorageReclaimPolicy}. Valid values are Retain, Delete and Recycle." + ;; + esac + fi +} + +# +# Function to validate the weblogic domain storage type +# +function validateWeblogicDomainStorageType { + validateInputParamsSpecified weblogicDomainStorageType + if [ ! -z "${weblogicDomainStorageType}" ]; then + case ${weblogicDomainStorageType} in + "HOST_PATH") + ;; + "NFS") + validateInputParamsSpecified weblogicDomainStorageNFSServer + ;; + *) + validationError "Invalid value for weblogicDomainStorageType: ${weblogicDomainStorageType}. Valid values are HOST_PATH and NFS." + ;; + esac + fi +} + +# +# Function to validate the load balancer value +# +function validateLoadBalancer { + validateInputParamsSpecified loadBalancer + if [ ! -z "${loadBalancer}" ]; then + case ${loadBalancer} in + "TRAEFIK") + ;; + "APACHE") + ;; + "VOYAGER") + ;; + "NONE") + ;; + *) + validationError "Invalid value for loadBalancer: ${loadBalancer}. Valid values are APACHE, TRAEFIK, VOYAGER and NONE." + ;; + esac + fi +} + +# +# Function to validate a kubernetes secret exists +# $1 - the name of the secret +# $2 - namespace +function validateSecretExists { + echo "Checking to see if the secret ${1} exists in namespace ${2}" + local SECRET=`kubectl get secret ${1} -n ${2} | grep ${1} | wc | awk ' { print $1; }'` + if [ "${SECRET}" != "1" ]; then + validationError "The secret ${1} was not found in namespace ${2}" + fi +} + +# +# Function to validate the domain secret +# +function validateDomainSecret { + # Verify the secret exists + validateSecretExists ${weblogicCredentialsSecretName} ${namespace} + failIfValidationErrors + + # Verify the secret contains a username + SECRET=`kubectl get secret ${weblogicCredentialsSecretName} -n ${namespace} -o jsonpath='{.data}' | tr -d '"' | grep username: | wc | awk ' { print $1; }'` + if [ "${SECRET}" != "1" ]; then + validationError "The domain secret ${weblogicCredentialsSecretName} in namespace ${namespace} does contain a username" + fi + + # Verify the secret contains a password + SECRET=`kubectl get secret ${weblogicCredentialsSecretName} -n ${namespace} -o jsonpath='{.data}' | tr -d '"'| grep password: | wc | awk ' { print $1; }'` + if [ "${SECRET}" != "1" ]; then + validationError "The domain secret ${weblogicCredentialsSecretName} in namespace ${namespace} does contain a password" + fi + failIfValidationErrors +} + +# +# function to validate if we will be using wdt or wlst to create the domain +# +function validateDomainFilesDir { + useWdt=true + if [ -z "${createDomainFilesDir}" ] || [ "${createDomainFilesDir}" == "wlst" ]; then + useWdt=false + fi +} + +# +# Function to validate the common input parameters +# +function validateCommonInputs { + sample_name=${1:-"other"} + + # Parse the common inputs file + parseCommonInputs + + validateInputParamsSpecified \ + adminServerName \ + domainUID \ + clusterName \ + managedServerNameBase \ + namespace \ + includeServerOutInPodLog \ + version + + validateIntegerInputParamsSpecified \ + adminPort \ + initialManagedServerReplicas \ + managedServerPort \ + t3ChannelPort \ + adminNodePort + + if [ ! "${sample_name}" == "fmw-domain-home-in-image" ]; then + validateIntegerInputParamsSpecified configuredManagedServerCount + fi + + validateBooleanInputParamsSpecified \ + productionModeEnabled \ + exposeAdminT3Channel \ + exposeAdminNodePort \ + includeServerOutInPodLog + + export requiredInputsVersion="create-weblogic-sample-domain-inputs-v1" + validateVersion + + validateDomainUid + validateNamespace + validateAdminServerName + validateManagedServerNameBase + validateClusterName + validateWeblogicCredentialsSecretName + validateServerStartPolicy + validateWeblogicImagePullPolicy + validateWeblogicImagePullSecretName + validateFmwDomainType + validateDomainFilesDir + # Below three validate methods are used for MII integration testing + validateWdtDomainType + validateWdtModelFile + validateWdtModelPropertiesFile + + failIfValidationErrors +} + +# +# Function to validate the domain's persistent volume claim has been created +# +function validateDomainPVC { + # Check if the persistent volume claim is already available + checkPvcExists ${persistentVolumeClaimName} ${namespace} + if [ "${PVC_EXISTS}" = "false" ]; then + validationError "The domain persistent volume claim ${persistentVolumeClaimName} does not exist in namespace ${namespace}" + fi + failIfValidationErrors +} + +# +# Function to validate the WDT model file exists +# used for MII integration testing +# +function validateWdtModelFile { + # Check if the model file exists + if [ ! -z $wdtModelFile ]; then + if [ ! -f $wdtModelFile ]; then + validationError "The WDT model file ${wdtModelFile} does not exist" + fi + fi + failIfValidationErrors +} + +# +# Function to validate the WDT model property file exists +# used for MII integration testing +# +function validateWdtModelPropertiesFile { + # Check if the model property file exists + if [ ! -z $wdtModelPropertiesFile ]; then + if [ ! -f $wdtModelPropertiesFile ]; then + validationError "The WDT model property file ${wdtModelPropertiesFile} does not exist" + fi + fi + failIfValidationErrors +} + +# Function to validate the wdtDomainType +# used for MII integration testing +function validateWdtDomainType { + if [ ! -z ${wdtDomainType} ]; then + case ${wdtDomainType} in + "WLS") + ;; + "JRF") + ;; + "RestrictedJRF") + ;; + *) + validationError "Invalid value for wdtDomainType: ${wdtDomainType}. Valid values are WLS or JRF or restrictedJRF." + ;; + esac + else + # Set the default + wdtDomainType="WLS" + fi + failIfValidationErrors +} + diff --git a/OracleWebCenterContent/kubernetes/common/wdt-and-wit-utility.sh b/OracleWebCenterContent/kubernetes/common/wdt-and-wit-utility.sh new file mode 100644 index 000000000..4ecf53f68 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/common/wdt-and-wit-utility.sh @@ -0,0 +1,441 @@ +#!/bin/bash +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Description: +# +# This script contains functions for installing WebLogic Deploy Tool (WDT) and +# WebLogic Image Tool (WIT), and for running WDT. +# +# +# Usage: +# +# Export customized values for the input shell environment variables as needed +# before calling this script. +# +# Outputs: +# +# WDT install: WDT_DIR/weblogic-deploy/... +# +# Copy of wdt model: WDT_DIR/$(basename WDT_MODEL_FILE) +# Copy of wdt vars: WDT_DIR/$(basename WDT_VAR_FILE) +# +# WDT logs: WDT_DIR/weblogic-deploy/logs/... +# WDT stdout: WDT_DIR/createDomain.sh.out +# +# WebLogic domain home: DOMAIN_HOME_DIR +# default: /shared/domains/ +# +# Input environment variables: +# +# ORACLE_HOME Oracle home with a WebLogic install. +# default: /u01/oracle +# +# DOMAIN_HOME_DIR Target location for generated domain. +# +# WDT_MODEL_FILE Full path to WDT model file. +# default: the directory that contains this script +# plus "/wdt_model.yaml" +# +# WDT_VAR_FILE Full path to WDT variable file (java properties format). +# default: the directory that contains this script +# plus "/create-domain-inputs.yaml" +# +# WDT_DIR Target location to install and run WDT, and to keep a copy of +# $WDT_MODEL_FILE and $WDT_MODEL_VARS. Also the location +# of WDT log files. +# default: /shared/wdt +# +# WDT_VERSION WDT version to download. +# default: LATEST +# +# WDT_INSTALL_ZIP_FILE Filename of WDT install zip. +# default: weblogic-deploy.zip +# +# WDT_INSTALL_ZIP_URL URL for downloading WDT install zip +# default: https://github.com/oracle/weblogic-deploy-tooling/releases/latest/download/$WDT_INSTALL_ZIP_FILE +# +# WIT_DIR Target location to install WIT +# default: /shared/imagetool +# +# WIT_VERSION WIT version to download. +# default: LATEST +# +# WIT_INSTALL_ZIP_FILE Filename of WIT install zip. +# default: imagetool.zip +# +# WIT_INSTALL_ZIP_URL URL for downloading WIT install zip +# default: https://github.com/oracle/weblogic-image-tool/releases/latest/download/$WIT_INSTALL_ZIP_FILE +# + + +# Initialize globals + +export ORACLE_HOME=${ORACLE_HOME:-/u01/oracle} + +SCRIPTPATH="$( cd "$(dirname "$0")" > /dev/null 2>&1 ; pwd -P )" +WDT_MODEL_FILE=${WDT_MODEL_FILE:-"$SCRIPTPATH/wdt_model.yaml"} +WDT_VAR_FILE=${WDT_VAR_FILE:-"$SCRIPTPATH/create-domain-inputs.yaml"} + +WDT_DIR=${WDT_DIR:-/shared/wdt} +WDT_VERSION=${WDT_VERSION:-LATEST} + +WIT_DIR=${WIT_DIR:-/shared/imagetool} +WIT_VERSION=${WIT_VERSION:-LATEST} + +DOMAIN_TYPE="${DOMAIN_TYPE:-WLS}" + +function download { + local fileUrl="${1}" + + local curl_res=1 + max=20 + count=0 + while [ $curl_res -ne 0 -a $count -lt $max ] ; do + sleep 1 + count=`expr $count + 1` + for proxy in "${https_proxy}" "${https_proxy2}"; do + echo @@ "Info: Downloading $fileUrl with https_proxy=\"$proxy\"" + https_proxy="${proxy}" \ + curl --silent --show-error --connect-timeout 10 -O -L $fileUrl + curl_res=$? + [ $curl_res -eq 0 ] && break + done + done + if [ $curl_res -ne 0 ]; then + echo @@ "Error: Download failed." + return 1 + fi +} + +function run_wdt { + # + # Run WDT using WDT_VAR_FILE, WDT_MODEL_FILE, and ORACLE_HOME. + # Output: + # - result domain will be in DOMAIN_HOME_DIR + # - logging output is in $WDT_DIR/createDomain.sh.out and $WDT_DIR/weblogic-deploy/logs + # - WDT_VAR_FILE & WDT_MODEL_FILE will be copied to WDT_DIR. + # + + local action="${1}" + + # Input files and directories. + + local inputs_orig="$WDT_VAR_FILE" + local model_orig="$WDT_MODEL_FILE" + local oracle_home="$ORACLE_HOME" + local domain_type="$DOMAIN_TYPE" + local wdt_bin_dir="$WDT_DIR/weblogic-deploy/bin" + local wdt_createDomain_script="$wdt_bin_dir/createDomain.sh" + + if [ ${action} = "create" ]; then + local wdt_domain_script="$wdt_bin_dir/createDomain.sh" + else + local wdt_domain_script="$wdt_bin_dir/updateDomain.sh" + fi + + local domain_home_dir="$DOMAIN_HOME_DIR" + if [ -z "${domain_home_dir}" ]; then + local domain_dir="/shared/domains" + local domain_uid=`egrep 'domainUID' $inputs_orig | awk '{print $2}'` + local domain_home_dir=$domain_dir/$domain_uid + fi + + mkdir -p $domain_home_dir + + # Output files and directories. + + local inputs_final=$WDT_DIR/$(basename "$inputs_orig") + local model_final=$WDT_DIR/$(basename "$model_orig") + if [ ${action} = "create" ]; then + local out_file=$WDT_DIR/createDomain.sh.out + else + local out_file=$WDT_DIR/updateDomain.sh.out + fi + local wdt_log_dir="$WDT_DIR/weblogic-deploy/logs" + + echo @@ "Info: About to run WDT ${wdt_domain_script}" + + for directory in wdt_bin_dir SCRIPTPATH WDT_DIR oracle_home; do + if [ ! -d "${!directory}" ]; then + echo @@ "Error: Could not find ${directory} directory ${!directory}." + return 1 + fi + done + + for fil in inputs_orig model_orig wdt_createDomain_script; do + if [ ! -f "${!fil}" ]; then + echo @@ "Error: Could not find ${fil} file ${!fil}." + return 1 + fi + done + + cp $model_orig $model_final || return 1 + cp $inputs_orig $inputs_final || return 1 + + local save_dir=`pwd` + cd $WDT_DIR || return 1 + + cmd=" + $wdt_domain_script + -oracle_home $oracle_home + -domain_type $domain_type + -domain_home $domain_home_dir + -model_file $model_final + -variable_file $inputs_final + " + + echo @@ "Info: About to run the following WDT command:" + echo "${cmd}" + echo @@ "Info: WDT output will be in $out_file and $wdt_log_dir" + eval $cmd > $out_file 2>&1 + local wdt_res=$? + + cd $save_dir + + if [ $wdt_res -ne 0 ]; then + if [ ${action} = "create" ]; then + cat $WDT_DIR/createDomain.sh.out + echo @@ "Info: WDT createDomain.sh output is in $out_file and $wdt_log_dir" + echo @@ "Error: WDT createDomain.sh failed." + return 1 + else + cat $WDT_DIR/updateDomain.sh.out + echo @@ "Info: WDT updateDomain.sh output is in $out_file and $wdt_log_dir" + echo @@ "Error: WDT updateDomain.sh failed." + return 1 + fi + fi + + cd $WDT_DIR || return 1 + + mkdir ${action} + + cmd=" + $wdt_bin_dir/extractDomainResource.sh + -oracle_home $oracle_home + -output_dir ./${action} + -domain_home $domain_home_dir + -model_file $model_final + -variable_file $inputs_final + " + echo @@ "Info: About to run the following WDT command:" + echo "${cmd}" + echo @@ "Info: WDT output will be in extract${action}.out and $wdt_log_dir" + eval $cmd > extract${action}.out 2>&1 + local wdt_res=$? + + cd $save_dir + + if [ $wdt_res -ne 0 ]; then + cat $WDT_DIR/extract${action}.out + echo @@ "Info: WDT extractDomainResource output is in extract${action}.out and $wdt_log_dir" + echo @@ "Error: WDT createDomain.sh failed." + return 1 + fi + + if [ ${action} = "create" ]; then + # chmod -R g+w $domain_home_dir || return 1 + echo @@ "Info: WDT createDomain.sh succeeded." + else + echo @@ "Info: WDT updateDomain.sh succeeded." + fi + + return 0 +} + +function setup_wdt_shared_dir { + mkdir -p $WDT_DIR || return 1 +} + +# +# Install Weblogic Server Deploy Tooling to ${WDT_DIR} +# +function install_wdt { + + WDT_INSTALL_ZIP_FILE="${WDT_INSTALL_ZIP_FILE:-weblogic-deploy.zip}" + + if [ "$WDT_VERSION" == "LATEST" ]; then + WDT_INSTALL_ZIP_URL=${WDT_INSTALL_ZIP_URL:-"https://github.com/oracle/weblogic-deploy-tooling/releases/latest/download/$WDT_INSTALL_ZIP_FILE"} + else + WDT_INSTALL_ZIP_URL=${WDT_INSTALL_ZIP_URL:-"https://github.com/oracle/weblogic-deploy-tooling/releases/download/release-$WDT_VERSION/$WDT_INSTALL_ZIP_FILE"} + fi + + local save_dir=`pwd` + cd $WDT_DIR || return 1 + + echo @@ "Info: Downloading $WDT_INSTALL_ZIP_URL " + download $WDT_INSTALL_ZIP_URL || return 1 + + if [ ! -f $WDT_INSTALL_ZIP_FILE ]; then + cd $save_dir + echo @@ "Error: Download failed or $WDT_INSTALL_ZIP_FILE not found." + return 1 + fi + + echo @@ "Info: Archive downloaded to $WDT_DIR/$WDT_INSTALL_ZIP_FILE, about to unzip via 'jar xf'." + + jar xf $WDT_INSTALL_ZIP_FILE + local jar_res=$? + + cd $save_dir + + if [ $jar_res -ne 0 ]; then + echo @@ "Error: Install failed while unzipping $WDT_DIR/$WDT_INSTALL_ZIP_FILE" + return $jar_res + fi + + if [ ! -d "$WDT_DIR/weblogic-deploy/bin" ]; then + echo @@ "Error: Install failed: directory '$WDT_DIR/weblogic-deploy/bin' not found." + return 1 + fi + + chmod 775 $WDT_DIR/weblogic-deploy/bin/* || return 1 + + echo @@ "Info: Install succeeded, wdt install is in the $WDT_DIR/weblogic-deploy directory." + return 0 +} + +# +# Install WebLogic Image Tool to ${WIT_DIR}. Used by install_wit_if_needed. +# Do not call this function directory. +# +function install_wit { + + WIT_INSTALL_ZIP_FILE="${WIT_INSTALL_ZIP_FILE:-imagetool.zip}" + + if [ "$WIT_VERSION" == "LATEST" ]; then + WIT_INSTALL_ZIP_URL=${WDT_INSTALL_ZIP_URL:-"https://github.com/oracle/weblogic-image-tool/releases/latest/download/$WIT_INSTALL_ZIP_FILE"} + else + WIT_INSTALL_ZIP_URL=${WIT_INSTALL_ZIP_URL:-"https://github.com/oracle/weblogic-image-tool/releases/download/release-$WIT_VERSION/$WIT_INSTALL_ZIP_FILE"} + fi + + + + local save_dir=`pwd` + + echo @@ "imagetool.sh not found in ${imagetoolBinDir}. Installing imagetool..." + + echo @@ "Info: Downloading $WIT_INSTALL_ZIP_URL " + download $WIT_INSTALL_ZIP_URL || return 1 + + if [ ! -f $WIT_INSTALL_ZIP_FILE ]; then + cd $save_dir + echo @@ "Error: Download failed or $WIT_INSTALL_ZIP_FILE not found." + return 1 + fi + echo @@ "Info: Archive downloaded to $WIT_DIR/$WIT_INSTALL_ZIP_FILE, about to unzip via 'jar xf'." + + jar xf $WIT_INSTALL_ZIP_FILE + local jar_res=$? + + cd $save_dir + + if [ $jar_res -ne 0 ]; then + echo @@ "Error: Install failed while unzipping $WIT_DIR/$WIT_INSTALL_ZIP_FILE" + return $jar_res + fi + + if [ ! -d "$WIT_DIR/imagetool/bin" ]; then + echo @@ "Error: Install failed: directory '$WIT_DIR/imagetool/bin' not found." + return 1 + fi + + chmod 775 $WIT_DIR/imagetool/bin/* || return 1 +} + +# +# Checks whether WebLogic Image Tool is already installed under ${WIT_DIR}, and install +# it if not. +# +function install_wit_if_needed { + + local save_dir=`pwd` + + mkdir -p $WIT_DIR || return 1 + cd $WIT_DIR || return 1 + + imagetoolBinDir=$WIT_DIR/imagetool/bin + if [ -f $imagetoolBinDir/imagetool.sh ]; then + echo @@ "Info: imagetool.sh already exist in ${imagetoolBinDir}. Skipping WIT installation." + else + install_wit + fi + + export WLSIMG_CACHEDIR="$WIT_DIR/imagetool-cache" + + # Check existing imageTool cache entry for WDT: + # - if there is already an entry, and the WDT installer file specified in the cache entry exists, skip WDT installation + # - if file in cache entry doesn't exist, delete cache entry, install WDT, and add WDT installer to cache + # - if entry does not exist, install WDT, and add WDT installer to cache + if [ "$WDT_VERSION" == "LATEST" ]; then + wdtCacheVersion="latest" + else + wdtCacheVersion=$WDT_VERSION + fi + + local listItems=$( ${imagetoolBinDir}/imagetool.sh cache listItems | grep "wdt_${wdtCacheVersion}" ) + + if [ ! -z "$listItems" ]; then + local wdt_file_path_in_cache=$(echo $listItems | sed 's/.*=\(.*\)/\1/') + if [ -f "$wdt_file_path_in_cache" ]; then + skip_wdt_install=true + else + echo @@ "Info: imageTool cache contains an entry for WDT zip at $wdt_file_path_in_cache which does not exist. Removing from cache entry." + ${imagetoolBinDir}/imagetool.sh cache deleteEntry \ + --key wdt_${wdtCacheVersion} + fi + fi + + if [ -z "$skip_wdt_install" ]; then + echo @@ "Info: imageTool cache does not contain a valid entry for wdt_${wdtCacheVersion}. Installing WDT" + setup_wdt_shared_dir || return 1 + install_wdt || return 1 + ${imagetoolBinDir}/imagetool.sh cache addInstaller \ + --type wdt \ + --version $WDT_VERSION \ + --path $WDT_DIR/$WDT_INSTALL_ZIP_FILE || return 1 + else + echo @@ "Info: imageTool cache already contains entry ${listItems}. Skipping WDT installation." + fi + + cd $save_dir + + echo @@ "Info: Install succeeded, imagetool install is in the $WIT_DIR/imagetool directory." + return 0 +} + +function encrypt_model { + # + # run encryptModel.sh from WDT to encrypt model and properties files + # + local domainOutputDirFullPath=${1} # full path to directory where the model, encrypt file, and domain properties files are + local model_file=${2} # path to file containing encryption key relative to ${domainOutputDirFullPath} + local encrypt_key_file=${3} # path to file containing encryption key relative to ${domainOutputDirFullPath} + local domain_properties_file=${4} # path to domain properties file relative to ${domainOutputDirFullPath} + local oracle_home="$ORACLE_HOME" + + echo @@ "Info: encrypt passwords in the variables file at ${domainOutputDirFullPath}/${domain_properties_file} using encryption key from create-domain.sh argument written to file: ${encrypt_key_file}" + + cmd=" + cat /shared/${encrypt_key_file} /shared/${encrypt_key_file} | + /wdt/bin/encryptModel.sh \ + -oracle_home ${oracle_home} \ + -model_file /shared/${model_file} \ + -variable_file /shared/${domain_properties_file} + " + echo $cmd > ${domainOutputDirFullPath}/cmd.sh + chmod 755 ${domainOutputDirFullPath}/cmd.sh + echo @@ "Info: Encrypt Model: About to run the following command in container with image ${domainHomeImageBase}:" + cat ${domainOutputDirFullPath}/cmd.sh + + chmod 766 ${domainOutputDirFullPath}/${domain_properties_file} + docker run -it --rm -v ${domainOutputDirFullPath}:/shared -v ${WDT_DIR}/weblogic-deploy:/wdt ${domainHomeImageBase} /bin/bash -c /shared/cmd.sh || return 1 + + # clean up the generated files + rm ${domainOutputDirFullPath}/cmd.sh + + echo @@ "Info: encrypt_model Completed" +} + + diff --git a/OracleWebCenterContent/kubernetes/create-kubernetes-secrets/create-azure-storage-credentials-secret.sh b/OracleWebCenterContent/kubernetes/create-kubernetes-secrets/create-azure-storage-credentials-secret.sh new file mode 100644 index 000000000..8e6d3d947 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-kubernetes-secrets/create-azure-storage-credentials-secret.sh @@ -0,0 +1,92 @@ +#!/usr/bin/env bash +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Description +# This sample script creates a Kubernetes secret for Azure Storage to use Azure file share on AKS. +# +# The following pre-requisites must be handled prior to running this script: +# * The kubernetes namespace must already be created +# + +script="${BASH_SOURCE[0]}" + +# +# Function to exit and print an error message +# $1 - text of message +function fail { + echo [ERROR] $* + exit 1 +} + +# Try to execute kubectl to see whether kubectl is available +function validateKubectlAvailable { + if ! [ -x "$(command -v kubectl)" ]; then + fail "kubectl is not installed" + fi +} + +function usage { + echo usage: ${script} -c storageAccountName -k storageAccountKey [-s secretName] [-n namespace] [-h] + echo " -a storage account name, must be specified." + echo " -k storage account key, must be specified." + echo " -s secret name, optional. Use azure-secret if not specified." + echo " -n namespace, optional. Use the default namespace if not specified." + echo " -h Help" + exit $1 +} + +# +# Parse the command line options +# +secretName=azure-secret +namespace=default +while getopts "ha:k:s:n:" opt; do + case $opt in + a) storageAccountName="${OPTARG}" + ;; + k) storageAccountKey="${OPTARG}" + ;; + s) secretName="${OPTARG}" + ;; + n) namespace="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${storageAccountName} ]; then + echo "${script}: -e must be specified." + missingRequiredOption="true" +fi + +if [ -z ${storageAccountKey} ]; then + echo "${script}: -p must be specified." + missingRequiredOption="true" +fi + +if [ "${missingRequiredOption}" == "true" ]; then + usage 1 +fi + +# check and see if the secret already exists +result=`kubectl get secret ${secretName} -n ${namespace} --ignore-not-found=true | grep ${secretName} | wc | awk ' { print $1; }'` +if [ "${result:=Error}" != "0" ]; then + fail "The secret ${secretName} already exists in namespace ${namespace}." +fi + +# create the secret +kubectl -n $namespace create secret generic $secretName \ + --from-literal=azurestorageaccountname=$storageAccountName \ + --from-literal=azurestorageaccountkey=$storageAccountKey + +# Verify the secret exists +SECRET=`kubectl get secret ${secretName} -n ${namespace} | grep ${secretName} | wc | awk ' { print $1; }'` +if [ "${SECRET}" != "1" ]; then + fail "The secret ${secretName} was not found in namespace ${namespace}" +fi + +echo "The secret ${secretName} has been successfully created in the ${namespace} namespace." diff --git a/OracleWebCenterContent/kubernetes/create-kubernetes-secrets/create-docker-credentials-secret.sh b/OracleWebCenterContent/kubernetes/create-kubernetes-secrets/create-docker-credentials-secret.sh new file mode 100644 index 000000000..48f113b93 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-kubernetes-secrets/create-docker-credentials-secret.sh @@ -0,0 +1,106 @@ +#!/usr/bin/env bash +# Copyright (c) 2018, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Description +# This sample script creates a Kubernetes secret for container registry credentials for use with the WLS Operator on AKS. +# +# The following pre-requisites must be handled prior to running this script: +# * The kubernetes namespace must already be created +# + +script="${BASH_SOURCE[0]}" + +# +# Function to exit and print an error message +# $1 - text of message +function fail { + echo [ERROR] $* + exit 1 +} + +# Try to execute kubectl to see whether kubectl is available +function validateKubectlAvailable { + if ! [ -x "$(command -v kubectl)" ]; then + fail "kubectl is not installed" + fi +} + +function usage { + echo usage: ${script} -e email -p password -u username [-s secretName] [-d dockerServer] [-n namespace] [-h] + echo " -e email, must be specified." + echo " -p password, must be specified." + echo " -u username, must be specified." + echo " -s secret name, optional, Use regcred if not specified." + echo " -d docker server, optional, Use docker.io if not specified." + echo " -n namespace, optional. Use the default namespace if not specified" + echo " -h Help" + exit $1 +} + +# +# Parse the command line options +# +secretName=regcred +namespace=default +dockerServer=container-registry.oracle.com +while getopts "he:p:u:n:d:s:d:" opt; do + case $opt in + e) email="${OPTARG}" + ;; + p) password="${OPTARG}" + ;; + u) username="${OPTARG}" + ;; + s) secretName="${OPTARG}" + ;; + d) dockerServer="${OPTARG}" + ;; + n) namespace="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${email} ]; then + echo "${script}: -e must be specified." + missingRequiredOption="true" +fi + +if [ -z ${password} ]; then + echo "${script}: -p must be specified." + missingRequiredOption="true" +fi + +if [ -z ${username} ]; then + echo "${script}: -u must be specified." + missingRequiredOption="true" +fi + +if [ "${missingRequiredOption}" == "true" ]; then + usage 1 +fi + +# check and see if the secret already exists +result=`kubectl get secret ${secretName} -n ${namespace} --ignore-not-found=true | grep ${secretName} | wc | awk ' { print $1; }'` +if [ "${result:=Error}" != "0" ]; then + fail "The secret ${secretName} already exists in namespace ${namespace}." +fi + +# create the secret +kubectl -n $namespace create secret docker-registry $secretName \ + --docker-email=$email \ + --docker-password=$password \ + --docker-server=$dockerServer \ + --docker-username=$username + +# Verify the secret exists +SECRET=`kubectl get secret ${secretName} -n ${namespace} | grep ${secretName} | wc | awk ' { print $1; }'` +if [ "${SECRET}" != "1" ]; then + fail "The secret ${secretName} was not found in namespace ${namespace}" +fi + +echo "The secret ${secretName} has been successfully created in the ${namespace} namespace." diff --git a/OracleWebCenterContent/kubernetes/create-oracle-db-service/README.md b/OracleWebCenterContent/kubernetes/create-oracle-db-service/README.md new file mode 100644 index 000000000..09b781a79 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-oracle-db-service/README.md @@ -0,0 +1,76 @@ +# Managing Oracle Database Service for OracleWebCenterContent + +The sample scripts in this directory demonstrate how to: +* Start an Oracle Database (DB) service in a Kubernetes cluster. +* Stop an Oracle DB service in a Kubernetes cluster. + +## Start an Oracle Database service in a Kubernetes cluster + +Use this script to create an Oracle Database service in a Kubernetes Namespace with the default credentials, in the Oracle Database Slim image. + +The script assumes that either the image, `container-registry.oracle.com/database/enterprise:12.2.0.1-slim`, is available in the Docker repository, or an `ImagePullSecret` is created for `container-registry.oracle.com`. To create a secret for accessing `container-registry.oracle.com`, see the script `create-image-pull-secret.sh`. + +``` + +$ ./start-db-service.sh -h +usage: ./start-db-service.sh -p -i -s -n [-h] + -i Oracle DB Image (optional) + (default: container-registry.oracle.com/database/enterprise:12.2.0.1-slim) + -p DB Service NodePort (optional) + (default: 30011, set to 'none' to deploy service without a NodePort) + -s DB Image PullSecret (optional) + (default: docker-store) + -n Configurable Kubernetes NameSpace for Oracle DB Service (optional)" + (default: default) + -h Help + +$ ./start-db-service.sh +NodePort[30011] ImagePullSecret[docker-store] Image[container-registry.oracle.com/database/enterprise:12.2.0.1-slim] +deployment.extensions/oracle-db created +service/oracle-db created +[oracle-db-54667dfd5f-76sxf] already initialized .. +Checking Pod READY column for State [1/1] +Pod [oracle-db-54667dfd5f-76sxf] Status is Ready Iter [1/60] +NAME READY STATUS RESTARTS AGE +oracle-db-54667dfd5f-76sxf 1/1 Running 0 8s +NAME READY STATUS RESTARTS AGE +oracle-db-54667dfd5f-76sxf 1/1 Running 0 8s +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +kubernetes ClusterIP 10.96.0.1 443/TCP 27d +oracle-db NodePort 10.99.58.137 1521:30011/TCP 9s +Oracle DB service is RUNNING with NodePort [30011] + +``` + +For creating a OracleWebCenterContent domain, you can use the database connection string, `oracle-db.default.svc.cluster.local:1521/devpdb.k8s`,as `rcuDatabaseURL` parameter in the `domain.input.yaml` file. + +Note: oracle-db.default.svc.cluster.local:1521/devpdb.k8s can be used as rcuDatabaseURL if the Oracle DB Service is started in `default` NameSpace. For custom NameSpace the URL need to be modified accrodingly e.g. oracle-db.[namespace].svc.cluster.local:1521/devpdb.k8s + +You can access the database through the NodePort outside of the Kubernetes cluster, using the URL `:30011/devpdb.k8s`. + +**Note**: To create a OracleWebCenterContent domain image, the domain-in-image model needs a public database URL as an `rcuDatabaseURL` parameter. + +## Stop an Oracle Database service in a Kubernetes cluster + +Use this script to stop the Oracle Database service you created using the `start-db-service.sh` script. + +``` +$ ./stop-db-service.sh -h +usage: stop-db-service.sh -n namespace [-h] + -n Kubernetes NameSpace for Oracle DB Service to be Stopped (optional) + (default: default) + -h Help + +Note: Here the NameSpace refers to the NameSpace used in start-db-service.sh + +$ ./stop-db-service.sh +deployment.extensions "oracle-db" deleted +service "oracle-db" deleted +Checking Status for Pod [oracle-db-756f9b99fd-gvv46] in namesapce [default] +Pod [oracle-db-756f9b99fd-gvv46] Status [Terminating] +Pod [oracle-db-756f9b99fd-gvv46] Status [Terminating] +Pod [oracle-db-756f9b99fd-gvv46] Status [Terminating] +Error from server (NotFound): pods "oracle-db-756f9b99fd-gvv46" not found +Pod [oracle-db-756f9b99fd-gvv46] removed from nameSpace [default] +``` + diff --git a/OracleWebCenterContent/kubernetes/create-oracle-db-service/common/checkDbState.sh b/OracleWebCenterContent/kubernetes/create-oracle-db-service/common/checkDbState.sh new file mode 100644 index 000000000..9ce5aa3d3 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-oracle-db-service/common/checkDbState.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +logfile="/home/oracle/setup/log/setupDB.log" +max=30 +counter=0 +while [ $counter -le ${max} ] +do + grep "Done ! The database is ready for use ." $logfile + [[ $? == 0 ]] && break; + ((counter++)) + echo "[$counter/${max}] Retrying for Oracle Database Availability..." + sleep 10 +done + +if [ $counter -gt ${max} ]; then + echo "[ERRORR] Oracle DB Service is not ready after [${max}] iterations ..." + exit -1 +fi + diff --git a/OracleWebCenterContent/kubernetes/create-oracle-db-service/common/oracle.db.yaml b/OracleWebCenterContent/kubernetes/create-oracle-db-service/common/oracle.db.yaml new file mode 100644 index 000000000..4185471f3 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-oracle-db-service/common/oracle.db.yaml @@ -0,0 +1,78 @@ +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +apiVersion: v1 +kind: Service +metadata: + name: oracle-db + namespace: default +spec: + ports: + - name: tns + port: 1521 + protocol: TCP + targetPort: 1521 + nodePort: 30011 + selector: + app.kubernetes.io/instance: dev + app.kubernetes.io/name: oracle-db + sessionAffinity: None + type: NodePort +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: oracle-db + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/instance: dev + app.kubernetes.io/name: oracle-db + strategy: + rollingUpdate: + maxSurge: 1 + maxUnavailable: 1 + type: RollingUpdate + template: + metadata: + labels: + app.kubernetes.io/instance: dev + app.kubernetes.io/name: oracle-db + spec: + containers: + - env: + - name: DB_SID + value: devcdb + - name: DB_PDB + value: devpdb + - name: DB_DOMAIN + value: k8s + - name: DB_BUNDLE + value: basic + image: container-registry.oracle.com/database/enterprise:12.2.0.1-slim + imagePullPolicy: IfNotPresent + name: oracle-db + ports: + - containerPort: 1521 + name: tns + protocol: TCP + resources: + limits: + cpu: "2" + memory: "6Gi" + ephemeral-storage: "8Gi" + requests: + cpu: 500m + ephemeral-storage: "6Gi" + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + terminationGracePeriodSeconds: 30 + imagePullSecrets: + - name: docker-store + diff --git a/OracleWebCenterContent/kubernetes/create-oracle-db-service/create-image-pull-secret.sh b/OracleWebCenterContent/kubernetes/create-oracle-db-service/create-image-pull-secret.sh new file mode 100644 index 000000000..bd8284daa --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-oracle-db-service/create-image-pull-secret.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Create ImagePullSecret to pull Oracle DB and OracleWebCenterContent Image + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" + +function usage { + echo "usage: ${script} -u -p -e -s [-h]" + echo " -u Oracle Container Registry User Name (needed)" + echo " -p Oracle Container Registry Password (needed)" + echo " -e email (needed)" + echo " -s Generated Secret (optional) " + echo " (default: docker-store) " + echo " -h Help" + exit $1 +} + +while getopts ":u:p:s:e:" opt; do + case $opt in + u) username="${OPTARG}" + ;; + p) password="${OPTARG}" + ;; + e) email="${OPTARG}" + ;; + s) secert="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${username} ]; then + echo "${script}: -u must be specified." + usage 1 +fi + +if [ -z ${password} ]; then + echo "${script}: -p must be specified." + usage 1 +fi + +if [ -e ${email} ]; then + echo "${script}: -p must be specified." + usage 1 +fi + +if [ -z ${secret} ]; then + secret="docker-store" +fi + +kubectl delete secret/${secret} --ignore-not-found +echo "Creating ImagePullSecret on container-registry.oracle.com" +kubectl create secret docker-registry ${secret} --docker-server=container-registry.oracle.com --docker-username=${username} --docker-password=${password} --docker-email=${email} + diff --git a/OracleWebCenterContent/kubernetes/create-oracle-db-service/start-db-service.sh b/OracleWebCenterContent/kubernetes/create-oracle-db-service/start-db-service.sh new file mode 100644 index 000000000..452860272 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-oracle-db-service/start-db-service.sh @@ -0,0 +1,124 @@ +#!/bin/bash +# Copyright (c) 2020, 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# Bring up Oracle DB Instance in [default] NameSpace with a NodePort Service + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/../common/utility.sh + +usage() { + echo "usage: ${script} -p -i -s -n [-h]" + echo " -i Oracle DB Image (optional)" + echo " (default: container-registry.oracle.com/database/enterprise:12.2.0.1-slim)" + echo " -p DB Service NodePort (optional)" + echo " (default: 30011, set to 'none' to deploy service without a NodePort)" + echo " -s DB Image PullSecret (optional)" + echo " (default: docker-store) " + echo " -n Configurable Kubernetes NameSpace for Oracle DB Service (optional)" + echo " (default: default) " + echo " -h Help" + exit $1 +} + +while getopts ":h:p:s:i:n:" opt; do + case $opt in + p) nodeport="${OPTARG}" + ;; + s) pullsecret="${OPTARG}" + ;; + i) dbimage="${OPTARG}" + ;; + n) namespace="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${nodeport} ]; then + nodeport=30011 +fi + +if [ -z ${pullsecret} ]; then + pullsecret="docker-store" +fi + +if [ -z ${namespace} ]; then + namespace="default" +fi + +echo "Checking Status for NameSpace [$namespace]" +domns=`kubectl get ns ${namespace} | grep ${namespace} | awk '{print $1}'` +if [ -z ${domns} ]; then + echo "Adding NameSpace[$namespace] to Kubernetes Cluster" + kubectl create namespace ${namespace} + sleep 5 +else + echo "Skipping the NameSpace[$namespace] Creation ..." +fi + +if [ -z ${dbimage} ]; then + dbimage="container-registry.oracle.com/database/enterprise:12.2.0.1-slim" +fi + +echo "NodePort[$nodeport] ImagePullSecret[$pullsecret] Image[${dbimage}] NameSpace[${namespace}]" + +#create unique db yaml file if does not exists +dbYaml=${scriptDir}/common/oracle.db.${namespace}.yaml +if [ ! -f "$dbYaml" ]; then + echo "$dbYaml does not exist." + cp ${scriptDir}/common/oracle.db.yaml ${dbYaml} +fi + +# Modify ImagePullSecret and DatabaseImage based on input +sed -i -e '$d' ${dbYaml} +echo ' - name: docker-store' >> ${dbYaml} +sed -i -e "s?name: docker-store?name: ${pullsecret}?g" ${dbYaml} +sed -i -e "s?image:.*?image: ${dbimage}?g" ${dbYaml} +sed -i -e "s?namespace:.*?namespace: ${namespace}?g" ${dbYaml} + +# Modify the NodePort based on input +if [ "${nodeport}" = "none" ]; then + sed -i -e "s? nodePort:? #nodePort:?g" ${dbYaml} + sed -i -e "s? type:.*NodePort? #type: NodePort?g" ${dbYaml} +else + sed -i -e "s?[#]*nodePort:.*?nodePort: ${nodeport}?g" ${dbYaml} + sed -i -e "s?[#]*type:.*NodePort?type: NodePort?g" ${dbYaml} # default type is ClusterIP +fi + +kubectl delete service oracle-db -n ${namespace} --ignore-not-found +kubectl apply -f ${dbYaml} + +detectPod ${namespace} +dbpod=${retVal} + +echo "Is going to check dbpod: ${dbpod} in the namespace: ${namespace} " +checkPod ${dbpod} ${namespace} + +echo " checking pod state for pod ${dbpod} running in ${namespace}" +checkPodState ${dbpod} ${namespace} "1/1" +checkService oracle-db ${namespace} + +kubectl get po -n ${namespace} +kubectl get service -n ${namespace} + +kubectl cp ${scriptDir}/common/checkDbState.sh -n ${namespace} ${dbpod}:/home/oracle/ +kubectl exec -it ${dbpod} -n ${namespace} /bin/bash /home/oracle/checkDbState.sh +if [ $? != 0 ]; then + echo "######################"; + echo "[ERROR] Could not create Oracle DB Service, check the pod log for pod ${dbpod} in namespace ${namespace}"; + echo "######################"; + exit -3; +fi + +if [ ! "${nodeport}" = "none" ]; then + echo "Oracle DB Service is RUNNING with NodePort [${nodeport}]" +else + echo "Oracle DB Service is RUNNING and does not specify a public NodePort" +fi +echo "Oracle DB Service URL [oracle-db.${namespace}.svc.cluster.local:1521/devpdb.k8s]" + diff --git a/OracleWebCenterContent/kubernetes/create-oracle-db-service/stop-db-service.sh b/OracleWebCenterContent/kubernetes/create-oracle-db-service/stop-db-service.sh new file mode 100644 index 000000000..a99af10b4 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-oracle-db-service/stop-db-service.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Copyright (c) 2020, 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Drop the DB Service created by start-db-service.sh + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/../common/utility.sh + +usage() { + echo "usage: ${script} -n namespace [-h]" + echo " -n Kubernetes NameSpace for Oracle DB Service to be Stopped (optional)" + echo " (default: default) " + echo " -h Help" + exit $1 +} + +while getopts ":h:n:" opt; do + case $opt in + n) namespace="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + + +if [ -z ${namespace} ]; then + namespace=default +fi + + +dbpod=`kubectl get po -n ${namespace} | grep oracle-db | cut -f1 -d " " ` +kubectl delete -f ${scriptDir}/common/oracle.db.${namespace}.yaml --ignore-not-found +rm ${scriptDir}/common/oracle.db.${namespace}.yaml --force + +if [ -z ${dbpod} ]; then + echo "Couldn't find oracle-db pod in [${namespace}] namesapce" +else + checkPodDelete ${dbpod} ${namespace} + kubectl delete svc/oracle-db -n ${namespace} --ignore-not-found +fi + diff --git a/OracleWebCenterContent/kubernetes/create-rcu-credentials/README.md b/OracleWebCenterContent/kubernetes/create-rcu-credentials/README.md new file mode 100644 index 000000000..fbc929484 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-rcu-credentials/README.md @@ -0,0 +1,56 @@ +# Creating RCU credentials for a OracleWebCenterContent domain + +This sample demonstrates how to create a Kubernetes secret containing the +RCU credentials for a OracleWebCenterContent domain. The operator expects this secret to be +named following the pattern `domainUID-rcu-credentials`, where `domainUID` +is the unique identifier of the domain. It must be in the same namespace +that the domain will run in. + +To use the sample, run the command: + +``` +$ ./create-rcu-credentials.sh \ + -u username \ + -p password \ + -a sys_username \ + -q sys_password \ + -d domainUID \ + -n namespace \ + -s secretName +``` + +The parameters are as follows: + +``` + -u username for schema owner (regular user), must be specified. + -p password for schema owner (regular user), must be specified. + -a username for SYSDBA user, must be specified. + -q password for SYSDBA user, must be specified. + -d domainUID, optional. The default value is wccinfra. If specified, the secret will be labeled with the domainUID unless the given value is an empty string. + -n namespace, optional. Use the wccns namespace if not specified. + -s secretName, optional. If not specified, the secret name will be determined based on the domainUID value. +``` + +This creates a `generic` secret containing the user name and password as literal values. + +You can check the secret with the `kubectl describe secret` command. An example is shown below, +including the output: + +``` +$ kubectl -n wccns describe secret wccinfra-rcu-credentials -o yaml +Name: wccinfra-rcu-credentials +Namespace: wccns +Labels: weblogic.domainName=wccinfra + weblogic.domainUID=wccinfra +Annotations: + +Type: Opaque + +Data +==== +password: 12 bytes +sys_password: 12 bytes +sys_username: 3 bytes +username: 4 bytes +``` + diff --git a/OracleWebCenterContent/kubernetes/create-rcu-credentials/create-rcu-credentials.sh b/OracleWebCenterContent/kubernetes/create-rcu-credentials/create-rcu-credentials.sh new file mode 100644 index 000000000..5f4f1df0e --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-rcu-credentials/create-rcu-credentials.sh @@ -0,0 +1,139 @@ +#!/usr/bin/env bash +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Description +# This sample script creates a Kubernetes secret for RCU credentials. +# +# The following pre-requisites must be handled prior to running this script: +# * The kubernetes namespace must already be created +# +# Secret name determination +# 1) secretName - if specified +# 2) wccinfra-rcu-credentials - if secretName and domainUID are both not specified. This is the default out-of-the-box. +# 3) -rcu-credentials - if secretName is not specified, and domainUID is specified. +# 4) rcu-credentials - if secretName is not specified, and domainUID is specified as "". +# +# The generated secret will be labeled with +# weblogic.domainUID=$domainUID +# and +# weblogic.domainName=$domainUID +# Where the $domainUID is the value of the -d command line option, unless the value supplied is an empty String "" +# + +script="${BASH_SOURCE[0]}" + +# +# Function to exit and print an error message +# $1 - text of message +function fail { + echo [ERROR] $* + exit 1 +} + +# Try to execute kubectl to see whether kubectl is available +function validateKubectlAvailable { + if ! [ -x "$(command -v kubectl)" ]; then + fail "kubectl is not installed" + fi +} + +function usage { + echo usage: ${script} -u username -p password -a sysuser -q syspassword [-d domainUID] [-n namespace] [-s secretName] [-h] + echo " -u username for schema owner (regular user), must be specified." + echo " -p password for schema owner (regular user), must be specified." + echo " -a username for SYSDBA user, must be specified." + echo " -q password for SYSDBA user, must be specified." + echo " -d domainUID, optional. The default value is wccinfra. If specified, the secret will be labeled with the domainUID unless the given value is an empty string." + echo " -n namespace, optional. Use the wccns namespace if not specified" + echo " -s secretName, optional. If not specified, the secret name will be determined based on the domainUID value" + echo " -h Help" + exit $1 +} + +# +# Parse the command line options +# +domainUID=wccinfra +namespace=wccns +while getopts "hu:p:n:d:s:q:a:" opt; do + case $opt in + u) username="${OPTARG}" + ;; + p) password="${OPTARG}" + ;; + a) sys_username="${OPTARG}" + ;; + q) sys_password="${OPTARG}" + ;; + n) namespace="${OPTARG}" + ;; + d) domainUID="${OPTARG}" + ;; + s) secretName="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z $secretName ]; then + if [ -z $domainUID ]; then + secretName=rcu-credentials + else + secretName=$domainUID-rcu-credentials + fi +fi + +if [ -z ${username} ]; then + echo "${script}: -u must be specified." + missingRequiredOption="true" +fi + +if [ -z ${password} ]; then + echo "${script}: -p must be specified." + missingRequiredOption="true" +fi + +if [ -z ${sys_username} ]; then + echo "${script}: -s must be specified." + missingRequiredOption="true" +fi + +if [ -z ${sys_password} ]; then + echo "${script}: -q must be specified." + missingRequiredOption="true" +fi + +if [ "${missingRequiredOption}" == "true" ]; then + usage 1 +fi + +# check and see if the secret already exists +result=`kubectl get secret ${secretName} -n ${namespace} --ignore-not-found=true | grep ${secretName} | wc | awk ' { print $1; }'` +if [ "${result:=Error}" != "0" ]; then + fail "The secret ${secretName} already exists in namespace ${namespace}." +fi + +# create the secret +kubectl -n $namespace create secret generic $secretName \ + --from-literal=username=$username \ + --from-literal=password=$password \ + --from-literal=sys_username=$sys_username \ + --from-literal=sys_password=$sys_password + +# label the secret with domainUID if needed +if [ ! -z $domainUID ]; then + kubectl label secret ${secretName} -n $namespace weblogic.domainUID=$domainUID weblogic.domainName=$domainUID +fi + +# Verify the secret exists +SECRET=`kubectl get secret ${secretName} -n ${namespace} | grep ${secretName} | wc | awk ' { print $1; }'` +if [ "${SECRET}" != "1" ]; then + fail "The secret ${secretName} was not found in namespace ${namespace}" +fi + +echo "The secret ${secretName} has been successfully created in the ${namespace} namespace." + diff --git a/OracleWebCenterContent/kubernetes/create-rcu-schema/README.md b/OracleWebCenterContent/kubernetes/create-rcu-schema/README.md new file mode 100644 index 000000000..e77ba6dfe --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-rcu-schema/README.md @@ -0,0 +1,221 @@ +# Managing RCU schema for a OracleWebCenterContent domain + +The sample scripts in this directory demonstrate how to: +* Create an RCU schema in the Oracle DB that will be used by a OracleWebCenterContent domain. +* Delete the RCU schema in the Oracle DB used by a OracleWebCenterContent domain. + +## Start an Oracle Database service in a Kubernetes cluster + +Use the script ``samples/scripts/create-oracle-db-service/start-db-service.sh`` + +For creating a OracleWebCenterContent domain, you can use the Database connection string, `oracle-db.default.svc.cluster.local:1521/devpdb.k8s`, as an `rcuDatabaseURL` parameter in the `domain.input.yaml` file. + +You can access the Database through the NodePort outside of the Kubernetes cluster, using the URL `:30011/devpdb.k8s`. + +**Note**: To create a OracleWebCenterContent domain image, the domain-in-image model needs a public Database URL as an `rcuDatabaseURL` parameter. + + +## Create the RCU schema in the Oracle Database + +This script generates the RCU schema based `schemaPrefix` and `dburl`. + +The script assumes that either the image, `oracle/wccontent:12.2.1.4`, is available in the nodes or an `ImagePullSecret` is created to pull the image. To create a secret, see the script `create-image-pull-secret.sh`. + +``` +$ ./create-rcu-schema.sh -h +usage: ./create-rcu-schema.sh -s -t -d -i -u -p -n -q -r -o -c [-l] [-h] + -s RCU Schema Prefix (required) + -t RCU Schema Type (optional) + (supported values: wcc) + -d RCU Oracle Database URL (optional) + (default: oracle-db.default.svc.cluster.local:1521/devpdb.k8s) + -p OracleWebCenterContent ImagePullSecret (optional) + (default: none) + -i OracleWebCenterContent Image (optional) + (default: oracle/wccontent:12.2.1.4) + -u OracleWebCenterContent ImagePullPolicy (optional) + (default: IfNotPresent) + -n Namespace for RCU pod (optional) + (default: default) + -q password for database SYSDBA user. (optional) + (default: Oradoc_db1) + -r password for all schema owner (regular user). (optional) + (default: Oradoc_db1) + -o Output directory for the generated YAML file. (optional) + (default: rcuoutput) + -c Comma-separated variables in the format variablename=value. (optional). + (default: none) + -l Timeout limit in seconds. (optional). + (default: 300) + -h Help + +$ ./create-rcu-schema.sh -s domain1 +ImagePullSecret[none] Image[oracle/wccontent:12.2.1.4] dburl[oracle-db.default.svc.cluster.local:1521/devpdb.k8s] rcuType[wcc] customVariables[none] +pod/rcu created +[rcu] already initialized .. +Checking Pod READY column for State [1/1] +Pod [rcu] Status is Ready Iter [1/60] +NAME READY STATUS RESTARTS AGE +rcu 1/1 Running 0 6s +NAME READY STATUS RESTARTS AGE +rcu 1/1 Running 0 11s +CLASSPATH=/u01/jdk/lib/tools.jar:/u01/oracle/wlserver/modules/features/wlst.wls.classpath.jar: + +PATH=/u01/oracle/wlserver/server/bin:/u01/oracle/wlserver/../oracle_common/modules/thirdparty/org.apache.ant/1.10.5.0.0/apache-ant-1.10.5/bin:/u01/jdk/jre/bin:/u01/jdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/u01/jdk/bin:/u01/oracle/oracle_common/common/bin:/u01/oracle/wlserver/common/bin:/u01/oracle:/u01/oracle/wlserver/../oracle_common/modules/org.apache.maven_3.2.5/bin + +Your environment has been set. +Check if the DB Service is ready to accept request +DB Connection String [oracle-db.default.svc.cluster.local:1521/devpdb.k8s], schemaPrefix [wccinfra] rcuType [wcc] + +**** Success!!! **** + +You can connect to the database in your app using: + + java.util.Properties props = new java.util.Properties(); + props.put("user", "sys as sysdba"); + props.put("password", "Oradoc_db1"); + java.sql.Driver d = + Class.forName("oracle.jdbc.OracleDriver").newInstance(); + java.sql.Connection conn = + Driver.connect("sys as sysdba", props); +Creating RCU Schema for OracleWebCenterContent Domain ... +Extra RCU Schema Component Choosen[] + +Processing command line .... + +Repository Creation Utility - Checking Prerequisites +Checking Component Prerequisites +Repository Creation Utility - Creating Tablespaces +Validating and Creating Tablespaces +Create tablespaces in the repository database +Repository Creation Utility - Create +Repository Create in progress. +Executing pre create operations + Percent Complete: 20 + Percent Complete: 20 + ..... + Percent Complete: 96 + Percent Complete: 100 + ..... +Executing post create operations + +Repository Creation Utility: Create - Completion Summary + +Database details: +----------------------------- +Host Name : oracle-db.default.svc.cluster.local +Port : 1521 +Service Name : DEVPDB.K8S +Connected As : sys +Prefix for (prefixable) Schema Owners : DOMAIN1 +RCU Logfile : /tmp/RCU2020-05-01_14-35_1160633335/logs/rcu.log + +Component schemas created: +----------------------------- +Component Status Logfile + +Common Infrastructure Services Success /tmp/RCU2020-05-01_14-35_1160633335/logs/stb.log +Oracle Platform Security Services Success /tmp/RCU2020-05-01_14-35_1160633335/logs/opss.log +Audit Services Success /tmp/RCU2020-05-01_14-35_1160633335/logs/iau.log +Audit Services Append Success /tmp/RCU2020-05-01_14-35_1160633335/logs/iau_append.log +Audit Services Viewer Success /tmp/RCU2020-05-01_14-35_1160633335/logs/iau_viewer.log +Metadata Services Success /tmp/RCU2020-05-01_14-35_1160633335/logs/mds.log +WebLogic Services Success /tmp/RCU2020-05-01_14-35_1160633335/logs/wls.log + +Repository Creation Utility - Create : Operation Completed +[INFO] Modify the domain.input.yaml to use [oracle-db.default.svc.cluster.local:1521/devpdb.k8s] as rcuDatabaseURL and [domain1] as rcuSchemaPrefix +``` + +## Drop the RCU schema from the Oracle Database + +Use this script to drop the RCU schema based `schemaPrefix` and `dburl`. + +``` +$ ./drop-rcu-schema.sh -h +usage: ./drop-rcu-schema.sh -s -d -n -q -r [-h] + -s RCU Schema Prefix (required) + -t RCU Schema Type (optional) + (supported values: wcc) + -d Oracle Database URL (optional) + (default: oracle-db.default.svc.cluster.local:1521/devpdb.k8s) + -n Namespace where RCU pod is deployed (optional) + (default: default) + -q password for database SYSDBA user. (optional) + (default: Oradoc_db1) + -r password for all schema owner (regular user). (optional) + (default: Oradoc_db1) + -c Comma-separated variables in the format variablename=value. (optional). + (default: none) + -h Help + +$ ./drop-rcu-schema.sh -s domain1 +CLASSPATH=/u01/jdk/lib/tools.jar:/u01/oracle/wlserver/modules/features/wlst.wls.classpath.jar: + +PATH=/u01/oracle/wlserver/server/bin:/u01/oracle/wlserver/../oracle_common/modules/thirdparty/org.apache.ant/1.10.5.0.0/apache-ant-1.10.5/bin:/u01/jdk/jre/bin:/u01/jdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/u01/jdk/bin:/u01/oracle/oracle_common/common/bin:/u01/oracle/wlserver/common/bin:/u01/oracle:/u01/oracle/wlserver/../oracle_common/modules/org.apache.maven_3.2.5/bin + +Your environment has been set. +Check if the DB Service is ready to accept request +DB Connection String [oracle-db.default.svc.cluster.local:1521/devpdb.k8s] schemaPrefix [domain1] rcuType[wcc] + +**** Success!!! **** + +You can connect to the database in your app using: + + java.util.Properties props = new java.util.Properties(); + props.put("user", "sys as sysdba"); + props.put("password", "Oradoc_db1"); + java.sql.Driver d = + Class.forName("oracle.jdbc.OracleDriver").newInstance(); + java.sql.Connection conn = + Driver.connect("sys as sysdba", props); +Dropping RCU Schema for OracleWebCenterContent Domain ... +Extra RCU Schema Component(s) Choosen[] + +Processing command line .... +Repository Creation Utility - Checking Prerequisites +Checking Global Prerequisites +Repository Creation Utility - Checking Prerequisites +Checking Component Prerequisites +Repository Creation Utility - Drop +Repository Drop in progress. + Percent Complete: 2 + Percent Complete: 14 + ..... + Percent Complete: 99 + Percent Complete: 100 + ..... + +Repository Creation Utility: Drop - Completion Summary + +Database details: +----------------------------- +Host Name : oracle-db.default.svc.cluster.local +Port : 1521 +Service Name : DEVPDB.K8S +Connected As : sys +Prefix for (prefixable) Schema Owners : DOMAIN1 +RCU Logfile : /tmp/RCU2020-05-01_14-42_651700358/logs/rcu.log + +Component schemas dropped: +----------------------------- +Component Status Logfile + +Common Infrastructure Services Success /tmp/RCU2020-05-01_14-42_651700358/logs/stb.log +Oracle Platform Security Services Success /tmp/RCU2020-05-01_14-42_651700358/logs/opss.log +Audit Services Success /tmp/RCU2020-05-01_14-42_651700358/logs/iau.log +Audit Services Append Success /tmp/RCU2020-05-01_14-42_651700358/logs/iau_append.log +Audit Services Viewer Success /tmp/RCU2020-05-01_14-42_651700358/logs/iau_viewer.log +Metadata Services Success /tmp/RCU2020-05-01_14-42_651700358/logs/mds.log +WebLogic Services Success /tmp/RCU2020-05-01_14-42_651700358/logs/wls.log + +Repository Creation Utility - Drop : Operation Completed +pod "rcu" deleted +Checking Status for Pod [rcu] in namesapce [default] +Error from server (NotFound): pods "rcu" not found +Pod [rcu] removed from nameSpace [default] +``` + +## Stop an Oracle Database service in a Kubernetes cluster + +Use the script ``samples/scripts/create-oracle-db-service/stop-db-service.sh`` + diff --git a/OracleWebCenterContent/kubernetes/create-rcu-schema/common/createRepository.sh b/OracleWebCenterContent/kubernetes/create-rcu-schema/common/createRepository.sh new file mode 100644 index 000000000..108f4d350 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-rcu-schema/common/createRepository.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# Copyright (c) 2020, 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +. /u01/oracle/wlserver/server/bin/setWLSEnv.sh + +echo "Check if the DB Service is ready to accept request " +connectString=${1:-oracle-db.default.svc.cluster.local:1521/devpdb.k8s} +schemaPrefix=${2:-wccinfra} +rcuType=${3:-wcc} +sysPassword=${4:-Oradoc_db1} +customVariables=${5:-none} + +echo "DB Connection String [$connectString], schemaPrefix [${schemaPrefix}] rcuType [${rcuType}] customVariables [${customVariables}]" + +max=100 +counter=0 +while [ $counter -le ${max} ] +do + java utils.dbping ORACLE_THIN "sys as sysdba" ${sysPassword} ${connectString} > dbping.err 2>&1 + [[ $? == 0 ]] && break; + ((counter++)) + echo "[$counter/${max}] Retrying the DB Connection ..." + sleep 10 +done + +if [ $counter -gt ${max} ]; then + echo "Error output from 'java utils.dbping ORACLE_THIN \"sys as sysdba\" SYSPASSWORD ${connectString}' from '$(pwd)/dbping.err':" + cat dbping.err + echo "[ERROR] Oracle DB Service is not ready after [${max}] iterations ..." + exit -1 +else + java utils.dbping ORACLE_THIN "sys as sysdba" ${sysPassword} ${connectString} +fi + +if [ $customVariables != "none" ]; then + extVariables="-variables $customVariables" +else + extVariables="" +fi +case $rcuType in + +wcc) + extComponents="-component CONTENT" + echo "Creating RCU Schema for OracleWebCenterContent Domain ..." + ;; + * ) + echo "[ERROR] Unknown RCU Schema Type [$rcuType]" + echo "Supported values: wcc" + exit -1 + ;; +esac + +echo "Extra RCU Schema Component Choosen[${extComponents}]" +echo "Extra RCU Schema Variable Choosen[${extVariables}]" + +#Debug +#export DISPLAY=0.0 +#/u01/oracle/oracle_common/bin/rcu -listComponents + +/u01/oracle/oracle_common/bin/rcu -silent -createRepository \ + -databaseType ORACLE -connectString ${connectString} \ + -dbUser sys -dbRole sysdba -useSamePasswordForAllSchemaUsers true \ + -selectDependentsForComponents true \ + -schemaPrefix ${schemaPrefix} ${extComponents} ${extVariables} \ + -component MDS -component IAU -component IAU_APPEND -component IAU_VIEWER \ + -component OPSS -component WLS -component STB < /u01/oracle/pwd.txt + diff --git a/OracleWebCenterContent/kubernetes/create-rcu-schema/common/dropRepository.sh b/OracleWebCenterContent/kubernetes/create-rcu-schema/common/dropRepository.sh new file mode 100644 index 000000000..2a767d7dc --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-rcu-schema/common/dropRepository.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# Copyright (c) 2020, 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +. /u01/oracle/wlserver/server/bin/setWLSEnv.sh + +echo "Check if the DB Service is ready to accept request " +connectString=${1:-oracle-db.default.svc.cluster.local:1521/devpdb.k8s} +schemaPrefix=${2:-wccinfra} +rcuType=${3:-wcc} +sysPassword=${4:-Oradoc_db1} +customVariables=${5:-none} + +echo "DB Connection String [$connectString] schemaPrefix [${schemaPrefix}] rcuType[${rcuType}] customVariables[${customVariables}]" + +max=20 +counter=0 +while [ $counter -le ${max} ] +do + java utils.dbping ORACLE_THIN "sys as sysdba" ${sysPassword} ${connectString} > dbping.err 2>&1 + [[ $? == 0 ]] && break; + ((counter++)) + echo "[$counter/${max}] Retrying the DB Connection ..." + sleep 10 +done + +if [ $counter -gt ${max} ]; then + echo "[ERROR] Oracle DB Service is not ready after [${max}] iterations ..." + exit -1 +else + java utils.dbping ORACLE_THIN "sys as sysdba" ${sysPassword} ${connectString} +fi + +if [ $customVariables != "none" ]; then + extVariables="-variables $customVariables" +else + extVariables="" +fi + +case $rcuType in +wcc) + extComponents="-component CONTENT" + echo "Dropping RCU Schema for OracleWebCenterContent Domain ..." + ;; + * ) + echo "[ERROR] Unknown RCU Schema Type [$rcuType]" + echo "Supported values: wcc" + exit -1 + ;; +esac + +echo "Extra RCU Schema Component(s) Choosen[${extComponents}]" +echo "Extra RCU Schema Variable(s) Choosen[${extVariables}]" + +/u01/oracle/oracle_common/bin/rcu -silent -dropRepository \ + -databaseType ORACLE -connectString ${connectString} \ + -dbUser sys -dbRole sysdba \ + -selectDependentsForComponents true \ + -schemaPrefix ${schemaPrefix} ${extComponents} ${extVariables} \ + -component MDS -component IAU -component IAU_APPEND -component IAU_VIEWER \ + -component OPSS -component WLS -component STB < /u01/oracle/pwd.txt + diff --git a/OracleWebCenterContent/kubernetes/create-rcu-schema/common/rcu.yaml b/OracleWebCenterContent/kubernetes/create-rcu-schema/common/rcu.yaml new file mode 100644 index 000000000..57a8fc7bc --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-rcu-schema/common/rcu.yaml @@ -0,0 +1,20 @@ +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +apiVersion: v1 +kind: Pod +metadata: + labels: + run: rcu + name: rcu + namespace: default +spec: + containers: + - args: + - sleep + - infinity + image: oracle/wccontent:12.2.1.4 + imagePullPolicy: IfNotPresent + name: rcu + imagePullSecrets: + - name: docker-store diff --git a/OracleWebCenterContent/kubernetes/create-rcu-schema/common/template/rcu.yaml.template b/OracleWebCenterContent/kubernetes/create-rcu-schema/common/template/rcu.yaml.template new file mode 100644 index 000000000..4659aed17 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-rcu-schema/common/template/rcu.yaml.template @@ -0,0 +1,22 @@ +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# This is a template for RCU Pod +# +apiVersion: v1 +kind: Pod +metadata: + labels: + run: rcu + name: rcu + namespace: %NAMESPACE% +spec: + containers: + - args: + - sleep + - infinity + image: oracle/wccontent:12.2.1.4 + imagePullPolicy: %WEBLOGIC_IMAGE_PULL_POLICY% + name: rcu + %WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%imagePullSecrets: + %WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%- name: %WEBLOGIC_IMAGE_PULL_SECRET_NAME% diff --git a/OracleWebCenterContent/kubernetes/create-rcu-schema/create-image-pull-secret.sh b/OracleWebCenterContent/kubernetes/create-rcu-schema/create-image-pull-secret.sh new file mode 100644 index 000000000..66d53e44c --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-rcu-schema/create-image-pull-secret.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Create ImagePullSecret to pull Oracle DB and OracleWebCenterContent Image + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" + +function usage { + echo "usage: ${script} -u -p -e -s [-h]" + echo " -u Oracle Container Registry User Name (needed)" + echo " -p Oracle Container Registry Password (needed)" + echo " -e email (needed)" + echo " -s Generated Secret (optional) " + echo " (default: docker-store) " + echo " -h Help" + exit $1 +} + +while getopts ":u:p:s:e:" opt; do + case $opt in + u) username="${OPTARG}" + ;; + p) password="${OPTARG}" + ;; + e) email="${OPTARG}" + ;; + s) secert="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${username} ]; then + echo "${script}: -u must be specified." + usage 1 +fi + +if [ -z ${password} ]; then + echo "${script}: -p must be specified." + usage 1 +fi + +if [ -e ${email} ]; then + echo "${script}: -p must be specified." + usage 1 +fi + +if [ -z ${secret} ]; then + secret="docker-store" +fi + +kubectl delete secret/${secret} --ignore-not-found +echo "Creating ImagePullSecret on container-registry.oracle.com" +kubectl create secret docker-registry ${secret} --docker-server=container-registry.oracle.com --docker-username=${username} --docker-password=${password} --docker-email=${email} diff --git a/OracleWebCenterContent/kubernetes/create-rcu-schema/create-rcu-schema.sh b/OracleWebCenterContent/kubernetes/create-rcu-schema/create-rcu-schema.sh new file mode 100644 index 000000000..ac8f6cd76 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-rcu-schema/create-rcu-schema.sh @@ -0,0 +1,204 @@ +#!/bin/bash +# Copyright (c) 2020, 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Configure RCU schema based on schemaPreifix and rcuDatabaseURL + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/../common/utility.sh + +function usage { + echo "usage: ${script} -s -t -d -i -u -p -n -q -r -o -c [-l] [-h] " + echo " -s RCU Schema Prefix (required)" + echo " -t RCU Schema Type (optional)" + echo " (supported values: wcc)" + echo " -d RCU Oracle Database URL (optional) " + echo " (default: oracle-db.default.svc.cluster.local:1521/devpdb.k8s) " + echo " -p OracleWebCenterContent ImagePullSecret (optional) " + echo " (default: none) " + echo " -i OracleWebCenterContent Image (optional) " + echo " (default: oracle/wccontent:12.2.1.4) " + echo " -u OracleWebCenterContent ImagePullPolicy (optional) " + echo " (default: IfNotPresent) " + echo " -n Namespace for RCU pod (optional)" + echo " (default: default)" + echo " -q password for database SYSDBA user. (optional)" + echo " (default: Oradoc_db1)" + echo " -r password for all schema owner (regular user). (optional)" + echo " (default: Oradoc_db1)" + echo " -o Output directory for the generated YAML file. (optional)" + echo " (default: rcuoutput)" + echo " -c Comma-separated custom variables in the format variablename=value. (optional)." + echo " (default: none)" + echo " -l Timeout limit in seconds. (optional)." + echo " (default: 300)" + echo " -h Help" + exit $1 +} + +# Checks if all container(s) in a pod are running state based on READY column using given timeout limit +# NAME READY STATUS RESTARTS AGE +# domain1-adminserver 1/1 Running 0 4m +function checkPodStateUsingCustomTimeout(){ + + status="NotReady" + count=1 + + pod=$1 + ns=$2 + state=${3:-1/1} + timeoutLimit=${4:-300} + max=`expr ${timeoutLimit} / 5` + + echo "Checking Pod READY column for State [$state]" + pname=`kubectl get po -n ${ns} | grep -w ${pod} | awk '{print $1}'` + if [ -z ${pname} ]; then + echo "No such pod [$pod] exists in NameSpace [$ns] " + exit -1 + fi + + rcode=`kubectl get po ${pname} -n ${ns} | grep -w ${pod} | awk '{print $2}'` + [[ ${rcode} -eq "${state}" ]] && status="Ready" + + while [ ${status} != "Ready" -a $count -le $max ] ; do + sleep 5 + rcode=`kubectl get po/$pod -n ${ns} | grep -v NAME | awk '{print $2}'` + [[ ${rcode} -eq "1/1" ]] && status="Ready" + echo "Pod [$1] Status is ${status} Iter [$count/$max]" + count=`expr $count + 1` + done + if [ $count -gt $max ] ; then + echo "[ERROR] Unable to start the Pod [$pod] after ${timeout}s "; + exit 1 + fi + + pname=`kubectl get po -n ${ns} | grep -w ${pod} | awk '{print $1}'` + kubectl -n ${ns} get po ${pname} +} + +timeout=300 + +while getopts ":h:s:d:p:i:t:n:q:r:o:u:c:l:" opt; do + case $opt in + s) schemaPrefix="${OPTARG}" + ;; + t) rcuType="${OPTARG}" + ;; + d) dburl="${OPTARG}" + ;; + p) pullsecret="${OPTARG}" + ;; + i) fmwimage="${OPTARG}" + ;; + n) namespace="${OPTARG}" + ;; + q) sysPassword="${OPTARG}" + ;; + r) schemaPassword="${OPTARG}" + ;; + o) rcuOutputDir="${OPTARG}" + ;; + u) imagePullPolicy="${OPTARG}" + ;; + c) customVariables="${OPTARG}" + ;; + l) timeout="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${schemaPrefix} ]; then + echo "${script}: -s must be specified." + usage 1 +fi + +if [ -z ${dburl} ]; then + dburl="oracle-db.default.svc.cluster.local:1521/devpdb.k8s" +fi + +if [ -z ${rcuType} ]; then + rcuType="wcc" +fi + +if [ -z ${pullsecret} ]; then + pullsecret="none" + pullsecretPrefix="#" +fi + +if [ -z ${fmwimage} ]; then + fmwimage="oracle/wccontent:12.2.1.4" +fi + +if [ -z ${imagePullPolicy} ]; then + imagePullPolicy="IfNotPresent" +fi + +if [ -z ${namespace} ]; then + namespace="default" +fi + +if [ -z ${sysPassword} ]; then + sysPassword="Oradoc_db1" +fi + +if [ -z ${schemaPassword} ]; then + schemaPassword="Oradoc_db1" +fi + +if [ -z ${rcuOutputDir} ]; then + rcuOutputDir="rcuoutput" +fi + +if [ -z ${customVariables} ]; then + customVariables="none" +fi + +if [ -z ${timeout} ]; then + timeout=300 +fi + +echo "ImagePullSecret[$pullsecret] Image[${fmwimage}] dburl[${dburl}] rcuType[${rcuType}] customVariables[${customVariables}]" + +mkdir -p ${rcuOutputDir} +rcuYaml=${rcuOutputDir}/rcu.yaml +rm -f ${rcuYaml} +rcuYamlTemp=${scriptDir}/common/template/rcu.yaml.template +cp $rcuYamlTemp $rcuYaml + +# Modify the ImagePullSecret based on input +sed -i -e "s:%NAMESPACE%:${namespace}:g" $rcuYaml +sed -i -e "s:%WEBLOGIC_IMAGE_PULL_POLICY%:${imagePullPolicy}:g" $rcuYaml +sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_NAME%:${pullsecret}:g" $rcuYaml +sed -i -e "s:%WEBLOGIC_IMAGE_PULL_SECRET_PREFIX%:${pullsecretPrefix}:g" $rcuYaml +sed -i -e "s?image:.*?image: ${fmwimage}?g" $rcuYaml +kubectl apply -f $rcuYaml + +# Make sure the rcu deployment Pod is RUNNING +checkPod rcu $namespace +checkPodStateUsingCustomTimeout rcu $namespace "1/1" ${timeout} +sleep 5 +kubectl get po/rcu -n $namespace + +# Generate the default password files for rcu command +echo "$sysPassword" > pwd.txt +echo "$schemaPassword" >> pwd.txt + +kubectl exec -n $namespace -i rcu -- bash -c 'cat > /u01/oracle/createRepository.sh' < ${scriptDir}/common/createRepository.sh +kubectl exec -n $namespace -i rcu -- bash -c 'cat > /u01/oracle/pwd.txt' < pwd.txt +rm -rf createRepository.sh pwd.txt + +kubectl exec -n $namespace -i rcu /bin/bash /u01/oracle/createRepository.sh ${dburl} ${schemaPrefix} ${rcuType} ${sysPassword} ${customVariables} +if [ $? != 0 ]; then + echo "######################"; + echo "[ERROR] Could not create the RCU Repository"; + echo "######################"; + exit -3; +fi + +echo "[INFO] Modify the domain.input.yaml to use [$dburl] as rcuDatabaseURL and [${schemaPrefix}] as rcuSchemaPrefix " + diff --git a/OracleWebCenterContent/kubernetes/create-rcu-schema/drop-rcu-schema.sh b/OracleWebCenterContent/kubernetes/create-rcu-schema/drop-rcu-schema.sh new file mode 100644 index 000000000..f465d08d5 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-rcu-schema/drop-rcu-schema.sh @@ -0,0 +1,108 @@ +#!/bin/bash +# Copyright (c) 2020, 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Drop the RCU schema based on schemaPreifix and Database URL + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/../common/utility.sh + +function usage { + echo "usage: ${script} -s -d -n -q -r -c [-h]" + echo " -s RCU Schema Prefix (required)" + echo " -t RCU Schema Type (optional)" + echo " (supported values: wcc) " + echo " -d Oracle Database URL (optional)" + echo " (default: oracle-db.default.svc.cluster.local:1521/devpdb.k8s) " + echo " -n Namespace where RCU pod is deployed (optional)" + echo " (default: default) " + echo " -q password for database SYSDBA user. (optional)" + echo " (default: Oradoc_db1)" + echo " -r password for all schema owner (regular user). (optional)" + echo " (default: Oradoc_db1)" + echo " -c Comma-separated custom variables in the format variablename=value. (optional)." + echo " (default: none)" + echo " -h Help" + exit $1 +} + +while getopts ":h:s:d:t:n:q:r:c:" opt; do + case $opt in + s) schemaPrefix="${OPTARG}" + ;; + t) rcuType="${OPTARG}" + ;; + d) dburl="${OPTARG}" + ;; + n) namespace="${OPTARG}" + ;; + q) sysPassword="${OPTARG}" + ;; + r) schemaPassword="${OPTARG}" + ;; + c) customVariables="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${schemaPrefix} ]; then + echo "${script}: -s must be specified." + usage 1 +fi + +if [ -z ${dburl} ]; then + dburl="oracle-db.default.svc.cluster.local:1521/devpdb.k8s" +fi + +if [ -z ${rcuType} ]; then + rcuType="wcc" +fi + +if [ -z ${namespace} ]; then + namespace="default" +fi + +if [ -z ${sysPassword} ]; then + sysPassword="Oradoc_db1" +fi + +if [ -z ${schemaPassword} ]; then + schemaPassword="Oradoc_db1" +fi + +if [ -z ${customVariables} ]; then + customVariables="none" +fi + +rcupod=`kubectl get po -n ${namespace} | grep rcu | cut -f1 -d " " ` +if [ -z ${rcupod} ]; then + echo "RCU deployment pod not found in [$namespace] Namespace" + exit -2 +fi + +#fmwimage=`kubectl get pod/rcu -o jsonpath="{..image}"` +echo "DB Connection String [$dbUrl], schemaPrefix [${schemaPrefix}] rcuType [${rcuType}] schemaProfileType [${customVariables}]" + +echo "${sysPassword}" > pwd.txt +echo "${schemaPassword}" >> pwd.txt + +kubectl exec -n $namespace -i rcu -- bash -c 'cat > /u01/oracle/dropRepository.sh' < ${scriptDir}/common/dropRepository.sh +kubectl exec -n $namespace -i rcu -- bash -c 'cat > /u01/oracle/pwd.txt' < pwd.txt +rm -rf dropRepository.sh pwd.txt + +kubectl exec -n $namespace -i rcu /bin/bash /u01/oracle/dropRepository.sh ${dburl} ${schemaPrefix} ${rcuType} ${sysPassword} ${customVariables} +if [ $? != 0 ]; then + echo "######################"; + echo "[ERROR] Could not drop the RCU Repository based on dburl[${dburl}] schemaPrefix[${schemaPrefix}] "; + echo "######################"; + exit -3; +fi + +kubectl delete pod rcu -n ${namespace} +checkPodDelete rcu ${namespace} + diff --git a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/common/configureIPMConnection.py b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/common/configureIPMConnection.py new file mode 100644 index 000000000..c97c6128d --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/common/configureIPMConnection.py @@ -0,0 +1,86 @@ +# Copyright (c) 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +import sys +class ConfigureIPMConnection: + + def ConfigureIPMDetails(self): + print 'Configuring FrontendHost, FrontendPort for IPM access and enable HTTP connections to UCM' + # login to wlst online + connect(domainUser, domainPassword, 't3://'+adminUrl) + + edit() + startEdit() + + # Navigate Mbean hierarchy and set FrontendHost and FrontendPort + cd ('Clusters/ipm_cluster') + + set ('FrontendHost',frontendHost) + + if (sslEnabled == 'true'): + set('FrontendHTTPSPort',frontendPort) + else: + set('FrontendHTTPPort',frontendPort) + + # Invoke save operation and activate + save() + activate() + print 'Configured FrontendHost, FrontendPort for IPM access' + self.enableHTTPConnection() + + def enableHTTPConnection(self): + + print 'Started enabling HTTP connections to UCM' + + cd('/') + beginRepositorySession() + createPolicySet('ws-client', 'ws-client', 'Domain("*")') + attachPolicySetPolicy('oracle/wss10_saml_token_client_policy') + commitRepositorySession() + + beginRepositorySession() + createPolicySet('ws-service', 'ws-service', 'Domain("*")') + attachPolicySetPolicy('oracle/wss_saml_or_username_token_service_policy') + commitRepositorySession() + + grantPermission(codeBaseURL="file:${common.components.home}/modules/oracle.wsm.common_12.1.3/wsm-agent-core.jar", permClass="oracle.wsm.security.WSIdentityPermission", permTarget="resource=imaging", permActions="assert") + grantPermission(codeBaseURL="file:${common.components.home}/modules/oracle.wsm.common_12.1.3/wsm-agent-core.jar", permClass="oracle.wsm.security.WSIdentityPermission", permTarget="resource=imaging-vc", permActions="assert") + + grantPermission(codeBaseURL="file:${common.components.home}/modules/oracle.wsm.common/wsm-agent-core.jar", permClass="oracle.wsm.security.WSIdentityPermission", permTarget="resource=imaging", permActions="assert") + grantPermission(codeBaseURL="file:${common.components.home}/modules/oracle.wsm.common/wsm-agent-core.jar", permClass="oracle.wsm.security.WSIdentityPermission", permTarget="resource=imaging-vc", permActions="assert") + + serverConfig() + cd('SecurityConfiguration/wccinfra/Realms/myrealm/AuthenticationProviders/DefaultAuthenticator') + cmo.createUser('IPM_SystemServiceUser','welcome1','') + cmo.createUser('IPM_AgentServiceUser','welcome1','') + + print 'Enabled HTTP connections to UCM' + +i = 1 +while i < len(sys.argv): + + if sys.argv[i] == '-user': + domainUser = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-password': + domainPassword = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-adminUrl': + adminUrl = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-loadbalancerHost': + frontendHost = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-loadbalancerPort': + frontendPort = sys.argv[i + 1] + i += 2 + elif sys.argv[i] == '-sslEnabled': + sslEnabled = sys.argv[i + 1] + i += 2 + else: + print 'Unexpected argument switch at position ' + str(i) + ': ' + str(sys.argv[i]) + usage() + sys.exit(1) + +config = ConfigureIPMConnection() +config.ConfigureIPMDetails() + diff --git a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/common/configureWCCADFDomain.py b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/common/configureWCCADFDomain.py index 68b5e3e6b..18df68829 100755 --- a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/common/configureWCCADFDomain.py +++ b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/common/configureWCCADFDomain.py @@ -6,7 +6,7 @@ class ConfigureWCCADFDomain: def configureMbeanAttribs(self): print 'Configuring MBean attributes of '+domainUID+'-wccadf-server1' # login to wlst online - connect(domainUser,domainPassword, domainProtocol+'://'+domainUID+'-wccadf-server1:'+domainPort+'') + connect(domainUser,domainPassword, 't3://'+domainUID+'-wccadf-server1:'+domainPort+'') custom() @@ -30,10 +30,7 @@ def configureMbeanAttribs(self): cd ('oracle.adf.share.connections') cd ('oracle.adf.share.connections:type=WccConnection,beantype=Runtime,ADFConnections=ADFConnections,Application=Oracle WebCenter Content - Web UI,name=WccAdfServerConnection,ApplicationName=Oracle WebCenter Content - Web UI') - if (sslEnabled == 'true'): - set('PropConnectionUrl','idcs://'+hostName+':'+intradocPort+'') - else: - set('PropConnectionUrl','idc://'+hostName+':'+intradocPort+'') + set('PropConnectionUrl','idc://'+hostName+':'+intradocPort+'') # Invoke save operation for the setting done above cd('..') @@ -62,16 +59,9 @@ def configureMbeanAttribs(self): i += 2 elif sys.argv[i] == '-intradocPort': intradocPort = sys.argv[i + 1] - i += 2 - elif sys.argv[i] == '-sslEnabled': - sslEnabled = sys.argv[i + 1] - i += 2 - elif sys.argv[i] == '-domainProtocol': - domainProtocol = sys.argv[i + 1] i += 2 else: print 'Unexpected argument switch at position ' + str(i) + ': ' + str(sys.argv[i]) - usage() sys.exit(1) config = ConfigureWCCADFDomain() diff --git a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/configure-ipm-connection.sh b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/configure-ipm-connection.sh new file mode 100644 index 000000000..14d2601ec --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/configure-ipm-connection.sh @@ -0,0 +1,94 @@ +#!/bin/bash +# Copyright (c) 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl +# + +function usage { + echo usage: ${script} -l load_balancer_external_ip -p load_balancer_port [-h] + echo " -l load balancer external ip, must be specified." + echo " -p load balancer port, must be specified." + echo " -h Help" + exit $1 +} + +while getopts "h:l:p:" opt; do + case $opt in + l) LoadBalancerExternalIP="${OPTARG}" + ;; + p) LoadBalancerPort="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${LoadBalancerExternalIP} ]; then + echo "${script}: -l(LoadBalancerExternalIP) must be specified." + usage 1 +fi + +if [ -z ${LoadBalancerPort} ]; then + echo "${script}: -p(LoadBalancerPort) must be specified." + usage 1 +fi + +function wait_admin_pod { +echo "Waiting for $adminPod Pod startup to kick in." +sleep 50s +counter=0 +while true; do + ready_status=$(kubectl -n $domainNS get pods $adminPod -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}') + if [ "True" == "$ready_status" ]; then + echo "$adminPod Pod started [OK]" + break; + elif [[ "$counter" -gt 8 ]]; then + echo "Pods timed out, exiting" + exit 1 + else + counter=$((counter+1)) + echo "Waiting for $adminPod Pod to start." + sleep 40s + fi +done +} + +echo "Configuring IPM Frontend Details using WLST..." + +domainUID=$(grep 'domainUID:' create-domain-inputs.yaml); +domainUID=${domainUID//*domainUID: /}; + +domainNS=$(grep 'namespace:' create-domain-inputs.yaml); +domainNS=${domainNS//*namespace: /}; + +adminServerName=$(grep 'adminServerName:' create-domain-inputs.yaml); +adminServerName=${adminServerName//*adminServerName: /}; + +adminPort=$(grep 'adminPort:' create-domain-inputs.yaml); +adminPort=${adminPort//*adminPort: /}; + +adminPod=$domainUID-$adminServerName +adminUrl=$adminPod:$adminPort + +weblogicCredentialsSecretName=$(grep 'weblogicCredentialsSecretName:' create-domain-inputs.yaml); +weblogicCredentialsSecretName=${weblogicCredentialsSecretName//*weblogicCredentialsSecretName: /}; + +sslEnabled=$(grep 'sslEnabled:' create-domain-inputs.yaml); +sslEnabled=${sslEnabled//*sslEnabled: /}; + +username=`kubectl get secrets ${weblogicCredentialsSecretName} -n ${domainNS} -o=jsonpath='{.data.username}'|base64 --decode` +password=`kubectl get secrets ${weblogicCredentialsSecretName} -n ${domainNS} -o=jsonpath='{.data.password}'|base64 --decode` + +echo "Checking if the $adminPod pod is running" +wait_admin_pod + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" + +# Copy the script inside the admin server pod and execute it using wlst +kubectl cp -n $domainNS ${scriptDir}/common/configureIPMConnection.py $adminPod:/u01/oracle + +kubectl exec -n $domainNS -it $adminPod -- /bin/bash -c "wlst.sh configureIPMConnection.py -user $username -password $password -adminUrl $adminUrl -loadbalancerHost $LoadBalancerExternalIP -loadbalancerPort $LoadBalancerPort -sslEnabled $sslEnabled" + + diff --git a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/configure-wccadf-domain.sh b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/configure-wccadf-domain.sh index 295421cfc..75d7e0d45 100755 --- a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/configure-wccadf-domain.sh +++ b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/configure-wccadf-domain.sh @@ -1,6 +1,37 @@ # Copyright (c) 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +function usage { + echo usage: ${script} -n node_ip -m ucm node port [-h] + echo " -n node ip, must be specified." + echo " -m ucm node port, which is exposed in the start server script." + echo " -h Help" + exit $1 +} + +while getopts "h:n:m:" opt; do + case $opt in + n) NodeIP="${OPTARG}" + ;; + m) UcmNodePort="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${NodeIP} ]; then + echo "${script}: -n(NodeIP) must be specified." + usage 1 +fi + +if [ -z ${UcmNodePort} ]; then + echo "${script}: -m(UcmNodePort) which is exposed in the start server script must be specified." + usage 1 +fi + # Determine the state of wccadf pod function wait_wccadf_managed_pod { counter=0 @@ -21,25 +52,27 @@ done } echo "Configuring WCCADF servers using WLST..." +domainPort=16225; + +domainUID=$(grep 'domainUID:' create-domain-inputs.yaml); +domainUID=${domainUID//*domainUID: /}; + +domainNS=$(grep 'namespace:' create-domain-inputs.yaml); +domainNS=${domainNS//*namespace: /}; weblogicCredentialsSecretName=$(grep 'weblogicCredentialsSecretName:' create-domain-inputs.yaml); weblogicCredentialsSecretName=${weblogicCredentialsSecretName//*weblogicCredentialsSecretName: /}; -sslEnabled=$(grep 'sslEnabled:' create-domain-inputs.yaml); -sslEnabled=${sslEnabled//*sslEnabled: /}; - echo "Checking if the $domainUID-wccadf-server pod's are running" wait_wccadf_managed_pod -domainPort=$(kubectl describe pod $domainUID-wccadf-server1 -n $domainNS | grep LOCAL_ADMIN_PORT| awk '{ print $2 }') -domainProtocol=$(kubectl describe pod $domainUID-wccadf-server1 -n $domainNS | grep LOCAL_ADMIN_PROTOCOL| awk '{ print $2 }') - username=`kubectl get secrets ${weblogicCredentialsSecretName} -n ${domainNS} -o=jsonpath='{.data.username}'|base64 --decode` password=`kubectl get secrets ${weblogicCredentialsSecretName} -n ${domainNS} -o=jsonpath='{.data.password}'|base64 --decode` script="${BASH_SOURCE[0]}" scriptDir="$( cd "$( dirname "${script}" )" && pwd )" + # Copy the script inside the wccadf pod and execute it using wlst kubectl cp -n $domainNS ${scriptDir}/common/configureWCCADFDomain.py $domainUID-wccadf-server1:/u01/oracle -kubectl exec -n $domainNS -it $domainUID-wccadf-server1 -- /bin/bash -c "wlst.sh configureWCCADFDomain.py -user $username -password $password -domainUID $domainUID -domainPort $domainPort -hostName $hostname -intradocPort $UCMIntradocPort -sslEnabled $sslEnabled -domainProtocol $domainProtocol" +kubectl exec -n $domainNS -it $domainUID-wccadf-server1 -- /bin/bash -c "wlst.sh configureWCCADFDomain.py -user $username -password $password -domainUID $domainUID -domainPort $domainPort -hostName $NodeIP -intradocPort $UcmNodePort" diff --git a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/create-domain-inputs.yaml b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/create-domain-inputs.yaml index d4f3b67c0..0cf1bda6d 100755 --- a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/create-domain-inputs.yaml +++ b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/create-domain-inputs.yaml @@ -42,7 +42,7 @@ managedServerSSLPort: 16201 # Number of managed servers to generate for the domain configuredManagedServerCount: 5 -# Number of managed servers to initially start for the domain +# Number of UCM managed servers to initially start for the domain initialManagedServerReplicas: 3 @@ -186,3 +186,15 @@ loadBalancerType: traefik ipmEnabled: false captureEnabled: false adfuiEnabled: false + +# Number of IPM managed servers to initially start for the domain. +initialIpmServerReplicas: 0 +# If ipmEnabled is set to 'true', a non-zero value must be provided for initialIpmServerReplicas. + +# Number of Capture managed servers to initially start for the domain. +initialCaptureServerReplicas: 0 +# If captureEnabled is set to 'true', a non-zero value must be provided for initialCaptureServerReplicas. + +# Number of ADFUI managed servers to initially start for the domain. +initialAdfuiServerReplicas: 0 +# If adfuiEnabled is set to 'true', a non-zero value must be provided for initialAdfuiServerReplicas. \ No newline at end of file diff --git a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/create-domain.sh b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/create-domain.sh index 723a20942..9380c570d 100755 --- a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/create-domain.sh +++ b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/create-domain.sh @@ -232,25 +232,28 @@ function createDomainHome { if [ "${ipmEnabled}" == "true" ] then echo "adding IPM cluster info" - sed -n "/- clusterName: ${clusterName}/,/# replicas: /{p}" ${dcrOutput} >> ${dcrOutput} - sed -i "0,/- clusterName: ${clusterName}/s//- clusterName: ipm_cluster/" ${dcrOutput} - sed -i "0,/- ${clusterName}/s//- ipm_cluster/" ${dcrOutput} + sed -n "/- clusterName: ${clusterName}/,/replicas: /{p}" ${dcrOutput} >> ${dcrOutput} + sed -i -z "/- clusterName: ${clusterName}/s//- clusterName: ipm_cluster/2" ${dcrOutput} + sed -i "$ s/replicas: ${initialManagedServerReplicas}/replicas: ${initialIpmServerReplicas}/" ${dcrOutput} + sed -i -z "/- ${clusterName}/s//- ipm_cluster/2" ${dcrOutput} fi if [ "${captureEnabled}" == "true" ] then echo "adding CAPTURE cluster info" - sed -n "/- clusterName: ${clusterName}/,/# replicas: /{p}" ${dcrOutput} >> ${dcrOutput} - sed -i "0,/- clusterName: ${clusterName}/s//- clusterName: capture_cluster/" ${dcrOutput} - sed -i "0,/- ${clusterName}/s//- capture_cluster/" ${dcrOutput} + sed -n "/- clusterName: ${clusterName}/,/replicas: /{p}" ${dcrOutput} >> ${dcrOutput} + sed -i -z "/- clusterName: ${clusterName}/s//- clusterName: capture_cluster/2" ${dcrOutput} + sed -i "$ s/replicas: ${initialManagedServerReplicas}/replicas: ${initialCaptureServerReplicas}/" ${dcrOutput} + sed -i -z "/- ${clusterName}/s//- capture_cluster/2" ${dcrOutput} fi if [ "${adfuiEnabled}" == "true" ] then echo "adding WCCADF cluster info" - sed -n "/- clusterName: ${clusterName}/,/# replicas: /{p}" ${dcrOutput} >> ${dcrOutput} - sed -i "0,/- clusterName: ${clusterName}/s//- clusterName: wccadf_cluster/" ${dcrOutput} - sed -i "0,/- ${clusterName}/s//- wccadf_cluster/" ${dcrOutput} + sed -n "/- clusterName: ${clusterName}/,/replicas: /{p}" ${dcrOutput} >> ${dcrOutput} + sed -i -z "/- clusterName: ${clusterName}/s//- clusterName: wccadf_cluster/2" ${dcrOutput} + sed -i "$ s/replicas: ${initialManagedServerReplicas}/replicas: ${initialAdfuiServerReplicas}/" ${dcrOutput} + sed -i -z "/- ${clusterName}/s//- wccadf_cluster/2" ${dcrOutput} fi #Traefik sticky session Setting diff --git a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/oke-start-managed-servers-wrapper.sh b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/oke-start-managed-servers-wrapper.sh index ad468cc96..399292325 100755 --- a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/oke-start-managed-servers-wrapper.sh +++ b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/oke-start-managed-servers-wrapper.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright (c) 2021, Oracle and/or its affiliates. +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl # diff --git a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/start-managed-servers-wrapper.sh b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/start-managed-servers-wrapper.sh index bfc75f9ad..68e1312d0 100755 --- a/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/start-managed-servers-wrapper.sh +++ b/OracleWebCenterContent/kubernetes/create-wcc-domain/domain-home-on-pv/start-managed-servers-wrapper.sh @@ -4,21 +4,27 @@ # function usage { - echo usage: ${script} -o path_to_output_dir -p load_balancer_port [-u ucm_intradocport] [-i ibr_intradocport] [-h] + echo usage: ${script} -o path_to_output_dir -p load_balancer_port -n node_port [-m ucm_node_port] [-u ucm_intradocport] [-i ibr_intradocport] [-h] echo " -o output directory which was used during domain creation to generate yaml files, must be specified." echo " -p load balancer port, must be specified." + echo " -n node port, to be used for exposing IBR intradoc-port (suggested value should be within a range of 30000-32767) - must be specified." + echo " -m ucm node port, to be used for exposing UCM intradoc-port (suggested value should be within a range of 30000-32767) - optional." echo " -u ucm intradocport, optional" echo " -i ibr intradocport, optional" echo " -h Help" exit $1 } -while getopts "ho:p:u:i:" opt; do +while getopts "ho:p:n:m:u:i:" opt; do case $opt in o) outputDir="${OPTARG}" ;; p) LoadBalancerPort="${OPTARG}" ;; + n) NodePort="${OPTARG}" + ;; + m) UcmNodePort="${OPTARG}" + ;; u) UCMIntradocPort="${OPTARG}" ;; i) IBRIntradocPort="${OPTARG}" @@ -40,6 +46,11 @@ if [ -z ${LoadBalancerPort} ]; then usage 1 fi +if [ -z ${NodePort} ]; then + echo "${script}: -n(NodePort) to be used for exposing IBR intradoc-port (suggested value should be within a range of 30000-32767) must be specified." + usage 1 +fi + if [ -z ${UCMIntradocPort} ]; then UCMIntradocPort=4444 fi @@ -151,28 +162,27 @@ kubectl cp autoinstall.cfg.ibr $domainNS/$domainUID-ibr-server1:/u01/oracle/use ip_addr=`hostname -i` -kubectl expose service/wccinfra-cluster-ibr-cluster --name wccinfra-cluster-ibr-cluster-ext --port=$IBRIntradocPort --target-port=$IBRIntradocPort --external-ip=$ip_addr -n $domainNS - -kubectl get service/wccinfra-cluster-ibr-cluster-ext -n $domainNS -o yaml > wccinfra-cluster-ibr-cluster-ext.yaml -sed -i "0,/$IBRIntradocPort/s//16250/" wccinfra-cluster-ibr-cluster-ext.yaml -kubectl -n $domainNS apply -f wccinfra-cluster-ibr-cluster-ext.yaml +echo "Expose the IBR intradoc port using service type NodePort" +kubectl expose service/$domainUID-cluster-ibr-cluster --name $domainUID-cluster-ibr-cluster-ext --port=$IBRIntradocPort --type=NodePort -n $domainNS --dry-run=client -o yaml > $domainUID-cluster-ibr-cluster-ext.yaml +sed -i -e "/targetPort:*/a\ \ \ \ nodePort: $NodePort" $domainUID-cluster-ibr-cluster-ext.yaml +kubectl -n $domainNS apply -f $domainUID-cluster-ibr-cluster-ext.yaml -echo " Expose the UCM intradoc port" -kubectl expose service/wccinfra-cluster-ucm-cluster --name wccinfra-cluster-ucm-cluster-ext --port=$UCMIntradocPort --target-port=$UCMIntradocPort --external-ip=$ip_addr -n $domainNS - - -kubectl get service/wccinfra-cluster-ucm-cluster-ext -n $domainNS -o yaml > wccinfra-cluster-ucm-cluster-ext.yaml -sed -i "0,/$UCMIntradocPort/s//16200/" wccinfra-cluster-ucm-cluster-ext.yaml -kubectl -n $domainNS apply -f wccinfra-cluster-ucm-cluster-ext.yaml - -# Load the script to configure wccadf domain if adfui is enabled wccadfEnabled=$(grep 'adfuiEnabled:' create-domain-inputs.yaml); wccadfEnabled=${wccadfEnabled//*adfuiEnabled: /}; -script="${BASH_SOURCE[0]}" -scriptDir="$( cd "$( dirname "${script}" )" && pwd )" -if [ true == "$wccadfEnabled" ]; then - source ${scriptDir}/configure-wccadf-domain.sh +ipmAppEnabled=$(grep 'ipmEnabled:' create-domain-inputs.yaml); +ipmAppEnabled=${ipmAppEnabled//*ipmEnabled: /}; + +if [[ true == "$ipmAppEnabled" || true == "$wccadfEnabled" ]]; then + if [ -z ${UcmNodePort} ]; then + echo "${script}: -m(UcmNodePort) to be used for exposing UCM intradoc-port (suggested value should be within a range of 30000-32767) must be specified if IPM and/or ADFUI is enabled." + usage 1 + fi + + echo " Expose the UCM intradoc port using service type NodePort" + kubectl expose service/$domainUID-cluster-ucm-cluster --name $domainUID-cluster-ucm-cluster-ext --port=$UCMIntradocPort --type=NodePort -n $domainNS --dry-run=client -o yaml > $domainUID-cluster-ucm-cluster-ext.yaml + sed -i -e "/targetPort:*/a\ \ \ \ nodePort: $UcmNodePort" $domainUID-cluster-ucm-cluster-ext.yaml + kubectl -n $domainNS apply -f $domainUID-cluster-ucm-cluster-ext.yaml fi #STOP @@ -184,3 +194,4 @@ sleep 2m kubectl patch domain $domainUID -n $domainNS --type='json' -p='[{"op": "replace", "path": "/spec/serverStartPolicy", "value": "IF_NEEDED" }]' echo "Please monitor server pods status at console using kubectl get pod -n $domainNS" + diff --git a/OracleWebCenterContent/kubernetes/create-weblogic-domain-credentials/README.md b/OracleWebCenterContent/kubernetes/create-weblogic-domain-credentials/README.md new file mode 100644 index 000000000..17bbeb712 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-weblogic-domain-credentials/README.md @@ -0,0 +1,50 @@ +# Creating credentials for a WebLogic domain + +This sample demonstrates how to create a Kubernetes secret containing the +credentials for a WebLogic domain. The operator expects this secret to be +named following the pattern `domainUID-weblogic-credentials`, where `domainUID` +is the unique identifier of the domain. It must be in the same namespace +that the domain will run in. + +To use the sample, run the command: + +``` +$ ./create-weblogic-credentials.sh -u username -p password -d domainUID -n namespace -s secretName +``` + +The parameters are as follows: + +``` + -u user name, must be specified. + -p password, must be specified. + -d domainUID, optional. The default value is wccinfra. If specified, the secret will be labeled with the domainUID unless the given value is an empty string. + -n namespace, optional. Use the wccns namespace if not specified. + -s secretName, optional. If not specified, the secret name will be determined based on the domainUID value. +``` + +This creates a `generic` secret containing the user name and password as literal values. + +You can check the secret with the `kubectl get secret` command. An example is shown below, +including the output: + +``` +$ kubectl -n wccns get secret wccinfra-weblogic-credentials -o yaml +apiVersion: v1 +data: + password: d2VsY29tZTE= + username: d2VibG9naWM= +kind: Secret +metadata: + creationTimestamp: 2018-12-12T20:25:20Z + labels: + weblogic.domainName: wccinfra + weblogic.domainUID: wccinfra + name: wccinfra-weblogic-credentials + namespace: wccns + resourceVersion: "5680" + selfLink: /api/v1/namespaces/wccns/secrets/wccinfra-weblogic-credentials + uid: 0c2b3510-fe4c-11e8-994d-00001700101d +type: Opaque + +``` + diff --git a/OracleWebCenterContent/kubernetes/create-weblogic-domain-credentials/create-weblogic-credentials.sh b/OracleWebCenterContent/kubernetes/create-weblogic-domain-credentials/create-weblogic-credentials.sh new file mode 100644 index 000000000..0258720bc --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-weblogic-domain-credentials/create-weblogic-credentials.sh @@ -0,0 +1,121 @@ +#!/usr/bin/env bash +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Description +# This sample script creates a Kubernetes secret for WebLogic domain admin credentials. +# +# The following pre-requisites must be handled prior to running this script: +# * The kubernetes namespace must already be created +# +# Secret name determination +# 1) secretName - if specified +# 2) wccinfra-weblogic-credentials - if secretName and domainUID are both not specified. This is the default out-of-the-box. +# 3) -weblogic-credentials - if secretName is not specified, and domainUID is specified. +# 4) weblogic-credentials - if secretName is not specified, and domainUID is specified as "". +# +# The generated secret will be labeled with +# weblogic.domainUID=$domainUID +# and +# weblogic.domainName=$domainUID +# Where the $domainUID is the value of the -d command line option, unless the value supplied is an empty String "" +# + +script="${BASH_SOURCE[0]}" + +# +# Function to exit and print an error message +# $1 - text of message +function fail { + echo [ERROR] $* + exit 1 +} + +# Try to execute kubectl to see whether kubectl is available +function validateKubectlAvailable { + if ! [ -x "$(command -v kubectl)" ]; then + fail "kubectl is not installed" + fi +} + +function usage { + echo usage: ${script} -u username -p password [-d domainUID] [-n namespace] [-s secretName] [-h] + echo " -u username, must be specified." + echo " -p password, must be specified." + echo " -d domainUID, optional. The default value is wccinfra. If specified, the secret will be labeled with the domainUID unless the given value is an empty string." + echo " -n namespace, optional. Use the wccns namespace if not specified" + echo " -s secretName, optional. If not specified, the secret name will be determined based on the domainUID value" + echo " -h Help" + exit $1 +} + +# +# Parse the command line options +# +domainUID=wccinfra +namespace=wccns +while getopts "hu:p:n:d:s:" opt; do + case $opt in + u) username="${OPTARG}" + ;; + p) password="${OPTARG}" + ;; + n) namespace="${OPTARG}" + ;; + d) domainUID="${OPTARG}" + ;; + s) secretName="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z $secretName ]; then + if [ -z $domainUID ]; then + secretName=weblogic-credentials + else + secretName=$domainUID-weblogic-credentials + fi +fi + +if [ -z ${username} ]; then + echo "${script}: -u must be specified." + missingRequiredOption="true" +fi + +if [ -z ${password} ]; then + echo "${script}: -p must be specified." + missingRequiredOption="true" +fi + +if [ "${missingRequiredOption}" == "true" ]; then + usage 1 +fi + +# check and see if the secret already exists +result=`kubectl get secret ${secretName} -n ${namespace} --ignore-not-found=true | grep ${secretName} | wc | awk ' { print $1; }'` +if [ "${result:=Error}" != "0" ]; then + fail "The secret ${secretName} already exists in namespace ${namespace}." +fi + +# create the secret +kubectl -n $namespace create secret generic $secretName \ + --from-literal=username=$username \ + --from-literal=password=$password + +# label the secret with domainUID if needed +if [ ! -z $domainUID ]; then + kubectl label secret ${secretName} -n $namespace weblogic.domainUID=$domainUID weblogic.domainName=$domainUID +fi + +# Verify the secret exists +SECRET=`kubectl get secret ${secretName} -n ${namespace} | grep ${secretName} | wc | awk ' { print $1; }'` +if [ "${SECRET}" != "1" ]; then + fail "The secret ${secretName} was not found in namespace ${namespace}" +fi + +echo "The secret ${secretName} has been successfully created in the ${namespace} namespace." + diff --git a/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/README.md b/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/README.md new file mode 100644 index 000000000..549fa7a5d --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/README.md @@ -0,0 +1,222 @@ +# Sample persistent volume and persistent volume claim + +The sample scripts demonstrate the creation of a Kubernetes persistent volume (PV) and persistent volume claim (PVC), which can then be used in a domain resource as a persistent storage for the WebLogic domain home or log files. + +A PV and PVC can be shared by multiple WebLogic domains or dedicated to a particular domain. + +## Prerequisites + +Please read the [Persistent Volumes](../../../../site/persistent-volumes.md) guide before proceeding. + +## Using the scripts to create a PV and PVC + +Prior to running the `create-pv-pvc.sh` script, make a copy of the `create-pv-pvc-inputs.yaml` file, and uncomment and explicitly configure the `weblogicDomainStoragePath` property in the inputs file. + +Run the create script, pointing it at your inputs file and an output directory: + +``` +$ ./create-pv-pvc.sh \ + -i create-pv-pvc-inputs.yaml \ + -o /path/to/output-directory +``` + +The `create-pv-pvc.sh` script will create a subdirectory `pv-pvcs` under the given `/path/to/output-directory` directory. By default, the script generates two YAML files, namely `weblogic-sample-pv.yaml` and `weblogic-sample-pvc.yaml`, in the `/path/to/output-directory/pv-pvcs`. These two YAML files can be used to create the Kubernetes resources using the `kubectl create -f` command. + +``` +$ kubectl create -f wccinfra-domain-pv.yaml +$ kubectl create -f wccinfra-domain-pvc.yaml + +``` + +As a convenience, the script can optionally create the PV and PVC resources using the `-e` option. + +The usage of the create script is as follows: + +``` +$ sh create-pv-pvc.sh -h +usage: create-pv-pvc.sh -i file -o dir [-e] [-h] + -i Parameter inputs file, must be specified. + -o Output directory for the generated yaml files, must be specified. + -e Also create the Kubernetes objects using the generated yaml files + -h Help +``` + +If you copy the sample scripts to a different location, make sure that you copy everything in the `/kubernetes/samples/scripts` directory together into the target directory, maintaining the original directory hierarchy. + +## Configuration parameters + +The PV and PVC creation inputs can be customized by editing the `create-pv-pvc-inputs.yaml` file. + +| Parameter | Definition | Default | +| --- | --- | --- | +| `domainUID` | ID of the domain resource to which the generated PV and PVC will be dedicated. Leave it empty if the PV and PVC are going to be shared by multiple domains. | no default | +| `namespace` | Kubernetes namespace to create the PVC. | `default` | +| `baseName` | Base name of the PV and PVC. The generated PV and PVC will be `-pv` and `-pvc` respectively. | `weblogic-sample` | +| `weblogicDomainStoragePath` | Physical path of the storage for the PV. When `weblogicDomainStorageType` is set to `HOST_PATH`, this value should be set the to path to the domain storage on the Kubernetes host. When `weblogicDomainStorageType` is set to NFS, then `weblogicDomainStorageNFSServer` should be set to the IP address or name of the DNS server, and this value should be set to the exported path on that server. Note that the path where the domain is mounted in the WebLogic containers is not affected by this setting, that is determined when you create your domain. | no default | +| `weblogicDomainStorageReclaimPolicy` | Kubernetes PVC policy for the persistent storage. The valid values are: `Retain`, `Delete`, and `Recycle`. | `Retain` | +| `weblogicDomainStorageSize` | Total storage allocated for the PVC. | `10Gi` | +| `weblogicDomainStorageType` | Type of storage. Legal values are `NFS` and `HOST_PATH`. If using `NFS`, `weblogicDomainStorageNFSServer` must be specified. | `HOST_PATH` | +| `weblogicDomainStorageNFSServer`| Name or IP address of the NFS server. This setting only applies if `weblogicDomainStorateType` is `NFS`. | no default | + +## Shared versus dedicated PVC + +By default, the `domainUID` is left empty in the inputs file, which means the generated PV and PVC will not be associated with a particular domain, but can be shared by multiple domain resources in the same Kubernetes namespaces as the PV and PVC. + +For the use cases where dedicated PV and PVC are desired for a particular domain, the `domainUID` needs to be set in the `create-pv-pvc-inputs.yaml` file. The presence of a non-empty `domainUID` in the inputs file will cause the generated PV and PVC to be associated with the specified `domainUID`. The association includes that the names of the generated YAML files and the Kubernetes PV and PVC objects are decorated with the `domainUID`, and the PV and PVC objects are also labeled with the `domainUID`. + +## Verify the results + +The create script will verify that the PV and PVC were created, and will report a failure if there was any error. However, it may be desirable to manually verify the PV and PVC, even if just to gain familiarity with the various Kubernetes objects that were created by the script. + +### Generated YAML files with the default inputs + +The content of the generated `wccinfra-domain-pvc.yaml`: + +``` +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: wccinfra-domain-pvc + namespace: default + + storageClassName: wccinfra-domain-storage-class + accessModes: + - ReadWriteMany + resources: + requests: + storage: 10Gi +``` + +The content of the generated `wccinfra-domain-pv.yaml`: +``` +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +apiVersion: v1 +kind: PersistentVolume +metadata: + name: wccinfra-domain-pv + # labels: + # weblogic.domainUID: +spec: + storageClassName: wccinfra-domain-storage-class + capacity: + storage: 10Gi + accessModes: + - ReadWriteMany + # Valid values are Retain, Delete or Recycle + persistentVolumeReclaimPolicy: Retain + hostPath: + # nfs: + # server: %SAMPLE_STORAGE_NFS_SERVER% + path: "/scratch/k8s_dir" + +``` + +### Generated YAML files for dedicated PV and PVC + +The content of the generated `wccinfra-domain-pvc.yaml` when `domainUID` is set to `domain1`: + +``` +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: wccinfra-domain-pvc + namespace: default + labels: + weblogic.domainUID: wccinfra +spec: + storageClassName: wccinfra-domain-storage-class + accessModes: + - ReadWriteMany + resources: + requests: + storage: 10Gi +``` + +The content of the generated `wccinfra-domain-pv.yaml` when `domainUID` is set to `domain1`: +``` +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +apiVersion: v1 +kind: PersistentVolume +metadata: + name: wccinfra-domain-pv + labels: + weblogic.domainUID: wccinfra +spec: + storageClassName: wccinfra-domain-storage-class + capacity: + storage: 10Gi + accessModes: + - ReadWriteMany + # Valid values are Retain, Delete or Recycle + persistentVolumeReclaimPolicy: Retain + hostPath: + # nfs: + # server: %SAMPLE_STORAGE_NFS_SERVER% + path: "/scratch/k8s_dir" +``` + +### Verify the PV and PVC objects + +You can use this command to verify the persistent volume was created, note that the `Status` field +should have the value `Bound`, indicating the that persistent volume has been claimed: + +``` +$ kubectl describe pv wccinfra-domain-pv +Name: wccinfra-domain-pv +Annotations: pv.kubernetes.io/bound-by-controller=yes +StorageClass: wccinfra-domain-storage-class +Status: Bound +Claim: default/wccinfra-domain-pvc +Reclaim Policy: Retain +Access Modes: RWX +Capacity: 10Gi +Message: +Source: + Type: HostPath (bare host directory volume) + Path: /scratch/k8s_dir + HostPathType: +Events: + +``` + +You can use this command to verify the persistent volume claim was created: + +``` +$ kubectl describe pvc wccinfra-domain-pvc +Name: wccinfra-domain-pvc +Namespace: default +StorageClass: wccinfra-domain-storage-class +Status: Bound +Volume: wccinfra-domain-pv +Annotations: pv.kubernetes.io/bind-completed=yes + pv.kubernetes.io/bound-by-controller=yes +Finalizers: [] +Capacity: 10Gi +Access Modes: RWX +Events: + +``` + +## Troubleshooting + +* Message: `[ERROR] The weblogicDomainStoragePath parameter in kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/create-pv-pvc-inputs.yaml is missing, null or empty` +Edit the file and set the value of the field. This value must be a directory that is world writable. +Optionally, follow these steps to tighten permissions on the named directory after you run the sample the first time: + + * Become the root user. + * `ls -nd $value-of-weblogicDomainStoragePath` + * Note the values of the third and fourth field of the output. + * `chown $third-field:$fourth-field $value-of-weblogicDomainStoragePath` + * `chmod 755 $value-of-weblogicDomainStoragePath` + * Return to your normal user ID. + diff --git a/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/create-pv-pvc-inputs.yaml b/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/create-pv-pvc-inputs.yaml new file mode 100644 index 000000000..c4a5f24e3 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/create-pv-pvc-inputs.yaml @@ -0,0 +1,44 @@ +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# The version of this inputs file. Do not modify. +version: create-wccinfra-pv-pvc-inputs-v1 + +# The base name of the pv and pvc +baseName: domain + +# Unique ID identifying a domain. +# If left empty, the generated pv can be shared by multiple domains +# This ID must not contain an underscope ("_"), and must be lowercase and unique across all domains in a Kubernetes cluster. +domainUID: wccinfra + +# Name of the namespace for the persistent volume claim +namespace: wccns + +# Persistent volume type for the persistent storage. +# The value must be 'HOST_PATH' or 'NFS'. +# If using 'NFS', weblogicDomainStorageNFSServer must be specified. +weblogicDomainStorageType: HOST_PATH + +# The server name or ip address of the NFS server to use for the persistent storage. +# The following line must be uncomment and customized if weblogicDomainStorateType is NFS: +#weblogicDomainStorageNFSServer: nfsServer + +# Physical path of the persistent storage. +# When weblogicDomainStorageType is set to HOST_PATH, this value should be set the to path to the +# domain storage on the Kubernetes host. +# When weblogicDomainStorageType is set to NFS, then weblogicDomainStorageNFSServer should be set +# to the IP address or name of the DNS server, and this value should be set to the exported path +# on that server. +# Note that the path where the domain is mounted in the WebLogic containers is not affected by this +# setting, that is determined when you create your domain. +# The following line must be uncomment and customized: +weblogicDomainStoragePath: /scratch/k8s_dir + +# Reclaim policy of the persistent storage +# The valid values are: 'Retain', 'Delete', and 'Recycle' +weblogicDomainStorageReclaimPolicy: Retain + +# Total storage allocated to the persistent storage. +weblogicDomainStorageSize: 10Gi + diff --git a/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/create-pv-pvc.sh b/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/create-pv-pvc.sh new file mode 100644 index 000000000..ba3de3459 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/create-pv-pvc.sh @@ -0,0 +1,267 @@ +#!/usr/bin/env bash +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Description +# This sample script generates the Kubernetes yaml files for a persistent volume and persistent volume claim +# that can be used by a domain custom resource. +# +# The creation inputs can be customized by editing create-pv-pvc-inputs.yaml +# +# The following pre-requisites must be handled prior to running this script: +# * The Kubernetes namespace must already be created +# + +# Initialize +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/../common/utility.sh +source ${scriptDir}/../common/validate.sh + +function usage { + echo usage: ${script} -i file -o dir [-e] [-h] + echo " -i Parameter inputs file, must be specified." + echo " -o Output directory for the generated yaml files, must be specified." + echo " -e Also create the Kubernetes objects using the generated yaml files" + echo " -h Help" + exit $1 +} + +# +# Parse the command line options +# +executeIt=false +while getopts "ehi:o:" opt; do + case $opt in + i) valuesInputFile="${OPTARG}" + ;; + o) outputDir="${OPTARG}" + ;; + e) executeIt=true + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${valuesInputFile} ]; then + echo "${script}: -i must be specified." + missingRequiredOption="true" +fi + +if [ -z ${outputDir} ]; then + echo "${script}: -o must be specified." + missingRequiredOption="true" +fi + +if [ "${missingRequiredOption}" == "true" ]; then + usage 1 +fi + +# +# Function to initialize and validate the output directory +# for the generated yaml files for this domain. +# +function initOutputDir { + pvOutputDir="$outputDir/pv-pvcs" + + if [ -z ${domainUID} ]; then + pvOutput="${pvOutputDir}/${baseName}-pv.yaml" + pvcOutput="${pvOutputDir}/${baseName}-pvc.yaml" + persistentVolumeName=${baseName}-pv + persistentVolumeClaimName=${baseName}-pvc + else + pvOutput="${pvOutputDir}/${domainUID}-${baseName}-pv.yaml" + pvcOutput="${pvOutputDir}/${domainUID}-${baseName}-pvc.yaml" + persistentVolumeName=${domainUID}-${baseName}-pv + persistentVolumeClaimName=${domainUID}-${baseName}-pvc + fi + removeFileIfExists ${pvOutputDir}/{valuesInputFile} + removeFileIfExists ${pvOutputDir}/{pvOutput} + removeFileIfExists ${pvOutputDir}/{pvcOutput} + removeFileIfExists ${pvOutputDir}/create-pv-pvc-inputs.yaml +} + +# +# Function to setup the environment to run the create domain job +# +function initialize { + + # Validate the required files exist + validateErrors=false + + if [ -z "${valuesInputFile}" ]; then + validationError "You must use the -i option to specify the name of the inputs parameter file (a modified copy of kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/create-pv-pvc-inputs.yaml)." + else + if [ ! -f ${valuesInputFile} ]; then + validationError "Unable to locate the input parameters file ${valuesInputFile}" + fi + fi + + if [ -z "${outputDir}" ]; then + validationError "You must use the -o option to specify the name of an existing directory to store the generated yaml files in." + fi + + domainPVInput="${scriptDir}/pv-template.yaml" + if [ ! -f ${domainPVInput} ]; then + validationError "The template file ${domainPVInput} for generating a persistent volume was not found" + fi + + domainPVCInput="${scriptDir}/pvc-template.yaml" + if [ ! -f ${domainPVCInput} ]; then + validationError "The template file ${domainPVCInput} for generating a persistent volume claim was not found" + fi + + failIfValidationErrors + + # Parse the commonn inputs file + parseCommonInputs + validateInputParamsSpecified \ + weblogicDomainStoragePath \ + weblogicDomainStorageSize \ + baseName \ + namespace \ + version + + export requiredInputsVersion="create-weblogic-sample-domain-pv-pvc-inputs-v1" + validateDomainUid + validateNamespace + validateWeblogicDomainStorageType + validateWeblogicDomainStorageReclaimPolicy + initOutputDir + failIfValidationErrors +} + + +# +# Function to generate the yaml files for creating a domain +# +function createYamlFiles { + + # Create a directory for this domain's output files + mkdir -p ${pvOutputDir} + + # Make sure the output directory has a copy of the inputs file. + # The user can either pre-create the output directory, put the inputs + # file there, and create the domain from it, or the user can put the + # inputs file some place else and let this script create the output directory + # (if needed) and copy the inputs file there. + copyInputsFileToOutputDirectory ${valuesInputFile} "${pvOutputDir}/create-pv-pvc-inputs.yaml" + + enabledPrefix="" # uncomment the feature + disabledPrefix="# " # comment out the feature + + echo Generating ${pvOutput} + + cp ${domainPVInput} ${pvOutput} + if [ "${weblogicDomainStorageType}" == "NFS" ]; then + hostPathPrefix="${disabledPrefix}" + nfsPrefix="${enabledPrefix}" + sed -i -e "s:%SAMPLE_STORAGE_NFS_SERVER%:${weblogicDomainStorageNFSServer}:g" ${pvOutput} + else + hostPathPrefix="${enabledPrefix}" + nfsPrefix="${disabledPrefix}" + fi + + sed -i -e "s:%NAMESPACE%:$namespace:g" ${pvOutput} + if [ -z ${domainUID} ]; then + domainUIDLabelPrefix="${disabledPrefix}" + separator="" + else + domainUIDLabelPrefix="${enabledPrefix}" + separator="-" + fi + sed -i -e "s:%DOMAIN_UID%:$domainUID:g" ${pvOutput} + sed -i -e "s:%SEPARATOR%:$separator:g" ${pvOutput} + sed -i -e "s:%DOMAIN_UID_LABEL_PREFIX%:${domainUIDLabelPrefix}:g" ${pvOutput} + + sed -i -e "s:%BASE_NAME%:$baseName:g" ${pvOutput} + sed -i -e "s:%SAMPLE_STORAGE_PATH%:${weblogicDomainStoragePath}:g" ${pvOutput} + sed -i -e "s:%SAMPLE_STORAGE_RECLAIM_POLICY%:${weblogicDomainStorageReclaimPolicy}:g" ${pvOutput} + sed -i -e "s:%SAMPLE_STORAGE_SIZE%:${weblogicDomainStorageSize}:g" ${pvOutput} + sed -i -e "s:%HOST_PATH_PREFIX%:${hostPathPrefix}:g" ${pvOutput} + sed -i -e "s:%NFS_PREFIX%:${nfsPrefix}:g" ${pvOutput} + + # Generate the yaml to create the persistent volume claim + echo Generating ${pvcOutput} + + cp ${domainPVCInput} ${pvcOutput} + sed -i -e "s:%NAMESPACE%:$namespace:g" ${pvcOutput} + sed -i -e "s:%BASE_NAME%:${baseName}:g" ${pvcOutput} + + sed -i -e "s:%DOMAIN_UID%:$domainUID:g" ${pvcOutput} + sed -i -e "s:%SEPARATOR%:$separator:g" ${pvcOutput} + sed -i -e "s:%DOMAIN_UID_LABEL_PREFIX%:${domainUIDLabelPrefix}:g" ${pvcOutput} + + sed -i -e "s:%SAMPLE_STORAGE_SIZE%:${weblogicDomainStorageSize}:g" ${pvcOutput} + + # Remove any "...yaml-e" files left over from running sed + rm -f ${pvOutputDir}/*.yaml-e +} + +# +# Function to create the domain's persistent volume +# +function createDomainPV { + # Check if the persistent volume is already available + checkPvExists ${persistentVolumeName} + if [ "${PV_EXISTS}" = "false" ]; then + echo Creating the persistent volume ${persistentVolumeName} + kubectl create -f ${pvOutput} + checkPvState ${persistentVolumeName} Available + fi +} + +# +# Function to create the domain's persistent volume claim +# Must be called after createDomainPV since it relies on +# createDomainPV defining persistentVolumeName +# +function createDomainPVC { + # Check if the persistent volume claim is already available + checkPvcExists ${persistentVolumeClaimName} ${namespace} + if [ "${PVC_EXISTS}" = "false" ]; then + echo Creating the persistent volume claim ${persistentVolumeClaimName} + kubectl create -f ${pvcOutput} + checkPvState ${persistentVolumeName} Bound + fi +} + +# +# Function to output to the console a summary of the work completed +# +function printSummary { + echo "The following files were generated:" + echo " ${pvOutput}" + echo " ${pvcOutput}" +} + +# +# Perform the following sequence of steps to create a domain +# + +# Setup the environment for running this script and perform initial validation checks +initialize + +# Generate the yaml files for creating the domain +createYamlFiles + +# All done if the generate only option is true +if [ "${executeIt}" = true ]; then + + # Create the domain's persistent volume + createDomainPV + + # Create the domain's persistent volume claim + createDomainPVC +fi + +# Output a job summary +printSummary + +echo +echo Completed + + diff --git a/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/pv-template.yaml b/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/pv-template.yaml new file mode 100644 index 000000000..49e33a22f --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/pv-template.yaml @@ -0,0 +1,21 @@ +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +apiVersion: v1 +kind: PersistentVolume +metadata: + name: %DOMAIN_UID%%SEPARATOR%%BASE_NAME%-pv + labels: + %DOMAIN_UID_LABEL_PREFIX%weblogic.domainUID: %DOMAIN_UID% +spec: + storageClassName: %DOMAIN_UID%%SEPARATOR%%BASE_NAME%-storage-class + capacity: + storage: %SAMPLE_STORAGE_SIZE% + accessModes: + - ReadWriteMany + # Valid values are Retain, Delete or Recycle + persistentVolumeReclaimPolicy: %SAMPLE_STORAGE_RECLAIM_POLICY% + %HOST_PATH_PREFIX%hostPath: + %NFS_PREFIX%nfs: + %NFS_PREFIX%server: %SAMPLE_STORAGE_NFS_SERVER% + path: "%SAMPLE_STORAGE_PATH%" diff --git a/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/pvc-template.yaml b/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/pvc-template.yaml new file mode 100644 index 000000000..49e8d5afb --- /dev/null +++ b/OracleWebCenterContent/kubernetes/create-weblogic-domain-pv-pvc/pvc-template.yaml @@ -0,0 +1,17 @@ +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: %DOMAIN_UID%%SEPARATOR%%BASE_NAME%-pvc + namespace: %NAMESPACE% + labels: + %DOMAIN_UID_LABEL_PREFIX%weblogic.domainUID: %DOMAIN_UID% +spec: + storageClassName: %DOMAIN_UID%%SEPARATOR%%BASE_NAME%-storage-class + accessModes: + - ReadWriteMany + resources: + requests: + storage: %SAMPLE_STORAGE_SIZE% diff --git a/OracleWebCenterContent/kubernetes/delete-domain/README.md b/OracleWebCenterContent/kubernetes/delete-domain/README.md new file mode 100644 index 000000000..800c7094a --- /dev/null +++ b/OracleWebCenterContent/kubernetes/delete-domain/README.md @@ -0,0 +1,27 @@ +# Deleting domain resources created while executing the samples + +After running the sample, you will need to release domain resources that +can then be used for other purposes. The script in this sample demonstrates one approach to releasing +domain resources. + +## Using the script to delete domain resources + +```shell +$ ./delete-weblogic-domain-resources.sh \ + -d domain-uid[,domain-uid...] \ + [-s max-seconds] \ + [-t] +``` +The required option `-d` takes `domain-uid` values (separated + by commas and no spaces) to identify the domain resources that should be deleted. + +To limit the amount of time spent on attempting to delete domain resources, use `-s`. +The option must be followed by an integer that represents the total number of seconds +that will be spent attempting to delete resources. The default number of seconds is 120. + +The optional option `-t` shows what the script will delete without executing the deletion. + +To see the help associated with the script: +```shell +$ ./delete-weblogic-domain-resources.sh -h +``` diff --git a/OracleWebCenterContent/kubernetes/delete-domain/delete-weblogic-domain-resources.sh b/OracleWebCenterContent/kubernetes/delete-domain/delete-weblogic-domain-resources.sh new file mode 100644 index 000000000..fd54d1ea0 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/delete-domain/delete-weblogic-domain-resources.sh @@ -0,0 +1,283 @@ +#!/bin/bash +# Copyright (c) 2019, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Description: +# Use this script to delete all kubernetes resources associated +# with a set of given domains. Alternatively, run the script +# in a test mode to show what would be deleted without actually +# performing the deletes. +# +# Usage: +# See "function usage" below or call this script with no parameters. +# + +script="${BASH_SOURCE[0]}" + +function usage { +cat << EOF + Usage: + + $(basename $0) -d domain-uid,domain-uid,... [-s max-seconds] [-t] + $(basename $0) -h + + Perform a best-effort delete of the kubernetes resources for + the given domain(s), and retry until either max-seconds is reached + or all resources were deleted (default $default_maxwaitsecs seconds). + + The domains can be specified as a comma-separated list of + domain-uids (no spaces). The domains can be located in any + kubernetes namespace. + + Specify '-t' to run the script in a test mode which will + show kubernetes commands but not actually perform them. + + The script runs in phases: + + Phase 1: Set the serverStartPolicy of each domain to NEVER if + it's not already NEVER. This should cause each + domain's operator to initiate a controlled shutdown + of the domain. Immediately proceed to phase 2. + + Phase 2: Wait up to half of max-seconds for WebLogic + Server pods to exit normally, and then proceed + to phase 3. + + Phase 3: Periodically delete any remaining kubernetes resources + for the specified domains, including any pods + leftover from previous phases. Exit and fail if + max-seconds is exceeded and there are any leftover + kubernetes resources. + + This script exits with a zero status on success, and a + non-zero status on failure. +EOF +} + +# +# getDomainResources domain(s) outfilename +# +# Usage: +# getDomainResources domainA,domainB,... outfilename +# +# Internal helper function +# +# File output is all domain related resources for the given domain uids, one per line, +# in the form: 'kind name [-n namespace]'. For example: +# PersistentVolumeClaim domain1-pv-claim -n default +# PersistentVolume domain1-pv +# +function getDomainResources { + local domain_regex='' + LABEL_SELECTOR="weblogic.domainUID in ($1)" + IFS=',' read -ra UIDS <<< "$1" + for i in "${!UIDS[@]}"; do + if [ $i -gt 0 ]; then + domain_regex="$domain_regex|" + fi + domain_regex="$domain_regex^Domain ${UIDS[$i]} " + done + + # clean the output file + if [ -e $2 ]; then + rm $2 + fi + + # first, let's get all namespaced types with -l $LABEL_SELECTOR + NAMESPACED_TYPES="pod,job,deploy,rs,service,pvc,ingress,cm,serviceaccount,role,rolebinding,secret" + + kubectl get $NAMESPACED_TYPES \ + -l "$LABEL_SELECTOR" \ + -o=jsonpath='{range .items[*]}{.kind}{" "}{.metadata.name}{" -n "}{.metadata.namespace}{"\n"}{end}' \ + --all-namespaces=true >> $2 + + # if domain crd exists, look for domains too: + kubectl get crd domains.weblogic.oracle > /dev/null 2>&1 + if [ $? -eq 0 ]; then + kubectl get domain \ + -o=jsonpath='{range .items[*]}{.kind}{" "}{.metadata.name}{" -n "}{.metadata.namespace}{"\n"}{end}' \ + --all-namespaces=true | egrep "$domain_regex" >> $2 + fi + + # now, get all non-namespaced types with -l $LABEL_SELECTOR + + NOT_NAMESPACED_TYPES="pv,clusterroles,clusterrolebindings" + + kubectl get $NOT_NAMESPACED_TYPES \ + -l "$LABEL_SELECTOR" \ + -o=jsonpath='{range .items[*]}{.kind}{" "}{.metadata.name}{"\n"}{end}' \ + --all-namespaces=true >> $2 +} + +# +# deleteDomains domain(s) maxwaitsecs +# +# Usage: +# deleteDomains domainA,domainB,... maxwaitsecs +# +# Internal helper function +# This function first sets the serverStartPolicy of each Domain to NEVER +# and waits up to half of $2 for pods to 'self delete'. It then performs +# a helm delete on $1, and finally it directly deletes +# any remaining k8s resources for domain $1 (including any remaining pods) +# and retries these direct deletes up to $2 seconds. +# +# If global $test_mode is true, it shows candidate actions but doesn't +# actually perform them +# +function deleteDomains { + + if [ "$test_mode" = "true" ]; then + echo @@ Test mode! Displaying commands for deleting kubernetes resources with label weblogic.domainUID \'$1\' without actually deleting them. + else + echo @@ Deleting kubernetes resources with label weblogic.domainUID \'$1\'. + fi + + local maxwaitsecs=${2:-$default_maxwaitsecs} + local tempfile="/tmp/$(basename $0).tmp.$$" # == /tmp/[script-file-name].tmp.[pid] + local mstart=`date +%s` + local phase=1 + + while : ; do + # get all k8s resources with matching domain-uid labels and put them in $tempfile + getDomainResources $1 $tempfile + + # get a count of all k8s resources with matching domain-uid labels + local allcount=`wc -l $tempfile | awk '{ print $1 }'` + + # get a count of all WLS pods (any pod with a matching domain-uid label that doesn't have 'traefik' or 'apache' embedded in its name) + local podcount=`grep "^Pod" $tempfile | grep -v traefik | grep -v apache | wc -l | awk '{ print $1 }'` + + local mnow=`date +%s` + + echo @@ $allcount resources remaining after $((mnow - mstart)) seconds, including $podcount WebLogic Server pods. Max wait is $maxwaitsecs seconds. + + # Exit if all k8s resources deleted or max wait seconds exceeded. + + if [ $allcount -eq 0 ]; then + echo @@ Success. + rm -f $tempfile + exit 0 + elif [ $((mnow - mstart)) -gt $maxwaitsecs ]; then + echo @@ Error! Max wait of $maxwaitsecs seconds exceeded with $allcount resources remaining, including $podcount WebLogic Server pods. Giving up. Remaining resources: + cat $tempfile + rm -f $tempfile + exit $allcount + fi + + # In phase 1, set the serverStartPolicy of each domain to NEVER and then immediately + # proceed to phase 2. If there are no domains or WLS pods, we also immediately go to phase 2. + + if [ $phase -eq 1 ]; then + phase=2 + if [ $podcount -gt 0 ]; then + echo @@ "Setting serverStartPolicy to NEVER on each domain (this should cause operator(s) to initiate a controlled shutdown of the domain's pods.)" + cat $tempfile | grep "^Domain" | while read line; do + local name="`echo $line | awk '{ print $2 }'`" + local namespace="`echo $line | awk '{ print $4 }'`" + if [ "$test_mode" = "true" ]; then + echo "kubectl patch domain $name -n $namespace -p '{\"spec\":{\"serverStartPolicy\":\"NEVER\"}}' --type merge" + else + kubectl patch domain $name -n $namespace -p '{"spec":{"serverStartPolicy":"NEVER"}}' --type merge + fi + done + fi + fi + + # In phase 2, wait for the WLS pod count to go down to 0 for at most half + # of 'maxwaitsecs'. Otherwise proceed immediately to phase 3. + + if [ $phase -eq 2 ]; then + if [ $podcount -eq 0 ]; then + echo @@ All pods shutdown, about to directly delete remaining resources. + phase=3 + elif [ $((mnow - mstart)) -gt $((maxwaitsecs / 2)) ]; then + echo @@ Warning! $podcount WebLogic Server pods remaining but wait time exceeds half of max wait seconds. About to directly delete all remaining resources, including the leftover pods. + phase=3 + else + echo @@ "Waiting for operator to shutdown pods (will wait for no more than half of max wait seconds before directly deleting them)." + sleep 3 + continue + fi + fi + + # In phase 3, directly delete remaining k8s resources for the given domainUids + # (including any leftover WLS pods from previous phases). + + # for each namespace with leftover resources, try delete them + cat $tempfile | awk '{ print $4 }' | grep -v "^$" | sort -u | while read line; do + if [ "$test_mode" = "true" ]; then + echo kubectl -n $line delete $NAMESPACED_TYPES -l "$LABEL_SELECTOR" + else + kubectl -n $line delete $NAMESPACED_TYPES -l "$LABEL_SELECTOR" + fi + done + + # if there are any non-namespaced types left, try delete them + local no_namespace_count=`grep -c -v " -n " $tempfile` + if [ ! "$no_namespace_count" = "0" ]; then + if [ "$test_mode" = "true" ]; then + echo kubectl delete $NOT_NAMESPACED_TYPES -l "$LABEL_SELECTOR" + else + kubectl delete $NOT_NAMESPACED_TYPES -l "$LABEL_SELECTOR" + fi + fi + + # Delete domains, if any + cat $tempfile | grep "^Domain " | while read line; do + if [ "$test_mode" = "true" ]; then + echo kubectl delete $line + else + kubectl delete $line + fi + done + + sleep 3 + done +} + +# main entry point + +# default when to stop retrying (override via command line) +default_maxwaitsecs=120 + +# optional test mode that lists what would be deleted without +# actually deleting (override via command line) +test_mode=false + +domains="" + +# parse command line options +while getopts ":d:s:th" opt; do + case $opt in + d) domains="${OPTARG}" + ;; + + s) maxwaitsecs="${OPTARG}" + ;; + + t) test_mode="true" + ;; + + h) usage + exit 0 + ;; + + *) usage + exit 9999 + ;; + esac +done + +if [ "$domains" = "" ]; then + usage + exit 9999 +fi + +if [ ! -x "$(command -v kubectl)" ]; then + echo "@@ Error! kubectl is not installed." + exit 9999 +fi + +deleteDomains "${domains}" "${maxwaitsecs:-$default_maxwaitsecs}" + diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/README.md b/OracleWebCenterContent/kubernetes/domain-lifecycle/README.md new file mode 100644 index 000000000..0eeab95d5 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/README.md @@ -0,0 +1,186 @@ +### Domain life cycle sample scripts + +The operator provides sample scripts to start up or shut down a specific Managed Server or cluster in a deployed domain, or the entire deployed domain. + +**Note**: Prior to running these scripts, you must have previously created and deployed the domain. These scripts make use of [jq](https://stedolan.github.io/jq/) for processing JSON. You must have `jq 1.5 or higher` installed in order to run these scripts. See the installation options on the [jq downlod](https://stedolan.github.io/jq/download/) page. + +These scripts can be helpful when scripting the life cycle of a WebLogic Server domain. For information on how to start, stop, restart, and scale WebLogic Server instances in your domain, see [Domain Life Cycle](https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle). + +#### Scripts to start and stop a WebLogic Server +The `startServer.sh` script starts a WebLogic Server in a domain. For clustered Managed Servers, either it increases the `spec.clusters[].replicas` value for the Managed Server's cluster by `1` or updates the `spec.managedServers[].serverStartPolicy` attribute of the domain resource or both as necessary. For the Administration Server, it updates the value of the `spec.adminServer.serverStartPolicy` attribute of the domain resource. For non-clustered Managed Servers, it updates the `spec.managedServers[].serverStartPolicy` attribute of the domain resource. The script provides an option to keep the `spec.clusters[].replicas` value constant for clustered servers. See the script `usage` information by using the `-h` option. + +Use the following command to start the server either by increasing the replica count or by updating the server start policy: +``` +$ startServer.sh -d domain1 -n weblogic-domain-1 -s managed-server1 +[INFO] Updating replica count for cluster 'cluster-1' to 1. +domain.weblogic.oracle/domain1 patched +[INFO] Successfully updated replica count for cluster 'cluster-1' to 1. +``` + +Use the following command to start the server without increasing the replica count: +``` +$ startServer.sh -d domain1 -n weblogic-domain-1 -s managed-server2 -k +[INFO] Patching start policy for 'managed-server2' to 'ALWAYS'. +domain.weblogic.oracle/domain1 patched +[INFO] Successfully patched server 'managed-server2' with 'ALWAYS' start policy. +``` + +The `stopServer.sh` script shuts down a running WebLogic Server in a domain. For clustered Managed Servers, either it decreases the `spec.clusters[].replicas` value for the Managed Server's cluster by `1` or updates the `spec.managedServers[].serverStartPolicy` attribute of the domain resource or both as necessary. For the Administration Server, it updates the value of the `spec.adminServer.serverStartPolicy` attribute of the domain resource. For non-clustered Managed Servers, it updates the `spec.managedServers[].serverStartPolicy` attribute of the domain resource. The script provides an option to keep the `spec.clusters[].replicas` value constant for clustered servers. See the script `usage` information by using the `-h` option. + +Use the following command to stop the server either by decreasing the replica count or by updating the server start policy: +``` +$ stopServer.sh -d domain1 -n weblogic-domain-1 -s managed-server1 +[INFO] Updating replica count for cluster cluster-1 to 0. +domain.weblogic.oracle/domain1 patched +[INFO] Successfully updated replica count for cluster 'cluster-1' to 0. +``` + +Use the following command to stop the server without decreasing the replica count: +``` +$ stopServer.sh -d domain1 -n weblogic-domain-1 -s managed-server2 -k +[INFO] Unsetting the current start policy 'ALWAYS' for 'managed-server2'. +domain.weblogic.oracle/domain1 patched +[INFO] Successfully unset policy 'ALWAYS'. +``` + +### Scripts to start and stop a cluster + +The `startCluster.sh` script starts a cluster by patching the `spec.clusters[].serverStartPolicy` attribute of the domain resource to `IF_NEEDED`. The operator will start the WebLogic Server instance Pods that are part of the cluster after the `serverStartPolicy` attribute is updated to `IF_NEEDED`. See the script `usage` information by using the `-h` option. +``` +$ startCluster.sh -d domain1 -n weblogic-domain-1 -c cluster-1 +[INFO]Patching start policy of cluster 'cluster-1' from 'NEVER' to 'IF_NEEDED'. +domain.weblogic.oracle/domain1 patched +[INFO] Successfully patched cluster 'cluster-1' with 'IF_NEEDED' start policy!. +``` +The `stopCluster.sh` script shuts down a cluster by patching the `spec.clusters[].serverStartPolicy` attribute of the domain resource to `NEVER`. The operator will shut down the WebLogic Server instance Pods that are part of the cluster after the `serverStartPolicy` attribute is updated to `NEVER`. See the script `usage` information by using the `-h` option. +``` +$ stopCluster.sh -d domain1 -n weblogic-domain-1 -c cluster-1 +[INFO] Patching start policy of cluster 'cluster-1' from 'IF_NEEDED' to 'NEVER'. +domain.weblogic.oracle/domain1 patched +[INFO] Successfully patched cluster 'cluster-1' with 'NEVER' start policy! +``` +### Scripts to start and stop a domain +The `startDomain.sh` script starts a deployed domain by patching the `spec.serverStartPolicy` attribute of the domain resource to `IF_NEEDED`. The operator will start the WebLogic Server instance Pods that are part of the domain after the `spec.serverStartPolicy` attribute of the domain resource is updated to `IF_NEEDED`. See the script `usage` information by using the `-h` option. +``` +$ startDomain.sh -d domain1 -n weblogic-domain-1 +[INFO] Patching domain 'domain1' from serverStartPolicy='NEVER' to 'IF_NEEDED'. +domain.weblogic.oracle/domain1 patched +[INFO] Successfully patched domain 'domain1' in namespace 'weblogic-domain-1' with 'IF_NEEDED' start policy! +``` + +The `stopDomain.sh` script shuts down a domain by patching the `spec.serverStartPolicy` attribute of the domain resource to `NEVER`. The operator will shut down the WebLogic Server instance Pods that are part of the domain after the `spec.serverStartPolicy` attribute is updated to `NEVER`. See the script `usage` information by using the `-h` option. +``` +$ stopDomain.sh -d domain1 -n weblogic-domain-1 +[INFO] Patching domain 'domain1' in namespace 'weblogic-domain-1' from serverStartPolicy='IF_NEEDED' to 'NEVER'. +domain.weblogic.oracle/domain1 patched +[INFO] Successfully patched domain 'domain1' in namespace 'weblogic-domain-1' with 'NEVER' start policy! +``` + +### Script to scale a WebLogic cluster + +The `scaleCluster.sh` script scales a WebLogic cluster by patching the `spec.clusters[].replicas` attribute of the domain resource to the specified value. The operator will perform the scaling operation for the WebLogic cluster based on the specified value of the `replicas` attribute after its value is updated. See the script `usage` information by using the `-h` option. +``` +$ scaleCluster.sh -d domain1 -n weblogic-domain-1 -c cluster-1 -r 3 +[2021-02-26T19:04:14.335000Z][INFO] Patching replicas for cluster 'cluster-1' to '3'. +domain.weblogic.oracle/domain1 patched +[2021-02-26T19:04:14.466000Z][INFO] Successfully patched replicas for cluster 'cluster-1'! +``` + +### Script to view the status of a WebLogic cluster + +The `clusterStatus.sh` script can be used to view the status of a WebLogic cluster in the WebLogic domain managed by the operator. The WebLogic Cluster Status contains information about the minimum, maximum, goal, current, and ready replica count for a WebLogic cluster. This script displays a table containing the status for WebLogic clusters in one or more domains across one or more namespaces. See the script `usage` information by using the `-h` option. + +Use the following command to view the status of all WebLogic clusters in all domains across all namespaces. +```shell +$ clusterStatus.sh + +WebLogic Cluster Status -n "" -d "" -c "": + +namespace domain cluster min max goal current ready +--------- ------ ------- --- --- ---- ------- ----- +ns-kvmt mii-domain1 cluster-1 1 5 5 5 5 +weblogic-domain-1 domain1 cluster-1 0 4 2 2 2 +weblogic-domain-1 domain1 cluster-2 0 4 0 0 0 +``` + +Use the following command to view the status of all WebLogic clusters in 'domain1' in 'weblogic-domain-1' namespace. +``` +$ clusterStatus.sh -d domain1 -n weblogic-domain-1 + +WebLogic Cluster Status -n "weblogic-domain-1" -d "domain1" -c "": + +namespace domain cluster min max goal current ready +--------- ------ ------- --- --- ---- ------- ----- +weblogic-domain-1 domain1 cluster-1 0 4 2 2 2 +weblogic-domain-1 domain1 cluster-2 0 4 0 0 0 +``` + +### Scripts to initiate a rolling restart of a WebLogic domain or cluster + +The `rollDomain.sh` script can be used to initiate a rolling restart of the WebLogic Server Pods in a domain managed by the operator. Similarly, the `rollCluster.sh` script can be used to initiate a rolling restart of the WebLogic Server Pods belonging to a WebLogic cluster in a domain managed by the operator. + +The `rollDomain.sh` script updates the value of the `spec.restartVersion` attribute of the domain resource. Then, the operator will do a rolling restart of the Server Pods in the WebLogic domain after the value of the `spec.restartVersion` is updated. You can provide the new value for `spec.restartVersion` as a parameter to the script or the script will automatically generate a new value to trigger the rolling restart. See the script `usage` information by using the `-h` option. + +``` +$ rollDomain.sh -d domain1 -n weblogic-domain-1 +[2021-03-24T04:01:19.733000Z][INFO] Patching restartVersion for domain 'domain1' to '1'. +domain.weblogic.oracle/domain1 patched +[2021-03-24T04:01:19.850000Z][INFO] Successfully patched restartVersion for domain 'domain1'! +``` + +Use the following command to roll the Server Pods in a WebLogic domain with a specific `restartVersion`: +``` +$ rollDomain.sh -r v1 -d domain1 -n weblogic-domain-1 +[2021-03-24T13:43:47.586000Z][INFO] Patching restartVersion for domain 'domain1' to 'v1'. +domain.weblogic.oracle/domain1 patched +[2021-03-24T13:43:47.708000Z][INFO] Successfully patched restartVersion for domain 'domain1'! +``` + +The `rollCluster.sh` script updates the value of the `spec.clusters[].restartVersion` attribute of the domain resource. Then, the operator will do a rolling restart of the WebLogic cluster Server Pods after the value of the `spec.clusters[].restartVersion` is updated. You can provide the new value of the `restartVersion` as a parameter to the script or the script will automatically generate a new value to trigger the rolling restart. See the script `usage` information by using the `-h` option. + +``` +$ rollCluster.sh -c cluster-1 -d domain1 -n weblogic-domain-1 +[2021-03-24T04:03:27.521000Z][INFO] Patching restartVersion for cluster 'cluster-1' to '2'. +domain.weblogic.oracle/domain1 patched +[2021-03-24T04:03:27.669000Z][INFO] Successfully patched restartVersion for cluster 'cluster-1'! +``` + +Use the following command to roll the WebLogic Cluster Servers with a specific `restartVersion`: +``` +$ rollCluster.sh -r v2 -c cluster-1 -d domain1 -n weblogic-domain-1 +[2021-03-24T13:46:16.833000Z][INFO] Patching restartVersion for cluster 'cluster-1' to 'v2'. +domain.weblogic.oracle/domain1 patched +[2021-03-24T13:46:16.975000Z][INFO] Successfully patched restartVersion for cluster 'cluster-1'! +``` + +### Scripts to restart a WebLogic Server in a domain +The `restartServer.sh` script can be used to restart a WebLogic Server in a domain. This script restarts the Server by deleting the Server Pod for the WebLogic Server instance. +``` +$ restartServer.sh -s managed-server1 -d domain1 -n weblogic-domain-1 +[2021-03-24T22:20:22.498000Z][INFO] Initiating restart of 'managed-server1' by deleting server pod 'domain1-managed-server1'. +[2021-03-24T22:20:37.614000Z][INFO] Server restart succeeded ! +``` + +### Scripts to explicitly initiate introspection of a WebLogic domain + +The `introspectDomain.sh` script can be used to rerun a WebLogic domain's introspect job by explicitly initiating the introspection. This script updates the value of the `spec.introspectVersion` attribute of the domain resource. The resulting behavior depends on your domain home source type and other factors, see [Initiating introspection](https://oracle.github.io/weblogic-kubernetes-operator/userguide/managing-domains/domain-lifecycle/introspection/#initiating-introspection) for details. You can provide the new value of the `introspectVersion` as a parameter to the script or the script will automatically generate a new value to trigger the introspection. See the script `usage` information by using the `-h` option. + +Use the following command to rerun a domain's introspect job with the `introspectVersion` value generated by the script. +``` +$ introspectDomain.sh -d domain1 -n weblogic-domain-1 +[2021-03-24T21:37:55.989000Z][INFO] Patching introspectVersion for domain 'domain1' to '1'. +domain.weblogic.oracle/domain1 patched +[2021-03-24T21:37:56.110000Z][INFO] Successfully patched introspectVersion for domain 'domain1'! +``` + +Use the following command to rerun a domain's introspect job with a specific `introspectVersion` value. +``` +$ introspectDomain.sh -i v1 -d domain1 -n weblogic-domain-1 +[2021-03-24T21:38:34.369000Z][INFO] Patching introspectVersion for domain 'domain1' to 'v1'. +domain.weblogic.oracle/domain1 patched +[2021-03-24T21:38:34.488000Z][INFO] Successfully patched introspectVersion for domain 'domain1'! +``` + +### Watching the Pods after executing life cycle scripts + +After executing the lifecycle scripts described above for a domain or a cluster or a Server, you can manually run the `kubectl -n MYNS get pods --watch=true --show-labels` command to watch the effect of running the scripts and monitor the status and labels of various Pods. You will need to do 'Ctrl-C' to stop watching the Pods and exit. diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/clusterStatus.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/clusterStatus.sh new file mode 100644 index 000000000..8bfeb45f3 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/clusterStatus.sh @@ -0,0 +1,130 @@ +# !/bin/sh +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +set -eu +set -o pipefail + +function usage() { +cat< ${kubernetesCli} patch domain ${domainUid} \ + -n ${domainNamespace} --type=merge --patch \"${patchJson}\"" + fi + ${kubernetesCli} patch domain ${domainUid} -n ${domainNamespace} --type=merge --patch "${patchJson}" +} + +# timestamp +# purpose: echo timestamp in the form yyyy-mm-ddThh:mm:ss.nnnnnnZ +# example: 2018-10-01T14:00:00.000001Z +timestamp() { + local timestamp="`date --utc '+%Y-%m-%dT%H:%M:%S.%NZ' 2>&1`" + if [ ! "${timestamp/illegal/xyz}" = "${timestamp}" ]; then + # old shell versions don't support %N or --utc + timestamp="`date -u '+%Y-%m-%dT%H:%M:%S.000000Z' 2>&1`" + fi + echo "${timestamp}" +} + +# +# Function to note that a validate error has occurred +# +validationError() { + printError $* + validateErrors=true +} + +# +# Function to cause the script to fail if there were any validation errors +# +failIfValidationErrors() { + if [ "$validateErrors" = true ]; then + printError 'The errors listed above must be resolved before the script can continue. Please see usage information below.' + usage 1 + fi +} + +# +# Function to lowercase a value and make it a legal DNS1123 name +# $1 - value to convert to DNS legal name +# $2 - return value containing DNS legal name. +toDNS1123Legal() { + local name=$1 + local __result=$2 + local val=`echo "${name}" | tr "[:upper:]" "[:lower:]"` + val=${val//"_"/"-"} + eval $__result="'$val'" +} diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/introspectDomain.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/introspectDomain.sh new file mode 100644 index 000000000..120eccec7 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/introspectDomain.sh @@ -0,0 +1,105 @@ +# !/bin/sh +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh +if [ "${debug}" == "true" ]; then set -x; fi; + +function usage() { + + cat << EOF + + This script initiates introspection of a WebLogic domain by updating + the value of 'spec.introspectVersion' attribute of the domain resource. + + Usage: + + $(basename $0) [-n mynamespace] [-d mydomainuid] [-i introspectVersion] [-m kubecli] + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -i : Introspect version. If this parameter is not provided, + then the script will generate the 'introspectVersion' by + incrementing the existing value. If the 'spec.introspectVersion' + doesn't exist or its value is non-numeric, then the script + will set the 'spec.introspectVersion' value to '1'. + + -m : Kubernetes command line interface. Default is 'kubectl' + if KUBERNETES_CLI env variable is not set. Otherwise + the default is the value of KUBERNETES_CLI env variable. + + -v : Enables verbose mode. Default is 'false'. + + -h : This help. + +EOF +exit $1 +} + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +clusterName="" +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +verboseMode=false +patchJson="" +introspectVersion="" + +while getopts "vc:n:m:d:i:h" opt; do + case $opt in + n) domainNamespace="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + i) introspectVersion="${OPTARG}" + ;; + m) kubernetesCli="${OPTARG}" + ;; + v) verboseMode=true; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +set -eu + +# +# Function to perform validations, read files and initialize workspace +# +function initialize { + + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + + failIfValidationErrors +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) +if [ -z "${domainJson}" ]; then + printError "Unable to get domain resource for domain '${domainUid}' in namespace '${domainNamespace}'. Please make sure the 'domain_uid' and 'namespace' specified by the '-d' and '-n' arguments are correct. Exiting." + exit 1 +fi + +# if the introspectVersion is not provided, generate the value of introspectVersion +if [ -z "${introspectVersion}" ]; then + generateDomainIntrospectVersion "${domainJson}" introspectVersion +fi + +printInfo "Patching introspectVersion for domain '${domainUid}' to '${introspectVersion}'." +createPatchJsonToUpdateDomainIntrospectVersion "${introspectVersion}" patchJson + +executePatchCommand "${kubernetesCli}" "${domainUid}" "${domainNamespace}" "${patchJson}" "${verboseMode}" + +printInfo "Successfully patched introspectVersion for domain '${domainUid}'!" diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/restartServer.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/restartServer.sh new file mode 100644 index 000000000..0c7405aba --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/restartServer.sh @@ -0,0 +1,106 @@ +# !/bin/sh +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh +if [ "${debug}" == "true" ]; then set -x; fi; +set -eu + +function usage() { + + cat << EOF + + This script restarts a running WebLogic server in a domain by deleting the server pod. + + Usage: + + $(basename $0) -s myserver [-n mynamespace] [-d mydomainuid] [-m kubecli] + + -s : The WebLogic server name (not the pod name). + This parameter is required. + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -m : Kubernetes command line interface. Default is 'kubectl' + if KUBERNETES_CLI env variable is not set. Otherwise the + default is the value of KUBERNETES_CLI env variable. + + -h : This help. + +EOF +exit $1 +} + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +serverName="" +clusterName="" +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +podName="" +legalDNSPodName="" + +while getopts "s:m:n:d:h" opt; do + case $opt in + s) serverName="${OPTARG}" + ;; + n) domainNamespace="${OPTARG}" + ;; + m) kubernetesCli="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +# +# Function to perform validations, read files and initialize workspace +# +function initialize { + + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + + # Validate that server name parameter is specified. + if [ -z "${serverName}" ]; then + validationError "Please specify the server name using '-s' parameter e.g. '-s managed-server1'." + fi + + failIfValidationErrors +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) +if [ -z "${domainJson}" ]; then + printError "Unable to get domain resource for domain '${domainUid}' in namespace '${domainNamespace}'. Please make sure the 'domain_uid' and 'namespace' specified by the '-d' and '-n' arguments are correct. Exiting." + exit 1 +fi + +# Validate that specified server is either part of a cluster or is an independent managed server +validateServerAndFindCluster "${domainUid}" "${domainNamespace}" "${serverName}" isValidServer clusterName isAdminServer +if [ "${isValidServer}" != 'true' ]; then + printError "Server ${serverName} is not part of any cluster and it's not an independent managed server. Please make sure that server name specified is correct." + exit 1 +fi + +podName=${domainUid}-${serverName} +toDNS1123Legal ${podName} legalDNSPodName +printInfo "Initiating restart of '${serverName}' by deleting server pod '${legalDNSPodName}'." +result=$(${kubernetesCli} -n ${domainNamespace} delete pod ${legalDNSPodName} --ignore-not-found) +if [ -z "${result}" ]; then + printError "Server '${serverName}' is not running." +else + printInfo "Server restart succeeded !" +fi diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/rollCluster.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/rollCluster.sh new file mode 100644 index 000000000..858e41706 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/rollCluster.sh @@ -0,0 +1,123 @@ +# !/bin/sh +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh +if [ "${debug}" == "true" ]; then set -x; fi; + +function usage() { + + cat << EOF + + This script initiates a rolling restart of the WebLogic cluster server pods in a domain by updating + the value of the 'spec.clusters[].restartVersion' attribute of the domain resource. + + Usage: + + $(basename $0) -c mycluster [-n mynamespace] [-d mydomainuid] [-r restartVersion] [-m kubecli] + + -c : Cluster name (required parameter). + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -r : Restart version. If this parameter is not provided, + then the script will generate the 'restartVersion' + value of the cluster by incrementing the existing + value. If the 'restartVersion' value doesn't exist + for the cluster then it will use the incremented value of + domain 'restartVersion'. If the domain 'restartVersion' also + doesn't exist or effective value is non-numeric, then + the script will set the 'restartVersion' value to '1'. + + -m : Kubernetes command line interface. Default is 'kubectl' + if KUBERNETES_CLI env variable is not set. Otherwise + the default is the value of the KUBERNETES_CLI env variable. + + -v : Enables verbose mode. Default is 'false'. + + -h : This help. + +EOF +exit $1 +} + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +clusterName="" +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +verboseMode=false +patchJson="" +restartVersion="" + +while getopts "vc:n:m:d:r:h" opt; do + case $opt in + c) clusterName="${OPTARG}" + ;; + n) domainNamespace="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + r) restartVersion="${OPTARG}" + ;; + m) kubernetesCli="${OPTARG}" + ;; + v) verboseMode=true; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +set -eu + +# +# Function to perform validations, read files and initialize workspace +# +function initialize { + + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + + if [ -z "${clusterName}" ]; then + validationError "Please specify cluster name using '-c' parameter e.g. '-c cluster-1'." + fi + + failIfValidationErrors +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) +if [ -z "${domainJson}" ]; then + printError "Unable to get domain resource for domain '${domainUid}' in namespace '${domainNamespace}'. Please make sure the 'domain_uid' and 'namespace' specified by the '-d' and '-n' arguments are correct. Exiting." + exit 1 +fi + +isValidCluster="" +validateClusterName "${domainUid}" "${domainNamespace}" "${clusterName}" isValidCluster +if [ "${isValidCluster}" != 'true' ]; then + printError "cluster ${clusterName} is not part of domain ${domainUid} in namespace ${domainNamespace}. Please make sure that cluster name is correct." + exit 1 +fi + +# if the restartVersion is not provided, generate the value of restartVersion +if [ -z "${restartVersion}" ]; then + generateClusterRestartVersion "${domainJson}" "${clusterName}" restartVersion +fi + +printInfo "Patching restartVersion for cluster '${clusterName}' to '${restartVersion}'." +createPatchJsonToUpdateClusterRestartVersion "${domainJson}" "${clusterName}" "${restartVersion}" patchJson + +executePatchCommand "${kubernetesCli}" "${domainUid}" "${domainNamespace}" "${patchJson}" "${verboseMode}" + +printInfo "Successfully patched restartVersion for cluster '${clusterName}'!" diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/rollDomain.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/rollDomain.sh new file mode 100644 index 000000000..4c821d8c8 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/rollDomain.sh @@ -0,0 +1,105 @@ +# !/bin/sh +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh +if [ "${debug}" == "true" ]; then set -x; fi; + +function usage() { + + cat << EOF + + This script initiates a rolling restart of pods in a WebLogic domain by updating + the value of the 'spec.restartVersion' attribute of the domain resource. + + Usage: + + $(basename $0) [-n mynamespace] [-d mydomainuid] [-r restartVersion] [-m kubecli] + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -r : Restart version. If this parameter is not provided, + then the script will generate the 'restartVersion' by + incrementing the existing value. If the 'spec.restartVersion' + doesn't exist or its value is non-numeric, then the script + will set the 'spec.restartVersion' value to '1'. + + -m : Kubernetes command line interface. Default is 'kubectl' + if KUBERNETES_CLI env variable is not set. Otherwise + the default is the value of the KUBERNETES_CLI env variable. + + -v : Enables verbose mode. Default is 'false'. + + -h : This help. + +EOF +exit $1 +} + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +clusterName="" +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +verboseMode=false +patchJson="" +restartVersion="" + +while getopts "vc:n:m:d:r:h" opt; do + case $opt in + n) domainNamespace="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + r) restartVersion="${OPTARG}" + ;; + m) kubernetesCli="${OPTARG}" + ;; + v) verboseMode=true; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +set -eu + +# +# Function to perform validations, read files and initialize workspace +# +function initialize { + + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + + failIfValidationErrors +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) +if [ -z "${domainJson}" ]; then + printError "Unable to get domain resource for domain '${domainUid}' in namespace '${domainNamespace}'. Please make sure the 'domain_uid' and 'namespace' specified by the '-d' and '-n' arguments are correct. Exiting." + exit 1 +fi + +# if the restartVersion is not provided, generate the value of restartVersion +if [ -z "${restartVersion}" ]; then + generateDomainRestartVersion "${domainJson}" restartVersion +fi + +printInfo "Patching restartVersion for domain '${domainUid}' to '${restartVersion}'." +createPatchJsonToUpdateDomainRestartVersion "${restartVersion}" patchJson + +executePatchCommand "${kubernetesCli}" "${domainUid}" "${domainNamespace}" "${patchJson}" "${verboseMode}" + +printInfo "Successfully patched restartVersion for domain '${domainUid}'!" diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/scaleCluster.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/scaleCluster.sh new file mode 100644 index 000000000..947dd871c --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/scaleCluster.sh @@ -0,0 +1,122 @@ +# !/bin/sh +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh +if [ "${debug}" == "true" ]; then set -x; fi; + +function usage() { + + cat << EOF + + This script scales a WebLogic cluster in a domain by patching the + 'spec.clusters[].replicas' attribute of the domain + resource. This change will cause the operator to perform a scaling + operation for the WebLogic cluster based on the value of replica count. + + Usage: + + $(basename $0) -c mycluster -r replicas [-n mynamespace] [-d mydomainuid] [-m kubecli] + + -c : Cluster name parameter is required. + + -r : Replica count, parameter is required. + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -m : Kubernetes command line interface. Default is 'kubectl' if KUBERNETES_CLI env + variable is not set. Otherwise default is the value of KUBERNETES_CLI env variable. + + -v : Enables verbose mode. Default is 'false'. + + -h : This help. + +EOF +exit $1 +} + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +clusterName="" +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +verboseMode=false +patchJson="" +replicas="" + +while getopts "vc:n:m:d:r:h" opt; do + case $opt in + c) clusterName="${OPTARG}" + ;; + n) domainNamespace="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + r) replicas="${OPTARG}" + ;; + m) kubernetesCli="${OPTARG}" + ;; + v) verboseMode=true; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +set -eu + +# +# Function to perform validations, read files and initialize workspace +# +function initialize { + + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + + if [ -z "${clusterName}" ]; then + validationError "Please specify cluster name using '-c' parameter e.g. '-c cluster-1'." + fi + + if [ -z "${replicas}" ]; then + validationError "Please specify replica count using '-r' parameter e.g. '-r 3'." + fi + + failIfValidationErrors +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) +if [ -z "${domainJson}" ]; then + printError "Unable to get domain resource for domain '${domainUid}' in namespace '${domainNamespace}'. Please make sure the 'domain_uid' and 'namespace' specified by the '-d' and '-n' arguments are correct. Exiting." + exit 1 +fi + +isValidCluster="" +validateClusterName "${domainUid}" "${domainNamespace}" "${clusterName}" isValidCluster +if [ "${isValidCluster}" != 'true' ]; then + printError "cluster ${clusterName} is not part of domain ${domainUid} in namespace ${domainNamespace}. Please make sure that cluster name is correct." + exit 1 +fi + +isReplicasInAllowedRange "${domainJson}" "${clusterName}" "${replicas}" replicasInAllowedRange range +if [ "${replicasInAllowedRange}" == 'false' ]; then + printError "Replicas value is not in the allowed range of ${range}. Exiting." + exit 1 +fi + +printInfo "Patching replicas for cluster '${clusterName}' to '${replicas}'." +createPatchJsonToUpdateReplicas "${domainJson}" "${clusterName}" "${replicas}" patchJson + +executePatchCommand "${kubernetesCli}" "${domainUid}" "${domainNamespace}" "${patchJson}" "${verboseMode}" + +printInfo "Successfully patched replicas for cluster '${clusterName}'!" diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/startCluster.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/startCluster.sh new file mode 100644 index 000000000..5c8bf034c --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/startCluster.sh @@ -0,0 +1,129 @@ +# !/bin/sh +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh +if [ "${debug}" == "true" ]; then set -x; fi; + +function usage() { + + cat << EOF + + This script starts a WebLogic cluster in a domain by patching + 'spec.clusters[].serverStartPolicy' attribute of the domain + resource to 'IF_NEEDED'. This change will cause the operator to initiate + startup of cluster's WebLogic server instance pods if the pods are not + already running and the spec.replicas or + 'spec.clusters[].serverStartPolicy' is set higher than zero. + + Usage: + + $(basename $0) -c mycluster [-n mynamespace] [-d mydomainuid] [-m kubecli] + + -c : Cluster name (required parameter). + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -m : Kubernetes command line interface. Default is 'kubectl' if KUBERNETES_CLI env + variable is not set. Otherwise default is the value of KUBERNETES_CLI env variable. + + -v : Enables verbose mode. Default is 'false'. + + -h : This help. + +EOF +exit $1 +} + +set -eu + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +clusterName="" +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +verboseMode=false +patchJson="" + +while getopts "vc:n:m:d:h" opt; do + case $opt in + c) clusterName="${OPTARG}" + ;; + n) domainNamespace="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + m) kubernetesCli="${OPTARG}" + ;; + v) verboseMode=true; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +# +# Function to perform validations, read files and initialize workspace +# +function initialize { + + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + + if [ -z "${clusterName}" ]; then + validationError "Please specify cluster name using '-c' parameter e.g. '-c cluster-1'." + fi + + failIfValidationErrors + +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) +if [ -z "${domainJson}" ]; then + printError "Unable to get domain resource for domain '${domainUid}' in namespace '${domainNamespace}'. Please make sure the 'domain_uid' and 'namespace' specified by the '-d' and '-n' arguments are correct. Exiting." + exit 1 +fi + +isValidCluster="" +validateClusterName "${domainUid}" "${domainNamespace}" "${clusterName}" isValidCluster +if [ "${isValidCluster}" != 'true' ]; then + printError "cluster ${clusterName} is not part of domain ${domainUid} in namespace ${domainNamespace}. Please make sure that cluster name is correct." + exit 1 +fi + +getDomainPolicy "${domainJson}" domainStartPolicy +# Fail if effective start policy of domain is NEVER or ADMIN_ONLY +if [[ "${domainStartPolicy}" == 'NEVER' || "${domainStartPolicy}" == 'ADMIN_ONLY' ]]; then + printError "Cannot start cluster '${clusterName}', the domain is configured with a 'spec.serverStartPolicy' attribute on the domain resource of 'NEVER' or 'ADMIN_ONLY'." + exit 1 +fi + +# Get server start policy for this cluster +getClusterPolicy "${domainJson}" "${clusterName}" startPolicy +if [ -z "${startPolicy}" ]; then + startPolicy=${domainStartPolicy} +fi + +if [ "${startPolicy}" == 'IF_NEEDED' ]; then + printInfo "No changes needed, exiting. The cluster '${clusterName}' is already started or starting. The effective value of 'spec.clusters[?(clusterName=\"${clusterName}\"].serverStartPolicy' attribute on the domain resource is 'IF_NEEDED'." + exit 0 +fi + +# Set policy value to IF_NEEDED +printInfo "Patching start policy of cluster '${clusterName}' from '${startPolicy}' to 'IF_NEEDED'." +createPatchJsonToUpdateClusterPolicy "${domainJson}" "${clusterName}" "IF_NEEDED" patchJson + +executePatchCommand "${kubernetesCli}" "${domainUid}" "${domainNamespace}" "${patchJson}" "${verboseMode}" + +printInfo "Successfully patched cluster '${clusterName}' with 'IF_NEEDED' start policy!." diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/startDomain.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/startDomain.sh new file mode 100644 index 000000000..fea9cbbe5 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/startDomain.sh @@ -0,0 +1,97 @@ +# !/bin/sh +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh + +function usage() { + + cat << EOF + + This script starts a deployed WebLogic domain by patching 'spec.serverStartPolicy' + attribute of the domain resource to 'IF_NEEDED'. This change will cause the operator + to initiate startup of domain's WebLogic server instance pods if the pods are not + already running. + + Usage: + + $(basename $0) [-n mynamespace] [-d mydomainuid] [-m kubecli] + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -m : Kubernetes command line interface. Default is 'kubectl' if KUBERNETES_CLI env + variable is not set. Otherwise default is the value of KUBERNETES_CLI env variable. + + -v : Enables verbose mode. Default is 'false'. + + -h : This help. + +EOF +exit $1 +} + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +verboseMode=false + +while getopts "vn:d:m:h" opt; do + case $opt in + n) domainNamespace="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + m) kubernetesCli="${OPTARG}" + ;; + v) verboseMode=true; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + + +set -eu +set -o pipefail + +function initialize { + + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + + failIfValidationErrors +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) + +if [ -z "${domainJson}" ]; then + printError "Domain resource for domain '${domainUid}' not found in namespace '${domainNamespace}'. Exiting." + exit 1 +fi + +getDomainPolicy "${domainJson}" serverStartPolicy + +if [ "${serverStartPolicy}" == 'IF_NEEDED' ]; then + printInfo "No changes needed, exiting. The domain '${domainUid}' is already started or starting. The effective value of 'spec.serverStartPolicy' attribute on the domain resource is 'IF_NEEDED'." + exit 0 +fi + +printInfo "Patching domain '${domainUid}' from serverStartPolicy='${serverStartPolicy}' to 'IF_NEEDED'." + +createPatchJsonToUpdateDomainPolicy "IF_NEEDED" patchJson + +executePatchCommand "${kubernetesCli}" "${domainUid}" "${domainNamespace}" "${patchJson}" "${verboseMode}" + +printInfo "Successfully patched domain '${domainUid}' in namespace '${domainNamespace}' with 'IF_NEEDED' start policy!" diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/startServer.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/startServer.sh new file mode 100644 index 000000000..37b120d71 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/startServer.sh @@ -0,0 +1,242 @@ +# !/bin/sh +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +# This script starts a WebLogic managed server in a domain. +# Internal code notes :- +# - If server start policy is ALWAYS or policy is IF_NEEDED and the server is selected +# to start based on the replica count, it means that server is already started or is +# in the process of starting. In this case, script exits without making any changes. +# +# - If start policy of servers parent cluster or domain is 'NEVER', script +# fails as server can't be started. +# +# - If server is part of a cluster and keep_replica_constant option is false (the default) +# and the effective start policy of the server is IF_NEEDED and increasing replica count +# will naturally start the server, the script increases the replica count. +# +# - If server is part of a cluster and keep_replica_constant option is false (the default) +# and unsetting policy and increasing the replica count will start this server, script +# unsets the policy and increases replica count. For e.g. if replica count is 1 and +# start policy of server2 is NEVER, unsetting policy and increasing replica count will +# start server2. +# +# - If option to keep replica count constant ('-k') is selected and unsetting start policy +# will naturally start the server, script will unset the policy. For e.g. if replica count +# is 2 and start policy of server2 is NEVER, unsetting policy will start server2. +# +# - If above conditions are not true, it implies that either start policy is NEVER or policy +# is IF_NEEDED but server is not next in the order to start. In this case, script sets start +# policy to ALWAYS. For e.g. replica count is 3 and server10 needs to start. The script also +# increments the replica count by default. If option to keep replica count constant ('-k') +# is selected, it only sets the start policy to ALWAYS. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh +if [ "${debug}" == "true" ]; then set -x; fi; +set -eu + +function usage() { + + cat << EOF + + This script starts a WebLogic server in a domain. For the managed servers, it either + increases the value of 'spec.clusters[].replicas' by '1' or updates the + 'spec.managedServers[].serverStartPolicy' attribute of the domain + resource or both as necessary for starting the server. For the administration server, it + updates the value of 'spec.adminServer.serverStartPolicy' attribute of the domain resource. + The 'spec.clusters[].replicas' value can be kept constant by using '-k' option. + Please see README.md for more details. + + Usage: + + $(basename $0) -s myserver [-n mynamespace] [-d mydomainuid] [-k] [-m kubecli] [-v] + + -s : The WebLogic server name (not the pod name). + This parameter is required. + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -k : Keep replica count constant for the clustered servers. The default behavior + is to increment the replica count for the clustered servers. This parameter + is ignored for the administration and non-clustered managed servers. + + -m : Kubernetes command line interface. Default is 'kubectl' if KUBERNETES_CLI env + variable is not set. Otherwise default is the value of KUBERNETES_CLI env variable. + + -v : Enables verbose mode. Default is 'false'. + + -h : This help. + +EOF +exit $1 +} + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +serverName="" +clusterName="" +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +keepReplicaConstant=false +verboseMode=false +withReplicas="CONSTANT" +withPolicy="CONSTANT" +managedServerPolicy="" +effectivePolicy="" +isValidServer="" +patchJson="" +serverStarted="" +startsByPolicyUnset="" +startsByReplicaIncreaseAndPolicyUnset="" +isAdminServer=false + +while getopts "vkd:n:m:s:h" opt; do + case $opt in + s) serverName="${OPTARG}" + ;; + n) domainNamespace="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + k) keepReplicaConstant=true; + ;; + m) kubernetesCli="${OPTARG}" + ;; + v) verboseMode=true; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +# +# Function to perform validations, read files and initialize workspace +# +function initialize { + + # Validate the required files exist + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + + # Validate that server name parameter is specified. + if [ -z "${serverName}" ]; then + validationError "Please specify a server name using '-s' parameter e.g. '-s managed-server1'." + fi + + failIfValidationErrors +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) +if [ -z "${domainJson}" ]; then + printError "Unable to get domain resource for domain '${domainUid}' in namespace '${domainNamespace}'. Please make sure the 'domain_uid' and 'namespace' specified by the '-d' and '-n' arguments are correct. Exiting." + exit 1 +fi + +# Validate that specified server is either part of a cluster or is an independent managed server +validateServerAndFindCluster "${domainUid}" "${domainNamespace}" "${serverName}" isValidServer clusterName isAdminServer +if [ "${isValidServer}" != 'true' ]; then + printError "Server ${serverName} is not part of any cluster and it's not an independent managed server. Please make sure that server name specified is correct." + exit 1 +fi + +getClusterPolicy "${domainJson}" "${clusterName}" clusterPolicy +if [ "${clusterPolicy}" == 'NEVER' ]; then + printError "Cannot start server '${serverName}', the server's parent cluster '.spec.clusters[?(clusterName=\"${clusterName}\"].serverStartPolicy' in the domain resource is set to 'NEVER'." + exit 1 +fi + +getDomainPolicy "${domainJson}" domainPolicy +if [ "${domainPolicy}" == 'NEVER' ] || [[ "${domainPolicy}" == 'ADMIN_ONLY' && "${isAdminServer}" != 'true' ]]; then + printError "Cannot start server '${serverName}', the .spec.serverStartPolicy in the domain resource is set to 'NEVER' or 'ADMIN_ONLY'." + exit 1 +fi + +getEffectivePolicy "${domainJson}" "${serverName}" "${clusterName}" effectivePolicy +if [ "${isAdminServer}" == 'true' ]; then + getEffectiveAdminPolicy "${domainJson}" effectivePolicy + if [[ "${effectivePolicy}" == "IF_NEEDED" || "${effectivePolicy}" == "ALWAYS" ]]; then + printInfo "No changes needed, exiting. Server should be already starting or started because effective sever start policy is '${effectivePolicy}'." + exit 0 + fi +fi + +if [ -n "${clusterName}" ]; then + # Server is part of a cluster, check currently started servers + checkStartedServers "${domainJson}" "${serverName}" "${clusterName}" "${withReplicas}" "${withPolicy}" serverStarted + if [[ ${effectivePolicy} == "IF_NEEDED" && ${serverStarted} == "true" ]]; then + printInfo "No changes needed, exiting. The server should be already started or it's in the process of starting. The start policy for server ${serverName} is ${effectivePolicy} and server is chosen to be started based on current replica count." + exit 0 + elif [[ "${effectivePolicy}" == "ALWAYS" && ${serverStarted} == "true" ]]; then + printInfo "No changes needed, exiting. The server should be already started or it's in the process of starting. The start policy for server ${serverName} is ${effectivePolicy}." + exit 0 + fi +else + # Server is an independent managed server. + if [[ "${effectivePolicy}" == "ALWAYS" || "${effectivePolicy}" == "IF_NEEDED" ]]; then + printInfo "No changes needed, exiting. The server should be already started or it's in the process of starting. The start policy for server ${serverName} is ${effectivePolicy}." + exit 0 + fi +fi + +getServerPolicy "${domainJson}" "${serverName}" managedServerPolicy +createServerStartPolicyPatch "${domainJson}" "${serverName}" "ALWAYS" alwaysStartPolicyPatch + +# if server is part of a cluster and replica count will increase +if [[ -n ${clusterName} && "${keepReplicaConstant}" != 'true' ]]; then + #check if server starts by increasing replicas and unsetting policy + withReplicas="INCREASED" + withPolicy="UNSET" + checkStartedServers "${domainJson}" "${serverName}" "${clusterName}" "${withReplicas}" "${withPolicy}" startsByReplicaIncreaseAndPolicyUnset + createReplicaPatch "${domainJson}" "${clusterName}" "INCREMENT" incrementReplicaPatch replicaCount + if [[ -n ${managedServerPolicy} && ${startsByReplicaIncreaseAndPolicyUnset} == "true" ]]; then + # Server starts by increasing replicas and policy unset, increment and unset + printInfo "Unsetting the current start policy '${managedServerPolicy}' for '${serverName}' and incrementing replica count ${replicaCount}." + createPatchJsonToUnsetPolicyAndUpdateReplica "${domainJson}" "${serverName}" "${incrementReplicaPatch}" patchJson + elif [[ -z ${managedServerPolicy} && ${startsByReplicaIncreaseAndPolicyUnset} == "true" ]]; then + # Start policy is not set, server starts by increasing replicas based on effective policy, increment replicas + printInfo "Updating replica count for cluster '${clusterName}' to ${replicaCount}." + createPatchJsonToUpdateReplica "${incrementReplicaPatch}" patchJson + else + # Patch server policy to always and increment replicas + printInfo "Patching start policy of server '${serverName}' from '${effectivePolicy}' to 'ALWAYS' and \ +incrementing replica count for cluster '${clusterName}' to ${replicaCount}." + createPatchJsonToUpdateReplicaAndPolicy "${incrementReplicaPatch}" "${alwaysStartPolicyPatch}" patchJson + fi +elif [[ -n ${clusterName} && "${keepReplicaConstant}" == 'true' ]]; then + # Replica count needs to stay constant, check if server starts by unsetting policy + withReplicas="CONSTANT" + withPolicy="UNSET" + checkStartedServers "${domainJson}" "${serverName}" "${clusterName}" "${withReplicas}" "${withPolicy}" startsByPolicyUnset + if [[ "${effectivePolicy}" == "NEVER" && ${startsByPolicyUnset} == "true" ]]; then + # Server starts by unsetting policy, unset policy + printInfo "Unsetting the current start policy '${effectivePolicy}' for '${serverName}'." + createPatchJsonToUnsetPolicy "${domainJson}" "${serverName}" patchJson + else + # Patch server policy to always + printInfo "Patching start policy for '${serverName}' to 'ALWAYS'." + createPatchJsonToUpdatePolicy "${alwaysStartPolicyPatch}" patchJson + fi +elif [ "${isAdminServer}" == 'true' ]; then + printInfo "Patching start policy of '${serverName}' from '${effectivePolicy}' to 'IF_NEEDED'." + createPatchJsonToUpdateAdminPolicy "${domainJson}" "IF_NEEDED" patchJson +else + # Server is an independent managed server + printInfo "Unsetting the current start policy '${effectivePolicy}' for '${serverName}'." + createPatchJsonToUnsetPolicy "${domainJson}" "${serverName}" patchJson +fi + +executePatchCommand "${kubernetesCli}" "${domainUid}" "${domainNamespace}" "${patchJson}" "${verboseMode}" + +printInfo "Patch command succeeded !" diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/stopCluster.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/stopCluster.sh new file mode 100644 index 000000000..6e0410932 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/stopCluster.sh @@ -0,0 +1,119 @@ +# !/bin/sh +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh +if [ "${debug}" == "true" ]; then set -x; fi; + +function usage() { + + cat << EOF + + This script stops a WebLogic cluster in a domain by patching + 'spec.clusters[].serverStartPolicy' attribute of the domain + resource to 'NEVER'. This change will cause the operator to initiate shutdown + of cluster's WebLogic server instance pods if the pods are running. + + Usage: + + $(basename $0) -c mycluster [-n mynamespace] [-d mydomainuid] [-m kubecli] + + -c : Cluster name (required parameter). + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -m : Kubernetes command line interface. Default is 'kubectl' if KUBERNETES_CLI env + variable is not set. Otherwise default is the value of KUBERNETES_CLI env variable. + + -v : Enables verbose mode. Default is 'false'. + + -h : This help. + +EOF +exit $1 +} + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +clusterName="" +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +verboseMode=false +patchJson="" + +while getopts "vc:n:m:d:h" opt; do + case $opt in + c) clusterName="${OPTARG}" + ;; + n) domainNamespace="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + m) kubernetesCli="${OPTARG}" + ;; + v) verboseMode=true; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +set -eu + +# +# Function to perform validations, read files and initialize workspace +# +function initialize { + + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + + if [ -z "${clusterName}" ]; then + validationError "Please specify cluster name using '-c' parameter e.g. '-c cluster-1'." + fi + + failIfValidationErrors +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) +if [ -z "${domainJson}" ]; then + printError "Unable to get domain resource for domain '${domainUid}' in namespace '${domainNamespace}'. Please make sure the 'domain_uid' and 'namespace' specified by the '-d' and '-n' arguments are correct. Exiting." + exit 1 +fi + +isValidCluster="" +validateClusterName "${domainUid}" "${domainNamespace}" "${clusterName}" isValidCluster +if [ "${isValidCluster}" != 'true' ]; then + printError "cluster ${clusterName} is not part of domain ${domainUid} in namespace ${domainNamespace}. Please make sure that cluster name is correct." + exit 1 +fi + +# Get server start policy for this server +getClusterPolicy "${domainJson}" "${clusterName}" startPolicy +if [ -z "${startPolicy}" ]; then + getDomainPolicy "${domainJson}" startPolicy +fi + +if [[ "${startPolicy}" == 'NEVER' || "${startPolicy}" == 'ADMIN_ONLY' ]]; then + printInfo "No changes needed, exiting. The cluster '${clusterName}' is already stopped or stopping. The effective value of spec.clusters[?(clusterName="${clusterName}"].serverStartPolicy attribute on the domain resource is 'NEVER' or 'ADMIN_ONLY'." + exit 0 +fi + +# Set policy value to NEVER +printInfo "Patching start policy of cluster '${clusterName}' from '${startPolicy}' to 'NEVER'." +createPatchJsonToUpdateClusterPolicy "${domainJson}" "${clusterName}" "NEVER" patchJson + +executePatchCommand "${kubernetesCli}" "${domainUid}" "${domainNamespace}" "${patchJson}" "${verboseMode}" + +printInfo "Successfully patched cluster '${clusterName}' with 'NEVER' start policy!" diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/stopDomain.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/stopDomain.sh new file mode 100644 index 000000000..d62f6b280 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/stopDomain.sh @@ -0,0 +1,95 @@ +# !/bin/sh +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh + +function usage() { + + cat << EOF + + This script stops a deployed WebLogic domain by patching + 'spec.serverStartPolicy' attribute of domain resource to 'NEVER'. + This change will cause the operator to initiate shutdown of the + domain's WebLogic server instance pods if the pods are running. + + Usage: + + $(basename $0) [-n mynamespace] [-d mydomainuid] [-m kubecli] + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -m : Kubernetes command line interface. Default is 'kubectl' if KUBERNETES_CLI env + variable is not set. Otherwise default is the value of KUBERNETES_CLI env variable. + + -v : Enables verbose mode. Default is 'false'. + + -h : This help. + +EOF +exit $1 +} + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +verboseMode=false + +while getopts "vn:d:m:h" opt; do + case $opt in + n) domainNamespace="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + m) kubernetesCli="${OPTARG}" + ;; + v) verboseMode=true; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +set -eu +set -o pipefail + +function initialize { + + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + failIfValidationErrors +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) + +if [ -z "${domainJson}" ]; then + printError "Domain resource for domain '${domainUid}' not found in namespace '${domainNamespace}'. Exiting." + exit 1 +fi + +getDomainPolicy "${domainJson}" serverStartPolicy + +if [ "${serverStartPolicy}" == 'NEVER' ]; then + printInfo "No changes needed, exiting. The domain '${domainUid}' is already stopped or stopping. The value of 'spec.serverStartPolicy' attribute on the domain resource is 'NEVER'." + exit 0 +fi + +printInfo "Patching domain '${domainUid}' in namespace '${domainNamespace}' from serverStartPolicy='${serverStartPolicy}' to 'NEVER'." + +createPatchJsonToUpdateDomainPolicy "NEVER" patchJson + +executePatchCommand "${kubernetesCli}" "${domainUid}" "${domainNamespace}" "${patchJson}" "${verboseMode}" + +printInfo "Successfully patched domain '${domainUid}' in namespace '${domainNamespace}' with 'NEVER' start policy!" diff --git a/OracleWebCenterContent/kubernetes/domain-lifecycle/stopServer.sh b/OracleWebCenterContent/kubernetes/domain-lifecycle/stopServer.sh new file mode 100644 index 000000000..ec35b4d97 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/domain-lifecycle/stopServer.sh @@ -0,0 +1,248 @@ +# !/bin/sh +# Copyright (c) 2020, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +# This script stops a WebLogic managed server in a domain. +# Internal code notes :- +# - If server start policy is NEVER or policy is IF_NEEDED and the server is not +# selected to start based on the replica count, it means that server is already +# stopped or is in the process of stopping. In this case, script exits without +# making any changes. +# +# - If server is part of a cluster and keep_replica_constant option is false (the default) +# and the effective start policy of the server is IF_NEEDED and decreasing replica count +# will naturally stop the server, the script decreases the replica count. +# +# - If server is part of a cluster and keep_replica_constant option is false (the default) +# and unsetting policy and decreasing the replica count will stop the server, script +# unsets the policy and decreases replica count. For e.g. if replica count is 2 and +# start policy of server2 is ALWAYS, unsetting policy and decreasing replica count will +# stop server2. +# +# - If option to keep replica count constant ('-k') is selected and unsetting start policy +# will naturally stop the server, script will unset the policy. For e.g. if replica count +# is 1 and start policy of server2 is ALWAYS, unsetting policy will stop server2. +# +# - If above conditions are not true, it implies that server policy is IF_NEEDED and server +# is selected to start. In this case, script sets start policy to NEVER. For e.g. replica +# count is 2 and server1 needs to be stopped. The script also decrements the replica count +# by default. If option to keep replica count constant ('-k') is selected, it only sets the +# start policy to NEVER. +# + +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/helper.sh +if [ "${debug}" == "true" ]; then set -x; fi; +set -eu + +function usage() { + + cat << EOF + + This script stops a running WebLogic server in a domain. For managed servers, it either + decreases the value of 'spec.clusters[].replicas' or updates the + 'spec.managedServers[].serverStartPolicy' attribute of the domain + resource or both as necessary to stop the server. For the administration server, it updates + the value of 'spec.adminServer.serverStartPolicy' attribute of the domain resource. The + 'spec.clusters[].replicas' value can be kept constant by using '-k' option. + Please see README.md for more details. + + Usage: + + $(basename $0) -s myserver [-n mynamespace] [-d mydomainuid] [-k] [-m kubecli] [-v] + + -s : The WebLogic server name (not the pod name). + This parameter is required. + + -d : Domain unique-id. Default is 'sample-domain1'. + + -n : Domain namespace. Default is 'sample-domain1-ns'. + + -k : Keep replica count constant for the clustered servers. The default behavior + is to decrement the replica count for the clustered servers. This parameter + is ignored for the administration and non-clustered managed servers. + + -m : Kubernetes command line interface. Default is 'kubectl' if KUBERNETES_CLI env + variable is not set. Otherwise default is the value of KUBERNETES_CLI env variable. + + -v : Enables verbose mode. Default is 'false'. + + -h : This help. + +EOF +exit $1 +} + +kubernetesCli=${KUBERNETES_CLI:-kubectl} +serverName="" +clusterName="" +domainUid="sample-domain1" +domainNamespace="sample-domain1-ns" +keepReplicaConstant=false +verboseMode=false +serverStartPolicy=NEVER +serverStarted="" +effectivePolicy="" +managedServerPolicy="" +stoppedWhenAlwaysPolicyReset="" +replicasEqualsMinReplicas="" +withReplicas="CONSTANT" +withPolicy="CONSTANT" +patchJson="" +isAdminServer=false + +while getopts "vks:m:n:d:h" opt; do + case $opt in + s) serverName="${OPTARG}" + ;; + n) domainNamespace="${OPTARG}" + ;; + m) kubernetesCli="${OPTARG}" + ;; + d) domainUid="${OPTARG}" + ;; + k) keepReplicaConstant=true; + ;; + v) verboseMode=true; + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +# +# Function to perform validations, read files and initialize workspace +# +function initialize { + + validateErrors=false + + validateKubernetesCliAvailable + validateJqAvailable + + # Validate that server name parameter is specified. + if [ -z "${serverName}" ]; then + validationError "Please specify the server name using '-s' parameter e.g. '-s managed-server1'." + fi + + failIfValidationErrors +} + +initialize + +# Get the domain in json format +domainJson=$(${kubernetesCli} get domain ${domainUid} -n ${domainNamespace} -o json --ignore-not-found) +if [ -z "${domainJson}" ]; then + printError "Unable to get domain resource for domain '${domainUid}' in namespace '${domainNamespace}'. Please make sure the 'domain_uid' and 'namespace' specified by the '-d' and '-n' arguments are correct. Exiting." + exit 1 +fi + +# Validate that specified server is either part of a cluster or is an independent managed server +validateServerAndFindCluster "${domainUid}" "${domainNamespace}" "${serverName}" isValidServer clusterName isAdminServer +if [ "${isValidServer}" != 'true' ]; then + printError "Server ${serverName} is not part of any cluster and it's not an independent managed server. Please make sure that server name specified is correct." + exit 1 +fi + +getEffectivePolicy "${domainJson}" "${serverName}" "${clusterName}" effectivePolicy +if [ "${isAdminServer}" == 'true' ]; then + getEffectiveAdminPolicy "${domainJson}" effectivePolicy + if [ "${effectivePolicy}" == "NEVER" ]; then + printInfo "No changes needed, exiting. Server should be already stopping or stopped because effective sever start policy is 'NEVER'." + exit 0 + fi +fi + +if [ -n "${clusterName}" ]; then + # Server is part of a cluster, check currently started servers + checkStartedServers "${domainJson}" "${serverName}" "${clusterName}" "${withReplicas}" "${withPolicy}" serverStarted + if [[ "${effectivePolicy}" == "NEVER" || "${effectivePolicy}" == "ADMIN_ONLY" || "${serverStarted}" != "true" ]]; then + printInfo "No changes needed, exiting. Server should be already stopping or stopped. This is either because of the sever start policy or server is chosen to be stopped based on current replica count." + exit 0 + fi +else + # Server is an independent managed server. + if [ "${effectivePolicy}" == "NEVER" ] || [[ "${effectivePolicy}" == "ADMIN_ONLY" && "${isAdminServer}" != 'true' ]]; then + printInfo "No changes needed, exiting. Server should be already stopping or stopped because effective sever start policy is 'NEVER' or 'ADMIN_ONLY'." + exit 0 + fi +fi + +if [[ -n "${clusterName}" && "${keepReplicaConstant}" == 'false' ]]; then + # check if replica count can decrease below current value + isReplicaCountEqualToMinReplicas "${domainJson}" "${clusterName}" replicasEqualsMinReplicas + if [ "${replicasEqualsMinReplicas}" == 'true' ]; then + printInfo "Not decreasing the replica count value: it is at its minimum. \ + (See 'domain.spec.allowReplicasBelowMinDynClusterSize' and \ + 'domain.status.clusters[].minimumReplicas' for details)." + keepReplicaConstant=true + fi +fi + +# Create server start policy patch with NEVER value +createServerStartPolicyPatch "${domainJson}" "${serverName}" "${serverStartPolicy}" neverStartPolicyPatch +getServerPolicy "${domainJson}" "${serverName}" managedServerPolicy +if [ -n "${managedServerPolicy}" ]; then + effectivePolicy=${managedServerPolicy} +fi +if [[ -n "${clusterName}" && "${effectivePolicy}" == "ALWAYS" ]]; then + # Server is part of a cluster and start policy is ALWAYS. + withReplicas="CONSTANT" + withPolicy="UNSET" + checkStartedServers "${domainJson}" "${serverName}" "${clusterName}" "${withReplicas}" "${withPolicy}" startedWhenAlwaysPolicyReset +fi + +if [[ -n "${clusterName}" && "${keepReplicaConstant}" != 'true' ]]; then + # server is part of a cluster and replica count will decrease + withReplicas="DECREASED" + withPolicy="UNSET" + checkStartedServers "${domainJson}" "${serverName}" "${clusterName}" "${withReplicas}" "${withPolicy}" startedWhenRelicaReducedAndPolicyReset + createReplicaPatch "${domainJson}" "${clusterName}" "DECREMENT" replicaPatch replicaCount + + if [[ -n ${managedServerPolicy} && "${startedWhenRelicaReducedAndPolicyReset}" != "true" ]]; then + # Server shuts down by unsetting start policy and decrementing replica count, unset and decrement + printInfo "Unsetting the current start policy '${managedServerPolicy}' for '${serverName}' \ + and decrementing replica count to ${replicaCount}." + createPatchJsonToUnsetPolicyAndUpdateReplica "${domainJson}" "${serverName}" "${replicaPatch}" patchJson + elif [[ -z ${managedServerPolicy} && "${startedWhenRelicaReducedAndPolicyReset}" != "true" ]]; then + # Start policy is not set, server shuts down by decrementing replica count, decrement replicas + printInfo "Updating replica count for cluster ${clusterName} to ${replicaCount}." + createPatchJsonToUpdateReplica "${replicaPatch}" patchJson + elif [[ ${managedServerPolicy} == "ALWAYS" && "${startedWhenAlwaysPolicyReset}" != "true" ]]; then + # Server shuts down by unsetting the start policy, unset and decrement replicas + printInfo "Unsetting the current start policy '${managedServerPolicy}' for '${serverName}' \ + and decrementing replica count to ${replicaCount}." + createPatchJsonToUnsetPolicyAndUpdateReplica "${domainJson}" "${serverName}" "${replicaPatch}" patchJson + else + # Patch server start policy to NEVER and decrement replica count + printInfo "Patching start policy of server '${serverName}' from '${effectivePolicy}' to 'NEVER' \ + and decrementing replica count for cluster '${clusterName}' to ${replicaCount}." + createPatchJsonToUpdateReplicaAndPolicy "${replicaPatch}" "${neverStartPolicyPatch}" patchJson + fi +elif [[ -n ${clusterName} && "${keepReplicaConstant}" == 'true' ]]; then + # Server is part of a cluster and replica count needs to stay constant + if [[ ${managedServerPolicy} == "ALWAYS" && "${startedWhenAlwaysPolicyReset}" != "true" ]]; then + # Server start policy is AlWAYS and server shuts down by unsetting the policy, unset policy + printInfo "Unsetting the current start policy '${effectivePolicy}' for '${serverName}'." + createPatchJsonToUnsetPolicy "${domainJson}" "${serverName}" patchJson + else + # Patch server start policy to NEVER + printInfo "Patching start policy of '${serverName}' from '${effectivePolicy}' to 'NEVER'." + createPatchJsonToUpdatePolicy "${neverStartPolicyPatch}" patchJson + fi +elif [ "${isAdminServer}" == 'true' ]; then + printInfo "Patching start policy of '${serverName}' from '${effectivePolicy}' to 'NEVER'." + createPatchJsonToUpdateAdminPolicy "${domainJson}" "${serverStartPolicy}" patchJson +else + # Server is an independent managed server, patch server start policy to NEVER + printInfo "Patching start policy of '${serverName}' from '${effectivePolicy}' to 'NEVER'." + createPatchJsonToUpdatePolicy "${neverStartPolicyPatch}" patchJson +fi + +executePatchCommand "${kubernetesCli}" "${domainUid}" "${domainNamespace}" "${patchJson}" "${verboseMode}" + +printInfo "Patch command succeeded !" diff --git a/OracleWebCenterContent/kubernetes/elasticsearch-and-kibana/README.md b/OracleWebCenterContent/kubernetes/elasticsearch-and-kibana/README.md new file mode 100644 index 000000000..a5b96bb44 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/elasticsearch-and-kibana/README.md @@ -0,0 +1,32 @@ +# Sample to deploy Elasticsearch and Kibana + + +When you install the WebLogic operator Helm chart, you can set +`elkIntegrationEnabled` to `true` in your `values.yaml` file to tell the operator to send the contents of the operator's logs to Elasticsearch. + +Typically, you would have already configured Elasticsearch and Kibana in the +Kubernetes cluster, and also would have specified `elasticSearchHost` and `elasticSearchPort` in your `values.yaml` file to point to where Elasticsearch is already running. + +This sample configures the Elasticsearch and Kibana deployments and services. +It's useful for trying out the operator in a Kubernetes cluster that doesn't already +have them configured. + +It runs the Elastic Stack on the same host and port that the operator's Helm chart defaults +to, therefore, you only need to set `elkIntegrationEnabled` to `true` in your +`values.yaml` file. + +To control Elasticsearch memory parameters (Heap allocation and Enabling/Disabling swapping) please open the file `elasticsearch_and_kibana.yaml`, search for env variables of the elasticsearch container and change the values of the following. + +* ES_JAVA_OPTS: value may contain for example -Xms512m -Xmx512m to lower the default memory usage (please be aware that this value is only applicable for demo purpose and it is not the one recommended by Elasticsearch itself) +* bootstrap.memory_lock: value may contain true (enables the usage of mlockall to try to lock the process address space into RAM, preventing any Elasticsearch memory from being swapped out) or false (disables the usage of mlockall to try to lock the process address space into RAM, preventing any Elasticsearch memory from being swapped out). + +To install Elasticsearch and Kibana, use: +```shell +$ kubectl apply -f kubernetes/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml +``` + +To remove them, use: +```shell +$ kubectl delete -f kubernetes/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml +``` + diff --git a/OracleWebCenterContent/kubernetes/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml b/OracleWebCenterContent/kubernetes/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml new file mode 100644 index 000000000..3ce098cdb --- /dev/null +++ b/OracleWebCenterContent/kubernetes/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml @@ -0,0 +1,119 @@ +# Copyright (c) 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +# When a user installs the WebLogic operator Helm chart, the user can set +# elkIntegrationEnabled to true in their values.yaml to tell the operator to send the +# contents of the operator's log to Elasticsearch. +# +# Typically, a user would have already configured Elasticsearch and Kibana in the +# Kubernetes cluster, and also would specify elasticSearchHost and elasticSearchPort +# in their values.yaml file to point to where Elasticsearch is already running. +# +# This sample configures the Elasticsearch and Kibana deployments and services. +# It's useful for trying out the operator in a Kubernetes cluster that doesn't already +# have them configured. +# +# It runs Elasticstack on the same host and port that the operator's Helm chart defaults +# to, therefore, the customer only needs to set elkIntegrationEnabled to true in their +# values.yaml file. +# +# To configure them, use: +# kubectl apply -f kubernetes/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml +# +# To remove them, use: +# kubectl delete -f kubernetes/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + namespace: "wccns" + name: "elasticsearch" + labels: + app: "elasticsearch" +spec: + replicas: 1 + selector: + matchLabels: + app: "elasticsearch" + template: + metadata: + labels: + app: "elasticsearch" + spec: + initContainers: + - name: set-vm-max-map-count + image: busybox + imagePullPolicy: IfNotPresent + command: ['sysctl', '-w', 'vm.max_map_count=262144'] + securityContext: + privileged: true + containers: + - name: "elasticsearch" + image: "elasticsearch:6.8.0" + ports: + - containerPort: 9200 + - containerPort: 9300 + env: + - name: ES_JAVA_OPTS + value: -Xms1024m -Xmx1024m + +--- +kind: "Service" +apiVersion: "v1" +metadata: + namespace: "wccns" + name: "elasticsearch" +spec: + ports: + - name: "http" + protocol: "TCP" + port: 9200 + targetPort: 9200 + - name: "https" + protocol: "TCP" + port: 9300 + targetPort: 9300 + selector: + app: "elasticsearch" + +--- +apiVersion: "apps/v1" +kind: "Deployment" +metadata: + namespace: "wccns" + name: "kibana" + labels: + app: "kibana" +spec: + replicas: 1 + selector: + matchLabels: + app: "kibana" + template: + metadata: + labels: + app: "kibana" + spec: + containers: + - name: "kibana" + image: "kibana:6.8.0" + ports: + - containerPort: 5601 + +--- +apiVersion: "v1" +kind: "Service" +metadata: + namespace: "wccns" + name: "kibana" + labels: + app: "kibana" +spec: + type: "NodePort" + ports: + - port: 5601 + selector: + app: "kibana" + diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/templates/nginx-ingress.yaml b/OracleWebCenterContent/kubernetes/ingress-per-domain/templates/nginx-ingress.yaml deleted file mode 100755 index 162a7728e..000000000 --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/templates/nginx-ingress.yaml +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (c) 2021, 2022, Oracle and/or its affiliates. -# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. - -{{- if eq .Values.type "NGINX" }} ---- -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ .Values.wlsDomain.domainUID }}-nginx - namespace: {{ .Release.Namespace }} - - annotations: - kubernetes.io/ingress.class: nginx - nginx.ingress.kubernetes.io/affinity: "cookie" - nginx.ingress.kubernetes.io/affinity-mode: persistent -{{- if eq .Values.tls "SSL" }} - nginx.ingress.kubernetes.io/configuration-snippet: | - more_set_input_headers "X-Forwarded-Proto: https"; - more_set_input_headers "WL-Proxy-SSL: true"; - nginx.ingress.kubernetes.io/ingress.allow-http: "false" -{{- end }} -spec: - rules: - - host: '{{ .Values.nginx.hostname }}' - http: - paths: - - path: /console - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.adminServerPort }} - - path: /em - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.adminServerPort }} - - path: /wls-exporter - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.adminServerPort }} - - path: /cs - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /adfAuthentication - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /_ocsh - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /_dav - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /idcws - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /idcnativews - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /wsm-pm - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /ibr - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ibrClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ibrManagedServerPort }} - - path: /ibr/adfAuthentication - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ibrClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ibrManagedServerPort }} - - path: /weblogic/ready - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /imaging - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ipmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ipmManagedServerPort }} - - path: /dc-console - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.captureClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.captureManagedServerPort }} - - path: /dc-client - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.captureClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.captureManagedServerPort }} - - path: /wcc - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.wccadfClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.wccadfManagedServerPort }} - -{{- if eq .Values.tls "SSL" }} - tls: - - hosts: - - '{{ .Values.nginx.hostname }}' - secretName: domain1-tls-cert -{{- end }} - -{{- end }} - diff --git a/OracleWebCenterContent/kubernetes/ingress-per-domain/templates/traefik-ingress.yaml b/OracleWebCenterContent/kubernetes/ingress-per-domain/templates/traefik-ingress.yaml deleted file mode 100755 index 076974cd6..000000000 --- a/OracleWebCenterContent/kubernetes/ingress-per-domain/templates/traefik-ingress.yaml +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright (c) 2021, 2022, Oracle and/or its affiliates. -# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. - -{{- if eq .Values.type "TRAEFIK" }} ---- -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ .Values.wlsDomain.domainUID }}-traefik - namespace: {{ .Release.Namespace }} - labels: - weblogic.resourceVersion: domain-v2 - annotations: - kubernetes.io/ingress.class: traefik -{{- if eq .Values.tls "SSL" }} - traefik.ingress.kubernetes.io/router.entrypoints: websecure - traefik.ingress.kubernetes.io/router.tls: "true" - traefik.ingress.kubernetes.io/router.middlewares: wccns-wls-proxy-ssl@kubernetescrd -{{- end }} -spec: - rules: - - host: '{{ .Values.traefik.hostname }}' - http: - paths: - - path: /console - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.adminServerPort }} - - path: /em - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.adminServerPort }} - - path: /wls-exporter - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-{{ .Values.wlsDomain.adminServerName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.adminServerPort }} - - path: /cs - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /adfAuthentication - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /_ocsh - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /_dav - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /idcws - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /idcnativews - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /wsm-pm - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /ibr - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ibrClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ibrManagedServerPort }} - - path: /ibr/adfAuthentication - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ibrClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ibrManagedServerPort }} - - path: /weblogic/ready - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ucmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ucmManagedServerPort }} - - path: /imaging - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.ipmClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.ipmManagedServerPort }} - - path: /dc-console - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.captureClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.captureManagedServerPort }} - - path: /dc-client - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.captureClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.captureManagedServerPort }} - - path: /wcc - backend: - serviceName: '{{ .Values.wlsDomain.domainUID }}-cluster-{{ .Values.wlsDomain.wccadfClusterName | lower | replace "_" "-" }}' - servicePort: {{ .Values.wlsDomain.wccadfManagedServerPort }} - -{{- if eq .Values.tls "SSL" }} - tls: - - hosts: - - '{{ .Values.traefik.hostname }}' - secretName: domain1-tls-cert -{{- end }} - -{{- end }} - diff --git a/OracleWebCenterContent/kubernetes/logging-services/logstash/README.md b/OracleWebCenterContent/kubernetes/logging-services/logstash/README.md new file mode 100644 index 000000000..2b15b5320 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/logging-services/logstash/README.md @@ -0,0 +1,59 @@ +## Publish OracleWebCenterContent server and diagnostics logs into Elasticsearch + +## Prerequisites +See [here](https://oracle.github.io/weblogic-kubernetes-operator/samples/simple/elastic-stack/) for the steps to integrate Elasticsearch for the WebLogic Kubernetes operator. + +Before deploying the WebLogic Kubernetes operator edit `values.yaml` in weblogic-kubernetes-operator/kubernetes/charts/weblogic-operator/ to enable elastic search integration. +Configure the following variables: +```bash +# elkIntegrationEnabled specifies whether or not ELK integration is enabled. +elkIntegrationEnabled: true +# logStashImage specifies the docker image containing logstash. +# This parameter is ignored if 'elkIntegrationEnabled' is false. +logStashImage: "logstash:6.6.0" + +# elasticSearchHost specifies the hostname of where Elasticsearch is running. +# This parameter is ignored if 'elkIntegrationEnabled' is false. +elasticSearchHost: "elasticsearch.default.svc.cluster.local" + +# elasticSearchPort specifies the port number of where Elasticsearch is running. +# This parameter is ignored if 'elkIntegrationEnabled' is false. +elasticSearchPort: 9200 +``` +Deployment of WebLogic Kubernetes operator with above changes, will create an additional logstash container as sidecar. This logstash container will push the operator logs to the configured Elasticsearch server. + +### WebLogic Server logs + +The WebLogic server logs or diagnostics logs can be pushed to Elasticsearch server using logstash pod. The logstash pod should have access to the shared domain home or the log location. The persistent volume of the domain home can be used in the logstash pod. + +### Create the logstash pod + +1. Get Domain home persistence volume claim details +Get the persistent volume details of the domain home of the WebLogic server(s). + + ```bash + $ kubectl get pvc -n wccns + ``` + +1. Create logstash configuration. +Create logstash configuration file. The logstash configuration file can be loaded from a volume. + ```bash + $ kubectl cp logstash.conf wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains --namespace wccns + ``` + + You can use sample logstash configuration file generated to push server and diagnostic logs of all servers available at DOMAIN_HOME/servers//logs/-diagnostic.log + +1. Copy the logstash.conf into say /u01/oracle/user_projects/domains so that it can be used for logstash deployment, using Administration Server pod + +1. Create deployment YAML for logstash pod. +You can use sample logstash.yaml file generated to create deployment for logstash pod. The mounted persistent volume of the domain home will provide access to the WebLogic server logs to logstash pod. +Make sure to point the logstash configuration file to correct location and also correct domain home persistence volume claim. + +1. Deploy logstash to start publish logs to Elasticsearch: + + ```bash + $ kubectl create -f logstash.yaml + ``` + +1. Now, you can view the diagnostics logs using Kibana with index pattern `logstash-*`. + diff --git a/OracleWebCenterContent/kubernetes/logging-services/logstash/logstash.conf b/OracleWebCenterContent/kubernetes/logging-services/logstash/logstash.conf new file mode 100644 index 000000000..026fd1e91 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/logging-services/logstash/logstash.conf @@ -0,0 +1,25 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +input { + file { + path => "/u01/oracle/user_projects/domains/wccinfra/servers/**/logs/*-diagnostic.log" + start_position => beginning + } + file { + path => "/u01/oracle/user_projects/domains/logs/wccinfra/*.log" + start_position => beginning + } +} + +filter { + grok { + match => [ "message", "<%{DATA:log_timestamp}> <%{WORD:log_level}> <%{WORD:thread}> <%{HOSTNAME:hostname}> <%{HOSTNAME:servername}> <%{DATA:timer}> <<%{DATA:kernel}>> <> <%{DATA:uuid}> <%{NUMBER:timestamp}> <%{DATA:misc}> <%{DATA:log_number}> <%{DATA:log_message}>" ] + } +} +output { + elasticsearch { + hosts => ["elasticsearch.default.svc.cluster.local:9200"] + } +} diff --git a/OracleWebCenterContent/kubernetes/logging-services/logstash/logstash.yaml b/OracleWebCenterContent/kubernetes/logging-services/logstash/logstash.yaml new file mode 100644 index 000000000..d2883f14c --- /dev/null +++ b/OracleWebCenterContent/kubernetes/logging-services/logstash/logstash.yaml @@ -0,0 +1,39 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: logstash + namespace: wccns +spec: + selector: + matchLabels: + app: logstash + template: # create pods using pod definition in this template + metadata: + labels: + app: logstash + spec: + volumes: + - name: domain-storage-volume + persistentVolumeClaim: + claimName: domain-pvc + - name: shared-logs + emptyDir: {} + containers: + - name: logstash + image: logstash:6.6.0 + command: ["/bin/sh"] + args: ["/usr/share/logstash/bin/logstash", "-f", "/u01/oracle/user_projects/domains/logstash.conf"] + imagePullPolicy: IfNotPresent + volumeMounts: + - mountPath: /u01/oracle/user_projects + name: domain-storage-volume + - name: shared-logs + mountPath: /shared-logs + ports: + - containerPort: 5044 + name: logstash + diff --git a/OracleWebCenterContent/kubernetes/logging-services/weblogic-logging-exporter/README.md b/OracleWebCenterContent/kubernetes/logging-services/weblogic-logging-exporter/README.md new file mode 100644 index 000000000..f5cc06fb8 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/logging-services/weblogic-logging-exporter/README.md @@ -0,0 +1,131 @@ +## Publish WebLogic Server logs into Elasticsearch + +The WebLogic Logging Exporter adds a log event handler to WebLogic Server, such that WebLogic Server logs can be integrated into Elastic Stack in Kubernetes directly, by using the Elasticsearch REST API. + +## Prerequisite + +This document assumes that you have already deployed Elasticsearch/Kibana environment. If you have not, please use a sample/demo deployment of Elasticsearch/Kibana from WebLogic Kubernetes operator. + +To deploy Elasticsearch and Kibana on the Kubernetes cluster: +```bash +$ kubectl create -f https://raw.githubusercontent.com/oracle/weblogic-kubernetes-operator/master/kubernetes/samples/scripts/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml +``` + +Follow these steps to setup WebLogic Logging Exporter in a WebLogic operator environment and push the WebLogic server logs to Elasticsearch/Kibana + +1. Download WebLogic logging exporter binaries + + The WebLogic logging exporter pre-built binaries are available in the github releases page: [Release 1.0.1](https://github.com/oracle/weblogic-logging-exporter/releases) + + ```bash + $ wget https://github.com/oracle/weblogic-logging-exporter/releases/download/v1.0.1/weblogic-logging-exporter.jar + ``` + + Download weblogic-logging-exporter.jar from the github release link above. Also download dependency jar - snakeyaml-1.27.jar from Maven Central. + + ```bash + $ wget -O snakeyaml-1.27.jar https://search.maven.org/remotecontent?filepath=org/yaml/snakeyaml/1.27/snakeyaml-1.27.jar + ``` +1. Copy JAR files into the Kubernetes WebLogic Administration Server Pod + + Copy weblogic-logging-exporter.jar and snakeyaml-1.27.jar to the domain home folder in the Administration server pod. + + ```bash + $ kubectl cp weblogic-logging-exporter.jar wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/ + $ kubectl cp snakeyaml-1.27.jar wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/ + ``` + +1. Add a startup class to the domain configuration + + In this step, we configure weblogic-logging-exporter JAR as a startup class in the WebLogic servers where we intend to collect the logs. + + a) In the Administration Console, navigate to `Environment` then `Startup and Shutdown classes` in the main menu. + + b) Add a new Startup class. You may choose any descriptive name and the class name must be `weblogic.logging.exporter.Startup`. + + c) Target the startup class to each server that you want to export logs from. + + You can verify this by checking for the update in your config.xml which should be similar to this example: + + ```bash + + LoggingExporterStartupClass + adminserver + weblogic.logging.exporter.Startup + + ``` + +1. Update WebLogic Server CLASS Path. + + In this step, we set the class path for weblogic-logging-exporter and its dependencies. + + a) Copy setDomainEnv.sh from the pod to local folder. + ```bash + $ kubectl cp wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/bin/setDomainEnv.sh setDomainEnv.sh + ``` + b) Modify setDomainEnv.sh to update the Server Class path. + ```bash + CLASSPATH=/u01/oracle/user_projects/domains/wccinfra/weblogic-logging-exporter.jar:/u01/oracle/user_projects/domains/wccinfra/snakeyaml-1.27.jar:${CLASSPATH} + export CLASSPATH + ``` + + c) Copy back the modified setDomainEnv.sh to the pod. + ```bash + $ kubectl cp setDomainEnv.sh wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/bin/setDomainEnv.sh + ``` + +1. Create configuration file for the WebLogic Logging Exporter. +Copy WebLogicLoggingExporter.yaml to the domain folder in the WebLogic server pod. YAML specifies the elasticsearch server host and port number. + ```bash + $ kubectl cp WebLogicLoggingExporter.yaml wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/config/ + ``` + +1. Restart WebLogic Servers + + Now we can restart the WebLogic servers for the weblogic-logging-exporter to get loaded in the servers. + + To restart the servers, use stopDomain.sh and startDomain.sh scripts from https://github.com/oracle/weblogic-kubernetes-operator/tree/master/kubernetes/samples/scripts/domain-lifecycle + + The stopDomain.sh script shuts down a domain by patching the `spec.serverStartPolicy` attribute of the domain resource to `NEVER`. The operator will shut down the WebLogic Server instance Pods that are part of the domain after the `spec.serverStartPolicy` attribute is updated to `NEVER`. See the script usage information by using the -h option. + + ```bash + $ stopDomain.sh -d wccinfra -n wccns + ``` + Sample output: + ```bash + [INFO] Patching domain 'wccinfra' in namespace 'wccns' from serverStartPolicy='IF_NEEDED' to 'NEVER'. + domain.weblogic.oracle/wccinfra patched + [INFO] Successfully patched domain 'wccinfra' in namespace 'wccns' with 'NEVER' start policy! + ``` + + Verify servers by checking the pod status. + ```bash + $ kubectl get pods -n wccns + ``` + + After all the servers are shutdown, run startDomain.sh script to start again. + + The startDomain.sh script starts a deployed domain by patching the `spec.serverStartPolicy` attribute of the domain resource to `IF_NEEDED`. The operator will start the WebLogic Server instance Pods that are part of the domain after the `spec.serverStartPolicy` attribute of the domain resource is updated to `IF_NEEDED`. See the script usage information by using the -h option. + + ```bash + $ startDomain.sh -d wccinfra -n wccns + ``` + Sample output: + ```bash + [INFO] Patching domain 'wccinfra' from serverStartPolicy='NEVER' to 'IF_NEEDED'. + domain.weblogic.oracle/wccinfra patched + [INFO] Successfully patched domain 'wccinfra' in namespace 'wccns' with 'IF_NEEDED' start policy! + ``` + + Verify servers by checking the pod status. Pod status will be RUNNING. + ```bash + $ kubectl get pods -n wccns + ``` + In the server logs, you will be able to see the weblogic-logging-exporter class being called. + +1. Create an index pattern in Kibana + + We need to create an index pattern in Kibana for the logs to be available in the dashboard. + + Create an index pattern `wls*` in `Kibana` > `Management`. After the server starts, you will be able to see the log data from the WebLogic servers in the Kibana dashboard, + diff --git a/OracleWebCenterContent/kubernetes/logging-services/weblogic-logging-exporter/WebLogicLoggingExporter.yaml b/OracleWebCenterContent/kubernetes/logging-services/weblogic-logging-exporter/WebLogicLoggingExporter.yaml new file mode 100644 index 000000000..a22e5a603 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/logging-services/weblogic-logging-exporter/WebLogicLoggingExporter.yaml @@ -0,0 +1,13 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +weblogicLoggingIndexName: wls +publishHost: elasticsearch.default.svc.cluster.local +publishPort: 9200 +domainUID: wccinfra +weblogicLoggingExporterEnabled: true +weblogicLoggingExporterSeverity: Notice +weblogicLoggingExporterBulkSize: 1 + + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/README.md b/OracleWebCenterContent/kubernetes/monitoring-service/README.md new file mode 100644 index 000000000..eb17263f0 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/README.md @@ -0,0 +1,307 @@ +# Monitor the OracleWebCenterContent instance using Prometheus and Grafana +Using the `WebLogic Monitoring Exporter` you can scrape runtime information from a running OracleWebCenterContent instance and monitor them using Prometheus and Grafana. + +## Prerequisites + +- Have Docker and a Kubernetes cluster running and have `kubectl` installed and configured. +- Have Helm installed. +- An OracleWebCenterContent domain deployed by `weblogic-operator` is running in the Kubernetes cluster. + +## Set up monitoring for OracleWebCenterContent domain + +Set up the WebLogic Monitoring Exporter that will collect WebLogic Server metrics and monitor OracleWebCenterContent domain. + +**Note**: Either of the following methods can be used to set up monitoring for OracleWebCenterContent domain. Using `setup-monitoring.sh` does the set up in an automated way. + +1. [Set up manually](#set-up-manually) +1. [Set up using `setup-monitoring.sh`](#set-up-using-setup-monitoringsh) + +## Set up manually + +### Deploy Prometheus and Grafana + +Refer to the compatibility matrix of [Kube Prometheus](https://github.com/coreos/kube-prometheus#kubernetes-compatibility-matrix) and clone the [release](https://github.com/coreos/kube-prometheus/releases) version of the `kube-prometheus` repository according to the Kubernetes version of your cluster. + +1. Clone the `kube-prometheus` repository: + ``` + $ git clone https://github.com/coreos/kube-prometheus.git + ``` + +1. Change to folder `kube-prometheus` and enter the following commands to create the namespace and CRDs, and then wait for their availability before creating the remaining resources: + + ``` + $ cd kube-prometheus + $ kubectl create -f manifests/setup + $ until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done + $ kubectl create -f manifests/ + ``` + +1. `kube-prometheus` requires all nodes in the Kubernetes cluster to be labeled with `kubernetes.io/os=linux`. If any node is not labeled with this, then you need to label it using the following command: + + ``` + $ kubectl label nodes --all kubernetes.io/os=linux + ``` + +1. Enter the following commands to provide external access for Grafana, Prometheus, and Alertmanager: + + ``` + $ kubectl patch svc grafana -n monitoring --type=json -p '[{"op": "replace", "path": "/spec/type", "value": "NodePort" },{"op": "replace", "path": "/spec/ports/0/nodePort", "value": 32100 }]' + + $ kubectl patch svc prometheus-k8s -n monitoring --type=json -p '[{"op": "replace", "path": "/spec/type", "value": "NodePort" },{"op": "replace", "path": "/spec/ports/0/nodePort", "value": 32101 }]' + + $ kubectl patch svc alertmanager-main -n monitoring --type=json -p '[{"op": "replace", "path": "/spec/type", "value": "NodePort" },{"op": "replace", "path": "/spec/ports/0/nodePort", "value": 32102 }]' + ``` + + Note: + * `32100` is the external port for Grafana + * `32101` is the external port for Prometheus + * `32102` is the external port for Alertmanager + +### Generate the WebLogic Monitoring Exporter Deployment Package + +The `wls-exporter.war` package need to be updated and created for each listening ports (Administration Server and Managed Servers) in the domain. +Set the below environment values based on your environment and run the script `get-wls-exporter.sh` to generate the required WAR files at `${WORKDIR}/monitoring-service/scripts/wls-exporter-deploy`: +- adminServerPort +- wlsMonitoringExporterToibrCluster +- ibrManagedServerPort +- wlsMonitoringExporterToucmCluster +- ucmManagedServerPort +- wlsMonitoringExporterToipmCluster +- ipmManagedServerPort +- wlsMonitoringExporterTocaptureCluster +- captureManagedServerPort +- wlsMonitoringExporterTowccadfCluster +- wccadfManagedServerPort + +For example: + +``` +$ cd ${WORKDIR}/monitoring-service/scripts +$ export adminServerPort=7001 +$ export wlsMonitoringExporterToibrCluster=true +$ export ibrManagedServerPort=16250 +$ export wlsMonitoringExporterToucmCluster=true +$ export ucmManagedServerPort=16200 +$ export wlsMonitoringExporterToipmCluster=true +$ export ipmManagedServerPort=16000 +$ export wlsMonitoringExporterTocaptureCluster=true +$ export captureManagedServerPort=16400 +$ export wlsMonitoringExporterTowccadfCluster=true +$ export wccadfManagedServerPort=16225 +$ sh get-wls-exporter.sh +``` + +Verify whether the required WAR files are generated at `${WORKDIR}/monitoring-service/scripts/wls-exporter-deploy`. + +``` +$ ls ${WORKDIR}/monitoring-service/scripts/wls-exporter-deploy +``` + +### Deploy the WebLogic Monitoring Exporter into the OracleWebCenterContent domain + +Follow these steps to copy and deploy the WebLogic Monitoring Exporter WAR files into the OracleWebCenterContent Domain. + +**Note**: Replace the `` with appropriate values based on your environment: + +``` +$ cd ${WORKDIR}/monitoring-service/scripts +$ kubectl cp wls-exporter-deploy /:/u01/oracle +$ kubectl cp deploy-weblogic-monitoring-exporter.py /:/u01/oracle/wls-exporter-deploy +$ kubectl exec -it -n -- /u01/oracle/oracle_common/common/bin/wlst.sh /u01/oracle/wls-exporter-deploy/deploy-weblogic-monitoring-exporter.py \ +-domainName -adminServerName -adminURL \ +-ibrClusterName -wlsMonitoringExporterToibrCluster \ +-ucmClusterName -wlsMonitoringExporterToucmCluster \ +-ipmClusterName -wlsMonitoringExporterToipmCluster \ +-captureClusterName -wlsMonitoringExporterTocaptureCluster \ +-wccadfClusterName -wlsMonitoringExporterTowccadfCluster \ +-username -password +``` + +For example: + +``` +$ cd ${WORKDIR}/monitoring-service/scripts +$ kubectl cp wls-exporter-deploy wccns/wccinfra-adminserver:/u01/oracle +$ kubectl cp deploy-weblogic-monitoring-exporter.py wccns/wccinfra-adminserver:/u01/oracle/wls-exporter-deploy +$ kubectl exec -it -n wccns wccinfra-adminserver -- /u01/oracle/oracle_common/common/bin/wlst.sh /u01/oracle/wls-exporter-deploy/deploy-weblogic-monitoring-exporter.py \ +-domainName wccinfra -adminServerName adminserver -adminURL wccinfra-adminserver:7001 \ +-ibrClusterName ibr_cluster -wlsMonitoringExporterToibrCluster true \ +-ucmClusterName ucm_cluster -wlsMonitoringExporterToucmCluster true \ +-ipmClusterName ipm_cluster -wlsMonitoringExporterToipmCluster true \ +-captureClusterName capture_cluster -wlsMonitoringExporterTocaptureCluster true \ +-wccadfClusterName wccadf_cluster -wlsMonitoringExporterTowccadfCluster true \ +-username weblogic -password Welcome1 +``` + +### Configure Prometheus Operator + +Prometheus enables you to collect metrics from the WebLogic Monitoring Exporter. The Prometheus Operator identifies the targets using service discovery. To get the WebLogic Monitoring Exporter end point discovered as a target, you must create a service monitor pointing to the service. + +The service monitor deployment YAML configuration file is available at `${WORKDIR}/monitoring-service/manifests/wls-exporter-ServiceMonitor.yaml.template`. Copy the file as `wls-exporter-ServiceMonitor.yaml` to update with appropriate values as detailed below. + +The exporting of metrics from `wls-exporter` requires `basicAuth`, so a Kubernetes `Secret` is created with the user name and password that are base64 encoded. This `Secret` is used in the `ServiceMonitor` deployment. The `wls-exporter-ServiceMonitor.yaml` has namespace as `wccns` and has `basicAuth` with credentials as `username: %USERNAME%` and `password: %PASSWORD%`. Update `%USERNAME%` and `%PASSWORD% ` in base64 encoded and all occurences of `wccns` based on your environment. + +Use the following example for base64 encoded: + +``` +$ echo -n "Welcome1" | base64 +V2VsY29tZTE= +``` + +You need to add `RoleBinding` and `Role` for the namespace (wccns) under which the WebLogic Servers pods are running in the Kubernetes cluster. These are required for Prometheus to access the endpoints provided by the WebLogic Monitoring Exporters. The YAML configuration files for wccns namespace are provided in "${WORKDIR}/monitoring-service/manifests/". + +If you are using namespace other than `wccns`, update the namespace details in `prometheus-roleBinding-domain-namespace.yaml` and `prometheus-roleSpecific-domain-namespace.yaml`. + +Perform the below steps for enabling Prometheus to collect the metrics from the WebLogic Monitoring Exporter: + +``` +$ cd ${WORKDIR}/monitoring-service/manifests +$ kubectl apply -f . +``` + +### Verify the service discovery of WebLogic Monitoring Exporter + +After the deployment of the service monitor, Prometheus should be able to discover wls-exporter and collect the metrics. + +1. Access the Prometheus dashboard at `http://mycompany.com:32101/` + +1. Navigate to **Status** to see the **Service Discovery** details. + +1. Verify that `wls-exporter` is listed in the discovered Services. + + +### Deploy Grafana Dashboard + +You can access the Grafana dashboard at `http://mycompany.com:32100/`. + +1. Log in to Grafana dashboard with username: admin and password: admin`. + +1. Navigate to + (Create) -> Import -> Upload the `weblogic-server-dashboard-import.json` file (provided at `${WORKDIR}/monitoring-service/config/weblogic-server-dashboard-import.json`). + + +## Set up using `setup-monitoring.sh` + +Alternatively, you can run the helper script `setup-monitoring.sh` available at `${WORKDIR}/monitoring-service` to setup the monitoring for OracleWebCenterContent domain. + +This script creates kube-prometheus-stack(Prometheus, Grafana and Alertmanager), WebLogic Monitoring Exporter and imports `weblogic-server-dashboard.json` into Grafana for WebLogic Server Dashboard. + +### Prepare to use the setup monitoring script + +The sample scripts for setup monitoring for OracleWebCenterContent domain are available at `${WORKDIR}/monitoring-service`. + +You must edit `monitoring-inputs.yaml`(or a copy of it) to provide the details of your domain. Refer to the configuration parameters below to understand the information that you must provide in this file. + +#### Configuration parameters + +The following parameters can be provided in the inputs file. + +| Parameter | Description | Default | +| --- | --- | --- | +| `domainUID` | domainUID of the OracleWebCenterContent domain. | `wccinfra` | +| `domainNamespace` | Kubernetes namespace of the OracleWebCenterContent domain. | `wccns` | +| `setupKubePrometheusStack` | Boolean value indicating whether kube-prometheus-stack (Prometheus, Grafana and Alertmanager) to be installed | `true` | +| `additionalParamForKubePrometheusStack` | The script install's kube-prometheus-stack with `service.type` as NodePort and values for `service.nodePort` as per the parameters defined in `monitoring-inputs.yaml`. Use `additionalParamForKubePrometheusStack` parameter to further configure with additional parameters as per [values.yaml](https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/values.yaml). Sample value to disable NodeExporter, Prometheus-Operator TLS support and Admission webhook support for PrometheusRules resources is `--set nodeExporter.enabled=false --set prometheusOperator.tls.enabled=false --set prometheusOperator.admissionWebhooks.enabled=false`| | +| `monitoringNamespace` | Kubernetes namespace for monitoring setup. | `monitoring` | +| `adminServerName` | Name of the Administration Server. | `adminserver` | +| `adminServerPort` | Port number for the Administration Server inside the Kubernetes cluster. | `7001` | +| `ibrClusterName` | Name of the ibrCluster. | `ibr_cluster` | +| `ibrManagedServerPort` | Port number of the managed servers in the ibrCluster. | `16250` | +| `wlsMonitoringExporterToibrCluster` | Boolean value indicating whether to deploy WebLogic Monitoring Exporter to ibrCluster. | `false` | +| `ucmClusterName` | Name of the ucmCluster. | `ucm_cluster` | +| `ucmManagedServerPort` | Port number of the managed servers in the ucmCluster. | `16200` | +| `wlsMonitoringExporterToucmCluster` | Boolean value indicating whether to deploy WebLogic Monitoring Exporter to ucmCluster. | `false` | +| `ipmClusterName` | Name of the ipmCluster. | `ipm_cluster` | +| `ipmManagedServerPort` | Port number of the managed servers in the ipmCluster. | `16000` | +| `wlsMonitoringExporterToipmCluster` | Boolean value indicating whether to deploy WebLogic Monitoring Exporter to ipmCluster. | `false` | +| `captureClusterName` | Name of the captureCluster. | `capture_cluster` | +| `captureManagedServerPort` | Port number of the managed servers in the captureCluster. | `16400` | +| `wlsMonitoringExporterTocaptureCluster` | Boolean value indicating whether to deploy WebLogic Monitoring Exporter to captureCluster. | `false` | +| `wccadfClusterName` | Name of the wccadfCluster. | `wccadf_cluster` | +| `wccadfManagedServerPort` | Port number of the managed servers in the wccadfCluster. | `16225` | +| `wlsMonitoringExporterTowccadfCluster` | Boolean value indicating whether to deploy WebLogic Monitoring Exporter to wccadfCluster. | `false` | +| `exposeMonitoringNodePort` | Boolean value indicating if the Monitoring Services (Prometheus, Grafana and Alertmanager) is exposed outside of the Kubernetes cluster. | `false` | +| `prometheusNodePort` | Port number of the Prometheus outside the Kubernetes cluster. | `32101` | +| `grafanaNodePort` | Port number of the Grafana outside the Kubernetes cluster. | `32100` | +| `alertmanagerNodePort` | Port number of the Alertmanager outside the Kubernetes cluster. | `32102` | +| `weblogicCredentialsSecretName` | Name of the Kubernetes secret which has Administration Server's user name and password. | `wccinfra-domain-credentials` | + +Note that the values specified in the `monitoring-inputs.yaml` file will be used to install kube-prometheus-stack (Prometheus, Grafana and Alertmanager) and deploying WebLogic Monitoring Exporter into the OracleWebCenterContent domain. Hence make the domain specific values to be same as that used during domain creation. + +### Run the setup monitoring script + +Update the values in `monitoring-inputs.yaml` as per your requirement and run the `setup-monitoring.sh` script, specifying your inputs file: + +```bash +$ cd ${WORKDIR}/monitoring-service +$ ./setup-monitoring.sh \ + -i monitoring-inputs.yaml +``` +The script will perform the following steps: + +- Helm install `prometheus-community/kube-prometheus-stack` of version "16.5.0" if `setupKubePrometheusStack` is set to `true`. +- Deploys WebLogic Monitoring Exporter to Administration Server. +- Deploys WebLogic Monitoring Exporter to `ibrCluster` if `wlsMonitoringExporterToibrCluster` is set to `true`. +- Deploys WebLogic Monitoring Exporter to `ucmCluster` if `wlsMonitoringExporterToucmCluster` is set to `true`. +- Deploys WebLogic Monitoring Exporter to `ipmCluster` if `wlsMonitoringExporterToipmCluster` is set to `true`. +- Deploys WebLogic Monitoring Exporter to `captureCluster` if `wlsMonitoringExporterTocaptureCluster` is set to `true`. +- Deploys WebLogic Monitoring Exporter to `wccadfCluster` if `wlsMonitoringExporterTowccadfCluster` is set to `true`. +- Exposes the Monitoring Services (Prometheus at `32101`, Grafana at `32100` and Alertmanager at `32102`) outside of the Kubernetes cluster if `exposeMonitoringNodePort` is set to `true`. +- Imports the WebLogic Server Grafana Dashboard if `setupKubePrometheusStack` is set to `true`. + + +### Verify the results +The setup monitoring script will report failure if there was any error. However, verify that required resources were created by the script. + +#### Verify the kube-prometheus-stack + +To confirm that `prometheus-community/kube-prometheus-stack` was installed when `setupKubePrometheusStack` is set to `true`, run the following command: + +```bash +$ helm ls -n +``` +Replace with value for Kubernetes namespace used for monitoring. + +Sample output: +```bash +$ helm ls -n monitoring +NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION +monitoring monitoring 1 2021-06-18 12:58:35.177221969 +0000 UTC deployed kube-prometheus-stack-16.5.0 0.48.0 +$ +``` + +#### Verify the Prometheus, Grafana and Alertmanager setup + +When `exposeMonitoringNodePort` was set to `true`, verify that monitoring services are accessible outside of the Kubernetes cluster: + +- `32100` is the external port for Grafana and with credentials `admin:admin` +- `32101` is the external port for Prometheus +- `32102` is the external port for Alertmanager + +#### Verify the service discovery of WebLogic Monitoring Exporter + +Verify whether prometheus is able to discover wls-exporter and collect the metrics: + +1. Access the Prometheus dashboard at http://mycompany.com:32101/ + +1. Navigate to Status to see the Service Discovery details. + +1. Verify that wls-exporter is listed in the discovered services. + +#### Verify the WebLogic Server dashoard + +You can access the Grafana dashboard at http://mycompany.com:32100/. + +1. Log in to Grafana dashboard with username: `admin` and password: `admin`. + +1. Navigate to "WebLogic Server Dashboard" under General and verify. + +### Delete the monitoring setup + +To delete the monitoring setup created by [Run the setup monitoring script](#run-the-setup-monitoring-script), run the below command: + +```bash +$ cd ${WORKDIR}/monitoring-service +$ ./delete-monitoring.sh \ + -i monitoring-inputs.yaml +``` + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/config/config.yml.template b/OracleWebCenterContent/kubernetes/monitoring-service/config/config.yml.template new file mode 100644 index 000000000..792f64d27 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/config/config.yml.template @@ -0,0 +1,64 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +metricsNameSnakeCase: true +restPort: %PORT% +queries: +- key: name + keyName: location + prefix: wls_server_ + applicationRuntimes: + key: name + keyName: app + componentRuntimes: + prefix: wls_webapp_config_ + type: WebAppComponentRuntime + key: name + values: [deploymentState, contextRoot, sourceInfo, openSessionsHighCount, openSessionsCurrentCount, sessionsOpenedTotalCount, sessionCookieMaxAgeSecs, sessionInvalidationIntervalSecs, sessionTimeoutSecs, singleThreadedServletPoolSize, sessionIDLength, servletReloadCheckSecs, jSPPageCheckSecs] + servlets: + prefix: wls_servlet_ + key: servletName + +- JVMRuntime: + prefix: wls_jvm_ + key: name + +- executeQueueRuntimes: + prefix: wls_socketmuxer_ + key: name + values: [pendingRequestCurrentCount] + +- workManagerRuntimes: + prefix: wls_workmanager_ + key: name + values: [stuckThreadCount, pendingRequests, completedRequests] + +- threadPoolRuntime: + prefix: wls_threadpool_ + key: name + values: [executeThreadTotalCount, queueLength, stuckThreadCount, hoggingThreadCount] + +- JMSRuntime: + key: name + keyName: jmsruntime + prefix: wls_jmsruntime_ + JMSServers: + prefix: wls_jms_ + key: name + keyName: jmsserver + destinations: + prefix: wls_jms_dest_ + key: name + keyName: destination + +- persistentStoreRuntimes: + prefix: wls_persistentstore_ + key: name +- JDBCServiceRuntime: + JDBCDataSourceRuntimeMBeans: + prefix: wls_datasource_ + key: name +- JTARuntime: + prefix: wls_jta_ + key: name + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic-server-dashboard-import.json b/OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic-server-dashboard-import.json new file mode 100644 index 000000000..c2fa9e2eb --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic-server-dashboard-import.json @@ -0,0 +1,3312 @@ +{ + "__inputs": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "5.2.4" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "5.0.0" + }, + { + "type": "panel", + "id": "singlestat", + "name": "Singlestat", + "version": "5.0.0" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "5.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": null, + "iteration": 1563266678971, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 32, + "panels": [], + "title": "Servers", + "type": "row" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "$datasource", + "decimals": 0, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 13, + "x": 0, + "y": 1 + }, + "hideTimeOverride": true, + "id": 16, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "count(count (wls_jvm_uptime{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\"}) by (name))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "", + "timeFrom": null, + "timeShift": null, + "title": "Running Servers", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "$datasource", + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 11, + "x": 13, + "y": 1 + }, + "id": 23, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "count(count(wls_webapp_config_deployment_state{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\"}) by (app))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "", + "timeFrom": null, + "timeShift": null, + "title": "Deployed Applications", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "avg" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "$datasource", + "decimals": 1, + "description": "", + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 4 + }, + "hideTimeOverride": true, + "id": 104, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeat": "serverName", + "repeatDirection": "v", + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "weblogic_serverName", + "targets": [ + { + "expr": "wls_server_activation_time{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\",weblogic_serverName=\"$serverName\"}", + "format": "table", + "hide": false, + "instant": true, + "interval": "10s", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "50,80", + "timeFrom": null, + "timeShift": null, + "title": "Server Name", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "", + "value": "" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "#56A64B", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "$datasource", + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 6, + "y": 4 + }, + "id": 84, + "interval": "", + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeat": "serverName", + "repeatDirection": "v", + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "wls_server_state_val{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=\"$serverName\"}", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "thresholds": "", + "timeFrom": null, + "timeShift": null, + "title": "Server Status", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "SHUTDOWN", + "value": "0" + }, + { + "op": "=", + "text": "STARTING", + "value": "1" + }, + { + "op": "=", + "text": "RUNNING", + "value": "2" + }, + { + "op": "=", + "text": "STANDBY", + "value": "3" + }, + { + "op": "=", + "text": "FAILED", + "value": "8" + }, + { + "op": "=", + "text": "FAILED", + "value": "17" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "$datasource", + "decimals": 1, + "description": "", + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 10, + "y": 4 + }, + "hideTimeOverride": true, + "id": 27, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeat": "serverName", + "repeatDirection": "v", + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": true + }, + "tableColumn": "instance", + "targets": [ + { + "expr": "100 - wls_jvm_heap_free_percent{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=\"$serverName\"}", + "format": "time_series", + "hide": false, + "instant": true, + "interval": "10s", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "50,80", + "timeFrom": null, + "timeShift": null, + "title": "Heap Usage", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "", + "value": "" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorPostfix": false, + "colorValue": true, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "$datasource", + "decimals": 1, + "description": "", + "format": "ms", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 5, + "x": 14, + "y": 4 + }, + "hideTimeOverride": true, + "id": 91, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeat": "serverName", + "repeatDirection": "v", + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "instance", + "targets": [ + { + "expr": "wls_jvm_uptime{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=\"$serverName\"}", + "format": "time_series", + "hide": false, + "instant": true, + "interval": "10s", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "50,80", + "timeFrom": null, + "timeShift": null, + "title": "Running Time", + "type": "singlestat", + "valueFontSize": "50%", + "valueMaps": [ + { + "op": "=", + "text": "", + "value": "" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorPostfix": false, + "colorValue": true, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "$datasource", + "decimals": 0, + "description": "", + "format": "short", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 5, + "x": 19, + "y": 4 + }, + "hideTimeOverride": true, + "id": 96, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "repeat": "serverName", + "repeatDirection": "v", + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "instance", + "targets": [ + { + "expr": "wls_server_open_sockets_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=\"$serverName\"}", + "format": "time_series", + "hide": false, + "instant": true, + "interval": "10s", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": "50,80", + "timeFrom": null, + "timeShift": null, + "title": "Open Sockets", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "", + "value": "" + } + ], + "valueName": "current" + }, + { + "aliasColors": { + " heap free managed-server-1": "super-light-green", + " heap free managed-server-2": "dark-green", + "heap size managed-server-1 ": "super-light-red", + "heap size managed-server-2 ": "dark-red" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 12, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "wls_jvm_heap_free_current{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": " Heap Free ()", + "refId": "B" + }, + { + "expr": "wls_jvm_heap_size_current{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", + "format": "time_series", + "instant": false, + "intervalFactor": 1, + "legendFormat": "Heap Size ()", + "refId": "A" + }, + { + "expr": "wls_jvm_heap_size_max{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", + "format": "time_series", + "hide": true, + "intervalFactor": 1, + "legendFormat": "Heap Max ()", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Heap", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + " heap free managed-server-1": "super-light-green", + " heap free managed-server-2": "dark-green", + "heap size managed-server-1 ": "super-light-red", + "heap size managed-server-2 ": "dark-red" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 17 + }, + "id": 21, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "wls_jvm_process_cpu_load{weblogic_domainUID=~\"$domainName\", weblogic_clusterName=~\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"} * 100", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": " ", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Load", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 17 + }, + "id": 10, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "wls_threadpool_execute_thread_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Total Threads ()", + "refId": "A" + }, + { + "expr": "wls_threadpool_stuck_thread_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Stuck Threads ()", + "refId": "D" + }, + { + "expr": "wls_threadpool_queue_length{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", + "format": "time_series", + "hide": true, + "intervalFactor": 1, + "legendFormat": "queue", + "refId": "C" + }, + { + "expr": "wls_threadpool_hogging_thread_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", + "format": "time_series", + "hide": true, + "intervalFactor": 1, + "legendFormat": "hogging", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Thread Pool", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 35, + "panels": [ + { + "columns": [], + "datasource": "$datasource", + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 28 + }, + "hideTimeOverride": true, + "id": 126, + "links": [], + "pageSize": null, + "scroll": true, + "showHeader": true, + "sort": { + "col": 13, + "desc": true + }, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Webapp", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "app", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Total Sessions", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "hidden", + "unit": "short" + } + ], + "targets": [ + { + "expr": "topk($topN,sum(wls_webapp_config_sessions_opened_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (app))", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "B" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Total Sessions (top $topN)", + "transform": "table", + "type": "table" + }, + { + "columns": [], + "datasource": "$datasource", + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 28 + }, + "hideTimeOverride": true, + "id": 136, + "links": [], + "pageSize": null, + "scroll": true, + "showHeader": true, + "sort": { + "col": 13, + "desc": true + }, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Webapp", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "app", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Total Requests", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "hidden", + "unit": "short" + } + ], + "targets": [ + { + "expr": "topk($topN,sum(wls_servlet_invocation_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (app))", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "B" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Total Requests (top $topN)", + "transform": "table", + "type": "table" + }, + { + "columns": [], + "datasource": "$datasource", + "fontSize": "100%", + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 28 + }, + "hideTimeOverride": true, + "id": 134, + "links": [], + "pageSize": null, + "scroll": true, + "showHeader": true, + "sort": { + "col": 13, + "desc": true + }, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Webapp", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "app", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Total Time", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value", + "thresholds": [], + "type": "number", + "unit": "ms" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "hidden", + "unit": "short" + } + ], + "targets": [ + { + "expr": "topk($topN,sum(wls_servlet_execution_time_total{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (app))", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "B" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Total Execution Time (top $topN)", + "transform": "table", + "type": "table" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 35 + }, + "id": 14, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(wls_webapp_config_open_sessions_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (app)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + }, + { + "expr": "", + "format": "time_series", + "intervalFactor": 1, + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Current Sessions ", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 35 + }, + "id": 128, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": false + }, + "lines": false, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": " sum(irate(wls_webapp_config_sessions_opened_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])) by (app)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Session Rate ", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": "per second", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 43 + }, + "id": 132, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "(sum(wls_servlet_execution_time_average{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (app)) / (count(wls_servlet_execution_time_average{weblogic_domainUID=\"domain1\", weblogic_clusterName=\"cluster-1\"}) by (app))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Execution Time per Request ", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 43 + }, + "id": 138, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": false + }, + "lines": false, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(wls_servlet_invocation_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])) by (app)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Rate ", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": "per second", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "Web Applications", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 43, + "panels": [ + { + "columns": [], + "datasource": "$datasource", + "fontSize": "100%", + "gridPos": { + "h": 4, + "w": 24, + "x": 0, + "y": 29 + }, + "hideTimeOverride": true, + "id": 111, + "links": [], + "pageSize": null, + "scroll": true, + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Server", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "weblogic_serverName", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Name", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "name", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Active Connections", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Current Capacity", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Total Connections", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Total Connections", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "hidden", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(wls_datasource_curr_capacity{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (weblogic_serverName,name)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "C" + }, + { + "expr": "sum(wls_datasource_active_connections_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (weblogic_serverName,name)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "A" + }, + { + "expr": "sum(wls_datasource_connections_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (weblogic_serverName,name)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "D" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Overview", + "transform": "table", + "type": "table" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 13, + "x": 0, + "y": 33 + }, + "id": 50, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "wls_datasource_active_connections_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": " @ ", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Active Connections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 8, + "w": 11, + "x": 13, + "y": 33 + }, + "id": 71, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(wls_datasource_connections_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": " @ ", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": "per second", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 9, + "w": 11, + "x": 0, + "y": 41 + }, + "id": 46, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "wls_datasource_waiting_for_connection_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": " @ ", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pending Connection Requests", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 9, + "w": 13, + "x": 11, + "y": 41 + }, + "id": 73, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "wls_datasource_connection_delay_time{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": " @ ", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Average Connection Delay Time", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "ms", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "Data Sources", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 40, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 145, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(wls_jmsruntime_connections_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (weblogic_serverName)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JMS Connections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 30 + }, + "id": 147, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(wls_jmsruntime_connections_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])) by (weblogic_serverName)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JMS Connection Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "columns": [], + "datasource": "$datasource", + "fontSize": "100%", + "gridPos": { + "h": 4, + "w": 24, + "x": 0, + "y": 36 + }, + "hideTimeOverride": true, + "id": 113, + "links": [], + "pageSize": null, + "scroll": true, + "showHeader": true, + "sort": { + "col": 0, + "desc": true + }, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Name", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "jmsserver", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Current Dests", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Total Msgs", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Total Bytes", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Total Dests", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "hidden", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(wls_jms_destinations_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "B" + }, + { + "expr": "sum(wls_jms_messages_received_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "A" + }, + { + "expr": "sum(wls_jms_bytes_received_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "D" + }, + { + "expr": "sum(wls_jms_destinations_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "E" + }, + { + "expr": "sum(wls_jms_destinations_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "F" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "JMSServer Overview", + "transform": "table", + "type": "table" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 40 + }, + "id": 54, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(wls_jms_messages_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Current ()", + "refId": "A" + }, + { + "expr": "sum(wls_jms_messages_pending_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Pending ()", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Messages", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 40 + }, + "id": 56, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(wls_jms_bytes_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Current ()", + "refId": "A" + }, + { + "expr": "sum(wls_jms_bytes_pending_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Pending ()", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 47 + }, + "id": 58, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(wls_jms_messages_received_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])) by (jmsserver)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Received Message Rate ", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": "$datasource", + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 47 + }, + "id": 117, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "paceLength": 10, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(wls_jms_bytes_received_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])) by (jmsserver)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Received Byte Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "columns": [], + "datasource": "$datasource", + "fontSize": "100%", + "gridPos": { + "h": 5, + "w": 24, + "x": 0, + "y": 54 + }, + "hideTimeOverride": true, + "id": 119, + "links": [], + "pageSize": null, + "scroll": true, + "showHeader": true, + "sort": { + "col": 3, + "desc": false + }, + "styles": [ + { + "alias": "Time", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "hidden" + }, + { + "alias": "Destination", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "destination", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Current Consumers", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #A", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Current Msgs", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #B", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Pending Msgs", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #C", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Currrent Bytes", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #D", + "thresholds": [], + "type": "number", + "unit": "bytes" + }, + { + "alias": "Pending Bytes", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #E", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Total Msgs", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #F", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "Total Bytes", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "Value #G", + "thresholds": [], + "type": "number", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "/.*/", + "thresholds": [], + "type": "hidden", + "unit": "short" + } + ], + "targets": [ + { + "expr": "sum(wls_jms_dest_consumers_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (destination)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "A" + }, + { + "expr": "sum(wls_jms_dest_messages_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (destination)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "B" + }, + { + "expr": "sum(wls_jms_dest_messages_pending_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (destination)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "C" + }, + { + "expr": "sum(wls_jms_dest_bytes_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (destination)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "D" + }, + { + "expr": "sum(wls_jms_dest_bytes_pending_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (destination)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "E" + }, + { + "expr": "sum(wls_jms_dest_messages_received_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (destination)", + "format": "table", + "instant": true, + "interval": "", + "intervalFactor": 1, + "refId": "F" + }, + { + "expr": "sum(wls_jms_dest_bytes_received_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (destination)", + "format": "table", + "instant": true, + "intervalFactor": 1, + "refId": "G" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Destinations Overview", + "transform": "table", + "type": "table" + } + ], + "title": "JMS Services", + "type": "row" + } + ], + "refresh": false, + "schemaVersion": 16, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "text": "prometheus", + "value": "prometheus" + }, + "hide": 0, + "label": null, + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allValue": null, + "current": {}, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "Domain", + "multi": false, + "name": "domainName", + "options": [], + "query": "label_values(weblogic_domainUID)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": {}, + "datasource": "$datasource", + "hide": 0, + "includeAll": false, + "label": "Cluster", + "multi": false, + "name": "clusterName", + "options": [], + "query": "label_values(wls_jvm_uptime{weblogic_domainUID=\"$domainName\"},weblogic_clusterName)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": {}, + "datasource": "$datasource", + "hide": 0, + "includeAll": true, + "label": "Server", + "multi": true, + "name": "serverName", + "options": [], + "query": "label_values(wls_jvm_uptime{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\"},weblogic_serverName)", + "refresh": 1, + "regex": "", + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "selected": false, + "tags": [], + "text": "5", + "value": "5" + }, + "hide": 0, + "includeAll": false, + "label": "Top N", + "multi": false, + "name": "topN", + "options": [ + { + "selected": false, + "text": "3", + "value": "3" + }, + { + "selected": true, + "text": "5", + "value": "5" + }, + { + "selected": false, + "text": "7", + "value": "7" + }, + { + "selected": false, + "text": "10", + "value": "10" + } + ], + "query": "3, 5, 7, 10", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "hidden": false, + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "WebLogic Server Dashboard", + "uid": "5yUwzbZWz", + "version": 6 +} diff --git a/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/weblogic_dashboard.json b/OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic-server-dashboard.json similarity index 98% rename from docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/weblogic_dashboard.json rename to OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic-server-dashboard.json index 82727da8d..cf6d5f776 100644 --- a/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/weblogic_dashboard.json +++ b/OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic-server-dashboard.json @@ -1,4 +1,5 @@ { + "dashboard": { "__inputs": [], "__requires": [ { @@ -125,7 +126,7 @@ "expr": "count(count (wls_jvm_uptime{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\"}) by (name))", "format": "time_series", "intervalFactor": 1, - "legendFormat": "{{weblogic_serverName}}", + "legendFormat": "", "refId": "A" } ], @@ -750,7 +751,7 @@ "expr": "wls_jvm_heap_free_current{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", "format": "time_series", "intervalFactor": 1, - "legendFormat": " Heap Free ({{weblogic_serverName}})", + "legendFormat": " Heap Free ()", "refId": "B" }, { @@ -758,7 +759,7 @@ "format": "time_series", "instant": false, "intervalFactor": 1, - "legendFormat": "Heap Size ({{weblogic_serverName}})", + "legendFormat": "Heap Size ()", "refId": "A" }, { @@ -766,7 +767,7 @@ "format": "time_series", "hide": true, "intervalFactor": 1, - "legendFormat": "Heap Max ({{weblogic_serverName}})", + "legendFormat": "Heap Max ()", "refId": "C" } ], @@ -859,7 +860,7 @@ "expr": "wls_jvm_process_cpu_load{weblogic_domainUID=~\"$domainName\", weblogic_clusterName=~\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"} * 100", "format": "time_series", "intervalFactor": 1, - "legendFormat": " {{weblogic_serverName}}", + "legendFormat": " ", "refId": "B" } ], @@ -947,14 +948,14 @@ "expr": "wls_threadpool_execute_thread_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", "format": "time_series", "intervalFactor": 1, - "legendFormat": "Total Threads ({{weblogic_serverName}})", + "legendFormat": "Total Threads ()", "refId": "A" }, { "expr": "wls_threadpool_stuck_thread_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", "format": "time_series", "intervalFactor": 1, - "legendFormat": "Stuck Threads ({{weblogic_serverName}})", + "legendFormat": "Stuck Threads ()", "refId": "D" }, { @@ -1338,7 +1339,7 @@ "format": "time_series", "interval": "", "intervalFactor": 1, - "legendFormat": "{{app}}", + "legendFormat": "", "refId": "A" }, { @@ -1434,7 +1435,7 @@ "expr": " sum(irate(wls_webapp_config_sessions_opened_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])) by (app)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "{{app}}", + "legendFormat": "", "refId": "A" } ], @@ -1526,7 +1527,7 @@ "format": "time_series", "interval": "", "intervalFactor": 1, - "legendFormat": "{{app}}", + "legendFormat": "", "refId": "A" } ], @@ -1616,7 +1617,7 @@ "expr": "sum(irate(wls_servlet_invocation_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])) by (app)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "{{app}}", + "legendFormat": "", "refId": "A" } ], @@ -1888,7 +1889,7 @@ "expr": "wls_datasource_active_connections_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", "format": "time_series", "intervalFactor": 1, - "legendFormat": " {{name}} @ {{weblogic_serverName}}", + "legendFormat": " @ ", "refId": "A" } ], @@ -1977,7 +1978,7 @@ "expr": "irate(wls_datasource_connections_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])", "format": "time_series", "intervalFactor": 1, - "legendFormat": " {{name}} @ {{weblogic_serverName}}", + "legendFormat": " @ ", "refId": "A" } ], @@ -2065,7 +2066,7 @@ "expr": "wls_datasource_waiting_for_connection_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", "format": "time_series", "intervalFactor": 1, - "legendFormat": " {{name}} @ {{weblogic_serverName}}", + "legendFormat": " @ ", "refId": "A" } ], @@ -2153,7 +2154,7 @@ "expr": "wls_datasource_connection_delay_time{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}", "format": "time_series", "intervalFactor": 1, - "legendFormat": " {{name}} @ {{weblogic_serverName}}", + "legendFormat": " @ ", "refId": "A" } ], @@ -2256,7 +2257,7 @@ "expr": "sum(wls_jmsruntime_connections_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (weblogic_serverName)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "{{weblogic_serverName}}", + "legendFormat": "", "refId": "A" } ], @@ -2345,7 +2346,7 @@ "expr": "sum(irate(wls_jmsruntime_connections_total_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])) by (weblogic_serverName)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "{{weblogic_serverName}}", + "legendFormat": "", "refId": "A" } ], @@ -2599,14 +2600,14 @@ "expr": "sum(wls_jms_messages_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "Current ({{jmsserver}})", + "legendFormat": "Current ()", "refId": "A" }, { "expr": "sum(wls_jms_messages_pending_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "Pending ({{jmsserver}})", + "legendFormat": "Pending ()", "refId": "B" } ], @@ -2694,14 +2695,14 @@ "expr": "sum(wls_jms_bytes_current_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "Current ({{jmsserver}})", + "legendFormat": "Current ()", "refId": "A" }, { "expr": "sum(wls_jms_bytes_pending_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}) by (jmsserver)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "Pending ({{jmsserver}})", + "legendFormat": "Pending ()", "refId": "B" } ], @@ -2788,7 +2789,7 @@ "expr": "sum(irate(wls_jms_messages_received_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])) by (jmsserver)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "{{jmsserver}}", + "legendFormat": "", "refId": "A" } ], @@ -2875,7 +2876,7 @@ "expr": "sum(irate(wls_jms_bytes_received_count{weblogic_domainUID=\"$domainName\", weblogic_clusterName=\"$clusterName\", weblogic_serverName=~\"${serverName:regex}\"}[5m])) by (jmsserver)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "{{jmsserver}}", + "legendFormat": "", "refId": "A" } ], @@ -3309,4 +3310,6 @@ "title": "WebLogic Server Dashboard", "uid": "5yUwzbZWz", "version": 6 -} \ No newline at end of file + } +} + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic.xml b/OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic.xml new file mode 100644 index 000000000..c4e2df0c5 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/config/weblogic.xml @@ -0,0 +1,18 @@ + + + + wls-exporter + + + com.google.gson.* + javax.inject.* + org.apache.commons.* + org.apache.http.* + org.glassfish.hk2.* + org.jvnet.hk2.* + org.jvnet.tiger_types.* + org.yaml.snakeyaml.* + + + + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/delete-monitoring.sh b/OracleWebCenterContent/kubernetes/monitoring-service/delete-monitoring.sh new file mode 100644 index 000000000..eee881c77 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/delete-monitoring.sh @@ -0,0 +1,122 @@ +#!/bin/bash +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# delete-monitoring.sh + +# Initialize +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +OLD_PWD=`pwd` + + +# +## Function to exit and print an error message +## $1 - text of message +function fail { + printError $* + exit 1 +} + +# Function to print an error message +function removeFileIfExists { + echo "input is $1" + if [ -f $1 ]; then + rm -f $1 + fi +} + +function exitIfError { + if [ "$1" != "0" ]; then + echo "$2" + exit $1 + fi +} +# +# Function to parse a yaml file and generate the bash exports +# $1 - Input filename +# $2 - Output filename +function parseYaml { + local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') + sed -ne "s|^\($s\):|\1|" \ + -e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \ + -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 | + awk -F$fs '{ + if (length($3) > 0) { + # javaOptions may contain tokens that are not allowed in export command + # we need to handle it differently. + if ($2=="javaOptions") { + printf("%s=%s\n", $2, $3); + } else { + printf("export %s=\"%s\"\n", $2, $3); + } + } + }' > $2 +} + +function usage { + echo usage: ${script} -i file [-v] [-h] + echo " -i Parameter inputs file, must be specified." + echo " -h Help" + exit $1 +} + + +function deletePrometheusGrafana { + helm delete ${monitoringNamespace} --namespace ${monitoringNamespace} +} + +#Parse the inputs +while getopts "hi:" opt; do + case $opt in + i) valuesInputFile="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${valuesInputFile} ]; then + echo "${script}: -i must be specified." + missingRequiredOption="true" +fi + +if [ "${missingRequiredOption}" == "true" ]; then + usage 1 +fi + +if [ ! -f ${valuesInputFile} ]; then + echo "Unable to locate the input parameters file ${valuesInputFile}" + fail 'The error listed above must be resolved before the script can continue' +fi + +exportValuesFile=$(mktemp /tmp/export-values-XXXXXXXXX.sh) +parseYaml ${valuesInputFile} ${exportValuesFile} + + +source ${exportValuesFile} +rm ${exportValuesFile} + +# Setting up the WebLogic Monitoring Exporter + +echo "Undeploy WebLogic Monitoring Exporter started" +serviceMonitor=${scriptDir}/manifests/wls-exporter-ServiceMonitor.yaml +kubectl delete --ignore-not-found=true -f ${serviceMonitor} +script=${scriptDir}/scripts/undeploy-weblogic-monitoring-exporter.sh +sh ${script} +if [ "$?" != "0" ]; then + echo "ERROR: $script failed." + echo "Undeploy WebLogic Monitoring Exporter completed with errors. Review the logs and rerun" +else + echo "Undeploy WebLogic Monitoring Exporter completed." +fi + +if [ "${setupKubePrometheusStack}" = "true" ]; then + echo "Deleting Prometheus and grafana started" + deletePrometheusGrafana + echo "Deleting Prometheus and grafana completed" +fi +cd $OLD_PWD + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/manifests/prometheus-roleBinding-domain-namespace.yaml b/OracleWebCenterContent/kubernetes/monitoring-service/manifests/prometheus-roleBinding-domain-namespace.yaml new file mode 100644 index 000000000..a160137eb --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/manifests/prometheus-roleBinding-domain-namespace.yaml @@ -0,0 +1,20 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +apiVersion: rbac.authorization.k8s.io/v1 +items: +- apiVersion: rbac.authorization.k8s.io/v1 + kind: RoleBinding + metadata: + name: prometheus-k8s + namespace: wccns + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: prometheus-k8s + subjects: + - kind: ServiceAccount + name: prometheus-k8s + namespace: monitoring +kind: RoleBindingList + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/manifests/prometheus-roleSpecific-domain-namespace.yaml b/OracleWebCenterContent/kubernetes/monitoring-service/manifests/prometheus-roleSpecific-domain-namespace.yaml new file mode 100644 index 000000000..92e82072e --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/manifests/prometheus-roleSpecific-domain-namespace.yaml @@ -0,0 +1,23 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +apiVersion: rbac.authorization.k8s.io/v1 +items: +- apiVersion: rbac.authorization.k8s.io/v1 + kind: Role + metadata: + name: prometheus-k8s + namespace: wccns + rules: + - apiGroups: + - "" + resources: + - services + - endpoints + - pods + verbs: + - get + - list + - watch +kind: RoleList + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/manifests/wls-exporter-ServiceMonitor.yaml b/OracleWebCenterContent/kubernetes/monitoring-service/manifests/wls-exporter-ServiceMonitor.yaml new file mode 100644 index 000000000..1ed412cd8 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/manifests/wls-exporter-ServiceMonitor.yaml @@ -0,0 +1,43 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +apiVersion: v1 +kind: Secret +metadata: + name: basic-auth + namespace: monitoring +data: + password: V2VsY29tZTE= # Welcome1 i.e.'WebLogic password' + user: d2VibG9naWM= # weblogic i.e. 'WebLogic username' +type: Opaque +--- +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: wls-exporter + namespace: monitoring + labels: + k8s-app: wls-exporter +spec: + namespaceSelector: + matchNames: + - wccns + selector: + matchLabels: + weblogic.domainName: wccinfra + endpoints: + - basicAuth: + password: + name: basic-auth + key: password + username: + name: basic-auth + key: user + port: default + relabelings: + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + interval: 10s + honorLabels: true + path: /wls-exporter/metrics + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/manifests/wls-exporter-ServiceMonitor.yaml.template b/OracleWebCenterContent/kubernetes/monitoring-service/manifests/wls-exporter-ServiceMonitor.yaml.template new file mode 100644 index 000000000..94938aafb --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/manifests/wls-exporter-ServiceMonitor.yaml.template @@ -0,0 +1,44 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +apiVersion: v1 +kind: Secret +metadata: + name: basic-auth + namespace: wccns +data: + password: %PASSWORD% + user: %USERNAME% +type: Opaque +--- +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + name: wls-exporter + namespace: wccns + labels: + k8s-app: wls-exporter + release: monitoring +spec: + namespaceSelector: + matchNames: + - wccns + selector: + matchLabels: + weblogic.domainName: wccinfra + endpoints: + - basicAuth: + password: + name: basic-auth + key: password + username: + name: basic-auth + key: user + port: default + relabelings: + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + interval: 10s + honorLabels: true + path: /wls-exporter/metrics + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/monitoring-inputs.yaml b/OracleWebCenterContent/kubernetes/monitoring-service/monitoring-inputs.yaml new file mode 100644 index 000000000..c6cfabc62 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/monitoring-inputs.yaml @@ -0,0 +1,92 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# The version of this inputs file. Do not modify. +version: create-wccinfra-monitoring-inputs-v1 + +# Unique ID identifying your domain. +# This ID must not contain an underscope ("_"), and must be lowercase and unique across all domains in a Kubernetes cluster. +domainUID: wccinfra + +# Name of the domain namespace +domainNamespace: wccns + +# Boolean value indicating whether to install kube-prometheus-stack +setupKubePrometheusStack: true + +# Additional parameters for helm install kube-prometheus-stack +# Refer https://github.com/prometheus-community/helm-charts/blob/main/charts/kube-prometheus-stack/values.yaml for additional parameters +# Sample : +# additionalParamForKubePrometheusStack: --set nodeExporter.enabled=false --set prometheusOperator.tls.enabled=false --set prometheusOperator.admissionWebhooks.enabled=false +additionalParamForKubePrometheusStack: + +# Name of the monitoring namespace +monitoringNamespace: monitoring + +# Name of the Admin Server +adminServerName: adminserver +# +# Port number for admin server +adminServerPort: 7001 + +# Cluster name +ibrClusterName: ibr_cluster + +# Port number for managed server +ibrManagedServerPort: 16250 + +# WebLogic Monitoring Exporter to Cluster +wlsMonitoringExporterToibrCluster: false + +# Cluster name +ucmClusterName: ucm_cluster + +# Port number for managed server +ucmManagedServerPort: 16200 + +# WebLogic Monitoring Exporter to Cluster +wlsMonitoringExporterToucmCluster: false + +# Cluster name +ipmClusterName: ipm_cluster + +# Port number for managed server +ipmManagedServerPort: 16000 + +# WebLogic Monitoring Exporter to Cluster +wlsMonitoringExporterToipmCluster: false + +# Cluster name +captureClusterName: capture_cluster + +# Port number for managed server +captureManagedServerPort: 16400 + +# WebLogic Monitoring Exporter to Cluster +wlsMonitoringExporterTocaptureCluster: false + +# Cluster name +wccadfClusterName: wccadf_cluster + +# Port number for managed server +wccadfManagedServerPort: 16225 + +# WebLogic Monitoring Exporter to Cluster +wlsMonitoringExporterTowccadfCluster: false + + +# Boolean to indicate if the Monitoring Services NodePort will be exposed +exposeMonitoringNodePort: false + +# NodePort to expose Prometheus +prometheusNodePort: 32101 + +# NodePort to expose Grafana +grafanaNodePort: 32100 + +# NodePort to expose Alertmanager +alertmanagerNodePort: 32102 + +# Name of the Kubernetes secret for the Admin Server's username and password +weblogicCredentialsSecretName: wccinfra-domain-credentials + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-monitoring-exporter.py b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-monitoring-exporter.py new file mode 100644 index 000000000..55cb7a787 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-monitoring-exporter.py @@ -0,0 +1,156 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +import sys +#======================================================= +# Function for fresh plain deployment +#======================================================= +def newDeploy(appName,target): + try: + print 'Deploying .........' + deploy(appName,'/u01/oracle/wls-exporter-deploy/'+appName+'.war', target, upload="true",remote="true") + startApplication(appName) + except Exception, ex: + print ex.toString() + +#======================================================== +# Main program here... +# Target you can change as per your need +#======================================================== + +def usage(): + argsList = ' -domainName -adminServerName -adminURL -username -password ' + argsList=argsList + ' -ibrClusterName ' + ' -wlsMonitoringExporterToibrCluster ' + argsList=argsList + ' -ucmClusterName ' + ' -wlsMonitoringExporterToucmCluster ' + argsList=argsList + ' -ipmClusterName ' + ' -wlsMonitoringExporterToipmCluster ' + argsList=argsList + ' -captureClusterName ' + ' -wlsMonitoringExporterTocaptureCluster ' + argsList=argsList + ' -wccadfClusterName ' + ' -wlsMonitoringExporterTowccadfCluster ' + print sys.argv[0] + argsList + sys.exit(0) + +if len(sys.argv) < 1: + usage() + +# domainName will be passed by command line parameter -domainName. +domainName = "wccinfra" + +# adminServerName will be passed by command line parameter -adminServerName +adminServerName = "adminserver" + +# adminURL will be passed by command line parameter -adminURL +adminURL = "wccinfra-adminserver:7001" + +# ibrClusterName will be passed by command line parameter -ibrClusterName +ibrClusterName = "ibr_cluster" + +# wlsMonitoringExporterToibrCluster will be passed by command line parameter -wlsMonitoringExporterToibrCluster +wlsMonitoringExporterToibrCluster = "false" + + +# ucmClusterName will be passed by command line parameter -ucmClusterName +ucmClusterName = "ucm_cluster" + +# wlsMonitoringExporterToucmCluster will be passed by command line parameter -wlsMonitoringExporterToucmCluster +wlsMonitoringExporterToucmCluster = "false" + + +# ipmClusterName will be passed by command line parameter -ipmClusterName +ipmClusterName = "ipm_cluster" + +# wlsMonitoringExporterToipmCluster will be passed by command line parameter -wlsMonitoringExporterToipmCluster +wlsMonitoringExporterToipmCluster = "false" + + +# captureClusterName will be passed by command line parameter -captureClusterName +captureClusterName = "capture_cluster" + +# wlsMonitoringExporterTocaptureCluster will be passed by command line parameter -wlsMonitoringExporterTocaptureCluster +wlsMonitoringExporterTocaptureCluster = "false" + + +# wccadfClusterName will be passed by command line parameter -wccadfClusterName +wccadfClusterName = "wccadf_cluster" + +# wlsMonitoringExporterTowccadfCluster will be passed by command line parameter -wlsMonitoringExporterTowccadfCluster +wlsMonitoringExporterTowccadfCluster = "false" + +# username will be passed by command line parameter -username +username = "weblogic" + +# password will be passed by command line parameter -password +password = "Welcome1" + +i=1 +while i < len(sys.argv): + if sys.argv[i] == '-domainName': + domainName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-adminServerName': + adminServerName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-adminURL': + adminURL = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-username': + username = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-password': + password = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-ibrClusterName': + ibrClusterName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wlsMonitoringExporterToibrCluster': + wlsMonitoringExporterToibrCluster = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-ucmClusterName': + ucmClusterName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wlsMonitoringExporterToucmCluster': + wlsMonitoringExporterToucmCluster = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-ipmClusterName': + ipmClusterName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wlsMonitoringExporterToipmCluster': + wlsMonitoringExporterToipmCluster = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-captureClusterName': + captureClusterName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wlsMonitoringExporterTocaptureCluster': + wlsMonitoringExporterTocaptureCluster = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wccadfClusterName': + wccadfClusterName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wlsMonitoringExporterTowccadfCluster': + wlsMonitoringExporterTowccadfCluster = sys.argv[i+1] + i += 2 + else: + print 'Unexpected argument switch at position ' + str(i) + ': ' + str(sys.argv[i]) + usage() + sys.exit(1) + +# Deployment +connect(username, password, 't3://' + adminURL) +cd('AppDeployments') +newDeploy('wls-exporter-adminserver',adminServerName) +if 'true' == wlsMonitoringExporterToibrCluster: + newDeploy('wls-exporter-ibr',ibrClusterName) + +if 'true' == wlsMonitoringExporterToucmCluster: + newDeploy('wls-exporter-ucm',ucmClusterName) + +if 'true' == wlsMonitoringExporterToipmCluster: + newDeploy('wls-exporter-ipm',ipmClusterName) + +if 'true' == wlsMonitoringExporterTocaptureCluster: + newDeploy('wls-exporter-capture',captureClusterName) + +if 'true' == wlsMonitoringExporterTowccadfCluster: + newDeploy('wls-exporter-wccadf',wccadfClusterName) + +disconnect() +exit() + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-monitoring-exporter.sh b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-monitoring-exporter.sh new file mode 100644 index 000000000..c765f97d8 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-monitoring-exporter.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Initialize +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +warDir=$PWD +source ${scriptDir}/utils.sh + +# Setting default values +initialize +# Function to lowercase a value and make it a legal DNS1123 name +# $1 - value to convert to lowercase +function toDNS1123Legal { + local val=`echo $1 | tr "[:upper:]" "[:lower:]"` + val=${val//"_"/"-"} + echo "$val" +} + +# username and password from Kubernetes secret +username=`kubectl get secrets ${weblogicCredentialsSecretName} -n ${domainNamespace} -o=jsonpath='{.data.username}'|base64 --decode` +password=`kubectl get secrets ${weblogicCredentialsSecretName} -n ${domainNamespace} -o=jsonpath='{.data.password}'|base64 --decode` + +adminServerPodName="${domainUID}-$(toDNS1123Legal ${adminServerName})" + +InputParameterList=" -domainName ${domainUID} -adminServerName ${adminServerName} -adminURL ${adminServerPodName}:${adminServerPort} -username ${username} -password ${password}" +InputParameterList="${InputParameterList} -ibrClusterName ${ibrClusterName} -wlsMonitoringExporterToibrCluster ${wlsMonitoringExporterToibrCluster}" +InputParameterList="${InputParameterList} -ucmClusterName ${ucmClusterName} -wlsMonitoringExporterToucmCluster ${wlsMonitoringExporterToucmCluster}" +InputParameterList="${InputParameterList} -ipmClusterName ${ipmClusterName} -wlsMonitoringExporterToipmCluster ${wlsMonitoringExporterToipmCluster}" +InputParameterList="${InputParameterList} -captureClusterName ${captureClusterName} -wlsMonitoringExporterTocaptureCluster ${wlsMonitoringExporterTocaptureCluster}" +InputParameterList="${InputParameterList} -wccadfClusterName ${wccadfClusterName} -wlsMonitoringExporterTowccadfCluster ${wlsMonitoringExporterTowccadfCluster}" + +echo "Deploying WebLogic Monitoring Exporter with domainNamespace[$domainNamespace], domainUID[$domainUID], adminServerPodName[$adminServerPodName]" +. $scriptDir/get-wls-exporter.sh +kubectl cp $scriptDir/wls-exporter-deploy ${domainNamespace}/${adminServerPodName}:/u01/oracle +kubectl cp $scriptDir/deploy-weblogic-monitoring-exporter.py ${domainNamespace}/${adminServerPodName}:/u01/oracle/wls-exporter-deploy +EXEC_DEPLOY="kubectl exec -it -n ${domainNamespace} ${adminServerPodName} -- /u01/oracle/oracle_common/common/bin/wlst.sh /u01/oracle/wls-exporter-deploy/deploy-weblogic-monitoring-exporter.py ${InputParameterList}" +eval ${EXEC_DEPLOY} + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-server-grafana-dashboard.sh b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-server-grafana-dashboard.sh new file mode 100644 index 000000000..3da4f6b7d --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/deploy-weblogic-server-grafana-dashboard.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# Copyright (c) 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Initialize +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +warDir=$PWD +source ${scriptDir}/utils.sh + +# Setting default values +initialize +# Function to lowercase a value and make it a legal DNS1123 name +# $1 - value to convert to lowercase +function toDNS1123Legal { + local val=`echo $1 | tr "[:upper:]" "[:lower:]"` + val=${val//"_"/"-"} + echo "$val" +} + +adminServerPodName="${domainUID}-$(toDNS1123Legal ${adminServerName})" + +grafanaEndpointIP=$(kubectl get endpoints ${monitoringNamespace}-grafana -n ${monitoringNamespace} -o=jsonpath="{.subsets[].addresses[].ip}") +grafanaEndpointPort=$(kubectl get endpoints ${monitoringNamespace}-grafana -n ${monitoringNamespace} -o=jsonpath="{.subsets[].ports[].port}") +grafanaEndpoint="${grafanaEndpointIP}:${grafanaEndpointPort}" +kubectl cp $scriptDir/../config/weblogic-server-dashboard.json ${domainNamespace}/${adminServerPodName}:/tmp/weblogic-server-dashboard.json +EXEC_DEPLOY="kubectl exec -it -n ${domainNamespace} ${adminServerPodName} -- curl --noproxy \"*\" -X POST -H \"Content-Type: application/json\" -d @/tmp/weblogic-server-dashboard.json http://admin:admin@${grafanaEndpoint}/api/dashboards/db" +echo "Deploying WebLogic Server Grafana Dashboard in progress...." +eval ${EXEC_DEPLOY} + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/scripts/get-wls-exporter.sh b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/get-wls-exporter.sh new file mode 100644 index 000000000..23dd90ad0 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/get-wls-exporter.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Initialize +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/utils.sh +warDir=$scriptDir/../bin +mkdir -p $warDir +curl -L -o $warDir/wls-exporter.war https://github.com/oracle/weblogic-monitoring-exporter/releases/download/v2.0.0/wls-exporter.war +mkdir -p $scriptDir/wls-exporter-deploy +echo "created $scriptDir/wls-exporter-deploy dir" + +function update_wls_exporter_war { + servername=$1 + port=$2 + tmp_dir=$(mktemp -d -t ci-XXXXXXXXXX) + echo "created $tmp_dir" + mkdir -p $tmp_dir/WEB-INF + cp $scriptDir/../config/config.yml.template $tmp_dir/config.yml + cp $scriptDir/../config/weblogic.xml $tmp_dir/WEB-INF/weblogic.xml + cp $warDir/wls-exporter.war $tmp_dir/wls-exporter.war + + sed -i -e "s:%PORT%:${port}:g" $tmp_dir/config.yml + pushd $tmp_dir + echo "in temp dir" + zip wls-exporter.war WEB-INF/weblogic.xml + zip wls-exporter.war config.yml + + cp wls-exporter.war ${scriptDir}/wls-exporter-deploy/wls-exporter-${servername}.war + popd +} + +initialize + +update_wls_exporter_war adminserver ${adminServerPort} +if [[ ${wlsMonitoringExporterToibrCluster} == "true" ]]; +then + update_wls_exporter_war ibr ${ibrManagedServerPort} +fi +if [[ ${wlsMonitoringExporterToucmCluster} == "true" ]]; +then + update_wls_exporter_war ucm ${ucmManagedServerPort} +fi +if [[ ${wlsMonitoringExporterToipmCluster} == "true" ]]; +then + update_wls_exporter_war ipm ${ipmManagedServerPort} +fi +if [[ ${wlsMonitoringExporterTocaptureCluster} == "true" ]]; +then + update_wls_exporter_war capture ${captureManagedServerPort} +fi +if [[ ${wlsMonitoringExporterTowccadfCluster} == "true" ]]; +then + update_wls_exporter_war wccadf ${wccadfManagedServerPort} +fi + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/scripts/undeploy-weblogic-monitoring-exporter.py b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/undeploy-weblogic-monitoring-exporter.py new file mode 100644 index 000000000..f4f8060e3 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/undeploy-weblogic-monitoring-exporter.py @@ -0,0 +1,148 @@ +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +import sys +#======================================================= +# Function for undeployment +#======================================================= +def unDeploy(appName,target): + print 'Undeploying .........' + try: + stopApplication(appName) + undeploy(appName, target) + except Exception, ex: + print ex.toString() + +#======================================================== +# Main program here... +# Target you can change as per your need +#======================================================== +def usage(): + argsList = ' -domainName -adminServerName -adminURL -username -password ' + argsList=argsList + ' -ibrClusterName ' + ' -wlsMonitoringExporterToibrCluster ' + argsList=argsList + ' -ucmClusterName ' + ' -wlsMonitoringExporterToucmCluster ' + argsList=argsList + ' -ipmClusterName ' + ' -wlsMonitoringExporterToipmCluster ' + argsList=argsList + ' -captureClusterName ' + ' -wlsMonitoringExporterTocaptureCluster ' + argsList=argsList + ' -wccadfClusterName ' + ' -wlsMonitoringExporterTowccadfCluster ' + print sys.argv[0] + argsList + sys.exit(0) + +if len(sys.argv) < 1: + usage() + +# domainName will be passed by command line parameter -domainName. +domainName = "wccinfra" + +# adminServerName will be passed by command line parameter -adminServerName +adminServerName = "adminserver" + +# adminURL will be passed by command line parameter -adminURL +adminURL = "wccinfra-adminserver:7001" + +# ibrClusterName will be passed by command line parameter -ibrClusterName +ibrClusterName = "ibr_cluster" + +# wlsMonitoringExporterToibrCluster will be passed by command line parameter -wlsMonitoringExporterToibrCluster +wlsMonitoringExporterToibrCluster = "false" +# ucmClusterName will be passed by command line parameter -ucmClusterName +ucmClusterName = "ucm_cluster" + +# wlsMonitoringExporterToucmCluster will be passed by command line parameter -wlsMonitoringExporterToucmCluster +wlsMonitoringExporterToucmCluster = "false" +# ipmClusterName will be passed by command line parameter -ipmClusterName +ipmClusterName = "ipm_cluster" + +# wlsMonitoringExporterToipmCluster will be passed by command line parameter -wlsMonitoringExporterToipmCluster +wlsMonitoringExporterToipmCluster = "false" +# captureClusterName will be passed by command line parameter -captureClusterName +captureClusterName = "capture_cluster" + +# wlsMonitoringExporterTocaptureCluster will be passed by command line parameter -wlsMonitoringExporterTocaptureCluster +wlsMonitoringExporterTocaptureCluster = "false" +# wccadfClusterName will be passed by command line parameter -wccadfClusterName +wccadfClusterName = "wccadf_cluster" + +# wlsMonitoringExporterTowccadfCluster will be passed by command line parameter -wlsMonitoringExporterTowccadfCluster +wlsMonitoringExporterTowccadfCluster = "false" + +# username will be passed by command line parameter -username +username = "weblogic" + +# password will be passed by command line parameter -password +password = "Welcome1" + + +i=1 +while i < len(sys.argv): + if sys.argv[i] == '-domainName': + domainName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-adminServerName': + adminServerName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-adminURL': + adminURL = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-username': + username = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-password': + password = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-ibrClusterName': + ibrClusterName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wlsMonitoringExporterToibrCluster': + wlsMonitoringExporterToibrCluster = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-ucmClusterName': + ucmClusterName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wlsMonitoringExporterToucmCluster': + wlsMonitoringExporterToucmCluster = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-ipmClusterName': + ipmClusterName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wlsMonitoringExporterToipmCluster': + wlsMonitoringExporterToipmCluster = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-captureClusterName': + captureClusterName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wlsMonitoringExporterTocaptureCluster': + wlsMonitoringExporterTocaptureCluster = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wccadfClusterName': + wccadfClusterName = sys.argv[i+1] + i += 2 + elif sys.argv[i] == '-wlsMonitoringExporterTowccadfCluster': + wlsMonitoringExporterTowccadfCluster = sys.argv[i+1] + i += 2 + + else: + print 'Unexpected argument switch at position ' + str(i) + ': ' + str(sys.argv[i]) + usage() + sys.exit(1) + +# Undeploy +connect(username, password, 't3://' + adminURL) +unDeploy('wls-exporter-adminserver',adminServerName) +if 'true' == wlsMonitoringExporterToibrCluster: + unDeploy('wls-exporter-ibr',ibrClusterName) + +if 'true' == wlsMonitoringExporterToucmCluster: + unDeploy('wls-exporter-ucm',ucmClusterName) + +if 'true' == wlsMonitoringExporterToipmCluster: + unDeploy('wls-exporter-ipm',ipmClusterName) + +if 'true' == wlsMonitoringExporterTocaptureCluster: + unDeploy('wls-exporter-capture',captureClusterName) + +if 'true' == wlsMonitoringExporterTowccadfCluster: + unDeploy('wls-exporter-wccadf',wccadfClusterName) + +disconnect() +exit() + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/scripts/undeploy-weblogic-monitoring-exporter.sh b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/undeploy-weblogic-monitoring-exporter.sh new file mode 100644 index 000000000..049c9cacd --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/undeploy-weblogic-monitoring-exporter.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# Initialize +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +source ${scriptDir}/utils.sh + +# Function to lowercase a value and make it a legal DNS1123 name +# $1 - value to convert to lowercase +function toDNS1123Legal { + local val=`echo $1 | tr "[:upper:]" "[:lower:]"` + val=${val//"_"/"-"} + echo "$val" +} + +initialize + +# username and password from Kubernetes secret +username=`kubectl get secrets ${weblogicCredentialsSecretName} -n ${domainNamespace} -o=jsonpath='{.data.username}'|base64 --decode` +password=`kubectl get secrets ${weblogicCredentialsSecretName} -n ${domainNamespace} -o=jsonpath='{.data.password}'|base64 --decode` + +adminServerPodName="${domainUID}-$(toDNS1123Legal ${adminServerName})" + +InputParameterList="-domainName ${domainUID} -adminServerName ${adminServerName} -adminURL ${adminServerPodName}:${adminServerPort} -username ${username} -password ${password}" +InputParameterList="${InputParameterList} -ibrClusterName ${ibrClusterName} -wlsMonitoringExporterToibrCluster ${wlsMonitoringExporterToibrCluster}" +InputParameterList="${InputParameterList} -ucmClusterName ${ucmClusterName} -wlsMonitoringExporterToucmCluster ${wlsMonitoringExporterToucmCluster}" +InputParameterList="${InputParameterList} -ipmClusterName ${ipmClusterName} -wlsMonitoringExporterToipmCluster ${wlsMonitoringExporterToipmCluster}" +InputParameterList="${InputParameterList} -captureClusterName ${captureClusterName} -wlsMonitoringExporterTocaptureCluster ${wlsMonitoringExporterTocaptureCluster}" +InputParameterList="${InputParameterList} -wccadfClusterName ${wccadfClusterName} -wlsMonitoringExporterTowccadfCluster ${wlsMonitoringExporterTowccadfCluster}" + +# Copy weblogic monitoring exporter jars for deployment +echo "Undeploying WebLogic Monitoring Exporter: domainNamespace[$domainNamespace], domainUID[$domainUID], adminServerPodName[$adminServerPodName]" + +kubectl cp $scriptDir/undeploy-weblogic-monitoring-exporter.py ${domainNamespace}/${adminServerPodName}:/u01/oracle/undeploy-weblogic-monitoring-exporter.py +EXEC_UNDEPLOY="kubectl exec -it -n ${domainNamespace} ${adminServerPodName} -- /u01/oracle/oracle_common/common/bin/wlst.sh /u01/oracle/undeploy-weblogic-monitoring-exporter.py ${InputParameterList}" +eval ${EXEC_UNDEPLOY} + +# Cleanup the local wars +rm -rf ${scriptDir}/wls-exporter-deploy + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/scripts/utils.sh b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/utils.sh new file mode 100644 index 000000000..b03f84063 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/scripts/utils.sh @@ -0,0 +1,103 @@ +#!/bin/bash +# Copyright (c) 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# + +function initialize { + if [ -z ${domainNamespace} ]; then + echo "domainNamespace is empty, setting to default wccns" + domainNamespace="wccns" + fi + + if [ -z ${domainUID} ]; then + echo "domainUID is empty, setting to default wccinfra" + domainUID="wccinfra" + fi + + if [ -z ${weblogicCredentialsSecretName} ]; then + echo "weblogicCredentialsSecretName is empty, setting to default \"wccinfra-domain-credentials\"" + weblogicCredentialsSecretName="wccinfra-domain-credentials" + fi + + if [ -z ${adminServerName} ]; then + echo "adminServerName is empty, setting to default \"adminserver\"" + adminServerName="adminserver" + fi + + if [ -z ${adminServerPort} ]; then + echo "adminServerPort is empty, setting to default \"7001\"" + adminServerPort="7001" + fi + + if [ -z ${ibrClusterName} ]; then + echo "ibrClusterName is empty, setting to default \"ibr_cluster\"" + ibrClusterName="ibr_cluster" + fi + + if [ -z ${ibrManagedServerPort} ]; then + echo "ibrManagedServerPort is empty, setting to default \"16250\"" + ibrManagedServerPort="16250" + fi + + if [ -z ${wlsMonitoringExporterToibrCluster} ]; then + echo "wlsMonitoringExporterToibrCluster is empty, setting to default \"false\"" + wlsMonitoringExporterToibrCluster="false" + fi + if [ -z ${ucmClusterName} ]; then + echo "ucmClusterName is empty, setting to default \"ucm_cluster\"" + ucmClusterName="ucm_cluster" + fi + + if [ -z ${ucmManagedServerPort} ]; then + echo "ucmManagedServerPort is empty, setting to default \"16200\"" + ucmManagedServerPort="16200" + fi + + if [ -z ${wlsMonitoringExporterToucmCluster} ]; then + echo "wlsMonitoringExporterToucmCluster is empty, setting to default \"false\"" + wlsMonitoringExporterToucmCluster="false" + fi + if [ -z ${ipmClusterName} ]; then + echo "ipmClusterName is empty, setting to default \"ipm_cluster\"" + ipmClusterName="ipm_cluster" + fi + + if [ -z ${ipmManagedServerPort} ]; then + echo "ipmManagedServerPort is empty, setting to default \"16000\"" + ipmManagedServerPort="16000" + fi + + if [ -z ${wlsMonitoringExporterToipmCluster} ]; then + echo "wlsMonitoringExporterToipmCluster is empty, setting to default \"false\"" + wlsMonitoringExporterToipmCluster="false" + fi + if [ -z ${captureClusterName} ]; then + echo "captureClusterName is empty, setting to default \"capture_cluster\"" + captureClusterName="capture_cluster" + fi + + if [ -z ${captureManagedServerPort} ]; then + echo "captureManagedServerPort is empty, setting to default \"16400\"" + captureManagedServerPort="16400" + fi + + if [ -z ${wlsMonitoringExporterTocaptureCluster} ]; then + echo "wlsMonitoringExporterTocaptureCluster is empty, setting to default \"false\"" + wlsMonitoringExporterTocaptureCluster="false" + fi + if [ -z ${wccadfClusterName} ]; then + echo "wccadfClusterName is empty, setting to default \"wccadf_cluster\"" + wccadfClusterName="wccadf_cluster" + fi + + if [ -z ${wccadfManagedServerPort} ]; then + echo "wccadfManagedServerPort is empty, setting to default \"16225\"" + wccadfManagedServerPort="16225" + fi + + if [ -z ${wlsMonitoringExporterTowccadfCluster} ]; then + echo "wlsMonitoringExporterTowccadfCluster is empty, setting to default \"false\"" + wlsMonitoringExporterTowccadfCluster="false" + fi +} + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/setup-monitoring.sh b/OracleWebCenterContent/kubernetes/monitoring-service/setup-monitoring.sh new file mode 100644 index 000000000..57e7cba0c --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/setup-monitoring.sh @@ -0,0 +1,191 @@ +#!/bin/bash +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# setup-monitoring.sh + +# Initialize +script="${BASH_SOURCE[0]}" +scriptDir="$( cd "$( dirname "${script}" )" && pwd )" +OLD_PWD=`pwd` + + + +# +# Function to exit and print an error message +# $1 - text of message +function fail { + printError $* + exit 1 +} + +# Function to print an error message +function printError { + echo [ERROR] $* +} + + +# +# Function to remove a file if it exists +# +function removeFileIfExists { + echo "input is $1" + if [ -f $1 ]; then + rm -f $1 + fi +} + +function exitIfError { + if [ "$1" != "0" ]; then + echo "$2" + exit $1 + fi +} + +# +# Function to parse a yaml file and generate the bash exports +# $1 - Input filename +# $2 - Output filename +function parseYaml { + local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') + sed -ne "s|^\($s\):|\1|" \ + -e "s|^\($s\)\($w\)$s:$s[\"']\(.*\)[\"']$s\$|\1$fs\2$fs\3|p" \ + -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 | + awk -F$fs '{ + if (length($3) > 0) { + # javaOptions may contain tokens that are not allowed in export command + # we need to handle it differently. + if ($2=="javaOptions") { + printf("%s=%s\n", $2, $3); + } else { + printf("export %s=\"%s\"\n", $2, $3); + } + } + }' > $2 +} + +function usage { + echo usage: ${script} -i file [-v] [-h] + echo " -i Parameter inputs file, must be specified." + echo " -h Help" + exit $1 +} + +function installKubePrometheusStack { + helm repo add prometheus-community https://prometheus-community.github.io/helm-charts + helm repo update + echo "Setup prometheus-community/kube-prometheus-stack in progress" + if [ ${exposeMonitoringNodePort} == "true" ]; then + + helm install ${monitoringNamespace} prometheus-community/kube-prometheus-stack \ + --namespace ${monitoringNamespace} ${additionalParamForKubePrometheusStack} \ + --set prometheus.service.type=NodePort --set prometheus.service.nodePort=${prometheusNodePort} \ + --set alertmanager.service.type=NodePort --set alertmanager.service.nodePort=${alertmanagerNodePort} \ + --set grafana.adminPassword=admin --set grafana.service.type=NodePort --set grafana.service.nodePort=${grafanaNodePort} \ + --version "16.5.0" --values ${scriptDir}/values.yaml \ + --atomic --wait + else + helm install ${monitoringNamespace} prometheus-community/kube-prometheus-stack \ + --namespace ${monitoringNamespace} ${additionalParamForKubePrometheusStack} \ + --set grafana.adminPassword=admin \ + --version "16.5.0" --values ${scriptDir}/values.yaml \ + --atomic --wait + fi + exitIfError $? "ERROR: prometheus-community/kube-prometheus-stack install failed." +} + +#Parse the inputs +while getopts "hi:" opt; do + case $opt in + i) valuesInputFile="${OPTARG}" + ;; + h) usage 0 + ;; + *) usage 1 + ;; + esac +done + +if [ -z ${valuesInputFile} ]; then + echo "${script}: -i must be specified." + missingRequiredOption="true" +fi + +if [ "${missingRequiredOption}" == "true" ]; then + usage 1 +fi + +if [ ! -f ${valuesInputFile} ]; then + echo "Unable to locate the input parameters file ${valuesInputFile}" + fail 'The error listed above must be resolved before the script can continue' +fi + + +exportValuesFile=$(mktemp /tmp/export-values-XXXXXXXXX.sh) +parseYaml ${valuesInputFile} ${exportValuesFile} + + +source ${exportValuesFile} +rm ${exportValuesFile} + + +if [ "${setupKubePrometheusStack}" = "true" ]; then + if test "$(kubectl get namespace ${monitoringNamespace} --ignore-not-found | wc -l)" = 0; then + echo "The namespace ${monitoringNamespace} for install prometheus-community/kube-prometheus-stack does not exist. Creating the namespace ${monitoringNamespace}" + kubectl create namespace ${monitoringNamespace} + fi + echo -e "Monitoring setup in ${monitoringNamespace} in progress.......\n" + + # Create the namespace and CRDs, and then wait for them to be availble before creating the remaining resources + kubectl label nodes --all kubernetes.io/os=linux --overwrite=true + + echo "Setup prometheus-community/kube-prometheus-stack started" + installKubePrometheusStack + cd $OLD_PWD + + echo "Setup prometheus-community/kube-prometheus-stack completed" +fi + +export username=`kubectl get secrets ${weblogicCredentialsSecretName} -n ${domainNamespace} -o=jsonpath='{.data.username}'|base64 --decode` +export password=`kubectl get secrets ${weblogicCredentialsSecretName} -n ${domainNamespace} -o=jsonpath='{.data.password}'|base64 --decode` + +# Setting up the WebLogic Monitoring Exporter +echo "Deploy WebLogic Monitoring Exporter started" +script=${scriptDir}/scripts/deploy-weblogic-monitoring-exporter.sh +sh ${script} +exitIfError $? "ERROR: $script failed." +echo "Deploy WebLogic Monitoring Exporter completed" + + +# Deploy servicemonitors +serviceMonitor=${scriptDir}/manifests/wls-exporter-ServiceMonitor.yaml +cp "${serviceMonitor}.template" "${serviceMonitor}" +sed -i -e "s/release: monitoring/release: ${monitoringNamespace}/g" ${serviceMonitor} +sed -i -e "s/user: %USERNAME%/user: `echo -n $username|base64 -w0`/g" ${serviceMonitor} +sed -i -e "s/password: %PASSWORD%/password: `echo -n $password|base64 -w0`/g" ${serviceMonitor} +sed -i -e "s/namespace:.*/namespace: ${domainNamespace}/g" ${serviceMonitor} +sed -i -e "s/weblogic.domainName:.*/weblogic.domainName: ${domainUID}/g" ${serviceMonitor} +sed -i -e "$!N;s/matchNames:\n -.*/matchNames:\n - ${domainNamespace}/g;P;D" ${serviceMonitor} + +kubectl apply -f ${serviceMonitor} + + +if [ "${setupKubePrometheusStack}" = "true" ]; then + # Deploying WebLogic Server Grafana Dashboard + echo "Deploying WebLogic Server Grafana Dashboard...." + sh ${scriptDir}/scripts/deploy-weblogic-server-grafana-dashboard.sh + echo "" + echo "Deployed WebLogic Server Grafana Dashboard successfully" + echo "" + if [ ${exposeMonitoringNodePort} == "true" ]; then + echo "Grafana is available at NodePort: ${grafanaNodePort}" + echo "Prometheus is available at NodePort: ${prometheusNodePort}" + echo "Altermanager is available at NodePort: ${alertmanagerNodePort}" + echo "==============================================================" + fi +else + echo "Please import config/weblogic-server-dashboard.json manually into Grafana" +fi + +echo "" + diff --git a/OracleWebCenterContent/kubernetes/monitoring-service/values.yaml b/OracleWebCenterContent/kubernetes/monitoring-service/values.yaml new file mode 100644 index 000000000..18757f394 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/monitoring-service/values.yaml @@ -0,0 +1,13 @@ +# Copyright (c) 2022, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +prometheusOperator: + admissionWebhooks: + patch: + enabled: true + image: + repository: k8s.gcr.io/ingress-nginx/kube-webhook-certgen + tag: v1.0 + sha: "f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068" + pullPolicy: IfNotPresent + diff --git a/OracleWebCenterContent/kubernetes/rest/README.md b/OracleWebCenterContent/kubernetes/rest/README.md new file mode 100644 index 000000000..f0e09b088 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/rest/README.md @@ -0,0 +1,38 @@ +# Sample to create certificates and keys for the operator + +When a user enables the operator's external REST API (by setting +`externalRestEnabled` to `true` when installing the operator Helm chart), the user needs +to provide the certificate and private key for api's SSL identity too (by creating a +`tls secret` before the installation of the operator helm chart). + +This sample script generates a self-signed certificate and private key that can be used +for the operator's external REST api when experimenting with the operator. They should +not be used in a production environment. + +The syntax of the script is: +```shell +$ kubernetes/samples/scripts/rest/generate-external-rest-identity.sh -n [-s ] +``` + +Where `` lists the subject alternative names to put into the generated self-signed +certificate for the external WebLogic Operator REST HTTPS interface, should match +the namespace where the operator will be installed, and optionally the secret name, which defaults +to `weblogic-operator-external-rest-identity`. Each must be prefaced +by `DNS:` (for a name) or `IP:` (for an address), for example: +``` +DNS:myhost,DNS:localhost,IP:127.0.0.1 +``` + +You should include the addresses of all masters and load balancers in this list. The certificate +cannot be conveniently changed after installation of the operator. + +The script creates the secret in the weblogic-operator namespace with the self-signed +certificate and private key + +Example usage: +```shell +$ generate-external-rest-identity.sh IP:127.0.0.1 -n weblogic-operator > my_values.yaml +$ echo "externalRestEnabled: true" >> my_values.yaml + ... +$ helm install my_operator kubernetes/charts/weblogic-operator --namespace my_operator-ns --values my_values.yaml --wait +``` diff --git a/OracleWebCenterContent/kubernetes/rest/generate-external-rest-identity.sh b/OracleWebCenterContent/kubernetes/rest/generate-external-rest-identity.sh new file mode 100644 index 000000000..e645d3925 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/rest/generate-external-rest-identity.sh @@ -0,0 +1,200 @@ +#!/usr/bin/env bash +# Copyright (c) 2017, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. +# +# When the customer enables the operator's external REST api (by setting +# externalRestEnabled to true when installing the operator helm chart), the customer needs +# to provide the certificate and private key for api's SSL identity too (by creating a +# tls secret before the installation of the operator helm chart). +# +# This sample script generates a self-signed certificate and private key that can be used +# for the operator's external REST api when experimenting with the operator. They should +# not be used in a production environment. +# +# The sytax of the script is: +# +# kubernetes/samples/scripts/rest/generate-external-rest-identity.sh -a -n +# +# Where lists the subject alternative names to put into the generated self-signed +# certificate for the external WebLogic Operator REST https interface, for example: +# +# DNS:myhost,DNS:localhost,IP:127.0.0.1 +# +# You should include the addresses of all masters and load balancers in this list. The certificate +# cannot be conveniently changed after installation of the operator. +# +# The script creates the secret in the weblogic-operator namespace with the self-signed +# certificate and private key +# +# Example usage: +# generate-external-rest-identity.sh -a IP:127.0.0.1 -n weblogic-operator > my_values.yaml +# echo "externalRestEnabled: true" >> my_values.yaml +# ... +# helm install my_operator kubernetes/charts/weblogic-operator --namespace my_operator-ns --values my_values.yaml --wait +usage(){ +cat < -n +Options: +-a SANS Required, the SANs for the certificate +-n NAMESPACE Required, the namespace where the secret will be created. +-s SECRET_NAME Optional, the name of the kubernetes secret. Default is: weblogic-operator-external-rest-identity. +-h, --help Display this help text. +EOF +exit 1 +} + +if [ ! -x "$(command -v keytool)" ]; then + echo "Can't find keytool. Please add it to the path." + exit 1 +fi + +if [ ! -x "$(command -v openssl)" ]; then + echo "Can't find openssl. Please add it to the path." + exit 1 +fi + +if [ ! -x "$(command -v base64)" ]; then + echo "Can't find base64. Please add it to the path." + exit 1 +fi + +TEMP_DIR=`mktemp -d` +if [ $? -ne 0 ]; then + echo "$0: Can't create temp directory." + exit 1 +fi + +if [ -z $TEMP_DIR ]; then + echo "Can't create temp directory." + exit 1 +fi + +function cleanup { + rm -r $TEMP_DIR + if [[ $SUCCEEDED != "true" ]]; then + exit 1 + fi +} + +set -e +#set -x + +trap "cleanup" EXIT + +SECRET_NAME="weblogic-operator-external-rest-identity" + +while [ $# -gt 0 ] + do + key="$1" + case $key in + -a) + shift # past argument + if [ $# -eq 0 ] || [ ${1:0:1} == "-" ]; then echo "SANs is required and is missing"; usage; fi + SANS=$1 + shift # past value + ;; + -n) + shift # past argument + if [ $# -eq 0 ] || [ ${1:0:1} == "-" ]; then echo "Namespace is required and is missing"; usage; fi + NAMESPACE=$1 + shift # past value + ;; + -s) + shift # past argument + if [ $# -eq 0 ] || [ ${1:0:1} == "-" ]; then echo "Invalid secret name $1"; usage; fi + SECRET_NAME=$1 + shift # past value + ;; + -h) + shift # past argument + ;; + *) + SANS=$1 + shift # past argument + ;; + esac +done + +if [ -z "$SANS" ] +then + 1>&2 + echo "SANs is required and is missing" + usage +fi + +if [ -z "$NAMESPACE" ] +then + 1>&2 + echo "Namespace is required and is missing" + usage +fi + +DAYS_VALID="3650" +TEMP_PW="temp_password" +OP_PREFIX="weblogic-operator" +OP_ALIAS="${OP_PREFIX}-alias" +OP_JKS="${TEMP_DIR}/${OP_PREFIX}.jks" +OP_PKCS12="${TEMP_DIR}/${OP_PREFIX}.p12" +OP_CSR="${TEMP_DIR}/${OP_PREFIX}.csr" +OP_CERT_PEM="${TEMP_DIR}/${OP_PREFIX}.cert.pem" +OP_KEY_PEM="${TEMP_DIR}/${OP_PREFIX}.key.pem" + +# generate a keypair for the operator's REST service, putting it in a keystore +keytool \ + -genkey \ + -keystore ${OP_JKS} \ + -alias ${OP_ALIAS} \ + -storepass ${TEMP_PW} \ + -keypass ${TEMP_PW} \ + -keysize 2048 \ + -keyalg RSA \ + -validity ${DAYS_VALID} \ + -dname "CN=weblogic-operator" \ + -ext KU=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment,keyAgreement \ + -ext SAN="${SANS}" \ +2> /dev/null + +# extract the cert to a pem file +keytool \ + -exportcert \ + -keystore ${OP_JKS} \ + -storepass ${TEMP_PW} \ + -alias ${OP_ALIAS} \ + -rfc \ +> ${OP_CERT_PEM} 2> /dev/null + +# convert the keystore to a pkcs12 file +keytool \ + -importkeystore \ + -srckeystore ${OP_JKS} \ + -srcstorepass ${TEMP_PW} \ + -destkeystore ${OP_PKCS12} \ + -srcstorepass ${TEMP_PW} \ + -deststorepass ${TEMP_PW} \ + -deststoretype PKCS12 \ +2> /dev/null + +# extract the private key from the pkcs12 file to a pem file +openssl \ + pkcs12 \ + -in ${OP_PKCS12} \ + -passin pass:${TEMP_PW} \ + -nodes \ + -nocerts \ + -out ${OP_KEY_PEM} \ +2> /dev/null + +set +e +# Check if namespace exist +kubectl get namespace $NAMESPACE >/dev/null 2>/dev/null +if [ $? -eq 1 ]; then + echo "Namespace $NAMESPACE does not exist" + exit 1 +fi +kubectl get secret $SECRET_NAME -n $NAMESPACE >/dev/null 2>/dev/null +if [ $? -eq 1 ]; then + kubectl create secret tls "$SECRET_NAME" --cert=${OP_CERT_PEM} --key=${OP_KEY_PEM} -n $NAMESPACE >/dev/null +fi +echo "externalRestIdentitySecret: $SECRET_NAME" + +SUCCEEDED=true diff --git a/OracleWebCenterContent/kubernetes/scaling/scalingAction.sh b/OracleWebCenterContent/kubernetes/scaling/scalingAction.sh new file mode 100644 index 000000000..462031314 --- /dev/null +++ b/OracleWebCenterContent/kubernetes/scaling/scalingAction.sh @@ -0,0 +1,504 @@ +#!/bin/bash +# Copyright (c) 2017, 2021, Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. + +# script parameters +scaling_action="" +wls_domain_uid="" +wls_cluster_name="" +wls_domain_namespace="default" +operator_service_name="internal-weblogic-operator-svc" +operator_namespace="weblogic-operator" +operator_service_account="weblogic-operator" +scaling_size=1 +access_token="" +no_op="" +kubernetes_master="https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}" +log_file_name="scalingAction.log" + +# timestamp +# purpose: echo timestamp in the form yyyy-mm-ddThh:mm:ss.nnnnnnZ +# example: 2018-10-01T14:00:00.000001Z +function timestamp() { + local timestamp="`date --utc '+%Y-%m-%dT%H:%M:%S.%NZ' 2>&1`" + if [ ! "${timestamp/illegal/xyz}" = "${timestamp}" ]; then + # old shell versions don't support %N or --utc + timestamp="`date -u '+%Y-%m-%dT%H:%M:%S.000000Z' 2>&1`" + fi + echo "${timestamp}" +} + +function trace() { + echo "@[$(timestamp)][$wls_domain_namespace][$wls_domain_uid][$wls_cluster_name][INFO]" "$@" >> ${log_file_name} +} + +function print_usage() { + echo "Usage: scalingAction.sh --action=[scaleUp | scaleDown] --domain_uid= --cluster_name= [--kubernetes_master=https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}] [--access_token=] [--wls_domain_namespace=default] [--operator_namespace=weblogic-operator] [--operator_service_name=weblogic-operator] [--scaling_size=1] [--no_op]" + echo " where" + echo " action - scaleUp or scaleDown" + echo " domain_uid - WebLogic Domain Unique Identifier" + echo " cluster_name - WebLogic Cluster Name" + echo " kubernetes_master - Kubernetes master URL, default=https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}" + echo " access_token - Service Account Bearer token for authentication and authorization for access to REST Resources" + echo " wls_domain_namespace - Kubernetes name space WebLogic Domain is defined in, default=default" + echo " operator_service_name - WebLogic Operator Service name, default=internal-weblogic-operator-svc" + echo " operator_service_account - Kubernetes Service Account for WebLogic Operator, default=weblogic-operator" + echo " operator_namespace - WebLogic Operator Namespace, default=weblogic-operator" + echo " scaling_size - number of WebLogic server instances by which to scale up or down, default=1" + echo " no_op - if specified, returns without doing anything. For use by unit test to include methods in the script" + exit 1 +} + +# Retrieve WebLogic Operator Service Account Token for Authorization +function initialize_access_token() { + if [ -z "$access_token" ] + then + access_token=`cat /var/run/secrets/kubernetes.io/serviceaccount/token` + fi +} + +function logScalingParameters() { + trace "scaling_action: $scaling_action" + trace "wls_domain_uid: $wls_domain_uid" + trace "wls_cluster_name: $wls_cluster_name" + trace "wls_domain_namespace: $wls_domain_namespace" + trace "operator_service_name: $operator_service_name" + trace "operator_service_account: $operator_service_account" + trace "operator_namespace: $operator_namespace" + trace "scaling_size: $scaling_size" +} + +function jq_available() { + if [ -x "$(command -v jq)" ] && [ -z "$DONT_USE_JQ" ]; then + return; + fi + false +} + +# Query WebLogic Operator Service Port +function get_operator_internal_rest_port() { + local STATUS=$(curl \ + -v \ + --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \ + -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \ + -X GET $kubernetes_master/api/v1/namespaces/$operator_namespace/services/$operator_service_name/status) + if [ $? -ne 0 ] + then + trace "Failed to retrieve status of $operator_service_name in name space: $operator_namespace" + trace "STATUS: $STATUS" + exit 1 + fi + + local port + if jq_available; then + local extractPortCmd="(.spec.ports[] | select (.name == \"rest\") | .port)" + port=$(echo "${STATUS}" | jq "${extractPortCmd}" 2>> ${log_file_name}) + else +cat > cmds-$$.py << INPUT +import sys, json +for i in json.load(sys.stdin)["spec"]["ports"]: + if i["name"] == "rest": + print((i["port"])) +INPUT +port=$(echo "${STATUS}" | python cmds-$$.py 2>> ${log_file_name}) + fi + echo "$port" +} + +# Retrieve the api version of the deployed Custom Resource Domain +function get_domain_api_version() { + # Retrieve Custom Resource Definition for WebLogic domain + local APIS=$(curl \ + -v \ + --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \ + -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \ + -X GET \ + $kubernetes_master/apis) + if [ $? -ne 0 ] + then + trace "Failed to retrieve list of APIs from Kubernetes cluster" + trace "APIS: $APIS" + exit 1 + fi + +# Find domain version + local domain_api_version + if jq_available; then + local extractVersionCmd="(.groups[] | select (.name == \"weblogic.oracle\") | .preferredVersion.version)" + domain_api_version=$(echo "${APIS}" | jq -r "${extractVersionCmd}" 2>> ${log_file_name}) + else +cat > cmds-$$.py << INPUT +import sys, json +for i in json.load(sys.stdin)["groups"]: + if i["name"] == "weblogic.oracle": + print((i["preferredVersion"]["version"])) +INPUT +domain_api_version=`echo ${APIS} | python cmds-$$.py 2>> ${log_file_name}` + fi + echo "$domain_api_version" +} + +# Retrieve Custom Resource Domain +function get_custom_resource_domain() { + local DOMAIN=$(curl \ + -v \ + --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \ + -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" \ + $kubernetes_master/apis/weblogic.oracle/$domain_api_version/namespaces/$wls_domain_namespace/domains/$wls_domain_uid) + if [ $? -ne 0 ]; then + trace "Failed to retrieve WebLogic Domain Custom Resource Definition" + exit 1 + fi + echo "$DOMAIN" +} + +# Verify if cluster is defined in clusters of the Custom Resource Domain +# args: +# $1 Custom Resource Domain +function is_defined_in_clusters() { + local DOMAIN="$1" + local in_cluster_startup="False" + + if jq_available; then + local inClusterStartupCmd="(.spec.clusters[] | select (.clusterName == \"${wls_cluster_name}\"))" + local clusterDefinedInCRD=$(echo "${DOMAIN}" | jq "${inClusterStartupCmd}" 2>> ${log_file_name}) + if [ "${clusterDefinedInCRD}" != "" ]; then + in_cluster_startup="True" + fi + else +cat > cmds-$$.py << INPUT +import sys, json +outer_loop_must_break = False +for j in json.load(sys.stdin)["spec"]["clusters"]: + if j["clusterName"] == "$wls_cluster_name": + outer_loop_must_break = True + print (True) + break +if outer_loop_must_break == False: + print (False) +INPUT +in_cluster_startup=`echo ${DOMAIN} | python cmds-$$.py 2>> ${log_file_name}` + fi + echo "$in_cluster_startup" +} + +# Gets the current replica count of the cluster +# args: +# $1 Custom Resource Domain +function get_num_ms_in_cluster() { + local DOMAIN="$1" + local num_ms + if jq_available; then + local numManagedServersCmd="(.spec.clusters[] | select (.clusterName == \"${wls_cluster_name}\") | .replicas)" + num_ms=$(echo "${DOMAIN}" | jq "${numManagedServersCmd}" 2>> ${log_file_name}) + else +cat > cmds-$$.py << INPUT +import sys, json +for j in json.load(sys.stdin)["spec"]["clusters"]: + if j["clusterName"] == "$wls_cluster_name": + print((j["replicas"])) +INPUT + num_ms=`echo ${DOMAIN} | python cmds-$$.py 2>> ${log_file_name}` + fi + + if [ "${num_ms}" == "null" ] || [ "${num_ms}" == '' ] ; then + num_ms=0 + fi + + echo "$num_ms" +} + +# Gets the replica count at the Domain level +# args: +# $1 Custom Resource Domain +function get_num_ms_domain_scope() { + local DOMAIN="$1" + local num_ms + if jq_available; then + num_ms=$(echo "${DOMAIN}" | jq -r '.spec.replicas' 2>> ${log_file_name}) + else +cat > cmds-$$.py << INPUT +import sys, json +print((json.load(sys.stdin)["spec"]["replicas"])) +INPUT + num_ms=`echo ${DOMAIN} | python cmds-$$.py 2>> ${log_file_name}` + fi + + if [ "${num_ms}" == "null" ] || [ "${num_ms}" == '' ] ; then + # if not defined then default to 0 + num_ms=0 + fi + + echo "$num_ms" +} + +# +# Function to get minimum replica count for cluster +# $1 - Domain resource in json format +# $2 - Name of the cluster +# $3 - Return value containing minimum replica count +# +function get_min_replicas { + local domainJson=$1 + local clusterName=$2 + local __result=$3 + + eval $__result=0 + if jq_available; then + minReplicaCmd="(.status.clusters[] | select (.clusterName == \"${clusterName}\")) \ + | .minimumReplicas" + minReplicas=$(echo ${domainJson} | jq "${minReplicaCmd}" 2>> ${log_file_name}) + else +cat > cmds-$$.py << INPUT +import sys, json +for j in json.load(sys.stdin)["status"]["clusters"]: + if j["clusterName"] == "$clusterName": + print((j["minimumReplicas"])) +INPUT + minReplicas=`echo ${DOMAIN} | python cmds-$$.py 2>> ${log_file_name}` + fi + eval $__result=${minReplicas} +} + +# Get the current replica count for the WLS cluster if defined in the CRD's Cluster +# configuration. If WLS cluster is not defined in the CRD then return the Domain +# scoped replica value, if present. Returns replica count = 0 if no replica count found. +# args: +# $1 "True" if WLS cluster configuration defined in CRD, "False" otherwise +# $2 Custom Resource Domain +function get_replica_count() { + local in_cluster_startup="$1" + local DOMAIN="$2" + local num_ms + if [ "$in_cluster_startup" == "True" ] + then + trace "$wls_cluster_name defined in clusters" + num_ms=$(get_num_ms_in_cluster "$DOMAIN") + else + trace "$wls_cluster_name NOT defined in clusters" + num_ms=$(get_num_ms_domain_scope "$DOMAIN") + fi + + get_min_replicas "${DOMAIN}" "${wls_cluster_name}" minReplicas + if [[ "${num_ms}" -lt "${minReplicas}" ]]; then + # Reset managed server count to minimum replicas + num_ms=${minReplicas} + fi + + echo "$num_ms" +} + +# Determine the nuber of managed servers to scale +# args: +# $1 scaling action (scaleUp or scaleDown) +# $2 current replica count +# $3 scaling increment value +function calculate_new_ms_count() { + local scaling_action="$1" + local current_replica_count="$2" + local scaling_size="$3" + local new_ms + if [ "$scaling_action" == "scaleUp" ]; + then + # Scale up by specified scaling size + # shellcheck disable=SC2004 + new_ms=$(($current_replica_count + $scaling_size)) + else + # Scale down by specified scaling size + new_ms=$(($current_replica_count - $scaling_size)) + fi + echo "$new_ms" +} + +# Verify if requested managed server scaling count is less than the configured +# minimum replica count for the cluster. +# args: +# $1 Managed server count +# $2 Custom Resource Domain +# $3 Cluster name +function verify_minimum_ms_count_for_cluster() { + local new_ms="$1" + local domainJson="$2" + local clusterName="$3" + # check if replica count is less than minimum replicas + get_min_replicas "${domainJson}" "${clusterName}" minReplicas + if [ "${new_ms}" -lt "${minReplicas}" ]; then + trace "Scaling request to new managed server count $new_ms is less than configured minimum \ + replica count $minReplicas" + exit 1 + fi +} + +# Create the REST endpoint CA certificate in PEM format +# args: +# $1 certificate file name to create +function create_ssl_certificate_file() { + local pem_filename="$1" + if [ ${INTERNAL_OPERATOR_CERT} ]; + then + echo ${INTERNAL_OPERATOR_CERT} | base64 --decode > $pem_filename + else + trace "Operator Cert File not found" + exit 1 + fi +} + +# Create request body for scaling request +# args: +# $1 replica count +function get_request_body() { +local new_ms="$1" +local request_body=$(cat < " description: "Configure different load balancers for Oracle WebCenter Content domains." --- -WebLogic Kubernetes Operator supports ingress-based load balancers such as Traefik and NGINX (kubernetes/ingress-nginx). It also supports Apache webtier load balancer. +WebLogic Kubernetes Operator managed Oracle WebCenter Content domain supports ingress-based load balancers such as Traefik and NGINX (kubernetes/ingress-nginx). {{% children style="h4" description="true" %}} diff --git a/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/apache.md b/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/apache.md deleted file mode 100644 index f6096e65b..000000000 --- a/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/apache.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -title: "Apache webtier" -date: 2021-15-02 T15:44:42-05:00 -draft: false -weight: 4 -pre: "c. " -description: "Configure the Apache webtier load balancer for Oracle WebCenter Content domain." ---- - -This section provides information about how to install and configure *Apache webtier* to load balance Oracle WebCenter Content domain clusters. You can configure Apache webtier for non-SSL and SSL termination access of the application URL. - -Follow these steps to set up Apache webtier as a load balancer for an Oracle WebCenter Content domain in a Kubernetes cluster: - - 1. [Build the Apache webtier image](#build-the-apache-webtier-image) - 1. [Create the Apache plugin configuration file](#create-the-apache-plugin-configuration-file) - 1. [Prepare the certificate and private key](#prepare-the-certificate-and-private-key) - 1. [Install the Apache webtier Helm chart](#install-the-apache-webtier-helm-chart) - 1. [Verify domain application URL access](#verify-domain-application-url-access) - 1. [Uninstall Apache webtier](#uninstall-apache-webtier) - -#### Build the Apache webtier image - -Refer to the [sample](https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/12213-webtier-apache), to build the Apache webtier Docker image. - -#### Create the Apache plugin configuration file - -1. The configuration file named `custom_mod_wl_apache.conf` should have all the URL routing rules for the Oracle WebCenter Content application deployed in the domain that needs to be accessible externally. Update this file with values based on your environment. The file content is similar to below mentioned sample. - -{{%expand "Click here to see the sample content of the configuration file custom_mod_wl_apache.conf for Oracle WebCenter Content domain" %}} - -```bash -# Copyright (c) 2018, 2020, Oracle Corporation and/or its affiliates. -# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. - - -WebLogicHost -WebLogicPort 7001 - - -# Directive for weblogic admin Console deployed on Weblogic Admin Server - -SetHandler weblogic-handler -WebLogicHost wccinfra-adminserver -WebLogicPort 7001 - - - -SetHandler weblogic-handler -WebLogicHost wccinfra-adminserver -WebLogicPort 7001 - - - -SetHandler weblogic-handler -WebLogicHost wccinfra-adminserver -WebLogicPort 7001 - -# Directive for all application deployed on weblogic cluster with a prepath defined by LOCATION variable -# For example, if the LOCAITON is set to '/weblogic', all applications deployed on the cluster can be accessed via -# http://myhost:myport/weblogic/application_end_url -# where 'myhost' is the IP of the machine that runs the Apache web tier, and -# 'myport' is the port that the Apache web tier is publicly exposed to. -# Note that LOCATION cannot be set to '/' unless this is the only Location module configured. - -WLSRequest On -WebLogicCluster wccinfra-cluster-ucm-cluster:16200 -PathTrim /weblogic1 - - - -WLSRequest On -WebLogicCluster wccinfra-cluster-ucm-cluster:16200 -PathTrim /weblogic1 - - - -WLSRequest On -WebLogicCluster wccinfra-cluster-ibr-cluster:16250 -PathTrim /weblogic1 - - - -WLSRequest On -WebLogicCluster wccinfra-cluster-ibr-cluster:16250 -PathTrim /weblogic1 - - - -WLSRequest On -WebLogicCluster wccinfra-cluster-ipm-cluster:16000 -PathTrim /weblogic1 - - - -WLSRequest On -WebLogicCluster wccinfra-cluster-capture-cluster:16400 -PathTrim /weblogic1 - - - -WLSRequest On -WebLogicCluster wccinfra-cluster-capture-cluster:16400 -PathTrim /weblogic1 - - - -WLSRequest On -WebLogicCluster wccinfra-cluster-wccadf-cluster:16225 -PathTrim /weblogic1 - - -# Directive for all application deployed on weblogic cluster with a prepath defined by LOCATION2 variable -# For example, if the LOCAITON2 is set to '/weblogic2', all applications deployed on the cluster can be accessed via -# http://myhost:myport/weblogic2/application_end_url -# where 'myhost' is the IP of the machine that runs the Apache web tier, and -# 'myport' is the port that the Apache webt ier is publicly exposed to. -# -#WLSRequest On -#WebLogicCluster domain2-cluster-cluster-1:8021 -#PathTrim /weblogic2 -# - -``` -{{% /expand %}} - - - -1. Update `persistentVolumeClaimName` with your PV-claim-name which contains your `custom_mod_wl_apache.conf` in file `kubernetes/samples/charts/apache-samples/custom-sample/input.yaml`. - -#### Prepare the certificate and private key - -1. (For the SSL termination configuration only) Run the following commands to generate your own certificate and private key using `openssl`. - - ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator - $ cd kubernetes/samples/charts/apache-samples/custom-sample - $ export VIRTUAL_HOST_NAME=WEBLOGIC_HOST - $ export SSL_CERT_FILE=WEBLOGIC_HOST.crt - $ export SSL_CERT_KEY_FILE=WEBLOGIC_HOST.key - $ sh certgen.sh - ``` - > NOTE: Replace WEBLOGIC_HOST with the host name on which Apache webtier is to be installed. - - {{%expand "Click here to see the output of the certifcate generation" %}} - ```bash - $ls - certgen.sh custom_mod_wl_apache.conf custom_mod_wl_apache.conf_orig input.yaml README.md - $ sh certgen.sh - Generating certs for WEBLOGIC_HOST - Generating a 2048 bit RSA private key - ........................+++ - .......................................................................+++ - unable to write 'random state' - writing new private key to 'apache-sample.key' - ----- - $ ls - certgen.sh custom_mod_wl_apache.conf_orig WEBLOGIC_HOST.info - config.txt input.yaml WEBLOGIC_HOST.key - custom_mod_wl_apache.conf WEBLOGIC_HOST.crt README.md - ``` - {{% /expand %}} - -1. Prepare input values for the Apache webtier Helm chart. - - Run the following commands to prepare the input value file for the Apache webtier Helm chart. - - ```bash - $ base64 -i ${SSL_CERT_FILE} | tr -d '\n' - $ base64 -i ${SSL_CERT_KEY_FILE} | tr -d '\n' - $ touch input.yaml - ``` - - Update `virtualHostName` with the value of the `WEBLOGIC_HOST` in file `kubernetes/samples/charts/apache-samples/custom-sample/input.yaml` - - {{%expand "Click here to see the snapshot of the sample input.yaml file " %}} - ```bash - $ cat apache-samples/custom-sample/input.yaml - # Use this to provide your own Apache webtier configuration as needed; simply define this - # path and put your own custom_mod_wl_apache.conf file under this path. - persistentVolumeClaimName: - - # The VirtualHostName of the Apache HTTP server. It is used to enable custom SSL configuration. - virtualHostName: - ``` - {{% /expand %}} - -#### Install the Apache webtier Helm chart - -1. Install the Apache webtier Helm chart to the domain `wccns` namespace with the specified input parameters: - - ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts - $ kubectl create namespace apache-webtier - - $ helm install apache-webtier --values apache-samples/custom-sample/input.yaml --namespace wccns apache-webtier --set image=oracle/apache:12.2.1.3 - ``` - -1. Check the status of the Apache webtier: - - ```bash - $ kubectl get all -n wccns | grep apache - ``` - - Sample output of the status of the apache webtier: -```bash -pod/apache-webtier-new-apache-webtier-65d8d7c59f-k27wf 1/1 Running 0 9d -service/apache-webtier-new-apache-webtier NodePort 10.108.12.143 80:30505/TCP,4433:30453/TCP 9d -deployment.apps/apache-webtier-new-apache-webtier 1/1 1 1 9d -replicaset.apps/apache-webtier-new-apache-webtier-65d8d7c59f 1 1 1 9d - -``` - -#### Verify domain application URL access - -Post the Apache webtier load balancer is up, verify that the domain applications are accessible through the load balancer port `30505/30453`. The application URLs for domain of type `wcc` are: - -> Note: Port `30505` is the LOADBALANCER-Non-SSLPORT and Port `30453` is LOADBALANCER-SSLPORT. - -##### Non-SSL configuration - - ```bash - http://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-Non-SSLPORT}/weblogic/ready - http://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-Non-SSLPORT}/console - http://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-Non-SSLPORT}/em - http://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-Non-SSLPORT}/cs - http://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-Non-SSLPORT}/ibr - http://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-Non-SSLPORT}/imaging - http://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-Non-SSLPORT}/dc-console - http://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-Non-SSLPORT}/wcc - ``` - -##### SSL configuration - - ```bash - https://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-SSLPORT}/weblogic/ready - https://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-SSLPORT}/console - https://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-SSLPORT}/em - https://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-SSLPORT}/cs - https://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-SSLPORT}/ibr - https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/imaging - https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/dc-console - https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/wcc - ``` - -#### Uninstall Apache webtier - - ```bash - $ helm delete apache-webtier -n wccns - ``` diff --git a/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/nginx.md b/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/nginx.md index df6fe6376..88dc8a911 100644 --- a/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/nginx.md +++ b/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/nginx.md @@ -23,7 +23,9 @@ Follow these steps to set up NGINX as a load balancer for an Oracle WebCenter Co 1. [Install the NGINX load balancer for End-to-end SSL](#install-the-nginx-load-balancer-for-end-to-end-ssl) 2. [Deploy tls to access individual Managed Servers](#deploy-tls-to-access-individual-managed-servers) 3. [Deploy tls to access Administration Server](#deploy-tls-to-access-administration-server) + 4. [Uninstall ingress-nginx tls](#uninstall-ingress-nginx-tls) +* [ Uninstall the NGINX](#uninstall-the-nginx) To get repository information, enter the following Helm commands: @@ -37,21 +39,19 @@ Follow these steps to set up NGINX as a load balancer for an Oracle WebCenter Co 1. Deploy the `ingress-nginx` controller by using Helm on the domain namespace: - For Kubernetes versions up to v1.18.x: ```bash $ helm install nginx-ingress -n wccns \ - --version=3.34.0 \ - --set controller.service.type=NodePort \ + --set controller.service.type=NodePort \ --set controller.admissionWebhooks.enabled=false \ - ingress-nginx/ingress-nginx + ingress-nginx/ingress-nginx ``` -{{%expand "Click here to see the sample output." %}} + {{%expand "Click here to see the sample output." %}} ```bash NAME: nginx-ingress -LAST DEPLOYED: Sun Feb 7 23:19:30 2021 +LAST DEPLOYED: Fri Jul 29 00:14:19 2022 NAMESPACE: wccns STATUS: deployed -REVISION: 2 +REVISION: 1 TEST SUITE: None NOTES: The ingress-nginx controller has been installed. @@ -59,36 +59,33 @@ Get the application URL by running these commands: export HTTP_NODE_PORT=$(kubectl --namespace wccns get services -o jsonpath="{.spec.ports[0].nodePort}" nginx-ingress-ingress-nginx-controller) export HTTPS_NODE_PORT=$(kubectl --namespace wccns get services -o jsonpath="{.spec.ports[1].nodePort}" nginx-ingress-ingress-nginx-controller) export NODE_IP=$(kubectl --namespace wccns get nodes -o jsonpath="{.items[0].status.addresses[1].address}") - echo "Visit http://$NODE_IP:$HTTP_NODE_PORT to access your application via HTTP." echo "Visit https://$NODE_IP:$HTTPS_NODE_PORT to access your application via HTTPS." - An example Ingress that makes use of the controller: - - apiVersion: networking.k8s.io/v1beta1 + apiVersion: networking.k8s.io/v1 kind: Ingress metadata: - annotations: - kubernetes.io/ingress.class: nginx name: example namespace: foo spec: + ingressClassName: nginx rules: - host: www.example.com http: paths: - - backend: - serviceName: exampleService - servicePort: 80 + - pathType: Prefix + backend: + service: + name: exampleService + port: + number: 80 path: / # This section is only required if TLS is to be enabled for the Ingress tls: - - hosts: - - www.example.com - secretName: example-tls - + - hosts: + - www.example.com + secretName: example-tls If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided: - apiVersion: v1 kind: Secret metadata: @@ -113,27 +110,27 @@ If TLS is enabled for the Ingress, a Secret containing the certificate and key m #### Configure NGINX to manage ingresses -1. Create an ingress for the domain in the domain namespace by using the sample Helm chart. Here path-based routing is used for ingress. Sample values for default configuration are shown in the file `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/values.yaml`. By default, `type` is `TRAEFIK`, `tls` is `Non-SSL`, and `domainType` is `wccinfra`. These values can be overridden by passing values through the command line or can be edited in the sample file `values.yaml`. If needed, you can update the ingress YAML file to define more path rules (in section `spec.rules.host.http.paths`) based on the domain application URLs that need to be accessed. Update the template YAML file for the NGINX load balancer located at `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/templates/nginx-ingress.yaml` +1. Create an ingress for the domain in the domain namespace by using the sample Helm chart. Here path-based routing is used for ingress. Sample values for default configuration are shown in the file `${WORKDIR}/charts/ingress-per-domain/values.yaml`. By default, `type` is `TRAEFIK`, `tls` is `Non-SSL`, and `domainType` is `wccinfra`. These values can be overridden by passing values through the command line or can be edited in the sample file `values.yaml`. If needed, you can update the ingress YAML file to define more path rules (in section `spec.rules.host.http.paths`) based on the domain application URLs that need to be accessed. Update the template YAML file for the NGINX load balancer located at `${WORKDIR}/charts/ingress-per-domain/templates/nginx-ingress.yaml` -```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator - $ helm install wccinfra-nginx-ingress kubernetes/samples/charts/ingress-per-domain \ - --namespace wccns \ - --values kubernetes/samples/charts/ingress-per-domain/values.yaml \ - --set "nginx.hostname=$(hostname -f)" \ - --set type=NGINX \ - --set tls=NONSSL -``` + ```bash + $ cd ${WORKDIR} + $ helm install wccinfra-nginx-ingress charts/ingress-per-domain \ + --namespace wccns \ + --values charts/ingress-per-domain/values.yaml \ + --set "nginx.hostname=$(hostname -f)" \ + --set type=NGINX \ + --set tls=NONSSL + ``` - Sample output: - ```bash - NAME: wccinfra-nginx-ingress - LAST DEPLOYED: Sun Feb 7 23:52:38 2021 - NAMESPACE: wccns - STATUS: deployed - REVISION: 1 - TEST SUITE: None - ``` + Sample output: + ```bash + NAME: wccinfra-nginx-ingress + LAST DEPLOYED: Sun Feb 7 23:52:38 2021 + NAMESPACE: wccns + STATUS: deployed + REVISION: 1 + TEST SUITE: None + ``` 1. For **secured access (SSL)** to the Oracle WebCenter Content application, create a certificate and generate a Kubernetes secret: ```bash @@ -144,11 +141,12 @@ If TLS is enabled for the Ingress, a Secret containing the certificate and key m 1. Install `ingress-per-domain` using Helm for SSL configuration: ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator - $ helm install wccinfra-nginx-ingress kubernetes/samples/charts/ingress-per-domain \ + $ cd ${WORKDIR} + $ helm install wccinfra-nginx-ingress charts/ingress-per-domain \ --namespace wccns \ - --values kubernetes/samples/charts/ingress-per-domain/values.yaml \ + --values charts/ingress-per-domain/values.yaml \ --set "nginx.hostname=$(hostname -f)" \ + --set "nginx.hostnameorip=$(hostname -f)" \ --set type=NGINX --set tls=SSL ``` Sample output: @@ -167,7 +165,7 @@ If TLS is enabled for the Ingress, a Secret containing the certificate and key m ```bash $ kubectl describe ingress wccinfra-nginx -n wccns ``` -{{%expand "Click here to see the sample output of the services supported by the above deployed ingress." %}} + {{%expand "Click here to see the sample output of the services supported by the above deployed ingress." %}} ```bash Name: wccinfra-nginx Namespace: wccns @@ -257,21 +255,19 @@ Uninstall and delete the `ingress-nginx` deployment: 1. Deploy the ingress-nginx controller by using Helm on the domain namespace: - For Kubernetes versions up to v1.18.x: ```bash - $ helm install nginx-ingress -n wccns \ - --version=3.34.0 \ + $ helm install nginx-ingress -n wccns \ --set controller.extraArgs.default-ssl-certificate=wccns/domain1-tls-cert \ --set controller.service.type=NodePort \ --set controller.admissionWebhooks.enabled=false \ --set controller.extraArgs.enable-ssl-passthrough=true \ - ingress-nginx/ingress-nginx - ``` + ingress-nginx/ingress-nginx + ``` {{%expand "Click here to see the sample output." %}} ```bash -Release "nginx-ingress" has been upgraded. Happy Helming! + NAME: nginx-ingress -LAST DEPLOYED: Mon Feb 8 02:07:26 2021 +LAST DEPLOYED: Thu Sep 8 23:59:54 2022 NAMESPACE: wccns STATUS: deployed REVISION: 1 @@ -282,36 +278,33 @@ Get the application URL by running these commands: export HTTP_NODE_PORT=$(kubectl --namespace wccns get services -o jsonpath="{.spec.ports[0].nodePort}" nginx-ingress-ingress-nginx-controller) export HTTPS_NODE_PORT=$(kubectl --namespace wccns get services -o jsonpath="{.spec.ports[1].nodePort}" nginx-ingress-ingress-nginx-controller) export NODE_IP=$(kubectl --namespace wccns get nodes -o jsonpath="{.items[0].status.addresses[1].address}") - echo "Visit http://$NODE_IP:$HTTP_NODE_PORT to access your application via HTTP." echo "Visit https://$NODE_IP:$HTTPS_NODE_PORT to access your application via HTTPS." - An example Ingress that makes use of the controller: - - apiVersion: networking.k8s.io/v1beta1 + apiVersion: networking.k8s.io/v1 kind: Ingress metadata: - annotations: - kubernetes.io/ingress.class: nginx name: example namespace: foo spec: + ingressClassName: nginx rules: - host: www.example.com http: paths: - - backend: - serviceName: exampleService - servicePort: 80 + - pathType: Prefix + backend: + service: + name: exampleService + port: + number: 80 path: / # This section is only required if TLS is to be enabled for the Ingress tls: - - hosts: - - www.example.com - secretName: example-tls - + - hosts: + - www.example.com + secretName: example-tls If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided: - apiVersion: v1 kind: Secret metadata: @@ -321,6 +314,7 @@ If TLS is enabled for the Ingress, a Secret containing the certificate and key m tls.crt: tls.key: type: kubernetes.io/tls + ``` {{% /expand %}} @@ -338,14 +332,16 @@ If TLS is enabled for the Ingress, a Secret containing the certificate and key m 1. Deploy tls to securely access the services. Only one application can be configured with `ssl-passthrough`. A sample tls file for NGINX is shown below for the service `wccinfra-cluster-ucm-cluster` and port `16201`. All the applications running on port `16201` can be securely accessed through this ingress. For each backend service, create different ingresses as NGINX does not support multiple path/rules with annotation `ssl-passthrough`. That is, for `wccinfra-cluster-ucm-cluster`, `wccinfra-cluster-ibr-cluster`, `wccinfra-cluster-ipm-cluster`, `wccinfra-cluster-capture-cluster`, `wccinfra-cluster-wccadf-cluster` and `wccinfra-adminserver`, different ingresses must be created. + > Note: There is a limitation with load-balancer in end-to-end SSL configuration - accessing multiple types of servers (different Managed Servers and/or Administration Server) at the same time, is currently not supported. We can access only one Managed Server at a time. + ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/tls + $ cd ${WORKDIR}/charts/ingress-per-domain/tls ``` Sample nginx-ucm-tls.yaml: - - {{%expand "Click here to see the content of the file nginx-ucm-tls.yaml" %}} -```bash -apiVersion: extensions/v1beta1 + +{{%expand "Click here to see the content of the file nginx-ucm-tls.yaml" %}} +```yaml +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wcc-ucm-ingress @@ -356,26 +352,28 @@ metadata: spec: tls: - hosts: - - 'domain1.org' + - 'your_host_name' secretName: domain1-tls-cert rules: - - host: 'domain1.org' + - host: 'your_host_name' http: paths: - - path: + - path: + pathType: ImplementationSpecific backend: - serviceName: wccinfra-cluster-ucm-cluster - servicePort: 16201 - + service: + name: wccinfra-cluster-ucm-cluster + port: + number: 16201 ``` - {{% /expand %}} - +{{% /expand %}} + > Note: host is the server on which this ingress is deployed. 1. Deploy the secured ingress: ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/tls + $ cd ${WORKDIR}/charts/ingress-per-domain/tls $ kubectl create -f nginx-ucm-tls.yaml ``` @@ -437,8 +435,9 @@ Verify that the Oracle WebCenter Content domain application URLs are accessible Sample nginx-admin-tls.yaml: {{%expand "Click here to see the content of the file nginx-admin-tls.yaml" %}} -```bash -apiVersion: extensions/v1beta1 +```yaml + +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: wcc-admin-ingress @@ -449,16 +448,19 @@ metadata: spec: tls: - hosts: - - 'domain1.org' + - 'your_host_name' secretName: domain1-tls-cert rules: - - host: 'domain1.org' + - host: 'your_host_name' http: paths: - - path: + - path: + pathType: ImplementationSpecific backend: - serviceName: wccinfra-adminserver-nginx-ssl - servicePort: 7002 + service: + name: wccinfra-adminserver-nginx-ssl + port: + number: 7002 ``` {{% /expand %}} @@ -466,18 +468,27 @@ spec: > Note: host is the server on which this ingress is deployed. ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/tls + $ cd ${WORKDIR}/charts/ingress-per-domain/tls $ kubectl create -f nginx-admin-tls.yaml ``` #### Verify end-to-end SSL access Verify that the Oracle WebCenter Content Administration Server URL is accessible through the `LOADBALANCER-SSLPORT`: - ```bash - https://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-SSLPORT}/console - ``` +```bash +https://${LOADBALANCER-HOSTNAME}:${LOADBALANCER-SSLPORT}/console +``` #### Uninstall ingress-nginx tls - ```bash - $ cd weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/tls - $ kubectl delete -f nginx-ucm-tls.yaml - ``` +```bash +$ cd ${WORKDIR}/charts/ingress-per-domain/tls +$ kubectl delete -f nginx-ucm-tls.yaml +``` +#### Uninstall the NGINX + +```bash +//Uninstall and delete the `ingress-nginx` deployment +$ helm delete wccinfra-nginx-ingress -n wccns + +//Uninstall NGINX +$ helm delete nginx-ingress -n wccns +``` diff --git a/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/traefik.md b/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/traefik.md index 863116ae4..6b27921e3 100644 --- a/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/traefik.md +++ b/docs-source/content/wccontent-domains/adminguide/configure-load-balancer/traefik.md @@ -7,7 +7,7 @@ pre: "a. " description: "Configure the ingress-based Traefik load balancer for Oracle WebCenter Content domains." --- -This section provides information about how to install and configure the ingress-based *Traefik* load balancer (version 2.2.1 or later for production deployments) to load balance Oracle WebCenter Content domain clusters. You can configure Traefik for non-SSL, SSL termination and end-to-end SSL access of the application URL. +This section provides information about how to install and configure the ingress-based *Traefik* load balancer (version 2.6.0 or later for production deployments) to load balance Oracle WebCenter Content domain clusters. You can configure Traefik for non-SSL, SSL termination and end-to-end SSL access of the application URL. Follow these steps to set up Traefik as a load balancer for an Oracle WebCenter Content domain in a Kubernetes cluster: @@ -16,14 +16,15 @@ Follow these steps to set up Traefik as a load balancer for an Oracle WebCenter 2. [Configure Traefik to manage ingresses](#configure-traefik-to-manage-ingresses) 3. [Create an Ingress for the domain](#create-an-ingress-for-the-domain) 4. [Verify domain application URL access](#verify-domain-application-url-access) - 5. [Uninstall the Traefik ingress](#uninstall-the-traefik-ingress) - + * [ End-to-end SSL configuration](#end-to-end-ssl-configuration) 1. [Install the Traefik load balancer for End-to-end SSL](#install-the-traefik-load-balancer-for-end-to-end-ssl) - 2. [Configure Traefik to manage domain](#configure-traefik-to-manage-domain) - 3. [Create IngressRouteTCP](#[create-ingressroutetcp) + 2. [Configure Traefik to manage the domain](#configure-traefik-to-manage-the-domain) + 3. [Create IngressRouteTCP](#create-ingressroutetcp) 4. [Verify end-to-end SSL access](#verify-end-to-end-ssl-access) - 5. [Uninstall Traefik](#uninstall-traefik) + 5. [Delete the IngressRouteTCP](#delete-the-ingressroutetcp) + +* [ Uninstall Traefik](#uninstall-traefik) ### Non-SSL and SSL termination @@ -35,9 +36,9 @@ Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifi ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ cd ${WORKDIR} $ kubectl create namespace traefik - $ helm repo add traefik https://containous.github.io/traefik-helm-chart + $ helm repo add traefik https://helm.traefik.io/traefik --force-update ``` Sample output: ```bash @@ -46,12 +47,12 @@ Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifi 2. Install Traefik: ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ cd ${WORKDIR} $ helm install traefik traefik/traefik \ --namespace traefik \ - --values kubernetes/samples/scripts/charts/traefik/values.yaml \ + --values charts/traefik/values.yaml \ --set "kubernetes.namespaces={traefik}" \ - --set "service.type=NodePort" --wait + --set "service.type=NodePort" --wait ``` {{%expand "Click here to see the sample output." %}} ```bash @@ -65,11 +66,11 @@ Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifi {{% /expand %}} - A sample `values.yaml` for deployment of Traefik 2.2.x: + A sample `values.yaml` for deployment of Traefik 2.6.0: ```yaml image: name: traefik - tag: 2.2.8 + tag: 2.6.0 pullPolicy: IfNotPresent ingressRoute: dashboard: @@ -115,6 +116,8 @@ Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifi # The port protocol (TCP/UDP) protocol: TCP nodePort: 30443 + additionalArguments: + - "--log.level=INFO" ``` 1. Verify the Traefik status and find the port number of the SSL and non-SSL services: @@ -149,38 +152,38 @@ Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifi Configure Traefik to manage ingresses created in this namespace, where `traefik` is the Traefik namespace and `wccns` is the namespace of the domain: ```bash - $ helm upgrade traefik traefik/traefik --namespace traefik --reuse-values \ - --set "kubernetes.namespaces={traefik,wccns}" + $ helm upgrade traefik traefik/traefik --namespace traefik --reuse-values \ + --set "kubernetes.namespaces={traefik,wccns}" ``` {{%expand "Click here to see the sample output." %}} ```bash - Release "traefik" has been upgraded. Happy Helming! - NAME: traefik - LAST DEPLOYED: Sun Jan 17 23:43:02 2021 - NAMESPACE: traefik - STATUS: deployed - REVISION: 2 - TEST SUITE: None + Release "traefik" has been upgraded. Happy Helming! + NAME: traefik + LAST DEPLOYED: Sun Jan 17 23:43:02 2021 + NAMESPACE: traefik + STATUS: deployed + REVISION: 2 + TEST SUITE: None ``` {{% /expand %}} #### Create an ingress for the domain Create an ingress for the domain in the domain namespace by using the sample Helm chart. Here path-based routing is used for ingress. -Sample values for default configuration are shown in the file `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/values.yaml`. +Sample values for default configuration are shown in the file `${WORKDIR}/charts/ingress-per-domain/values.yaml`. By default, `type` is `TRAEFIK` , `tls` is `Non-SSL`, and `domainType` is `wccinfra`. These values can be overridden by passing values through the command line or can be edited in the sample file `values.yaml` based on the type of configuration (non-SSL or SSL). -If needed, you can update the ingress YAML file to define more path rules (in section `spec.rules.host.http.paths`) based on the domain application URLs that need to be accessed. The template YAML file for the Traefik (ingress-based) load balancer is located at `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/templates/traefik-ingress.yaml` +If needed, you can update the ingress YAML file to define more path rules (in section `spec.rules.host.http.paths`) based on the domain application URLs that need to be accessed. The template YAML file for the Traefik (ingress-based) load balancer is located at `${WORKDIR}/charts/ingress-per-domain/templates/traefik-ingress.yaml` 1. Install `ingress-per-domain` using Helm for non-SSL configuration: ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ cd ${WORKDIR} $ helm install wcc-traefik-ingress \ - kubernetes/samples/charts/ingress-per-domain \ + charts/ingress-per-domain \ --set type=TRAEFIK \ --namespace wccns \ - --values kubernetes/samples/charts/ingress-per-domain/values.yaml \ - --set "traefik.hostname=$(hostname -f)" + --values charts/ingress-per-domain/values.yaml \ + --set "traefik.hostname=$(hostname -f)" \ --set tls=NONSSL ``` Sample output: @@ -249,13 +252,14 @@ If needed, you can update the ingress YAML file to define more path rules (in se The entry point for SSL access and the Middleware name should be updated in the annotation. The Middleware name should be in the form `-@kubernetescrd`. ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ cd ${WORKDIR} $ helm install wcc-traefik-ingress \ - kubernetes/samples/charts/ingress-per-domain \ + charts/ingress-per-domain \ --set type=TRAEFIK \ --namespace wccns \ - --values kubernetes/samples/charts/ingress-per-domain/values.yaml \ + --values charts/ingress-per-domain/values.yaml \ --set "traefik.hostname=$(hostname -f)" \ + --set "traefik.hostnameorip=$(hostname -f)" \ --set tls=SSL ``` Sample output: @@ -397,14 +401,6 @@ After setting up the Traefik (ingress-based) load balancer, verify that the doma https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/wcc ``` -#### Uninstall the Traefik ingress - -Uninstall and delete the ingress deployment: - -```bash -$ helm delete wcc-traefik-ingress -n wccns -``` - ### End-to-end SSL configuration #### Install the Traefik load balancer for end-to-end SSL @@ -414,9 +410,9 @@ Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifi ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ cd ${WORKDIR} $ kubectl create namespace traefik - $ helm repo add traefik https://containous.github.io/traefik-helm-chart + $ helm repo add traefik https://helm.traefik.io/traefik --force-update ``` Sample output: ```bash @@ -425,11 +421,12 @@ Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifi 1. Install Traefik: ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ cd ${WORKDIR} $ helm install traefik traefik/traefik \ --namespace traefik \ - --values kubernetes/samples/scripts/charts/traefik/values.yaml \ + --values charts/traefik/values.yaml \ --set "kubernetes.namespaces={traefik}" \ + --set "service.type=NodePort" \ --wait ``` {{%expand "Click here to see the sample output." %}} @@ -478,8 +475,8 @@ Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifi Configure Traefik to manage the domain application service created in this namespace, where `traefik` is the Traefik namespace and `wccns` is the namespace of the domain: ```bash - $ helm upgrade traefik traefik/traefik --namespace traefik --reuse-values \ - --set "kubernetes.namespaces={traefik,wccns}" +$ helm upgrade traefik traefik/traefik --namespace traefik --reuse-values \ +--set "kubernetes.namespaces={traefik,wccns}" ``` {{%expand "Click here to see the sample output." %}} ```bash @@ -495,7 +492,11 @@ Configure Traefik to manage the domain application service created in this names #### Create IngressRouteTCP -1. To enable SSL passthrough in Traefik, you can configure a TCP router. A sample YAML for `IngressRouteTCP` is available at `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/tls/traefik-tls.yaml`. The following should be updated in `traefik-tls.yaml`: +1. To enable SSL passthrough in Traefik, you can configure a TCP router. A sample YAML for `IngressRouteTCP` is available at `${WORKDIR}/charts/ingress-per-domain/tls/traefik-tls.yaml`. + + > Note: There is a limitation with load-balancer in end-to-end SSL configuration - accessing multiple types of servers (different Managed Servers and/or Administration Server) at the same time, is currently not supported. we can access only one managed server at a time. + + The following should be updated in `traefik-tls.yaml`: * The service name and the SSL port should be updated in the Services. * The load balancer hostname should be updated in the `HostSNI` rule. @@ -510,17 +511,19 @@ spec: entryPoints: - websecure routes: - - match: HostSNI(`${LOADBALANCER_HOSTNAME}`) + - match: HostSNI(`your_host_name`) services: - name: wccinfra-cluster-ucm-cluster port: 16201 weight: 3 - TerminationDelay: 400 + terminationDelay: 400 tls: passthrough: true ``` 1. Create the IngressRouteTCP: ```bash +cd ${WORKDIR}/charts/ingress-per-domain/tls + $ kubectl apply -f traefik-tls.yaml ``` @@ -538,9 +541,18 @@ LOADBALANCER-SSLPORT is 30443 https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/dc-console https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/wcc ``` +#### Delete the IngressRouteTCP +```bash +cd ${WORKDIR}/charts/ingress-per-domain/tls +$ kubectl delete -f traefik-tls.yaml +``` #### Uninstall Traefik ```bash + $ helm delete wcc-traefik-ingress -n wccns + $ helm delete traefik -n wccns + + $ kubectl delete namespace traefik ``` diff --git a/docs-source/content/wccontent-domains/adminguide/elasticsearch-integration.md b/docs-source/content/wccontent-domains/adminguide/elasticsearch-integration.md index 11a8ca80b..46948839f 100644 --- a/docs-source/content/wccontent-domains/adminguide/elasticsearch-integration.md +++ b/docs-source/content/wccontent-domains/adminguide/elasticsearch-integration.md @@ -7,9 +7,9 @@ description: "Monitor an Oracle WebCenter Sites domain and publish the WebLogic #### 1. Integrate Elasticsearch to WebLogic Kubernetes Operator -For reference information, see [Elasticsearch integration for the WebLogic Kubernetes Operator](https://oracle.github.io/weblogic-kubernetes-operator/samples/simple/elastic-stack/). +For reference information, see [Elasticsearch integration for the WebLogic Kubernetes Operator](https://oracle.github.io/weblogic-kubernetes-operator/samples/elastic-stack/). -To enable elasticsearch integration, you must edit file `kubernetes/charts/weblogic-operator/values.yaml` before deploying the WebLogic Kubernetes Operator. +To enable elasticsearch integration, you must edit file `${WORKDIR}/charts/weblogic-operator/values.yaml` before deploying the WebLogic Kubernetes Operator. ``` # elkIntegrationEnabled specifies whether or not ELK integration is enabled. @@ -17,7 +17,7 @@ elkIntegrationEnabled: true # logStashImage specifies the docker image containing logstash. # This parameter is ignored if 'elkIntegrationEnabled' is false. -logStashImage: "logstash:6.6.0" +logStashImage: "logstash:6.8.23" # elasticSearchHost specifies the hostname of where Elasticsearch is running. # This parameter is ignored if 'elkIntegrationEnabled' is false. @@ -43,21 +43,22 @@ NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM wccinfra-domain-pv 10Gi RWX Retain Bound wccns/wccinfra-domain-pvc wccinfra-domain-storage-class 33d ``` -Create the deployment yaml for Logstash pod. The mounted persistent volume of the domain home will provide access to the WebLogic server logs to Logstash pod. Given below is a sample Logstash deployment yaml. +Create the deployment yaml for Logstash pod by updating the `logstash.yaml`, located at `$WORKDIR/logging-services/logstash/logstash.yaml` according to your configurations. +The mounted persistent volume of the domain home will provide access to the WebLogic server logs to Logstash pod. Given below is a sample Logstash deployment yaml. ``` apiVersion: apps/v1 kind: Deployment metadata: - name: logstash-wls + name: logstash namespace: wccns spec: selector: matchLabels: - app: "logstash-wls" + app: logstash template: # create pods using pod definition in this template metadata: labels: - app: logstash-wls + app: logstash spec: volumes: - name: weblogic-domain-storage-volume @@ -67,7 +68,7 @@ spec: emptyDir: {} containers: - name: logstash - image: logstash:6.6.0 + image: logstash:6.8.23 command: ["/bin/sh"] args: ["/usr/share/logstash/bin/logstash", "-f", "/u01/oracle/user_projects/domains/logstash.conf"] imagePullPolicy: IfNotPresent @@ -81,114 +82,53 @@ spec: name: logstash ``` -Sample Logstash configuration file is located at `kubernetes/samples/scripts/create-wcc-domain/logstash/logstash.conf` +Sample Logstash configuration file is located at +`$WORKDIR/logging-services/logstash/logstash.conf` + ```bash -$ vi kubernetes/samples/scripts/create-wcc-domain/logstash/logstash.conf +$ vi $WORKDIR/logging-services/logstash/logstash.conf ``` ``` -input { - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/AdminServer.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/ucm_server*.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/ibr_server*.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/ipm_server*.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/capture_server*.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/wccadf_server*.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/AdminServer.out" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/ucm_server*.out" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/ibr_server*.out" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/ipm_server*.out" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/capture_server*.out" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/logs/wccinfra/wccadf_server*.out" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/wccinfra/servers/AdminServer/logs/AdminServer-diagnostic.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/wccinfra/servers/**/logs/ucm_server*.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/wccinfra/servers/**/logs/ibr_server*.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/wccinfra/servers/**/logs/ipm_server*.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/wccinfra/servers/**/logs/capture_server*.log" - start_position => beginning - } - file { - path => "/u01/oracle/user_projects/domains/wccinfra/servers/**/logs/wccadf_server*.log" - start_position => beginning - } -} -filter { - grok { - match => [ "message", "<%{DATA:log_timestamp}> <%{WORD:log_level}> <%{WORD:thread}> <%{HOSTNAME:hostname}> <%{HOSTNAME:servername}> <%{DATA:timer}> <<%{DATA:kernel}>> <> <%{DATA:uuid}> <%{NUMBER:timestamp}> <%{DATA:misc}> <%{DATA:log_number}> <%{DATA:log_message}>" ] - } +input { + file { + path => "/u01/oracle/user_projects/domains/wccinfra/servers/**/logs/*-diagnostic.log" + start_position => beginning + } + file { + path => "/u01/oracle/user_projects/domains/logs/wccinfra/*.log" + start_position => beginning + } } -output { - elasticsearch { - hosts => ["elasticsearch.default.svc.cluster.local:9200"] - } + +filter { + grok { + match => [ "message", "<%{DATA:log_timestamp}> <%{WORD:log_level}> <%{WORD:thread}> <%{HOSTNAME:hostname}> <%{HOSTNAME:servername}> <%{DATA:timer}> <<%{DATA:kernel}>> <> <%{DATA:uuid}> <%{NUMBER:timestamp}> <%{DATA:misc}> <%{DATA:log_number}> <%{DATA:log_message}>" ] + } +} +output { + elasticsearch { + hosts => ["elasticsearch.default.svc.cluster.local:9200"] + } } ``` -Here ** means that all ucm_server.log and ibr_server.log from any servers under `wccinfra` will be pushed to Logstash. +This sample configuration will publish all server and Diagnostic logs under `wccinfra` to Logstash. ```bash -$ kubectl cp kubernetes/samples/scripts/create-wcc-domain/logstash/logstash.conf wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/logstash.conf +$ kubectl cp $WORKDIR/logging-services/logstash/logstash.conf wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/logstash.conf ``` #### Deploy Logstash pod After you have created the Logstash deployment yaml and Logstash configuration file, deploy Logstash using following command: ```bash -$ kubectl create -f kubernetes/samples/scripts/create-wcc-domain/logstash/logstash.yaml +$ kubectl create -f $WORKDIR/logging-services/logstash/logstash.yaml ``` #### 3. Test the deployment of Elasticsearch and Kibana The WebLogic Kubernetes Operator also provides a sample deployment of Elasticsearch and Kibana for testing purpose. You can deploy Elasticsearch and Kibana on the Kubernetes cluster as shown below: ```bash -$ cd ${WORKDIR}/weblogic-kubernetes-operator/ -$ kubectl create -f kubernetes/samples/scripts/elasticsearch-and-kibana/elasticsearch_and_kibana.yaml +$ cd ${WORKDIR}/elasticsearch-and-kibana/ +$ kubectl create -f elasticsearch_and_kibana.yaml ``` ##### Get the Kibana dashboard port information as shown below: diff --git a/docs-source/content/wccontent-domains/adminguide/weblogic-logging-exporter-setup.md b/docs-source/content/wccontent-domains/adminguide/weblogic-logging-exporter-setup.md index f7245421e..e0788cc32 100644 --- a/docs-source/content/wccontent-domains/adminguide/weblogic-logging-exporter-setup.md +++ b/docs-source/content/wccontent-domains/adminguide/weblogic-logging-exporter-setup.md @@ -8,7 +8,7 @@ description: "Use the WebLogic Logging Exporter to publish the WebLogic Server l The WebLogic Logging Exporter adds a log event handler to WebLogic Server. WebLogic Server logs can be pushed to Elasticsearch in Kubernetes directly by using the Elasticsearch REST API. For more details, see to the [WebLogic Logging Exporter](https://github.com/oracle/weblogic-logging-exporter) project. -This sample shows you how to publish WebLogic Server logs to Elasticsearch and view them in Kibana. For publishing WebLogic Kubernetes Operator logs, see this [sample](https://oracle.github.io/weblogic-kubernetes-operator/samples/simple/elastic-stack/operator/). +This sample shows you how to publish WebLogic Server logs to Elasticsearch and view them in Kibana. For publishing WebLogic Kubernetes Operator logs, see this [sample](https://oracle.github.io/weblogic-kubernetes-operator/samples/elastic-stack/operator/). #### Prerequisites @@ -22,9 +22,14 @@ The pre-built binaries are available on the WebLogic Logging Exporter [Releases] Download: -* [weblogic-logging-exporter-1.0.0.jar](https://github.com/oracle/weblogic-logging-exporter/releases/download/v1.0.0/weblogic-logging-exporter-1.0.0.jar) from the Releases page. -* [snakeyaml-1.25.jar](https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.25/snakeyaml-1.25.jar) from Maven Central. +* [weblogic-logging-exporter-1.0.1.jar](https://github.com/oracle/weblogic-logging-exporter/releases/download/v1.0.1/weblogic-logging-exporter.jar) from the Releases page. +* [snakeyaml-1.27.jar](https://repo1.maven.org/maven2/org/yaml/snakeyaml/1.27/snakeyaml-1.27.jar) from Maven Central. +``` +$ wget https://github.com/oracle/weblogic-logging-exporter/releases/download/v1.0.1/weblogic-logging-exporter.jar +$ wget -O snakeyaml-1.27.jar https://search.maven.org/remotecontent?filepath=org/yaml/snakeyaml/1.27/snakeyaml-1.27.jar + +``` {{% notice note %}} These identifiers are used in the sample commands in this document. * `wccns`: WebCenter Content domain namespace @@ -34,17 +39,17 @@ Download: #### Copy the JAR Files to the WebLogic Domain Home -Copy the `weblogic-logging-exporter-1.0.0.jar` and `snakeyaml-1.25.jar` files to the domain home directory in the Administration Server pod. +Copy the `weblogic-logging-exporter.jar` and `snakeyaml-1.27.jar` files to the domain home directory in the Administration Server pod. ``` -$ kubectl cp /: +$ kubectl cp /: ``` ``` -$ kubectl cp weblogic-logging-exporter-1.0.0.jar wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/ +$ kubectl cp weblogic-logging-exporter.jar wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/ -$ kubectl cp snakeyaml-1.25.jar wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/ +$ kubectl cp snakeyaml-1.27.jar wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/ ``` @@ -69,7 +74,7 @@ In this step, we configure weblogic-logging-exporter JAR as a startup class in t ``` weblogic-logging-exporter - AdminServer,ucm_cluster,ibr_cluster,ipm_cluster,capture_cluster,wccadf_cluster + adminServer,ucm_cluster,ibr_cluster,ipm_cluster,capture_cluster,wccadf_cluster weblogic.logging.exporter.Startup ``` @@ -79,14 +84,14 @@ In this step, we configure weblogic-logging-exporter JAR as a startup class in t 1. Copy the `setDomainEnv.sh` file from the pod to a local folder: ``` $ kubectl cp wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/bin/setDomainEnv.sh $PWD/setDomainEnv.sh - tar: Removing leading `/' from member names + ``` Ignore exception: `tar: Removing leading '/' from member names` 1. Modify `setDomainEnv.sh` to update the Server Class path, add below code at the end of file: ``` - CLASSPATH=/u01/oracle/user_projects/domains/wccinfra/weblogic-logging-exporter-1.0.0.jar:/u01/oracle/user_projects/domains/wccinfra/snakeyaml-1.25.jar:${CLASSPATH} + CLASSPATH=/u01/oracle/user_projects/domains/wccinfra/weblogic-logging-exporter.jar:/u01/oracle/user_projects/domains/wccinfra/snakeyaml-1.27.jar:${CLASSPATH} export CLASSPATH ``` @@ -99,9 +104,9 @@ In this step, we configure weblogic-logging-exporter JAR as a startup class in t In this step, we will be creating the configuration file for weblogic-logging-exporter. -1. Specify the Elasticsearch server host and port number in file `kubernetes/samples/scripts/create-wcc-domain/utils/weblogic-logging-exporter/WebLogicLoggingExporter.yaml`: +1. Specify the Elasticsearch server host and port number in file `$WORKDIR/logging-services/weblogic-logging-exporter/WebLogicLoggingExporter.yaml`: - Example: + Sample: ``` weblogicLoggingIndexName: wls publishHost: elasticsearch.default.svc.cluster.local @@ -109,14 +114,14 @@ In this step, we will be creating the configuration file for weblogic-logging-ex domainUID: wccinfra weblogicLoggingExporterEnabled: true weblogicLoggingExporterSeverity: Notice - weblogicLoggingExporterBulkSize: 2 + weblogicLoggingExporterBulkSize: 1 weblogicLoggingExporterFilters: - FilterExpression: NOT(MSGID = 'BEA-000449') ``` 2. Copy the `WebLogicLoggingExporter.yaml` file to the domain home directory in the WebLogic Administration Server pod: ``` - $ kubectl cp kubernetes/samples/scripts/create-wcc-domain/utils/weblogic-logging-exporter/WebLogicLoggingExporter.yaml wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/config/ + $ kubectl cp ${WORKDIR}/logging-services/weblogic-logging-exporter/WebLogicLoggingExporter.yaml wccns/wccinfra-adminserver:/u01/oracle/user_projects/domains/wccinfra/config/ ``` #### Restart All the Servers in the Domain diff --git a/docs-source/content/wccontent-domains/adminguide/weblogic-logging-exporter-setup/images/wle-startup-class2.png b/docs-source/content/wccontent-domains/adminguide/weblogic-logging-exporter-setup/images/wle-startup-class2.png index d296887fd2b4c22abd8563e4eed5b18458e5ca81..2bdc6b2e44ea58e2812405e4c85bba353420b2ca 100644 GIT binary patch literal 85757 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 literal 83172 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/prometheus/weblogic_monitor_exporter -in temp dir - adding: config.yml (deflated 63%) - - -``` - -Generate the packages for Managed Servers/clusters with the different configuration file. - - -#### Deploy the WebLogic Monitoring Exporter - -Follow these steps to deploy the package in the WebLogic Server instances: - -1. In the Administration Server and Managed Servers, deploy the WebLogic Monitoring Exporter (`wls-exporter.war`) separately using the Oracle Enterprise Manager. - - ![Wme-Deploy](images/wme-deploy1.png) - -1. Select the servers to which the Exporter WAR should be deployed: - - ![Wme-Deploy-Target-Server](images/wme-deploy2.png) - -1. Set the application name. The application name must be different if it is deployed separately in the Administration Server and Managed Servers. Make sure the context-root for both the deployments is `wls-exporter`: - - ![Wme-Deploy-Contextroot](images/wme-deploy3.png) - -1. Click **Install and start application**. - -1. Then deploy the WebLogic Monitoring Exporter application. - -1. Activate the changes to start the application. If the application is started and the port is exposed, -then you can access the WebLogic Monitoring Exporter console using this URL: `http:///wls-exporter`. - - ![Wme-Test-Url](images/wme-test-url.png) - -1. Repeat same steps for ucm, ibr, ipm, capture and wccadf servers. - -#### Configure Prometheus Operator - -Prometheus enables you to collect metrics from the WebLogic Monitoring Exporter. The Prometheus Operator identifies the targets using service discovery. To get the WebLogic Monitoring Exporter end point discovered as a target, you must create a service monitor pointing to the service. - -See the following sample service monitor deployment YAML configuration file located at - -`kubernetes/samples/scripts/create-wccontent-domains/utils/weblogic-monitoring-exporter/wls-exporter.yaml`. - -`ServiceMonitor` for wls-exporter: - -{{%expand "Click here to see sample content for wls-exporter.yaml" %}} - -``` -apiVersion: v1 -kind: Secret -metadata: - name: basic-auth - namespace: monitoring -data: - password: d2VsY29tZTE= # welcome1 i.e.'WebLogic password' - user: d2VibG9naWM= # weblogic i.e. 'WebLogic username' -type: Opaque ---- -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: wls-exporter-wccinfra - namespace: monitoring - labels: - k8s-app: wls-exporter -spec: - namespaceSelector: - matchNames: - - wccns - selector: - matchLabels: - weblogic.domainName: wccinfra - endpoints: - - basicAuth: - password: - name: basic-auth - key: password - username: - name: basic-auth - key: user - port: default - relabelings: - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - interval: 10s - honorLabels: true - path: /wls-exporter/metrics -``` -{{% /expand %}} - -The exporting of metrics from `wls-exporter` requires `basicAuth` so a Kubernetes `Secret` is created with the user name and password that are base64 encoded. This `Secret` will be used in the `ServiceMonitor` deployment. - -When generating the base64 encoded strings for the user name and password, observe if a new line character is appended in the encoded string. This line character causes an authentication failure. To avoid a new line string, use the following example: - -``` -$ echo -n "welcome1" | base64 -d2VsY29tZTE= - -``` - -In the deployment YAML configuration for `wls-exporter` shown above, `weblogic.domainName: wccinfra` is used as a label under `spec.selector.matchLabels`, so all the services will be selected for the service monitor. If you don't use this label, you should create separate service monitors for each server - if the server name is used as matching labels in `spec.selector.matchLabels`. Doing so will require you to relabel the configuration because Prometheus, by default, ignores the labels provided in the wls-exporter. - -By default, Prometheus does not store all the labels provided by the target. In the service monitor deployment YAML configuration, you must mention the relabeling configuration (`spec.endpoints.relabelings`) so that certain labels provided by `weblogic-monitoring-exporter` (required for the Grafana dashboard) are stored in Prometheus. Do not delete the following section from the configuration YAML file: -``` -relabelings: - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) -``` - -#### Add `RoleBinding` and `Role` for the WebLogic Domain Namespace - -The RoleBinding is required for Prometheus to access the endpoints provided by the WebLogic Monitoring Exporter. You need to add RoleBinding for the namespace under which the WebLogic Servers pods are running in the Kubernetes cluster. Edit the `kube-prometheus/manifests/prometheus-roleBindingSpecificNamespaces.yaml` file in the Prometheus Operator deployment manifests and add the `RoleBinding` for the namespace (`wccns`) similar to the following example: - -``` -- apiVersion: rbac.authorization.k8s.io/v1 - kind: RoleBinding - metadata: - name: prometheus-k8s - namespace: wccns - roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: prometheus-k8s - subjects: - - kind: ServiceAccount - name: prometheus-k8s - namespace: monitoring -``` -Similarly, add the `Role` for the namespace under which the WebLogic Servers pods are running in the Kubernetes cluster. Edit `kube-prometheus/manifests/prometheus-roleSpecificNamespaces.yaml` in the Prometheus Operator deployment manifests and add the `Role` for the namespace (`wccns`) similar to the following example: -``` -- apiVersion: rbac.authorization.k8s.io/v1 - kind: Role - metadata: - name: prometheus-k8s - namespace: wccns - rules: - - apiGroups: - - "" - resources: - - services - - endpoints - - pods - verbs: - - get - - list - - watch -``` -Then apply `prometheus-roleBindingSpecificNamespaces.yaml` and `prometheus-roleSpecificNamespaces.yaml` for the `RoleBinding` and `Role` to take effect in the cluster. -``` -$ kubectl apply -f kube-prometheus/manifests/prometheus-roleBindingSpecificNamespaces.yaml - -$ kubectl apply -f kube-prometheus/manifests/prometheus-roleSpecificNamespaces.yaml -``` -#### Deploy the Service Monitor - -To deploy the service monitor, use the above wls-exporter.yaml deployment YAML and run the following command: -``` -$ cd kubernetes/samples/scripts/create-wccontent-domains/utils/weblogic-monitoring-exporter/ - -$ kubectl create -f wls-exporter.yaml -``` -#### Enable Prometheus to Discover the Service - -After the deployment of the service monitor, Prometheus should be able to discover wls-exporter and export metrics. - -You can access the Prometheus dashboard at `http://mycompany.com:32101/`. - -![Wme-Service-Discovery](images/wme-service-discovery.png) - - -#### Deploy Grafana Dashboard - -To view the domain metrics, deploy the Grafana dashboard provided in the [WebLogic Monitoring Exporter](https://github.com/oracle/weblogic-monitoring-exporter/tree/master/samples/kubernetes/end2end#monitoring-weblogic-server-with-the-grafana-dashboard). - -You can access the Grafana dashboard at `http://mycompany.com:32100/`. - -1. Log in to Grafana dashboard with `admin/admin`. -1. Go to **Settings**, then select **DataSources**, and then **Add Data Source**. - - HTTP URL: Prometheus URL `http://mycompany.com:32101/` - - Auth: Enable Basic Auth - - Basic Auth Details: WebLogic credentials provided in step [Configure Prometheus Operator](#configure-prometheus-operator) - - ![Wme-GP-Add-Datasource](images/wme-gp-add-datasource.png) - -1. Download the `weblogic_dashboard.json` file from [here](weblogic_dashboard.json). -1. Click **Add** and then **Import**. Paste the modified JSON in the Paste JSON block, and then load it. - - ![Wme-GP-Import-Json](images/wme-gp-import-json.png) - - This displays the WebLogic Server Dashboard. - - ![wcc-gp-dashboard](images/wcc-gp-dashboard.png) +![wcc-gp-dashboard](images/wcc-gp-dashboard.png) diff --git a/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-deploy1.png b/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-deploy1.png deleted file mode 100644 index 45525a8c25fe23ae2bd2cf5c57d8e7dd0d192748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220664 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±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 diff --git a/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-deploy2.png b/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-deploy2.png deleted file mode 100644 index 7070d5ab5adb4fe202f050ca08f99749d4611dc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90627 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 HJCg7p$7K8} diff --git a/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-deploy3.png b/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-deploy3.png deleted file mode 100644 index 4122b2fc1f16cf1e91e00830bdeb349363272240..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122246 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 diff --git a/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-gp-add-datasource.png b/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-gp-add-datasource.png deleted file mode 100644 index a39902e3892a320270510f9d137c27f60a077050..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120555 zcmd432UL^mwl0i|C7@EohLnJcf{1`pg-{d_1d*cBLKA6$(0fOvS*Rkt8Id9+^denA zX`u%~?EKD z{5bIbg!2PKHyRq|mZN{i+MMz%X=td~YRdPXdYi6J(x;vC$oNUcNW9lkrn|@|rgZW2 ztv_zOz4ZFUi?44DyPEUySC&k=-ac3U!G%fl@aTSB_?(W_V1`gVK3-o;^~><{6j^on zT8lj>a`G6~@E}&X>F#Ru+L#sXj+uP%vzEbxo9QCPE3VLVS|ply#&gU0{sHXi*Xv{4 z(`yE9L)O<*pf`_c4M2`TGkr>1W~R zuk$Jj{{G-DRvCJqUtF^_qC+!rt1RKfTM^i#wfO(AB0UDA7EF$nX!JmgN6^8~|6cvk z?Z)+T?pvOSI+qbgQLju^H8k6*l!kDo0b3(MrC`VBuJ`H#j)iCh326ab^(_<9YtkbT zl|ujf0xy;q*dT2YaV}A|e$i)=+2a}&p7WDt_voYpsMgiEZ+4{N(doD<7Cc_K0F{kk z32Bb{eDAP5Wm*Q~pprGxw?76esz&(yz8uYK&3n8MHc;PHsss!iTYWp$C(1A?i%Yd_ zK}vOXHOku~(W6CoW&f_r-?#Pmn|)#m_n?+oEFK&%Cpw_LJb3Y8Ew!l9HxjN3Q%Kjo zr22(zO3Gqz%R#$Hu1B1}yh_`!+q~{d<%{OgSn+lq!!09zqU3rt*3^f*(bny=veA|q zBUn_|nU;9s?`G>1C_jWg5BB%6^db?v(ifxMD%qqZ`Lwt(jSh!D=!a1barCI>6Ws)2 zCYOO=CfDf0)@TsAGGgt9;TE>BJ#(C#F6;TJ!dQAaKyaQ?J;#gP-H0_d?>^<4NDK^@ zE{yAWqt#v{(>dK#FVfJ~R+JHQcGAc5DwAs#u0+2R(%=Cp7pDTZey|H(AAN%3!Mk+iSMv& zwD}bp+BJRobstxvkyGN7qM%V@*8i|c7Lflwyn8eET~!>_%T}W&bzni$sI0ik9_*!` zENA|i>+AZ(Y9G&vcCF`|<2;1x2WxVA!bxM-w^%r0OOc)+fqjp1nlDwEO3GoaP&jEQseBd0&wR$`3g2$#1)gr1z;%sqmY#Ezxx`@v z32Y1Ia-7jFUArt?GIf4!%OeAwIpjEsZAtp?wvc_! z@amq$e~y05Z8FRTLDLQG1!&bcWgrx=r(WV4GRJqNyjM$hl+NZJfXFK){QmgGgEG3W z<3!4;Kw(TKHS^KtO2Kry8I^ddbi~I$<6v2TvtP9_#%sz)-_)o?yEQ`keqkWlrJ8zp zFsVduR^gn_`8ZmZ^0<2D6;J1=O(rjYZ~A)%1bxTlaIJXCZszp^LT#ptUq{`y{I_oq zZ~vZ`7G*zqZ0_}M@ZSC;0s;JD2 zQBBF|DIqJ)FJv7N@8y|icO%T4-g!DkY|%G0mKUYov9TSmQNw~CH9SgZGZVfwIbnTy z{DJW>aWV$ijZzuzzE+;UQ=EJzbE`U9V3=51X0jfbOJ*K(65*~mMKPq^cETSRjt5tJ zHHw!XzVol&{HlDN2!5hhw-Z8!s#LNf!%-7)(TQK^m#vtP=*5p42eqi|iAI76{uu1j z^}S*g0=}kmDYzL7NIt%%Xv#^w-g=itTt(Wnr1ez5ODi#x-NC>}zje-bd4{~&BARhcAJoHz_cUlC@Zcnt0 zsg_%xM5<==%YTv(DA$aqq_;U0hBITRzKQSNAVc(i@BKxOKyKfDp9HP)As=6Iy3uR7r;u-KtEq^4U&hrlE-)Zfr*Aj~kdo3CRfeTqar3r{_=UJd z^244O9Kn^oBVvB@6!Ng0BTWx#f9>zMB^`>n&o9*>l&Fis?-GQmhooKQLrFe`#vm!_ z?U{ZxRJUxMZY9NDKbCqvj!Jg*Bh{C!t|hW)Lim!;4-Ryr@eR<#b7zoNXp?9sevfji zi{r0(nyc32Yr@BfPQ045mSg=H4%?FcaPdiaaFKU&6=iR&tty=$Z@pjrYPhT$Mm3z* z8EUjY*j`nDQ?B-Nh#Y z8bIFQe|)8&?HzJ=!p*6(&i+3DOiwuTjmvXHpF(iMl0WX1{zVV| zNsL}>UcXdM5E?!#Rw*LBVl7e-ev#0?f4Z1wN?Jl zFJb$yJ>A7B{p$_Q3)#P2o#v7j!2M2fh*@*}!>X6AVge0l;)`bb@unHq7;~52UnZ44YuYGvo@E!V_uuYsYmZ=8?F>8sUFz;`necEofu+)XvZ(JkBHu@^ zPgZM1$NNa<&q0Xy@2P&tZ(&Zo!Jp~>HqB?rP+FQe7z$jK)gjAxcMOK`;iPF^tcPnQ zIe$Ee=DBe5&Tm$7nst(;;K1Sy^6p|MxV)8xRrYa?M)Hcv6TzINxxpt|acXhQ9xP(A zc7vu%4#yb6cU20vyD6`Eqdv5-WHSG?5t`Sp3E@MOl0!-v=Fo^HUEdU5QQ`5SyqwX? z>>|P&!Z4ZO_@v5VlJCVFX}XLtb_!Jb@0i9LMLO&uZT3XUsOgvoms> zU>-uOL>$n3bUu{YbPd78_11k$`^P>%ZjYGh%K)cY3ZRkSngoXFV;k32fLKhJ?arz+ z!2#z0**$*uknA*P(Him3ENa4afLG_|hP3gm|FN7_8itu|QEgx72v0T_KY5l< zaWJK(8SsEZKQXl~w?@aPX{O(UpE|MfKQIWkD;v4?Jl>rn+beV(fH1pe)FL9xBK$pdAK-W~er6Eh*)CR7Au9DdPHT>H0 z8g31;%g?h~gz8ermfFj4VhhDBIh_j~Pp)K*50CecqsNEFs|fmqGD^^TT+Sjux{BD8cljaX zH@}mxW_^_=_4Yz>C*T$Mx23d;bMGGt$FrGwmmtquWufe*ODlD67Ni5ax^Ta7Gs7l} zKO%8IGmW1jU#GQ0CbNFoU%1EqbAu8^KY^ks1dXKUqLxb!J>23Y%U8nOEpcCRm*i81 z-XY9_C>3=S&sjKeAx`Tk+Le5o`rCa8)!6u}l^N~>9hUPuBvnH6aFf)0c3GqC;XG~L3nqXUutW>G`Dh;Vp z?tETfBf5)WZ|YDGhW*LJ4XO1D;Ot*|VF_ag^h52lB9+qrvWO;i$xJT?QOa+r`u zxi2$d=h4ZJ$$#<|m{ujA;=OptyI)Ro=s#pNBHo*kV_5$>Us(Au-{px2K2Oi-kW6YT zH(_?nz1Y;AKa8}+)Z`f-O8qoeD%fqhM;#hDuWx)UH^a9E-1!tZsU<3#6-JW0Nt#)5 z*q!pzukP2yElOqhYX%y5eC0Hx>i3=?wClkrkENGCsuA!fZloTjBO4Wdxzciq`_(Th zJ$b6d)>&0WyIFm)$aH~n$d;&pyWBge6kUq~HsdYOkUDg&h75Xe5OGp-S0&9(Y7=uR zxb@*=p@O|{-8l1rl}E-DKP>R_Tr4rN@}R_ibcnD+$+Gb<9VzkX`Wo>0kRRL1i(m1} z9$%?ld{LAUuS#`^Lr^9aI&vEiRI3k$@m3>aZP{%r@ulHq5yA!d(*ZD(zfysh z$$UQd;aFqDN#R6Iz;iN!z?KP?`JMKl(rf*_Vd4u0W$dcJ|jscTlEt_xRj{k6H@ zpWk+81+Nxo4Gs;}u0O^-(hS|wq^B|Xi$ z3%r)ng||sv?_VsG?oRUBeq22tmF?>8EMsgNTc!J1q%T5C9DlBG-rCuR4tt`GTC7B>Nm=&8raP_WWi!^5UGM(q(IipDe}AT8{{2bTQ}f=bjXR5ENAAF zG+ydSPdsxs_|t2Ix|7j*Fjf9MZ|BGgQxhf@f$>+Mw(D65#T6MV+6kjRijt=ncg>Y-F9Qf#Ze)iz`18nsmf7Kq7`M-me)Rf;O%QL;;g*?kW1y$bK^-Ti@)325Uy3e)5-ICfSQUAH zbG3*vj7A@1?V@TLlie%(@>R#sO=oN}0~|YDYZ{+maiYGHji&PM;{b&=>ugX0b*u=@ zD?}6nt_{Km`Y<3(5*ul=YZ1K`^@w`|Mk0)d`fKPj5niT*B6_Su+InKf>wz`UZ}z-d7ddj7D|f>Y0oQ2q#iTD zOBtTv_wzq2t}U$Sb{`1C0C?^?;c}{rVMThq?tZMYUUn4{YfGHYeSZJEQT+>?F3EjM z2(wB0N&hrn;Nyy{lk{`g@N5w6x; zMNBK_QD*EJa2!;FLUeO2^qb_-aQdJ%_B>yc`p(}qSghMI!KP1IC%YgKj6F#Wl0OxiuWBL8T;Cdf!;@>JGTpcd7agpD^7Djkq*Awm2M}Hrgwxw3SkanW>d7yDY@j!gCY_18qVVw z(ZEBi7T<55EVde7VmTo7EGK+N!B@k)Cbe>LrA@ed)&9;~^d{L@OD1mNky?=&L$iK~glOs@~sVd3ms4z}0 zM{ie-v8efVzyIbbzFg7mWTv(5ci=v~+$oOAEu5#4=6J=&m#$H`TGy`#i1Gzyptqf7 zryZZAI-qG4ikzN8_YZPQ$y4uD60P^sE2*-!LE(inYuCznz{$hE80|S#7If;`1cF12 zl4USn2z&7;WN-%;ogJoU=G+}R#ZzyFp>%(a>09CH{<2ZthpXPi5DWciuew(h@Ua^9)HyS7M1E+N87)K}_Xp1)OUCjGZeR4|0IYYw43L;|GwC1fEPCOO$ zjH&QR-r+j(gIthH}g=lY?^_l6X@6+rPQDqRK)N>uS)DcvtBuVZ06v~thTL|akN zLPrPTsATmPsLwcW4EL>o)RleU5>Lc2{qM$|8td67`aD45l+}g4l`wsgwBt%9F?3b# zItaPeibrCqxAvPMm82OD%FWSjg6d67sx&DH6kg8 zv)SC5&d_T0I0`VDA2Rz%7TqJsSFMy`tM2xQ5+Y@7-?G6D;*T5EYBO)qQo?I|c9hwr|YCM~)9|wWz>hYoL0CX(}v=ONjVd z4+iGYt3P-S;=6+w_f*2S?be1f9FljbSJ@m6+NmnHm z`&v9MxkR_6&S82i53OFI{CHZoCr(VkgNdb@D9`1Yd%<+c zB}^uX^0|mM^|aRFnd?77lw%~Y)qmX9Ouna?Wf}} zft4P45aZrhMiHJf7sGjd*?Ll$oW#91I@V*6N;o7Xz-l8A<0mFO2iC=_rp*V|NY&$2 z*ld$uoq*GCjaAC?Ipx*T!il|&v0CzP=rQi_p+^eJl$wQ*zflB*$SdY zZkxIlZM#6Vkp~OrJ}t>RRY808=-;aoQYG|4cjBeo0r)- zbp1I#P1E!epX>O-{Kcbi}d5am($eG%=Z= zfdZ_nO`Vgs{RayhO!?bY6=RLJ9^7UzU6RxFj>-))GJty6YCTGN9>X`^ zA7(0CsSWTh8VuYl_TOEn8aeKbi&#ZR>#I#mY`B$h|6CL!n1>RBhRJK#&H7!(#Fu8W zD@WjvUJmy-(lh}1K;YQmnfvzXG9D>@N6cPZM@26?dlLM{DJSkc?AF^Gt-dU+Gepu> z^zB@~VI2}syjF+lEe0fg#pR?<;tz>+LF@_m@HfWtUl-3B##cld~%BwiEfmi z6)nu*WZ(dLU&se^wLN%$*WFDi`L^%v`19Qnw#k2(cKXlnOg_74&=!>WWQpF9_u`2% zp-gc(Rx#wkX)9<&PVUc11#At;?_m`Pk5z-nqt^S(JY9qAf1$xi2{(*Rl(ayJ zm=M)GL?Y#I6nwLo`^ty{WGJY8hOAid8xX`o^cExSh&?Dfp)B_duj{kVRmyzbXTls& zwT~vfme&*pZDrQs;oO=KevnB<-GwghDr6N6pA7fMT*jGm5GX_ z_viD0`fo)BQ@JVOiV?>ZVT~xufw*elY>oYWAJV2-kRU9G8eO^~#knvWG;)2KJWk~o zA$z9Qk%A8O9QT2PI@n#0xyPe0^N$k&6qWK-Kq^w(5Q{6eD4438qNfJjP#%mOnh%PB zY7oPe1nUv#I+D4p+N(MT`l8%af{E(l5uBfecu0#VPkD}~6FjmLJyLp59!8_`Uu~au z^OxR$fpx$@`DE>^H2lO&L0i+4n`MJF=1n`+xS`d{R8s^~ky(Id2(ukUt-#GGw~=ek z71G^OuPi$Q2CdQ@ymfA!J~x?^C~(FaGL<|muPz=4-oU>Z-*(`a=4i#{PPBa{jRp!& z=450^c=)D9?1~)hpnD%qOs6TqYQ|C9BPEz$2Nm*&o)2g4>k$*9;K^63Bk#g;Q1A!V zXy|835|*cXOmaoSMQ&J$9#84}O?4B14%R&$b^6dW4~(?KEKpyT?~ppe&j^30lB0q(VCdSTYx;H}NY`$j1^k zv#&_#`0*t-V<{t3B7!aLv9ezD?u&lcE*Ex8J(6Pfrnd0mL)(v0+(PNA&0+r zVDXwN?bw<}yhsp6T>E75d~&ca(LC^(J8WS4`)2fVuWL$B^~_EJ9YOz~H|^XbnQ{$6_gG9n^f+P6G{QA>j)K74^qlowP*dC$Qhv(NJ znuDLWY9x!TC#Cfaaa^kpsORwwLL4MNvN?%dc`H~by34wc6UEe!Hp2()-3?)!fgzYe z)U?Hb$<9`kHiydcwx*Ba>tg0<{Ki=Fq0;dpa{<7i-A$8Xb#Ytv+aVjGmWx&!Bm1)f z15Vum1Rn!p9nx-i$m=0hqQFw$CPf94;wS7i+_5X2B3YjA&&;#B@w}jP3H!V?f>#M_ zUrdKNGBYy_Ll5Ux9rx2-0kj}YjLpNGZ=C0r8ddJL9bvsxdH!DG7=$1jHP2tzi@jBw zVXO#~kCi~MJPN%i4vk@->hsuM9YsYFF!Ncwr=kMyJE~Ls1Q&Mp#*c;t?%IL?aYoA3 zntPN3RBv)*0}KUq-{urjeOGNI@Sa?Ha#hh|z*qfu^{wa9gNNqVScp4u``AU%i=hDA z+H!98RHqPJwR3z(1H##I?JLR`Oe9y^R|Gu3TNySSn)o2sjO~M;@}u)x;a1=HSvtR& z$#Mcn`3M}2&iV>-vl^b?k@U6-{r-$=}9%eKP zy;M3)C{yo|9L}p6<*JJE8|LKT0B6jewHzxyAv%!~UKhbx<(13T@mIIv6I?YoO&Wh) z+O9`dDvh{0fT8;F^Be0+Of4>LLe5S~PN*6dnv?TEwEq;Tp9Pux^&?My zEtz28xNk4F@jY%r2f?danNr1cq*4EL4gK9mTz>mYE|xC85sCCY9F%rjN@*%Ty|n~d zvv>QG*YG6+Y5Mz#-yJyeRICON( zkyPFK^xZGbs)lJY!2@U@01ABOt=YS~-6qs)zh_r2an$hW?Y8aj_CgMvj=7s257p~k z?zfmQ7@LsQ*co4^k=|@i77YrNomqaZ3!u-~Hcl+fYR3yGaep;5nz2E=(VX~0-rut< zcg0^}t#$wEBj~_~vP77D_spC=z#gJ*?Z$jl7xBx|msY-|E#D-y?K$<&=E_HJpeJ)h zQ2UJ{U?CZLd^hM<1wun}S_l>-^rBM{dc1}P|L7k&GtFrxm;&%A(DbRfgpcI;$9J_a z!W3@4=w!q9XXXCmqoY5rY;K3SRDGA7i8A&40+?lc4CKofWa3y2-4`dQJ7aunjNg-%^C>vc|B zypyYQxMtk;iH=mob4NHYF{rlBMJJtnaHj1?)I+<)X_121pvDOot4MNNba;CZ`MZlp z1-Y#v3Qva$nz&_f=#0KZYH@87iaJlb$WjF+hj)F>mV)a2qyRiz5v)*M@ zWRg%DxPC!oU3$t3K@bQsL@OO`#?G@%E;h=0AUyo19!(jK4pX=!pg&{IQJS)no-qYj!TW6d^^B@GoTd5nLqVo#Q}Hri|LQ$Y~RHDy>-O5 zctd$P*8#EQlHiKLnpEG77Z3NFt_utek4$2V#h?6Df2QJp>a zM+M^2o6Dc%d6uslAV9noN`1_sWAM)n*xh<#|Dx5(UHi8-rWgdM77i zZ+-QB&B*?kS3<($6Byxvt)n|0d4nTJ{Hf2q?o%%gp=!{`_aX>7+;o&fmn!1~psCDU35+H>Lh$h0t~xKo}KaC&fNnTeJ;obU`5u zVtF|h^n=F9{pF{vjfrK!w(u_R6c$BT&uUVNTG7{xMT_vEj~N}lA9&yr>LD2CQJtaZ zbb8V3YAw%>mc1OZphGK;HkE6KV1S&Pzzmo8V?W#2t5_Fik9-qthb$N#SviGd7Rm8B z*2g1s0;zNIyRHJ(NfFu|zja4gd2T}sO626o2-{xuPKnNe-YJU2eQq7p;CPrN38}>Qc--Ik5~Q5<9QgfF7jcav_lg2Ne0TeLS-$hghByzc zo75#P&j;N(H-dWH_%$$YWs@)Fq^FyjRiI3_ENpKxAO*T&QX)Z5#BOKVUhevs5(QY& zN(HT$hbpQ%xH*-q^$v^C7dy019RtUk^ZcJlV5S0 zTb3jBK5a~xD3cxsbq=okBkLOAQ7^x)40G9p_deb_KIER(#sZh%3}`riFSF>_7kIhB ze$DAK0g-AgQMn}OTa^G`Pwhv!CE_ckWwZsk@NK&?-e1wdtq4=S3uWR+vwP;UY5t%!83?5iOxoyei8xaiIaC{S!9BS+ z;&tHHJ}@9>OSAHSFe13c-iI|EEdxx!m=jtG*nk08Tewao0$}SEqW-N^2 zk^h>br&=NTRp*|?YdS6w1KSyNUp{N!y97t5E)X*RNid|mLnn1cW&gPNuk7&K2>(-V zxLoe}X9(tF(-*o6ZAVK!BySml89imY+rCXOF@%F2mwoBX+?qHMN1U*i`sht*QH3%+ zIFbG1N_oyLz(IgB{vMGNdMnsY#`A7>Jo}?l=B>I4;G_$k5xJyGHjK7uvS>cw@2av|8`@akT5K7*UX07fvZwc-L=?-e} ziUx`-(zN)kYK8Zo+u;utVNd@6G7ib;G{h~QA(v#QZr#>@OMM_K!>dFYcVb z{oBjn36KL}HW;@3vx(``?YqIDt>;Dbeq=#p|JZKtz}wd)RNdCTdN0K@+Gdp;_Pkk*$jRa1788{+X4R$m)u`s>DJ z{<9l*BrF}~Jp+mO~K3)~#kn`591;2|lW zbTTtQPtpJK|N6022IT!)v<2aPW2_(K$}3j|>3RGgymt|jDY~Z;sg)7EIcBgHJac594MlC) z{2#o}WVKs=C5RUE|K2!ESPxmw|40{40GEuG*5=c2Umd;?97zHxMXpxOSSC+Fy9J{+ z!!T;DXrpmU6vmP>lN8G+vzuEgd@BHj8FD>f)#GA9&phq1(UUkRlqg*!Jsc}M5b_C3 zMKr*oq<(!mXHezc36&ZN^LHA!thx5OjbOdfooCSYe>O4Z7`TR@(Gpt(C{s0hI z1H9b#2k|Bk7(qwWz+{mbkUCe&!%$KA7Xa7qdcZ+XjqTUEzL1w0z|O z#x3Qb#(aneQa_Rp$eY^J<4h$Asj}a#9CEeyuPHVrv0T(%BzO;i9EX(btR6h7U)J=D zq~}nsJG~Gp5&2@{F8i;r+-tUrIRuR<+EkNX*~uu4kKPtnf8(4Yg1xN;u&jTf@tvYK zxRGBKi?eB4nObB)AXBz}DhOV|0Dxl1SqO^^$+dc+6t=j*Qh#x`W`anYo?y3;rsu|) z&=hXMr&YHbY2WAIxUVN4NOS}qe&KL4Y>Dddi+WRiGWrC&gIbbo&>O~@z0g6Nk;41hsM0y8_Osfa>2)@RAY);r`Xm1t6I50Q$iV+aCX}wp36aRrT%GP_%9o13ud6(%FHA&!ONlIm zO=@1=ei#yX8yGVIzj6;ZBA%Ah5`!NJpIP@uhE0<32mj_b!a~E^9>9@az`+!6HM2=C?MS2{e$hVnU65J5HvR5fg zw(rth=p_+^?aVv+PVcW*%T<1`=>?w&3SXEp6mIyK($nYZ$r$lv~<;45i!Gy`LPYQLkb_-Fbx7y zT!o3bodcPHKr`0CP4!^|wf#9(QY68qYX8$rxE3l-jdjDP8rnPR8ZNdr%7c@fPs}v) zDXS~>%n}PKLl{x=(!i2|euUR!5;6g)_67$jvir>xqvNKGyYs{%~67RT$=7MqFeQE;LL}KlrBarjg<90%>Ebj^LIvL0rK)@FpmDZ~Kpq zn>ZG)2JEZ*5XIJaYgM=n%ZoTQCj0j10$eSg%TZ;SkUVl8nOjm+O#L*cyq}4qY>hlC zWH%m7@HN2%<|+WQLo1ZFg;yttJ=-&~*xNs6EnKIjHa_n2PA`jQjXykPL!|alkcsLtSAyrtd{r!c=NyK>i_*^`*{$A81qeLuA*YS zM-9)6Ysdmq=5ZBjsQpBNu)q@|SwTTw^r3`r{pk)vL%z$;n2=0_C|{;4rVImlIk8&3 z=&?ES@TntK^DBJ{y?<^a{qNJ~|FW1lvCD-NP|4t}x~5V(73=jnO-N9F0e>AvpnypY)+m3z+6@oH#4s0yyh|f9$_dwhE%xKt5 zeKU7my@A~aW~Dr@lsl64k5{`Z)-xjHw0rzN2TZ}G8ihF1eG+*@HS*JZY-GPeBxSa& zrMDnOzTN4$cw8OIjI1XqAM|GMsvHq1?*$UjLYHG-i z73H?XbRS0}m%+|Y@B#(tgkm~7hQ)c#k4tM3DDGu-)R8mEQr3BH0eKM_-ght2VGHZv z758#XcRtDz2gTF~kh)C9F|0=QV*dh8OU^gFt6(b>T`n4eSKbViO*Ct#a%?K>QTqL8~fpa zK=iD2;Q49DlcdWMoL~U=j->A^`P?L539PLsIToJC?z#H~-pgBa3lH>VO)L2hIWsXO$Agy``n@MM z40OcIp~g?bPcx>5<#=+eJw&}tk%nquPD=~gFTpSC1}r1;3_tE~ue`PX(S7=e_zf=o zc$>nS*ImfRD`=;J$T{sfvI>3t$woTq<$bxQJ+$Lm4vz))Gz zq11*FJ-@ekrRSVGHP!E0;asLfG42V>oN zt)d`Rsq)cm?4 z9!JJex1(+b0+HKFU?`MB<*I7_FTT)ihH*lH7k&zsGA zcKi^|e*Qy$yeD~;>%3sYl4Guh=gGM9W~ZvMtlFLf>tw-yu4(6i9~d2 z_3k7aY*f@$j`uwOG5qt#tCyl?yP8~=sJ?b??>TqZoP-O+^O$iZSqEmYsiJ77uCIZG z6MZZGtdnlN#|ADy3Sggea(X6bk>+stWp0Rs>jkZ$j;Cxq~m!YLkqSaBb57_3xjm_A7MC z(7F!yXzt#$p5ZESfLGM$?xf$*T$#j4h^~4wbrx8KW`HG2?BzSbpCnA6^;dzXp;_}r z4R|3GEL5%uRI$J0p!yK@JOsh1?m?>Qcm39M(B5}1I2}hE@ExEftncpN%%h#(Y<{z8pl6fa+Ar6#=x-D8N}5B0k<#4y8gmYC6Yh$!ja9u5KvT>JvXnRG zzg;qtWz+IJ3em0WWEK4(GDW&sGHc4EzLVc4#6hP1J@IDahdumCvT5|DnCe&#x<0Lj z|F-G`orhq!qiu4QW3Z>tdA~vA4=x}4=(QU=%VWmLSx$1`@D6Srqdcg}%ouR>GgA!4 ze&6k%Zt{e}q9cT|CyqWgM|Hd{!n6-x|9<2q$lCRrRA1{Ssq0Y%V!SKgU)FYtEHTBJ zWe)UJu5yaeqh7)5-zTK%j02CdC?HSoH|bM<6mdcd=&He$;=luKAmepHo)Z*$hUq59 zD{+YJ0=hq8V}_08)rP?+_pLY!bJc}Y2`4=7-jp)SV{|>d08)Ku+LgyH0E#tvkz;8+ z!8p`6C!QlpYopr#kLJn$T0}Ds$KYIBdgT+fhGkyGikpQ`+;no>S21m{)+EQ&4IxGG zDf(xziVpExnTIM3zVmv9ACCZNg@9lDe zw4tLntSlf36RY2WO2u@}EA+XQ>#0$0hhUz*>>G1UO7q+8O>dkYcbzwv3DP0UA{3-G z!dA>fu%;qKcN)#SNc{@2`f1baXW3SyA@r!ec~=&sZxlw5nLS~V3z;>K)uU`5lkQ3O z+L@p3tYIrkQ0w-+IP2ruT`&!dk|+1{uN)s|2NtBf*>I~r195x$@32YG&f1!r?(6A* zE%Wep<7C#-(*pgX?NQO8q866&6VB|G;jP6ZI-;ueA3*1`tW`UYgo)K{$7^SF;kT`$@ZM+yNY+&%C?ij>J>`WAA|?f>$3mvj<`_>H#nMNk==Z%` z9Gxb|SvqNp91?oDWrmXV*Sh?)0}qpT4@`J_&D!H235 zaAH<2A&y@`gWN6er;`Ahnh}>c7J~BvA|K<7GJ$#+F+>bC2c-m}vEIxxp6ub=Og=PC%fulMc;bd9$9Znj;+IfEK;7-9QAi=tmO|H+ zPYcJed7qNH?$xvV>elDhDPzX2=@-tU$3~v$%3`azD+h<;j?J#{Fo~^%HNCF+fy=yl zZ8fZkv5ut9+#F~)`DRH&Sldt4wRP&EFlT zwQ3;9`Lh618knjRbOXGcHMQs{*gJN{V?m2|-}+ zC18%=F=X2*_S{*N04txEt(}c(>-8TzjXvnMdM!J5##H&?w;y|lUJTM0B65BLg=JfZ zzqm?^&m+e04BA?YTNXB)0X)}l2dsBok?>xbC7?d@d0Fq>lmHaPW}bfEty+$r$_mw< z9z+eFK!%;RX_>3(rs(DC>#s573e~neMoo$0JDwpoTR(Q?H=C<=_%n7*zHlCai>Bt2 zrF+wF8TNL2(!RC%v+cPDh85ZLV$@|V_Osc!{rf1O(ez*LuSMZ?fA!bm5jIEtwZYh| z>`ahgJo}B{uH}oz!P<~61KjO-i;JtL4RL=p8IPnjzxBF$dzoCwA?1CIWRq1!#`tu4 zpg%17gU?F$aoRCVy_1T9SBj(8Q)>F-gzoUbpF=^Ul}PANy8h6R(r4cX{>lY(FTKyb z3FilVbs6TUv*8R(aJ>CB!2t&*I8sG`w%b$9j&K^`r|PenCVv4;u)WT<_S|I`Q=IHaKxg{rQD^$`A5Qs$I*7k?P~KntIjun~bggSA&Z;QrvWS`6XFp-gz6BwES1N!v zIwO6$+S;vuR1vmK7cP8l;=&^ZC7WBfxU9cNzTK+7#Q3E|ij8(l>XNZ1&Cb*Fy*`EE zLPVnF-LLzqEfF>5x3U~>zi%m!zEWWzkoDx0xvHKOPg#R&tJEx6ex83ZZme}Wm`RlfMN=MvW`x=v$|LD@Sp z<$crUx<0dQneE264~y=}T0IwIL?_XHiEEQY_W%>UA|uq|LxrT3L>bB^0xYm?M#8_= z15_f6FWe*VyOQ>tY-%?!T*B~Ow-F9fJ0R)1nTL%$kYH;)((8B^>Iy%{$-I{|+pjtQ z^51mKH0XFdlVxM?xc_V=W_AinT?q7^(b#s1aW|NLe9`z0cq;6ROgy`#n@x0@P}q61 zfVAFW^I}!>l7%(_@OfaEhHlB}?pL4#`Q=8&mT~md3r#pR!%rnEsJ!c|(M_?ROM=o2 z2iYN$&y(R&oZvrfo~ukLCe2EL!25t&Umtplw>T5z3yAzv{vR&WrSign48>Z71Juzt zd6#-{%@jyeo!p(HPf9*^2gEy=pm_}2A`$E`_&&He^S_X+=m!dgsdwz@#~*hJF^ zk}jfl2q13-P~tEfPQp#5`>qp-N|U$dqL?+l7kK}bmbQ;;q+{Sr4`a`Wg8!t*<-&u4 zD`N~C-`q-8djbZFdftufSZ$$%2^`7_8YtZWD_+PFkR|F23?m0bm24nP*?`Kx4jvy& z1cn!^f8J!{&C7{9BZmS;oQ{S#X2SHaWd^vXY(E&`@PXc(W5I7NTKld`XBM?QYeV}p zcA5aKmY9_8Z)7HhL_n<2{o$5@?=NeyR<%$WxV0Ufz^?wzDh%yE`v0-_o>5J1UE8Q_ zi*A}&KtMo6K&2@NNLP_2O+`vVQ|Vpl9Tfo!ReBd`QbGy6g{>%^B!DDzLiA@BQkjwk6a?b^0kS!q}u3OZFKH~@wv^cU9 z&m=+Twg}?(Kv|1Eu;K4TdqU%6MTUd^N7_cWBZ{>{AB#Dx+jEnzUuC9?uJ#}l_>qE> z4kp;F)iiTEl&-$n3!jNcsP;TVCiP|5Z?)j7?Oo^QzTFNf(u_*5avU#u@%hS z9b;RCw#rygZG@WkTzaf5!u#yLj|<`ZC;!15cf+Sv(<-6C9ERVDt8($&g26ZAJ2Fd> z?<#vSe+)@VcS^PVY^7p;5c%#(P>!6ew5Ho0*Xe%l8$H(NLkAxArV*Y~q!FCu!LKeMw+%pk5`X4u3th#X zQto__Mw*)^KsImUTS6pw-Q4t%TSg5lb;=6VDWXRo1 zR+B1RWVzf7Y3ca2yH*zuuRp3?wF(I$d&P%QcWBSki>C6b$qJOHR*ujGBa{Pwi2Pv^sH7a$Ae z8)sQP3HUlW#SdN_bc)->^eS-W<4cD?J}-UrhiA#WIXX4V89Q8BqBPFzQ2B7qqU4*c z@tu`~`Mf_gomV(64s#elk}P4^hZ;B(D=l|p^8)|-jLQOcj0-wBp2VbM^Y zHDQ!14Tj2t3eFEZ?!+hzDJm(y!1VT8NrB+OwRg67R*pPw=lzLNe4;k7L+IJ$X3c4( zpo7ztH*J}GGV}zW zV@S>l`L3M3E$6~-ck10bAQ*U^Lu2NB|M~a~bF#>J_x+6z!eT?8kvXzm4!Wu2a{K0g z#QErjJY#ij{92b9lz)Kx@p|wX&k6hHjCD>@sj~jkc@EJ<=65FI7^|VMCQb@Fv-7z} zg>J%J&Nm+^)i%%R%2}*vlo-Gf96F;6F#7|}LTl05dozN);{trQMvxt+hG(Zw#7r=C ztcoaK_4W#C<*Xlyc`k8rkTc~}%!ab$U`7OpEbkzfTE+`6QoY5@u)TEkcC;}mZJC(x zt>0N&IV&u0{I8S|MVx&gpL=&hk=P7X!( zKdn4zQ772;wIdmYF^b{vDP@grcseFx>JZ=Ygk4;^#qEm47y1D5u=p(yyT_6_Z`Vzn z9$J`9sLXUGGIR5+De>Wo(Sah$zfr??(|+!|o3A2|2C6m7gg;W+{N_fSaw9$(IO|&I z#@`TqKjkIs8@102pTWOH0eAN~-+R;OnsvFcwwZ1s5I*jb{_bVJTgdzjDV*qLC6qPv zu!1ADHV>F9^S4hgYg@RuhPhh@;}$Q+QP{=IX!@Pn=PwXuuGp^nOwm^RS@keZui-Se zDW&sY(J8lk6@sdyjfOb}=QX|QPruxQdqLCSaYUWRWl(MOR_@hkaWn3At~k;*D5{j8>Vs%xKAQ1n#;hqcrwMN4`Z2Nz&!p&PDK zj%?C6W{KR)%cr#r8hoE{y&`$`E$A=Or0JviWa54!h|LCt{a)SEG0_0fmGSHcrT=h~ z@mkDrqjsYoSCPkll0~X$)e(!8&>+c&)kh}Zo6Actx(O_);ELlj;+)Nc#=>mE;i9Il z;+s+zy`Q@%M_wUGv5R`d-P(I+@KAf#AnaRw*RZM5!lk~Fnr_8oqjM)YV!z+0;7IEd zs$6jh#_d>QAk^;F7ee@^!!{_PEE4%2fd`OEl~^D2&Hy*evyp81iwg zO<*LHL3!tOV-zvNWXshugazuV?Bs)Y3$U{K{!ZIq$`-vX&gYW3632(fPkG!mHHqMu zm3kYkfR250f{qNLuGwodx6YiT%XkpJZ*EUA_QRvhrbZ{#&{%VeS=P~LU}?%ps^JDu zZF8j5JIR1yD#(@c+V}nZ9`XkAPVw2txMD_$RJ4S;?zwsBM`@Fa6EDZ&23PB0FNR$K zUJ5^HK%D0G_j*uyyur7iNXGp!WA(RqBlFeV;R!OXUOTpH8Y51d#dyfqw2M(=?E|!7 zV~WLkGj6Dc`33YB-?4N_DVHr0K7HsmJ@^@P$(w}u$YO30 z1=Hx+DSbLoX1C)OPw3QaZa){~apCR4ZXfMgPX66I2z6InEh|fK|!)>eu&3)9@Z}iXkc&36rhh!ODcRI2pI__}!?pYfikX~nr?st_-MqN$` z=Sa!02%0fmBu+i!PHacX2)OfFObLleySckq*fEMUx__B{JDia4A67Noi{l!dLx;?^ zv0^|p3JI}iTzVtlfZ=mQnP808Tt<;Y7U_$@JuLLT3SSr%*T$d?APq1cP9LAY*>eXb zCY9HFM^AWUOmuUsphsEF{NN`iHHK(r(Iaj*E%XIqzU=AOiGNypo-&pT6L5PkAnLqm zDK~rn#m9KOx}X?dR`%Ep+f~;JG+X_I!inGyA(eNW@DJL@1Wki$9PfpFf553;BT(Aq*LYyd$dMDwK?R#gW7j+ulltNyz*( z?o^y{`J-ji(rM8kOs|A``p!gPQ7zH$I+o+y0y+%kY)X=7=H5(Y+CxGpo+h`$Vq=U*MT=6U&XPD!m-w0*2R-N0q+U=qdQf$fE_) z`=zD0V_31Jm&e_d@6$Xw-n`Mg_d0SprMr~d$I@bpdv7=^5k%lNE;3`ArhBCmGsygS z`MWPb@O62M3*twQ7^dj60{)e^iO#+@XL!^0w>S&|MpV`3jA{I-a}yT z7k&{z-1F`zc<`-XwDtBJi2)0g?(csI6YqKQ9>D1EyT9nr?zzbWqJo%bf9ZbP$#&-NR5El&OR zcHb1a+HrI^1xucMKdq@LU6oi*Z4>&$pXTsHd4F=bGkeTuS{NwTd|fbH zyL{mGUQh>(BHsdcel)k7*dC3$LT$9ozeJW z(nG*A8{ZYpo_h7Ct^T24HOE$fw)wngPYP{%x$~}(|K|mu@)38o%*|)l0*&tc)p0=j zV1N3F_lBS>C49$X-||zZ>+WO$Om$oEz?j$QfrVYoMi<3DE%__pa?=B~KPM)rGd5q3 z3lw(pdK2rz)f2C%W@{wzidrJ0`%5j`fy#v0NS&wCVwZCJ#wxiq@$$GzzyJ1rv&E_U z4ysZQwX*j=8+?(wELB*`-bk=gvtn|u5lgz5M8HA%SOo^jPoeq2oL=uwxuCCu!r7b4 z4PHh$s6;U}pgoo3Y)3iew=xFLA$wOk=>2PpdAZFOzl=|Ga2cKh@^z5{a)g@+o?nfd zoO0p8m8bC1BO`|tyAJp2`4;$)fFtir*vPr7*Cq#duhy-Ee%0<4t2y~ho7H%Ij zsaKd)48GfqmYTg;O-`YQKPKcj5%-z;@y69p)K%1-i-VH8i~UA!EV?5aZB%4uiyJ4N z>}QB5F>S8lHXsn#hqfy!K&@@gj1R{cRK-qb8jLZu^7ESB@jophbyj*jJSxVvqP3}a zxvk5-r!X2{=@5k%CJP6vl&i-ci!~IkEYLs0UuY;m8z!$1Ye+OSew<`Y6u<816oDCX|SRP;U z*IyWx^4v}^7cq^mFR&!Rh;6ZyqPB2G4!%xEtj3*ebY3tmQ1y!9(~7-p+En$pJUbhc zxmP!?Clcm$@&P|6p$k4%F%K;3KflIMfe;Hz!chpkJlUZ9$~Ln@-vw5HZpjmpQ*6@O zKnMV;j7-JW_junB%D{=EP@~srk%C-9yivm~tC2EfbUxgzN8HnYQ1wwO(Ody)Ev!0F=F&krG7t^Ol{}DxALl^>!|?+eq0)W z`&XO#=VLVpxOy671n=_F(Y-3=!@<4qnKc?*y=zj+^k^%eun~W7ZDqfa7Z)0_8A_0g z(4ifVv>?Iq&D*u{&5mk7)_G)fEkvNZeJd?}uHsmGLfh3mW|fTh=o*WdQ^S`u8RESo zWy-uteKv>8;gux?Ildg;eo9;DL{pb?zY(A57djlBHKTs(<{<@~Mw)S0=L%+#yk05G zf3X74Z;L3#A>wU<01BM{Uu>-Gq0A`m6vOIzO4K}~jy!~AjQg58mZvm;CRIUDFSnf@Tq^b~the^kA?WLhl zI;WIJ?#2qQaG6wWieMDX_1N!+VfFcpacOmR#^MMMz}fnUj}tcLQJxjkWm_IHiLEbz zAbe&XvR3Al+7VRYr25X6l<~o}NnAeezU=Jx)Y1t}{93Fls=fQM&in%pt*UM9ei8|X zbX#vzW%LzfAFb_?z4@4kDaDOxiMP|L%?zzaNWByD<8rC3Hvp_ljD2hl^RjD&XP(Sr zuZ8FG5~O>y-+}-MZ*5L8e#0Y{pg>S%gvB|g*7wnW0(ZR00kRpD_S|Lf#xKZ~H5Eyu zk+oOt2(@sZSI)kDFX0;$VY2{4h5vG3og3k$Q-S}10;O(W;b>(!eHIf7f)ZqXZO*A6 z%t_NsN2y>#}ew0oq0+*Rluzja;eb<{ep>m7-xw}HM(sj`~8oA zyZ?i|2QLdn;)os@DYHzl&fvlbiHgEV>F`^#e`uXDb{cw@*2aeHA7vbtqF!psgy&i%6>~yt4(RSqTX|E`HZ$z ziYs8d-PfFq@1+2JqtSgFn<|l&O4(H;aVzFTL#he`YsAtCee$y zy4Zdbli|GI6K2KXi;&q;^cgNl*U8}%j7p`DCka4?wB-X0mw<+bLT52sW`;44qSCWH z6U-<#^FHHWJ9S8b@VL9~>-E(~1gX{O)%F2}eCe5KQTNO|mMIr65^`nYlK1p$q?535 zLSNSiB2_JiZ&+?7%;+0!UKp3)qih-lLYC9VlcvMZfi|Z9O z$V`Q!G@Scq>J7}^l^P<`bt*0G@WV-rZ9Y?9?v;nSDBMBFvW7%5uVBBm5t^+3}tG*mmto1e9 zVss3l>CJR55sG*{g!X!E_;}z90;e6w33aDW&M5an3@wdVtgbk4w8m&z!JGAAD`Z*+dfOheuSUmutq>O%36dk#4B2nH05H^ebfc3R;Tl(X%!d zj}gCr??jTFQtVbIc~%$7fH9&V@NXa3&6|qp09?&if3{%Aj^Y}^6slZ zq~iE-pl=-3;0HEXsWLFX24JnyWl~FsSsn;Ju*VnmW__gpG<&5(ENXP6x;A4oDIQkyBYV* z-*rZ2kXjE~)_9*EqXQg;q4g)PC%Trg(&38r^0qj@dx+z8ul6->?HSp0$(CQN^O@q1 z@|a?E!lI6n0iQz4bXwg?pxqO0c$j>> zA~_NBwtEROp72>vk#2EchYjMom@gz@iz#@58K z%pSx5@oH6D+k9ywJi!U5uL)XRu{AQP_gw#PvG@>(7@KEWbY%sKQ*`>+jwaI z)P|cgqPh1AM$O1b;d6b3!5Cb$i>W!_piX+x4M-vKyKlDfX^Embt@(QFV|*vv%7)9i`qJ*u?>>Gf zC%<#jug!I#CGk<`1#VCh`O8^OyYPq7?r7}Z@%9asMfm%#$VSXLun^q&6>NEbjtZ(F z!|uv2cu0~mFP2w zR6?iM;zMrvrMBkD6?Mn>|laPEGLH(ox1Z zmq{V7!mqns`Io1Q{NAWlEp(yG*tzY{zxLHXJ~L$Bub2`K6?i)S>sMV=1-W;|C65tv zCrbmXdJS;0PqU$r`mY`Mzi8F}O8~8bn`p>wP$4JG!b)D-p7OLDVXHRHcJ`bchIc}M#=ik@%Yj;WIuArvYmq~8#!3DrR_m<9?mFtkHqzdA9Hp}&w=(X;01TH+XG*+IU z%W;60-MIQzlm7DI-I;PNnEB6~-cK?Z^G96>VbySPNW7mkHtb~9R(I2?_fGLsPgB2* z8oQwy-FaDYPpREopM(kj8Cz{gJ+z`QXm8Ah@9X)|Y!{EeFc~b90^ut;^^L1RLyR&? zGxg`u4C7Sx+b*cn5XKB8Fv@AoZ{IJqTU|RWSvt`0<3y7u$kTtl=-USugM&=Ly5r&! z1)k7YPTgbrKlGihSyB<#U0~F2;r`kyL)nFE2}fKy`H^)m6bNcq-qFeU^ryJp*6(rQ zrB44Z5oZ+4rn|G?KC7hTQuSF`S@zZD?Xd~%g2r`K_SFxme&~rw(|u^R^G}?1s*VbC zoe#|omm#S@`Sl82;(A(aI+v{;(L2;0p-!2vyQ>d)(UENG)?wSL?CSwEjN&;okUEE7T0N)k}e`bAz`g=6(&v|++e&;Rx@dy9B6g=-9)%7#C{hodO*Qpsp?VmrN z@#Fih@lbK~^n&|rzxvAChpCT!A4toR*!887umd#T zpb)TH%mVsfgYJS=LtzNF*f1U2qn|%`_{Ycoc-=0VoetJd-cn1H`2M^g9pSe#{?3p> z{a>59<3-Z1L_>r3Elr&P$Nprg#U+wurR1yTZv4Yb212WyvRE}Y-9~-goxLK;H+_EX zi=AbG`qk*K9|Ah3uVa?TyP3>xi*`Wq|NE{w|F0upvr58QT%k;DI1JaA8#(mD%_slu z?KUkDXW%Z=cO^0pPA?ul##_~1URG9hS!~b=2!{N5&fu@GzsJFQ^l#SIcv+>&e%o{V zgN-f09JP0U=ko5wAOD)HsX;;M-F;uqQbIfLV)vBwT*^qJUzbWdwth8@#e4Z68ZtNU z)103Rb2rVW81MARwZ6aL*`CbE-WPUHf^b)qB<)oKl!Fh>$r!p5MhboElNL#^9Fx+S91`j(-#0S*H9vi+~*kH z9_zxxsDSa#x_A4p-3Nf#o=v%LReqM?$q%@9&-viLVw@w;NCp4~pW3yfYq@{rsln)1 z)YDdQKi0cjf`9r6ndiEh+N$ZU%^dErbD#ia!>(@FZE#00lPW-4<2GQ;(r+GT)M@Yf zoAlh5t@ZBh8R91>Lki80*4bR%W{AH96y)~op?*tlG&-*fy{4X=4-Q^2Ml9Da9jYA< zlWs*y6W`nzFQ`-(uaOm=_ak~spX=;d&mSB#k8_wr9TN-f#tY3Dt>k@2o3i@_~uuA#@ z^a}_RE?BZ&=>*RzsY^7|{o7hWt$a*n;i!pQqHFGILM8wAcku2P)1eW9L(3h5(<;v* ztEa05Cq8R6L%$a9L7;6SACVc(=!>f>0j3n!pmHs*I|T6;cw8 z!ivLUb@)PJM{1X1W~%vdn=oQa`MMN&sb1GuE73itu6EiMQhp7aa<&pd0pHLq>ok{F zY2Hq=bsx&7W;`TdBIg=ewlpoYg9Rc61cU{0+u_E|O1lS8MFST&vgI@iq?@Y>@hGOij-(kBUHBXF$!J5Djc43h8sG)R?>AXPj>(E!KuYMj<2vN!obfbR=om4 zZoN<@=baIgqV^oodWYFzM9fRz{%Yg6u!5?RzOO$5V-JyS!L zIQiIa$oKJT3AzcTZN2p&4Y-PQC1S-p)5AY!-p|`U|CPJi9=a|PJh~NW=ku+uf>0Pu zkrMyQ5Equ>){$X57C#n0WF7bQtTcrOEwHj#I|p(S$}^ajE{N{B_Jvr7r5o6|%~=WfH= zq}3m7)P!B#fO10mu(BZq6i=2I+nkhxEg{aDZ#LJ<QcF4<~ROcHxOLXux7Fx6)Jyox>9A+ZZbX*0TJqvTB-4Ceze1{2?oEnUV^qQ%Ry z*}De(;=is?GA0VOjs~A}D?A3RP0d6nI)z~_R!@1F6ca_ELOwILtKFW-iGZgo!;Fe* zmf%Uta2=^na}L|pS0zpOgjY5Uxx4LzWv$>muXZitK>>C>unVJpl8-yb=v;VVKd*_r zXZjTy>Jg}>q*e@SBE3hf?I^U}rVTqE)m5g|$xz$Dk8I$KDpe_E zLV@?hct!Ia_i6cQ8&B(DEZpWPIL^oXPDM*z$W+6`=T4*-i)y|z`>v;e3Tp`#{?k)% z1%be$_4(mrJFzPW;~*eX5->p+G7B3E2nq^LN<9F&wZJ}?&@=H>D!PcRK)b#gjS9Pg z(`j|{9Gq7r%PJK6-5uhrU!rH^3m*9#FL11V@ukXC_zl6aiwTBpcg21-@+S+zzXi49 zzBGc#w{n67N|=}p#hfRe5<}N(x#J4LaQxU8;BP~Dhnqck@uf`MuThDkdNXD z*OXH)=44wcQ*MZ5i7lfM27Ab*R6jDnE1bO)gDK^Tu54IC`iAyb%?B(sN3MI&)g8>e zf2#c1G+NZGSK5S+Gs&c#;LerCX8S_`*KBt*S=9FD2lXm*dVT^#vC-3^McUcwm$Aak zJ2nqo#8g=#V>}OEig&JIR=R8d38yhgbL$!IIr9K`Am-h~@!U6z$Lef5c}O4i!rQG8 z&XyLmFzPWHU?VgPGJAT^zA~j+PAWCUeWZMj7(VnP=FFPhF(nq$rP+Sf>#iT3{WgDI zcl(OG(a3-%P=egE2kdz(O5qq`{njp}azw8ynNR}6ZNxL~+7rPLSNV^{n@gkZt!{(% zj)f+NuOu7zOPl>j6M*+O8rgbga-JidjV_lBx=ta)i3|(R_TBm!eN5A(>p;@nWu@n< zqN+8cokC$!uXG#V3l%MED-64I;fQH-n7y=N@rgSuLWX_f8jS3-CQ8$5AMAH8qy`|ztgYzpWHTjWNLkXLlAj^OQmf@Y>pt{Y`6I{I9+&~+kCkX*CmFhbwYMvm z?VbS?`i9|fLC=*6n-{%I#Wl$!Oiv^2dZod6>eT=tjMThTW>Zi?jZ)RpDt|IVAp5s;qbAXWcz1QF6f);Nn3O zLCQzv{Lr4DgR!ZL!NFNsjtO5~aiNcTarKl9@{jKro;Dt}3Kn;3D<;gWmnm;+mF=GEr@ZY`1zsu-Y|j<=*8_1; z5Mkt`KX`vdyj-Q8X#ibrZPkkkVl!|x%jZ-&c@1BdL^dkQt}vdNVe9xcuD>B@P|<;t z=dzU=Ij>6(2WPpB^+Nefb{s3<#k7RN*n0Qu0U;9{gO#W$TE%$p0s%V}Zt2WIhEriS zy|?rB>L?doq|ftexxcNV%Q2UCT{j@V3F2?nJGb(qr*}RCoYb^KVYq3QsoO&31y!&q4li`EI($eN{@w`hJRt`77^!K*kTmoHmlL>fHJ0AJ^?N zd_JQa_tK2#`hUs`yWflBRgaG-3sDZRd-TIHe_Xpm$9fIUKPo?)r;I|`1nL^028@9) zC7A4@Z*3yJU?p17>4JNnJQ*19>UaL*S}v!U5tIdS#?-&8yr+A;NIv-2+>13xy~Gt@ z4ferDm!5M#PVD%rzfpwHn%q%-;MDXGQFqo`H6d)fxXCQM|`rh1cM zSym5w{R%&MhuO2|Nij%=LMts zLB-%pGri5Lvwb_PAs5!QcvRz0W9!#egFD7WEsyzMJmf2LC5( z=fw1ssegB#e|QPqwpyGVuVj*|Jp; z{2$EI50J~pk3z?L@EW5AK_`0-m%g}l%gSic{!Wnaw&kkwTmf=>YvHwqh>Z1?gvdsR zShvprO}A4M-f4SOlGa+iQ>y6FzgU762JN-g19u?gJK>5~C=mCeNI?@B-W;AuVNZur zJ5SGqQv}+~EehZ0MupwRq^hL!C0P!CE7|pzuJ8qXW!uCbBA>rIj>^}2PKtQibRO)l zas`;@Jgw*4h@yyGvAV-7I*~{`L-+rf{sA!6!9PLLHnt;C0s?gxovgedQ-(~F*UBau zMTw-KU%fw|K=`gmc>O&_V0eWkvSB0GXElGDX?58@G7IlTMnpc)+bZ{2sNIg-X10u! z->BW_-G15pg)D+3JIc%d`={3sLrH5GVO)9-P)n< zERi6_kE<5tYmZMfemSV1cZ?3!h%_*%a`xjf*@jGn`;!^r+k^fQ+p*hkw9-~CUN&L8 zu(5q}i^K<6#}rK{J8lMVEcpW^qVc*v>?c0_iw9_BgR+P15Yh}PHJyb_cu@{eK_a43 z!??kr?hCyEudw~_X?a>FjGgsmj5N%_D0;1)G}K(et(@4Mt%c%#4X6;={#~k6+5fo{Xt^ zys1p;V;m3WzznXcU^jt5dQ;+Z(_N=&ky4IrV(S%J(w?hi(qhVMbC>TGCUti#&M7VP z4sW}2MwTY86B%Khw7RV{N#gA^%c=1)-`s!lf=1jqWW5P5yY03@=9c+PdQjCBf_cW? z)tusek5^sodvpt`6osVRGOG*ua?k@AiVVr3+DrKap;|x}@Kl~1^m}0<;e?D>(Ab~Z zTv(Psiunr(JyR3x9Q02i;)hqcDsZKuC6m@>kne^Qtd(Rm9bHBXyxNoCk2ibZDggyeNS&NE6}(%a zr>DX#D_6%J_p4?NljOA6A_-Wew-y^;XRz^Et-@j6G?}W~GhtOAQz+9+ZLrC6-VTo( z9PJliH>uTJTAJ?(Mfwllf$P--pI+KF^Z7(jS44LF9ObQSn}B zaA|eqN(sw7y_U~>S|Mq1ls+E7vbs?yw|)p@^3~6EB?`SRJAv|qsX7mrUeAE#R3S27 zc@wgr^nDO<#O&=xiwh5@KdDDUxoelKqW52UUjv3(cvRVq>(aF~UZt%08e7<` zH1}l`JuJ%1V{plbe6%M>>y@MY_@;eQP~lmgvQ)C`1LPJobtQP4kAxp>hgl-{Lv!kc zmp9w0w??;t^C88Q4Xq24P-o%Oox%f{$EGvHEk$JK72(JANB+$%3Z=Ue2_w;h4Ia0J z>b*nR6$oJv9xmQzgjm2X6|hXmd@)1&c57O--Eisdpw$;~K%pvA_qLMNoHwk8i2H06 z%J>q+oYu-7zg)-oNsr(r>=EbUW_(>0EH*4v5ori(>l^vf#FW87hEng@Jgss0(h-09 z>X*}c}r?@<*UW23H34D~*=WQYuZFNy4Jb`C5iVo<_dTC`p=%s^B>eIEpSo-uk(tr%BZ* zIn~K^<%Y?l&=i6!8$(3G{F&!baqf((-e%v>9}c@&Y1DHFm(?s|EB%IKB(3z<;Zsu2 z0ID=wMC&}~h{HbICKl;QgQ>NjE3|RVHaahFv|U)YO70}}b6ZxopQGt8RIv5AQm|dI(Owp;YdKQ9 zeF>B@h{dCcfx4xi|PRGaHsyK4*%a6^X)^_gQ& z5=0!=K8Um$$X$N3^v8q!!;Sm-?D@mdGb5u4N=>M_S3<%kp~0z}I(rcjrt<3Dj-xTgEPNXp!6re@qE*8jypD zI1QA;Ng!PD>pSXc<2$K9gQa)&LpWBn28WxR6XiW6K$BK{!`L0ur2_q)9*~meyW#5C z)}(b1OXRPLVHqLzVX`jB4?+_!h26AE5iKC7FLWTv>rY4i1Ey+ z@S1s&cUVj=(rr0^RMtIE1kqb_RFfCKm+LYf9h!!T@t^9^xVTVG$`miDRWHop6UvXD3{Tu5_7r zSzAdZ;*729FpM2Xs00ftZxa#w#u5=7`f@NYsp=-@`u!BUM}>}t+mSM^y?45kt5U*U zh5>(z#n@YZ8vp$Y%8*wJ*8kN(EzVnm8zwEhT7gCQ)t*W^8JIt4RBs$mIse~&&%M;UKPfc@p_Sp%uUio${;j&)FlwpG8^d3norFBUy z%A+daLtpMAy=M;6rH7jEocQ)U_&X@|{NvN0{{RsWKirMOWbG zb@hR5{Us{g^@Q3HizQvntI2((mc)v_-(60CthyN?N3&Rc+j*A%uJ;UIO6u0Bzd0NI zrZ5iMFf;mYTmj|vE>uN-h!W~%rGU*24@Dp?KN;7rm3`KIn~!d;3$y4YDr;zTirnve zATqHotk!v*ZP?j%|7vY@@?xll;9bY(06k)Z zQcBaCbUAu+x(-iWT)bQqzMVMWm78yS$wYn!thwd|;3K+5u+QJ|J~2$l(LU$of8aZF zF6V50eKXdjtn2-D_N1RI0t}5c$PRBo4=uj`v^oXoRsLXr02F0skN$yvokt1K!05uk z=8gyKkl=O!mYo7LI)y^KB?VyDLqoeb>QA6%hkkI$>S{UA4hJlYE0x-GyRhBP1v~JN z$lvPeVg#tD#oxG3W>h##S556TyCw`A&m$!N;Nt;j?_K!u$9r}`o-UX{WgU0ENrT^J z#~kxNs^kPPaP#(#7m1+KySO`JzJo*la7L6x0v7deG`f;2c|yizD$J+cliBZ4 z)}k+Hzqyf*B**r)OAY7<(^TsG!_wjUY>>@6u7Gx;irwtlB*zLGSU42j-UXp|EqRAp zQ(}QiO*wwgIqNCr2U7XN%y-L1A5Ncn(i8en!xA*SJz~b@$6R>g!Yk;nRbgkuzszZi z5^mYiAGasXhKG3mxc#Cgz`Yu8t5}s+>`udCjo75oVP1m@hbY(Z6w?mWXS?e0Mte9Q zv(5GVWD#A9qt>cE1l^!T{Z>|Oo$NjNglQ{%+uFdLc^bujvmwGV&D)@&!2cE!CLY`R zW4i)S%3XK(S=4#=WQJARt)SLW&AC)^v~=;?YwZf7L)3{>?6Zw1hvUe>6Dx-$+LHjg zj1QTwYCNfoYLA84PJ|^Oti6o|P+m;EDO_Ak>~Z=SS{PO!TH1KiP<*P6h=`P!H#l#) zG5F&c!rM&L{ebiQiC)iw4`K)yC(dp7j<0xfkFRwT1kvS;$rFZQTsJ(%omtxNZ;JrI zt?{b~mlo6^lm&4J`Huu7ZogT4*ei|an9xyQAz=Y|NVbNIl8}#Gxn0>qq20cGqDke= z1-7{vW6t#U&O1rLdlQL=2|h6DU`BkKnmQ!wKY`W?Rbx%^0H|23E$WczvYw1(QJE>y4dO|Sd-JwQN001^>r`seFYf?0WO|@!rP}+DGxm#Zi+*e`y>(53rA{juq5+3 ziO`>(=QIsfAe8FEj)EYI{nzTN~; zggq8~a%AO$f)i$OzxjYFwoSX?(IlVZm;Jb)%8J%lMq*qPuV&VVIv!C%<~;u!Kf;9<6#vJ9VrrT2+v1pUxadNv0%rXf^>uHZ|01x4bJlbXcrr#m zJ7FxvPCW7+gQB_F>80)_zP3>^lD5;hlwUUwZl34kuW=E7t{WXiiJ!IG9rxP_e{u8_ zPT!D(bY+#EDSMY(&}?Q2&MgH`dD8Y*5iaLGrnc5sLMebshBK4pmHxr>x<@6Q2HC5) zmUn%BTKNIC`JY1y^o z1Pyq@Wi}o`*^F6Exf`DAirF#w|8k>1&_P}P!kH`dMbuqp_F)@AQEI^T!`U-FJ%lq; zjJq+{pA(#1xjpZ+93qR`JVw(hj4F(2Fu5n}?{6HiF`2BiO6k`ixmz;CG)UJ&wwB5s zkR)=#A{ykZGwo#kGVQLqW%@`uKKJqZa%j~9qvH9X?b2#%m6xRT)O~UVIOgU&AK@}2 z1Vqp(;P}{nZ=&x+gaSk4bWcw0s5ZVMftx(p8I=((2c1NvrA4udhDC2K%U@FpA8D@> z1Y6S7k-Df&^^0SSIc(ZF>Ir9uYg}!Uhz$iUewS(v#$7nRn^^1&;PHn;5yqqsxjLjl zE}eGy%||ab#(xtdG0MMhKMCDli)MnaJ|83DHXe}X3oJYxY%*k=R04+l?+3`Z+>VkF z%~kZ1%hKVLe^dpOK9f9aU!h+)!8xM>*}!3U?0Pw%UVW#k+~@lTA#g0VMQ0)psMYD@ zukd1!-+0vD~2bD(cK)^s#8ZM^xGg6uwYnxtN|hmR%^#NI;3RTR*`matFRWEP#Q?bihlBHk!@(Ol25kF?ZLyus3jKU!UGRTP~%vz2} zbj*0Q#|cYd`48+25uE1TxEU_d9&T>?@h35m_2WzX9VmuGIrci#^Gxk54;}%)LMR!X zejq>%vH0jiQA(f5Rzp^R69cS43K-x_H1q0Am4zpz<>2ZEglqRbJ;FiE+w2-CNpF`7 z8F#db=fc}NlfErHWkOy~0bu_MayGd$N?Ok`3dJeOe|cNPlUf`;otI#p#x41|1?Zl} zpnT2|lI`vLYwlnWh+D`+D}lHuew-(Mb!)>MQzxTdtur!IrpYOdjgPx#HEd#$;v6Gj zQgTDr(7!}LX6vRT@fMy0SaFHu@W{uLQggsPP#Z4wMn_>L{<3K%0`b8|ZpvNTNJ+T@ zXhOrlA*Gy}S3Q0dckRq^fgtyj_hru&i;eyc1NpLZ9G2p;`BiE+HPR|fr!;zpI}3$J z?VlVuEeso_;#tDQhMqj1*>2e8FwqIEN?99nt>V>awzg+Cy**A)p5fQAX&Gm~W$D}u z96I#$`HQjGBh|lMI`s6~p?3zinSMK=c7Cqf|L&Z!?x0(73b*_C>taebL zQ3sa}edaJhnO)&mCZH&8u4`*KwBSA$0O}@17`K z_V&*&yjZr?>71LFoS4V;`fizx3Ra0bzx@*?d_8;WYjN-uvDFU;o6*VW0r&nhI%%Wt zrYBvu!^=lE(wH^v(C5f&t)Ws7=Nq=P+?6lu<`a)`i(c_I$juX;!_*!NKJSedh5EfU zJQ0jNKkDwIU3jL<7)Qa5DA;1YRF-w$)E(dKXG@d5)x#2KQe>R#p636>T{>>r$L_GG zb8m-*7)sk-0AAB^QWPUoTAo!3tw-7M>?DWRE$!!wcc)+4dv%JE9lA*YYyA+D{8#X(0TIXd^)g;u z4(NV|8==m0WB11ey)l56S?da%r{lsLVjNwBrAoCtPQw|$TfXCo2_SamKT-xfq9K$)n z;;W7<$8*+h8YA&?S*}rYo9f0{zB%o4n-W9e>`>=Pd+pW}e!>T|o*Hlb5t`S&SW#_X zJU3TkUJ*mP=)u@vuTY0KRg3qqNo};*_kMJhE7zT-xaf zQWN*hnO9CL-PXFNECC6Zs;JJlAxJ8;xKHo0eQ zIQ5RRscb2Dby;oz3*SkB7!-IvJ=Xr|C)kJov>$*Jfr7mMsnw6Je~SB1|$ zoAtOZN>Ar157W5?6ca`TojXf#E5B8`J@Y_FJvrR(i)QdC7~2RI86%g`{898iG4HP} zismirSK9EbJ0A7BPXx;NA_ecOTtlsSnr}{>#uaB9RSTZ+GG+}AHhJ}wMq~I&3Tt%#)o?AlR3sD`_H)^ z&j7o0x1?m#r>D?abTWr!Osvt9{TO)`Qv0 zV7?~7{R2$OgvEjrpBggyCEYk_w{!ywO)CvV`M!E5@W}2}%@X`coRqY?Dtdxh3GND` zMtd=BxPkp-Ax8vfYinD(ubDtdgAn3u@ig6(<_@^__)lvcE0>w+n+vYF-2B1!5wH$j zBen(Ud&yj$U+64%V;Fp9bz9)xgDK4iVXymwl;x9>C){Lwv((gUMRXKqo@b&mO%o^d zgaaKr)Gr!7$`?B&lj>iCyXC*{&KjMgV7s%}T)Td4mgK0SXn6dU>q5SHP+(q~mpX`T zbQtnh%L+pm+<4ufwgz|gFSR^E`A|YTeozW$G2!M2MeIl^Wz+@au=G3_;Y4~K(9mt14 zKKPB`M8-M+$CJE1)nuPMZ}9F{<@X@j8gAdX6U^VCN{oD7)dDFe36M)UCX zTNKtuGzS&eVmllik<8~}i3jpc5~WLzLZN}2-m{4Ot9jlB--7zzi?;b^zoSEK5^Vw3vUxYu-eBgt1L*x|FC}W7yHtRf`kH5?JIWQ5jEn^)% z$;Y?B%Pax*p~O>{(AKb)IEj7IWyiK2sGd2!kwe#QInufpE5?NQAdW_YXv1&Uafz-@ zPr`X_vw{BcckDvjX$~K4%n~5#TJV!XNjE`Yu9rai0odRiS?{vvYR6Qc)nuQUD5+w` z-N+Ape3h$_RR&>=K?%$3c~if`p39+m$<}dFxGIAtwaR1QQg5OGcp|}s^R+!KY0h@o zd6CSG!^O^>Iu$vp@mVc@tK9y-uaC3Y8W-M$ZoN$f+AU$6D^HynwOEK!|9)L^V;l~> zoQ4s>VXblANxkkd#m>N999xJ&&Y`(uvRzm1_|s(0KBRW|u&i!VXZP>4nw>$(@f*c6 z+w?R~sPaGunhp1%KIo=f+%u4Wn)Vxy-Yb}?5yKryY0$V*oeLkU@lT`_eHosDca5E4 z4(e&fF?3ot^EzoqfmS%Df!)p!_?6a6gqP!H zyulWUi5x1zXez1F*I!Nj>vUz&qx9!YNLG4HF;x_fWITFIS>AxSzcU>Fo6>{(L;tny{PfGY+0E z4)M=@{N!8$3fDJcY83!nw9UD;J$L^*>RQMH-VoxU2~Jw(!24oY9CMDDT;EB`o;g0V{web zI^~7J&Fc%Z=6>*2Eb1*2sqg*eIAe@9ugVpyIRZ6D*6*Tk1lPw+*M1CGWJBi8P}_Ra z(sw!b0CGA2umSV3-@hJiUF{KC^T3+DejAxXlbL(^e?5H9kE1&lw(!^$i(Jc!C%vLi z56{a%i?4WBYhei0fJdDZ!v1`=&+Ga6`R0sQP_sAm4z$jOyjgv*MzyH?$=ss)__4Dv zlHxvHTNTjlXpEd)kk!hy05f-MUWc+jaiTLip~3jB!R&H_jWA@_F2@e%4T>K^rxl z)bPzu&P6|5(Q#g@^O{))vnA(A(Y3%gB1i3yL6wpHt|fO$!lq}0E9TC<9UIU?|GjyX{aa3-|EUTYAK|1>FwgF7WGsD$ zO?N19(=W_Q0BUV+K>{Cju9L^IxplVqruPqpQol$#bOY2H?&D~}1K^|19Wn2H7C+01 z9l%N%*zC0i2h7a=OTfkEl)ri4xiEmAcWeac_M@@DTs;aK*Hh?OEcu*YDbMGzmE?^z zxR0tu1k1|E#HN&EaeVG@da`l2qM@PF%9Sgn4Ur{4Zu;{VFLsy%?F-+(e{U`ga?M&L zR&DLtXIwfead&YI-T%OXw!FF^tq;F;KYM#hA#KwSYx3ti9f?)p>7Dsd-rQ9d4*UA~ zEdU68XWSg)dwVJ(8q4pB;}y3^MH%ojMsn~HWS++2%b5k@Q-FF4?QD*;TJ|;Bg_4*b zXEyQUAp$fX1M_1k3s_Azb-??5GiJ5R^~nR?#F4yNO^r>^@;jS8)z(^@n0Te8aZl5- zI}<|UXs*_YwqC9UdFopn_HK5-v-UukJ4ojrb`^`grLrFxnFqO*_SF(e>c-;7I98ZC zZB??*>s>qWDL0m{)}=+DTH_u!H~qg47t7W3iK^ICb@TyS$$@?w=nBt$ z`taev3TxHe5(~6Jtu{!huH*M+)!!ZN7K&mR2hD{RJ!b=><6$MQ z?RPmT*FRH7UoD7S<=%0B6#Aao3>J3Dz(;J(amFtSSj|erYqghLrhwfDMiWZFk7$ny zPi+=|5{yp?mq$* zSY{Z@94{2#Rksh%w@b6zV!5TJoZf^7tSxG2N|88Gw{%7X?W@_} zV*XIEo>>`84bpzwTJFM*qrf`@ZdEm_fkvwL9RxWOb3QQDST))p`a!SPyFla9NgA#H zLE9t*jZ95^F-gqQNhaQY)P4j_HV>z+uc5m-`N#UPI`0}k)gO>jHawkuuMEaaaevZ3 zt&P*Z?1bGV!s!BpHff(L;GkL)pb+JYp( zQ|XAAGmK$-Iy+}>rd8~~vcUN5WkJ7~_3w8OR3_6*n;AIjtFI>uN-g#^>ER6}B*2vj z_zQ!BI^)F8JU!wR=|#pvDT!y^lF+KV-c~J@7hKtxXDRC(pCU$0IFe#vqauT1DozqaQf8$aD-T{9w23Q@NJ zLQN5IL^XS7jmIhBi-$I&bX4u+SWjjCp3VB>A3o1BG}5{jQPB6t1+3c)OgHpyWYe~W zvx1Tn2nZfiHb)TK+oT%g8toU%$#mt2 zkhq5ZJGW%ha^lvtsiz=q>F*4ol`%Yx+8JF4T{HS=E6vY*0YAIu0j;^Ty_*cO9T?i= zogF>9^E8kBEALW3dnEE4Ni%;5BZaLW^<8LLF^>n-7W^+jTgUOgz-0@!-Afi|;wTTM zvobhg;*ny(LwAo}C{5NlHad)L7>fW!N5`a|QQFWdU?jKJ9(W4lt#*!1n#wZJ>!LsA zn1a9%_r@v3VT7TAdgIq>S96~jLAbTgHc<#6sR07SHi*g9Z4P}R_RzdJY6ZZNO+a@E zR?^3|Eg+w|2U>Ng%O7zT>(;FU!mV5*Sc5&n)*7I7(%kud>$o~aEhv3vsaU7A_W1OD z14-j#4v-fu&lbxp;dryWSA8($mOxge%FcPK@CL=C(N(!PIms%7(t@1^Vw zWY+G-s4=)Q?O_)wazRL%C#e=ZdjZhIL>A?&(L)mDQ&Bg-?p|8z?!xA9Dn(G7+iNs* zAjvsHo)G{wPvk|IDs33h7k`>?-7$=& zKR`%;KhV-9^g#!2fD=1jorjry0@gi6M`CR@QJ3rXNIwmzEUg{l7LUZO!9}3in|iXh zfD?Tm(HtiOUSzMlMS)wH)HXaWdhTwgRuw4cdkrc)ttvTrS*A~4-tHYKGOozu6$_lb zeGvi=-};WTvRU%rO6C-gPP@O-v-~5aT2-a#*r!(&p0d+ZLGRCuRmgz-$vt_SQrBLK#u5JsZw%mE3to$fCx_Jl{5Qdt9E9Z_?E1x4(QUE%_AiPxI zxEjWF&nd)l6J!&*MV_lH!+Z)ffn&j3Y=a|I;+8HpokycNvU8_~{3kOZ(Y`{(NzZ5H4 zJ-yt-zV-TP+o;VP{oEW*(*_Zl75aH544W9(>?g=medwLFPJ#xyO=fArlltRO9Ak6> zDP>wWdx%A?vp$uQOq_Qs-aWad7WePu)?O}E6!C+ZJ(lm!{&g$Bv$Pn?!#uy&t?!z(l#jKg@p z@MT3@io4O772>zNA+S!s+xzY~3mB>3l=r?Md)7B^-;U}p^bASgzhz6XF_v`D|3=<6 zC9A+MlP1P6%x+;`xs;65VdEPg>He2itPS78p8k{&*nVyNH7V+ox9|$VfUx`Ij8A`I zZf%ye5zAK`AOpIoc3zE?XNh z08zq_8NB|skUuMKG*P%Ea7I%W?BRABJl*{9tFKKmNT3CE^=#}9ZZb%K@k-dGebRfT z-0xO|=7VSzQL)t=>8s{iYj8T?ugxp1TG~NaV&N+0SfIRnDyqI{$XMAY_+_t>4J+kn zotq^w?UFDH;q{doxMTg~;2eFcjV44WdjGly-l#@?QDs@ho z3w*mAk0AtH4k_&9rQ!B`#@r|S)g8YD+*we&B9Gw(I(}y)2v=~ngm-CK^ zKXfTcN#|;JIX3PtZy+T~Q`%P4ND2G|AOOye_^My|d`KY894xm=fz&zrJ|ga-J-nLA zy7NykAIxM3i{qmc5?*9w?d#u~QCL_geK6n^```&5>^aaneBq6ZSFcV3B0!7CNo4-I z$Ri7Y9)CMX76rt|*6l!i>{hRFN&Qz7a4`yi`Q(bomM5q1_2v5p^ zV0Uh4rGQvxE(-e5xm3@-NqjamYxsG2P9G32eZ=L{)4qHe0fIaYWWUS7tN88YkcH&Z z?)W7W{_^FB>8ZiwBk0-R^P%J#x$lAV+@k{j{kv?<;*7xEPE5a^m1FoZ4tl!0R*Efs{_1Qxct33g~g-9h00n=5uhKFkThMaYO zzlr!PsoE1!7&e`)ym;s8?{@~8g#q!Q{WrE@*&*YlKzTki>-t7BEL$c$M};hs6?5}* zUF^5Gb{Xa2_oq{t`;<-v-vZiY*TcS#&XrAb+{(LN;y`O|?5g#DWNg}L0tMW>;+{Pe z08;`?-wFu{3AcuqClpmwJR1O^Ssi*hyP**j%urY)ftEer{(boE=XsDTt(z0|80kRp zI2Y8Gg>Rq%cq%$Ro;BTAqFGfLA(IaD5Y^PnD>8}P2JGj{>K2r)S_oc$x)yCSSOI64 z$`qGT|CoDlAxPXr+(&=8wYvUhrg0fQoQcENVoTDj0e*9|u9-S{y9(>F1B)tjcg=By zK$Lc-~}5*kEI zX|SUJ@T`%f4nsm8>&YnQ+Etd)rYdQ6C^hjF&yCBv8Y~nCqBS8W`@Lu$Y$$+PQQh() zS3{EEW>WsTlFB@89?dO9pCb>gb@foTdhd^Y3URD!O>T%g$G;5DJKHE7d9-S3?ulJr z$KBz7EweQ}e*D_+*jQV7x`jL>0Z7vD+&Lt94qsk`dgeJ&Rm0H42kf88aG{FRy@Ynl65D!KFrpq?6#ot+xCc@#CDqd2!ZewZ~HvS7(U z)+ey6y^d*SEo+;3pb$|LvO|p^)@)a7YK3sir+*TyIjaFWEB<&Z3{talc(&(EbekY! zj~<3m1HEM81~|Z;N^u>}wu)SgL9T6M0&NO>wZJ-6Z>x6um+JPk$FCIyLX0K+V!UG& zu~K_9#PnFCwf3kjk6!C7fK~2A%)IAeR0Jk?owt5znu+-4M;bjZ=rT3^5ivHfH`i~} zg3i|r-w<|Veh7~UV$x6BKmV~{(3UL|U0Rmzx&&9~r}SNl{x7~97S8n8N=Hk9CD-C) zhyg+oE6XHGkwOjIjFj9w1MfNM;u6_#QQVo;oqlZLEnLP|$>Me9^k=*vBul8#+h$N_ zP&!jZ$RB@d5Ts%^5B0B;&>lWzqfQG@|Frc)&@s9ATtt9Vt@1q}RQvEXs2dZQ(%Y<- z|GV75fGeFK+xP~69Rh-5EOA%<204)H$y?6f65W5Cwu2Pu$4Q1}qgf2`I1y&Gy=XY~ zlcH6VJvHA85?-mf9;YXHo7WTi(HPuDMv{HwWWmPMkqUrbaCO4LF9W&Ny=i^(t0EMZ zGs=KM%|F!#35>2%Q5r#?ojIajx3KdA3RnbyG~z^HA`bM__$iCv!g#+NMm0ht^2BI~ z)-mS}NPJoiwZGr^w?+}1Myjs&L>7=^LAeY$`M{VZ5vkywpd4a;7Zc^##9vNKw#B*@ zvJC)5u#?^lRB~gQ0vQ>Ep*yAdhW#@x5glu#YPx~%T9sJu?uy|bwNeGKqowBE(z0ba zknaQ@_9JBuTv}NVwuHq#O++PU?FF>xENce-6VQko)^^fE_Z;?qd!J%6kNUPwQGZys zQ+IN0rMO0Iz-3%ylV#?M@tc}8YgDoA$h6lDuhrc@uEGUf9RPHSP{PVKPcp=}_cv0% zWJLXCIy8{j0f>hXJpZ;8zWQWR{XCht?8?sXRO)AUHA0)WW5;tKAHnL3bN9tU(^7DE z^&Z?h9QRq1l--1nd8VHVyzl~4A8wf%O~e38gIMchkD#aLP~7Rcrv^~i2w97!nQg$r zXp!?l-cLKWuMU-OZs>@4#e*cV`4L+sTPm+U_{KL0a>GUX^d`5XeiAzeV|Mem`1@+LW!`-^|r?Ro_6q%X_vf}o; z|0SK$T2lXdSJ-+fW`|J$z-~oUSmz#8!s0=m9R*jFi#)!5c$5;%KraBTpZyNYDz4;k zB@AP+t^kOKVy8}?93yEcURMhGd?UM* zwt%4y1uZS#s)J~ae~=Kaw=Ar$&t=~~q0PO!Sq8tYFW5BwyX(P14z>MhLPsaBZJ`ne zTDOF7Q0-{`%Ke{BzTS@=tFSjl{$gbQ7e^l0X+i_=;ETG{vSt4{!Ttrrje{qKTFsWP zTHgdDJgWN*otN0M1v))B7PtSx&3pImsk=4&B_S!PsFYbU!Iy8 zTuFl%UgS622f#Nu?fvbxUKPZ@@}wi)TmJ%-tig@_W$f(e_|mDDkAof6=ew8p)UsWM2h$D+lqxr&M#UOwg^9^yfXu%7>b!crWGp_f>s=ERg#XM?Ow# z?BW(}#v%8?0~@!((uJ-5D&uyN)RwEa$>EhW!!BDS(Xl?p%u1JVkO6UE9hc=3wgwlR z1se5JyIaq3zC6$(RL{UU$Gljr#~Km&cYy_p4-4FlEmVGm%4s`)$rr_OO_1_RYHfQA zWQKi9_xovG18HHLww+zRO~)w-d1HVZl%*WAh_I%Ah@EIJ>&5J`#h>tXW~PkIA(%Xl z1jhik1?(*6g+ClM2A{gseCm=0Jpg{k`(A&j5mwx;A6pPr=eMb(e%xL3kNuRuRoFuP zS5EdEW~W}Glp%6@5>Vz3-}08(wy=i)kg)y(JO?24TvFT#+h`0709OG%0bJ;w<8p@J z7vpiAd^Vt%AON>dtmHZP9dGW>hZeOWf&3?22QJ^c-<_RvHYiJPoo__i%T|`;aGn#o z;ZceNhE6;$Qn-%L`&3Aj@|g^+)w~ns!*Q|2aaF4_o%)V^0*K?C(|lA7zi|9|3_d5S z2Vh{=Ma5r=94imI@=$bjvqeqbBTzsYnpJ#D*V(n&appvP|B;f|O%g}vlKu>J(AepY zGqQT4$PFNM7pnmIO=zua>sL<<&++PvI-k`xZjW=xVU@3Z&LH+{MuwCgT@Cw0L^y`| zY-`kVI?Vx8o2Y|%e*_FgO7?w;IQZyHb640$ z3QYXZMCYN|94;-Pc@!<8%oD}A#%ElS7Q@Lv6qS6Q(mT&NN|_L0*5<*Mx^e-*U72I=7TA{liR ze!M-;=@n0-StLCf5r;yL_*fYy^qzut;_?%O;gQKIawhL9U%lh#`lV9h@(#6EVF)|~ zXq|@INk<2$uc6I^=7mi?i5%bUg)>0|`!@d(xime97f&kDVv}>DkDI= zSPt=R)q>+j@<>|y2{VK<=XT`hI>4Z!x4(EJLR#oi{%IZ$E?GF)0}Ve^W{=~yv{!}K zQQE6mkRs&Qi#J9WpAQ7C$+Z!_!`Qg)u3LP*f=x>2&@ik|unU99sb24*5Akf5F+f6MhTIf>Pme_b;?uNGYt+{_S>u}77qk(Y)gd>m&z!el z&4-0U!3<_pPCW&l>OARjH+QxOT~p#^=@@uuwDWrVs^YWqiJ9+}j6mR6Wx@V0JrZD& zccx>aI>kT!I33!$86X~gJ-2tHTcAyxv9?Lk%`_m>siR?}i~MkYW0s!4&ntzF-omJe2BB{F(~kocAl5J->l`C6K7=Us@N~hq;^4 z+SJ2W*nK#wa&ZsWv3tq9ixC zUHktcbs&}G^ZyA*eG$7aTgm|X_DlJ_{}SZ?cG~~F(0?V}>f5OO|8TGmW$iNH64KTW zF^g5WbP7#FVWRzavM(;V*u)~pbh+Gqr+lLG@`VA&HvH~vnGrOvC>o|H&2j3zJdsm# zrU)p^@mWuKEVR-s9&|(dn#&Y*XJD%GSi2NXYSvAAxm&&V3!e1#aZc;cwV8Qwj)BO& zy)#boP6~s)mXCN&itgtK-1;;Y3Fl>RzXza)NT)AnZ3uJF_}uKl&+J=`Q2(IEH3=|c zS)gesAFDPtYdxAXlf8=oboNe2eUTc(NjDYbZeT}xWV9x0to_9W^}V1PC)Z~+a0`=Z zh_n!lVN&K5SA_LbSz20b?z^7X6V+`9T|{g38r)g8kNxn$E{f)vP2)FqAP78ysgiN7 zNl3>*o8-6s&gNLoE} ziLD!ql9#*$moxV=+u}TPUJVf z$7?8bA`@pKxt5L%G_Sq^B&eM;+^LA`$eh{@u5H6KyzT^FN_x*f6uA}Yb3!5{_!wzO z*ff{M(|Ywp2)}2wbYh1skC%{U5oI;_^&0y;ZT}^rJxJQ#(Q+q9e zN-ZpV2hs&K8ERGC4X>SCz11yUW^HnRs1k=Qd_?NI}ulzDbb zsqd8*2|zD5?{>aV94tP^Z|ntb5u(>gQU)zN(nj(RlSE#Iwc`Z{##xQqCLfn6Ewy$O z5EKq0sy)1hdpBGf_{d27diNoah-2bmQ|aZ3>!M?LpT^X6;f{fq^~rT|QxB+Nm2!LC z(OsWBM|Jsdf8Qa1k@erAi>EuUC}wyx$g`5{ z-0|&SZ=G@yt2wBwJY_vLB2q{q}+D&Xp=vh);ZHM_GXXrwA%C(Oc5|C z>F~ZTO3?ss2=gwAcbhE9El5NUt_xy>1k?0nw8mjU@w*tzWBnkM-Rjxr9919I--}ap z$(Aqt@bBvE;xWrEzW??yzx{GY;`?0x-*}-bo$ZD9H;bQZA_Z+&_QscjvwJa8$TMIt z3g>T1ko-<_7Ce4jr1Xuj41KOP)~_P)(qre-hq(+y;t+Y(vsm;E$1h#TNGZ!pMgvl7Hc%~{1^I& z4B!3^!BoUQPruuC^F0v#@5aj5dI3`UG8#(8u12Gur#HW4;C1f1?;|LgOhoKAgn+7Q zJKCBeva}c-hk*?3b=O&M>@C7%>=ue6ew4rGPWZYGhs;@XsA`e?&iL*quLHZV8vy$% z$}CcdhwdyrmJv(PJN2L-9MWE+!Qa8BGv>gVCt-eEht&j$g;ecjM&C^jAZ)jX z{~1a>Ayb>#9d$pt4`_v}w5a_3aBF}|1RP2nc-Y>Oe7S*t4r7pW_{ockWaV|hHbC9; z+vWhu=f$+GfwL7f_zIqp0v60r`am+Um; zlU+3Zz|W&Cvq!_pEsvz)Wpx)b?Cf39`4lrqHhi(Jms=25#ndq+}$jj6MJlALk`UnO4>WB#n17Mch$k)CyrzZ za}_(Y+-g}6VkY4TcHFbx!@`St`;$B;{$_1a=D9S-mSC_%G2N1O1&Y%y(%f=zR4R?f zeLC2{)j3sy+knf5wWZy!Ex5a(W8{H=lYQT}C*iYzy_NLv0zQ{#=r1@b*yjERm>n~l z;S@P@$^vzjH$e*y>PW3aZwSBeoU=$0tyxOZ@byS;&MJPc>I$&KK6%KHp_^RXAL*eG zO;-PF5;zW>+Jy9(m_mUOWJSX*V1Q9&_TP_Al$w&eL)>kQ1w5{s!y}<@{pdA#-7)^( z7AQ@953=Sa?$D^^rKor!(KMYVN%MkGb+$M4Q{TE8b_LkUgPo|7(OtZ&m7Lk*4BAk0 zyu)hNlN4ebnP4F-vMC)G!6jdHsv(h(_Kdx8ymtddQiX?L3k3kne*Oe3aiG30b=>C| z!C82==0hFE$;(T8aFVZJlj3y z)1v$GN|O&bICZ403(f0lnYlK@T99HVE);-YN=&2bo|Dh_)_Bkr*))dl(q zb4%B!wZkCKNRrIRLKSkVLR7HcG3ZwETU$Uk)dwC^Yu7-HK2ewBcA-;E!BcMf5X#rt zllG?2&X>?MeHq578q^1Kj$lX!w}59STfGRZ36~&;XcbxhI`cufwrm3eu$QA~Lx*zZ zwakVD3m4r&!OjShLdonYRNR!{YtcBUjmSWTpegW1^USyz!Oo)7BO^V__1pHAY~;wfv(bryx9{|0XW zxSf{bsXnnqga7U)gTIcvv+T1DcNVf>mgKi z=^=LQ^0k>u8{?PjtOysu`L~9&7v?lqU)IRqwCW0?^TMn@CcATU^uvc=1pn!!X{5wr z?VRRN?PYI>2SB#s;!hG8IOKocWq!>A%WWy8ZSj|X2Tk^UIydj$-CJ5Gz2f@wL8|f@ zUPlo6aV7Fac%LJ+3{N9S^#xR4of2lRn!DVe^d$#vYRb(1@>I_BU>VMZq>={Mf+OFb5q#2qc!qLAlW>Sv4Sv&q-lP=g&8I?P8Zhf0=gd-TN} zSc_-IubxquCf4E!4GnOedJ(8ab)Z-6?9-=~`s$;q?fb}#=J}T@ms#??yWdRR2B4A* zxaOqw4y87b&rCe)t?HFL2_zXi|0V8d{RB6R_YlHdbBo^Y)zGN16kK|)}|MkG>1iPJtw5Zwh#iwGiuhXof$qCJ|UhBWg`WsKfqc9f8w7p0cMde76 zfaJK>D|Z@cGapWE^jezLsL!7z`!??D>ksZRW?YM^^=QJD2)UJM3GaVVMCj)a_+d(^Ji}XVY3;akaBj*en@5brF+gl-C5kX$*ryMm|O4qn=#D=GI zwza4#|QW!tuGt7XF=!Kk}84GCuhAyP}Mc^)G@zCf5ZI+KODo8(x z7UCuhhuGNBTm{0*ZuErV41P8(lRPs!fS=*a)_<%?e|kW0lRMo>9z@SDy`uR;jEu8q zd*8}O>sIya@0|RF?NEFBR<*kMz8KDgsTXABkZb3~L1Sw?p8-PA0z8#_qG_eX4gWn> z#7kgpZiOK^EXXylE3GppjsUG<<_h`dWog=XSvn9cWp^#F0l6V4Ss_IN(Ad9N?+iUXmo7KHC_uHBpAeY8ydd&1d8WmkrF}NFR^f! zmqIBy70P3W)KIFQ%6P}=P1tcFS5E*H4sQSN4zdHc5ey7ST`~^vTMj z+x1I9wGO{KIJ(pk8bSg}H|x9_&44}?Ay;!Flk_rros9%KbFEp15&JrQ4;y-+>2D;GmEkB zH$eNo-vdvjFozmvrVONs4j^Ned~B#|W1F;Gyq@1<1ARyAa(S_}s`(l%s%`NZ6n^*n z3gOW`gqcanWSY!LsIYzZ`2-|#k4~0g9k)pGl%l@}uC#E%a3W-;hdd}hTgGr}@t+L| z`Z{Y7@0cMUKiwe}WatTv2tb?s^ZaESq-b0VqDok}wy?s0tb|=f106FO(~Nr=CH%8Uh6w=9!A0PPsGEh;U!iJW!R!c8?rC>$%1{Kw?Dec8_-CTY9A> ziHKDssET{c)#FVDB(xHCSL*_WFfKLY`F_oqYwh;^Fi+Wzhf_LE2M8)Hnd3$6d=sDU zv_cM^@p@|*HB3-)k0PCu$kq)WX%?6v*fDkN3&5Ip1lGJR>tYYJ5Ck^HE6hwp@nb`T zA(pR+_9!-%^ImoKIgcS!5>9St2+5o_Y#P0t3-9VSJTWUIyYpAi#?F+HrvXbb71H$3 z23h~qdG@(H8Bo~SA(&~WmvQpLh?4F=!wvsz*+so%?IE>d(bR+nNaJhi2WG=OB@%yZ z)$sm&E@=X{bwaECl3Nq|J^|i%II+Y&)fpX^vm~N}ZZ!|Fzj_WI^yAFRsxbdX_eedtx`7 z1G0d9shv$D3!Gf1=8PP9);QkU@fFYK40@*7kmWR#8qK)PYhUxv17NcT2lT``TEhby z95fzm)MTD_fp+}mBf}66p)^%nrk>&_BIl}EpHx>jdk;IRnP#4_g*SHWo{T?Qi%e)= zL2F{p3HC5hE-??el_dd;r#zTVdwPZSS!usvzpH)DXzXDpPKdKST^K3`P_ zmHj$x5^b5(m^R4uQ(litMre*du!eN(^$5V^7p3{{O{2t31G|C)1ZY;Qq2S5c4#YuTO76bEuwti>e?(TC?2X_j6-<&tzm?-T?D)CW zz5^$LJb-7IP(mg+$BDy910cb8-fnWlF2c>Z9_J=F^-RCpeKG^BrEbgo; zxbtNFTh)*>VZUO+pN`1PBTm{knjC2j6!&iCI}hENDyKF<7NvE$VGFAx=hno#(I`w- zgF%R5mG5+w*R>2FCHMZpyiZQ2m{{KK&`4#(O}dbu{xvYbvDko-c@8k>%Htgtfn7%b zju!iO8?!`XlIVKfL=i$du`6@nz#Gn%z!3%VmC~AV!GB_9mz%eo=Abg#Cw?uiEQa-F zYB~R90bW>yPnsGERRl7s6YfCDf2Y}5LJ>3e|C5{NX`~SID@ggEVAf}{W$WNAuuIZM zrry>90|1x4l4<~tlTy>t7Q@_v8%y9+=j~gC>h0&N>sn>N<^kS2 zw`{!BXYaKUj252gOcEB>9H{&yfEN)nxG?_+Qc@^pvy!o!8;N;SoI-!bX4r3Vkaxg% z)+L;!L6GjCgdVBfHr_9R;oXljSH<1}-K8cbC|TAQmD+at(Bs*LyLL76c-!ZJoi;~Ei`$vsS$_Rb&|*{=gd}g6k9gj2zQ-i< zw*&t3|3m5c|GwJ%2>g&x{cS}4zsau12FmZwT)cR%$ba;==b{6P)WIlcAt`&~FZhqe zvbmGzOR8q#8>dC##X=rbK``3T?g=B05N5?j+m!3?;*hk3%DY1)uf7+u&C>(RmV2%c z2X}sG14`}$UQO*y$;Op_RlzgBp1qBwD(4XRg*^1@0T;ffw^xO#ke99MSmO!R0NHka zfLAH!=h=B))?i4ISqsVLe>yHv8gseZD0W@-XZ8FV-<_-)Eq{u+R%b)@v%1R#IrB}A zfg$c*%5q<*p@VYPJsMtA1(vP2yA$xoE+-zB9z0FQJbgE5XEv=)_XW|`xt;U{CNWumqnEE37wr1@Tl~N;u z%e2U@FKz6_WMo=#df9FH$UN`hiq1dg>(L!L`1k6HWNuTKrvI~q=p)dGZ+jseUiui= zK??s~o;{{{OtlYY=^FDI;@On*X|4xDCFHW*Ce}t^^R$US@Ue#Hhk>T55$WN3(gRNI zA?W7#mfjOgUY5K;k^a^&{pOO41@N=Jk4m$%n%_pJJY|;D)<2~&XwwSbPaj%mq|Wtw zOB^h6$LR0gvb`?m>41IjUR?Zvxz?#+6-|~vOSL&FcN9|ZX@xd?*%@AQvQ;r!j-D|n zteF84i<=K877j@{`5)Z$$Y-IRi&T6H(_~O_kIfi-@)6);Y6Z6|Q_Y+232h8&Bha#^ zkG6`{Ln?;?@62i22?w1JremT|IDs ztJ$cTWHp!+HPlmknmVM)$z@#aQ)#5nWpbAxH$cd{z`|#OB$Kc(+_Yo!E|x|lg}En5 zvdHDt*i6;YPil28vN~pFJAggHR$AO%PBQ%U3U(vTeEk?cBjJ+RmF8 zkC`n&g@BwgMUWeBr5^qDLYMt5{HY~Jt7h0wf0K7tJ|<(zu`2PvTwltPT9WTq!oE}!y6$AEN74Cn zm_)M*MSW$vM%ra+!_5bGobR=S{Ln^%YoMkMgJpu&@f`a7%0WbUPo?yeK5;WaeEVvf z%ohzLk1J3^NPcY&4`h1Zzg4iEKxO?y`tHVG&-8`*xYHqmj!)jv!NkAR%QSGO?~`>i z8%%?y<}8vs=B&(-4>@ozT3~d0dkk7P!x-`|*Q_j=^Wj1+16aI{_`S7Rt?SKgeNP+4 z+ijuEEppK~lwHWansvC$xCuM9ee2hPx#(i{vhZp)8n=ycKJLP38ItkU<5tbn2Ny6-B5y5$$dydmfkMw`Zz73^97j=h?Tb7t+KuB|b2c$cc=S-Z5JLpqNcf4rC zDh5wBk+>+fOECscmJFJ0v_#)*IQIz5Bij+GrCLKa4+41hdZ4i#P9-nTrjH#z`mOe)TyM$c>>l`Qx8T_R zKdBuQ01f0rfkqh2i?ARU12U>B{_$gG5NV-ytNe%Ti0^IiHm$#-Ar2mWJ==H9c@8pr z?(A>`)D(R>(eB0O&5whBfd^RhT8D%d_nVT}sX&SK?%lifXsL|c1+cES~m5 zqk*3iM?4PYd)_VTrwe}dWZw$$4(M2koOl!A@~+!~%Sh<+qO=c_kLk6B#M1rj1itA) z{{Wij-BXu2#g6k>e_8hutjPY>a9~bEp+?FAXQj~7#AJ2z?E2UYq#%*&i~8k=?!GoP zR}6Q>7>oJ{oN4D-NbK}>#!i(^I^Y-HX>7^g&bJ~+2ytDNUg(hxB$<>J-kNKK;P*b* zwJhRWUHHb)rC4mfn}8A4>CWX1ixT6X$AA9o8eILizwG(n^_TZn&>DovI!6^t3`3WY zB!|%G9K#*^#+<&@fT)=IlVGxQVdJjr&zI0Apqj>gDpy_iAp(=%KH`t?rKK&%jh z*A3wAgz??AG(J!%rd?t(Roa8c&+&tB+C=~XR?m~(rmWq9ELa`<0j)|t3lKBLDjJQS zo;#=jG+%1bb$X8o&btrv!-w0{B`faRmWj;dvAANJSR(_tuA{f5+gOgi`w!&B>Syn< zkn%tB;4bJ_CQb}@f5O*gv8F4ua;~P!>IoHnmIF}jU$Pea#(fCZx5RtsXPymeX96bu zvcvO)mkNZDBe>c{G&VbFmWbO6^n|OP1YG@TY=i7Nrl;u85$m9kNQe6=^r|eqpuf?` zJy>to)}#)C5%&LK@6F?(Zri`{uIs9+J(W;|v=Bli6o%{}gd%&^!B`SwU#^N|4V{9{nG5kK3%6;Em_v`mO&-Z&h&-eAZ|7w}f=lq<@aUSP! z9>@E5AJkOc3Q+0lpqOWCyi;P@1{dya?Crq~LrzE|F_&q$uqO^RJpdej$7sH>8tq_c z#M3_3$+YaD?v{sl>0gln34jxIwb5&({xGccf-ol;i|%o;R_p%b$*-0?(8Wt-aeo@;zPp z>lR<@m#Yd!Y}p4Im@P%q+3)mONq$p*`Ow=U|Xm~`}GTp z>-TApwpY#6pp?$3!>}I8TDFyyO?Qi2?z=K9(&FW3T6-@G9?3uulzVv1?ScU90E5$tch)0^i?`))6!^}$yhUmy*#QC#`0^`|krqrAP z3u~hIP4fdvw${dvxtUq=l;vgax|=xHHJDCN1|uUvpyd+UBC5<61K1OTT<#yLp@&>(rwrME;$4MJ^{d& zDT>Gj#~r6}hB9|s3Q&^)N;>wa0jTb(b)C;2T^lGoDIkZdGvhTbC zc&U;%nBa3um$eCFLmeyQU7pQg1KntVj$2^%rAN~f54{ERQ zabWn(yaD3alW(7-ce1{WeJvpY;40SQXOOf{&o2&${>g%d*&12d>1k<(w34i%Y@vdKx%_c{nYzKmu{!Vsaf~c% zB<)`Kr<;LpvFx-to%{e>6h0-Ae?NmJ^>FMIY&;&utH+ukZOj-9m}s1ua6zduP6zX! zs6&8WL-?A{g5Et7@z)V4tgz}xp~rY9 z>);kf{dL1qE#amqEO|p`@gTUvx~4L$N^K@6$WBsn?jGFT98c2T7M0fWsg8u%&!R^8 zygi>T09<*ou*nVL@Aq|KL*nIysHi*T#!a^B)5SJ=Dk3QNu~EY`O6 z2$YDq{vb41iP}Slnh$)diMaDlss?0gVJ;$TO5|CD63^Hgc9-@R$xd%DDCQghDkZ2e z#C11)%uMra$G-VSf>{f2MF1JTn+zfVNOwhWRT0l8r%BG0gJ^By;8I(238O#?7oD4e zG2i6=T;LN+9owv&A#!b@v=cS&?+fH=fpzk9r!s^~+!d@9r;98(pLtiy=IILdCZ4ZbdcLNxo<>J}PCc;A{nV2Ng zImS=H#GqPY+gI;D4_kisQ{?HTiKxWBDOi?a5sI@8^We@Vy&7-1v+~-+rhPc~_cjwK0%#M|4z@$UOKewU=2U? z#r#2@+&*Km!iO(^KaXP{nsLZFax&{lPylMSK6_DP1x^Fvn`;n_D&`0I%lr{f&!QjO)JwfwNT<_4Ju$sc6Jn? zY1%})u$!#Q*B3Ql^tAJUV{tv7Qs~^|fE()(sUo8RGmfKz@F>T35GZb=NlMHubB!l& zFiCx#-^kA$?03MYH;?I#aKLeuZ`AbtRC;(st)ozt6hY`jm;UUq3d|U(9|G3si54E} zxC&4Jb0T42PBki)`!m2^Q>E1{1i#4`9K2=G1o9OdWOs%w$XA7IXGkThNFF-qCYy}qm2FMr+0LYCx!9INI= zG|K-w(gJ{cNWw+Cwv$mrv@A~C?HZia{WRW#?^26)BRd81(+=rNBUn%AS7+<=R5ABP z6vlUWuKvlDEC3KcWd+2Neb)cr`;>&%0P<|*v~}3K<6F5~Hi{>RBotkLBnk_HrHz8t zjNAvuQV|~N;l;JxJiXSqiUVM~dtbIz!bTA*Bo9%NyrP5a(yG1Aa_$g4R?s&V!($UX?IV) z|GHWV+x`AjucnbFD7}+0SXS7yX?)VujXR%M@O7<)|CKeIA6@^Uvt`l=j&h|`K9M9( zVy;wUu_`lh*-wJ3T#52bUqSi6jzeGdTf?We&^U|R9P@#T*ycw62e|@DUesA4rIVJ7KWF|^lRG`Vx9F@k@F5!z z8@0qdA)$K!eG)h(W#bkkoi`<%C?e3#VRFhi<%W)GySpspw}u7TvO}UneigU$#w+sA zfo+uKt&Naha#s4Ar2q}eNf1+Pkn>tDa0c94hHr=C8FEL}fVWWVqQL9L#(mHenWDT!sGS-z;{4MF? zfHHO^LPzuc%?o`bH+#gBWsi!geYX z5ix}E`YBjsr>G>Oh$N(EY*5_2*9?qfqQ&NrnnhM>Hk_*YetvkL3<{GkoPSWfeCB@g z=w;f$T6{Dcv3Tv{))yPHLbM7`oRH0iceDB38US z?iq976C2Ezvth03;U{ql40slPI5oMlmSoL@x10*EgtEu1H2ZffNq9osHPfC+C*{)| zNE3qvOEX^Ux7i&%Z~7<&mcj?{&>Cpr{(N1=pN^=+*gC8l`c7I5!7W*;qhx!;hW;$- z&ciTwU<`hkx4c8dM0R}!8=Li6pkPT}6v)TP=#Ejv>N%vAoe-y#oTCstb#mo>$excvx@>| z(qi929y=v-1YpS@v!47#*q{d)@UWh?Nd>SI+MR~a7hKh064|OEBg(AL2KXj_wHF#i zzgPP!4uET7h@r^H-cT^Y7#pfnY-BF1&-3-o)SGa>H(n&sGB(jxi5zD~X9+V#Z8>56 zK=Py1UX18ZlsUhYEF^cO#_uMRC2m3lPx%l@O5MCz;*0nK9Av725;w%Lty(H=ZMOF3 z5g3zfsR~7aAHHwY_MY#|YaPk>;n0r&5f_ip0LgE;x&})6Jc6tI$%i7IGe~7>u?ez^ckDR`C!fy%dq6G-)*dG<)OJ=>ueF*hT6^} z5U{0R@BevR|n0_I$SwkETXNS4s31;r{iZ z&6obyLEzi3?eJUvr=iUm__3U_d6h0+p68Hsj|}r9!;Y(_};GH`QpyLQEG3dKCD7Y|dxUxyQG-ldY+((LU%U=sfJ?D?+ZvY-9ZkSlHPOVA7 zY1B#@e|T=CU6mAVKJIM?Yr_62?FDQh!`F$P!_pIrWBOnUWSd7ov+P`rU;SD8m6@a# zBDn|1s_h=qAh*?#r?;*}yXt==uAaT|ezDt=NdjdG+DHfPjo9QQaA^%mSXTqw0RVf@ z94=WCY8fQu&yN$OnTO-|egOFLsgZ)YP9U|M~V z9)W9SGv~;o0P{gsGyYFz@7$;alf~uy=a$=RFp}^cpAdQWX^t>Ic@gX>Sv?aVKrTDz zFcgYTB@;1w_*h>YgSLLDB7N+T@FEgxjlSw_DWqLztiNld=O>tM*9qS)s~NoK76>lq zFpk8BLii9vJ{qwpdULRF!~Az~y}9Xx@|xub!N-%KzQWrfi(R`Te{>@KsZB~OXU@IJ zIQUx>oSK{d2tK6F5C#!PpsQ-}x73UZb^UU4K0me`N5B6@yR>UZvg}!pr#3=7@77++ z1w!u4HMw>3SFZ-AmC$5;JjRnsYvVP`Oh}h>z}3`KusW&FoT$^iCbvWGZ)URq`78zB zbE}W$yl?B?3s6wRlu(Lh1^nw;;gT65sw4tTi`*c$LJTp#cG2xNHWUr2J<`-0NTeI* z_oN>2&5h6C?0l_!aB;bi@7`(J-GIosEvtOjO~c}E@Rc)KK$!y#UF71JP_9&&a&7R* z-mieO?_^eh$=X|KBhkoGoiP@_P`{ znC+Ss61zq#iKe>|?8|<+>0QyaMjAA#x*%TIL;BY?Hk}^&Hw`Rgf!u2eSHQ`n<^`B| z6Z>{KHLT85(kT)|zrEQjYgL=X8BhM)kxZiND|65~WU#~5s;DxO9BbgP=a2G{Mx6zT z_Md!bAM82LxVK30pKUNP0MfM3&hFBsR<`SABG}jDl*2ZQ^}eg$l_9{tUC&tCF~uUh z>osgEJ$Pq!+A;lO8i1Mf|8)b^wi38fRra@)jr(bPCUeN+ZAbHNPu~ zh$D&D2koUz7mlP&O_t3Bi%+g)p2v2*cQiUZ{SfYBB=t7jclx2imcNMj_`4P<07~&~ zRz}KH;fLHa(%!0*P=LDrTKPATnFcq68QB)LHhUOE&CBuhD5L`kYWm{fq9X6IoL->1 zkh67Ra0s&TE$(UOsKYf`$gXP=2-kbHO~E1v@DdrzU?bn@Zpot%UQshclBj&|VM1Ng z1+3-6Cq*-oMSdRg%yTmG+O>Iom6pz>^kXg614g*u0`4bn<=Sp;sy%hTDPF9- zj9aK0cE}nJMf;y!042Tsuqva1Q?ny`LCREsF_f6aTTcFfuyZw z)C^PrewKj;9p@3h-&6(g#vLW=CxL4y#mG%0X~D&U6Kif_Ld|68_3!k7`e8S!xT+SM zMM(7tnFK7KyY^-H^q7|viv5(w_Wjz$ia_}m?Ww11)!W>4)9b+xhxTMggqPk>eC-a8N4=W&HC(CW{|092!do7uu!==$RQxm z{Eo_q!AJUd$qwimcgz5ZHDmG>e6|~8l}MxzwNJLqmy!y9G&KG7{W5z7UW80TsJS|+TV{!F>2T6Idz}I6>!bCh7AIct^SN$aDQ|O1F zJ#sx&s!CuZ7wa(Z+91AWulq*H11+w)>ZXy3R<1`PoC7{!o0HateFDP^m1I2^ouG%2 zaq%$|941bk@?oDQ)2aw#?3G74%oQ?v#7@V~Oo3z-0)Q}&`ByK6skeeij?Rhw3d1PI zIgS+61FJRiWv3S7-ZOkk@|USz*UYMs8sOVXP-1j;;U_PDX!1eCut_VtG+JbM_)5K}~y)z5| z@@qj4CX}PqP-8j8c7uDPRyn7XG2ZK2DJr^84qIHBDSxdl^rL4OWE@QT5!`+k2S=~9 zJo35GB%D#QQO*ic=CjRmzg5sGEJrd8<_OB*qEN=YTwJG5XYp9tj5i)n?yptJm<}h3 zvq@=_DrKN#S+&+9pg1ys#skoTRFP@TRQtLDUIa!q&B@;r2h9dKJUOtJ>SC4a0WQp9 zNW8<6m_!GO-r_wr-3EKU_xz9zoRs;AA?!|Px!r~3P?6%{;DutBR6vG~V|&4O=`^VK z9lea;yO+;&8Urp_Ezeworv@?4&JOukOI70JJHvxmAJht_TsA~XxE0~1)w8~ycza!_ zYfaLP&)hxoK;Rn*)NbO#2%m7Zi=R7ExOJc|R#MFUqcfEmanIB*c7H)gfJjWkDS;v_ z-a0(jT(!#9GVa~Id}lvJoGP3tLGpuZ6%nBk7a2?5=oDRTv#hKgP(BsGYR9{h-E(?U6`GzlA{_jF^B2+Ij>T#P~0=mNJprP=Qu@40I2swjb6e4uA?e)> z#T&d-46ba}?mo?jgYD>AQZlWN#?DgdGw(z3u&izBFt*C4gFY3ZvLKRh)-}n5I>1?c z2iMuaisl~?F0-yx+rs1QG$b0h0j}qg3-|b>-Q*?ELOr40VwV*Cb-=Ys2r~=`|U8K#5^%~brDTML(;W1Mv?I6aTvi@;t)ZplP+?)4b4`8R zKAy5n0N#WK7oAAPH}Qe0CAq&BG*k7U%ujTzq!|m&_KW8Cr}e}mnbQP6x!l!qeas!o zp7-Gcmx}OQoAJ;v#Vh$TekMZ>KFoKdiM?1FOi4kBgZ1Q}&xIo=!vVD)p_S@&_MGO$ z@$LYDI{DmYAJH#|-O>yi6cw^7eO$VUZf@vgXz^W%+}?N3N2gxo6Q1m6l_-5Dc&(RM zHyu92YJB(YFaytY&47eB*W#u>nJy(4$l+-rdofdlN&g)9(3``8!6`ECN@C<&8k%?- z&DLdZANk07Xz1@a6NXwJC9Hbc%=HgfJl$iXW`t!**1XUU5)&&YhF537VWAF(e>D`A zgJ51%UMAHv`7q!E&sB)6iqPZbX6|aG%1p(%rqYWGrB&1SH!&{W%B2fK9wuSC{cZy_ zu9i92E2Z)y0~Gl9u095xINeTmDqCI_1Nwv-J~GM5OxByK<@vN=k&K!yaHbB-FXRs6 z?T(PBRl`tp5nXf(628-J?Xj>%et#J;55a6iMOaoI8$Jqu@mpd!lfwORsl zf0E(7_%##p_2u@^jEUFb;(SM&Yv3<3C9ugZtRGU2MykonN3ye=POJW_t*>5*DE5cK%1ZSZrS63z*R@5> zFpZ)TUPd;Ng7Ofaw6F5F!Mr-mH!PK3wk91ocBs+^WCQ-CTUorq#}fV~Swun_d%vCp z35yh#wKGqg{W$M!RM?oU*x!9vtbOLN@tnBL8RO`rqgsL#_4JbJI72g?Az|r8Z0cEO zgJ*7^1dij@3B?^Y;bHb8*|O`bkpAWzHq4vivfS&xV3to+zKU~5-kns-Ge>ul6}r%) zT6lkTnf@BSK)x&W^y1#i>&(Wn&W_`-`mIKe^hoKm(GQN`*$cT=k)`C zf5{B#A;OE0>a`6s6(iRMz{NU=SLp{u*M-Ukl3CXJtTa!iknP!S*aiDU!ifSZ&9_C5 z3^az<5~QjYmnuvP3^6Ir7mdLK^t`8eEHHzpo=UinrupF+qCyCqEo978Mbpa!VJ6$X>$5g*+v&I+o!$D^1IpsZ(F*eh{}I zubTGMW8-V9A6;$Ahd!l43+U$uqX{v{VGP5HQF*PN3AA@eYW>$L=Z{RTW^*Nf?oD-% z^2zdeZtt|p?T7UH-(B%sYhN&Mj30)^?y()Z)e_I3LqV7Q%v zNkdJMZttg3y<*X_8(m7VHNwIlSvgB0)`ir))9GBa`iWDbJd7WVk|mSO+n+*?!GaiJ zk|K%8)`wAV-4FN7hC9bCz3^EYS*K+O^%=s(}}yLQCu zVgyuY4`3vS7-_s2gO7HtZ>3RC?^nSJtYG=8DCd{Hj?wc1i`agqzq z2+)e7&-$mG;Z?$42f<|~ZUyWmAoX}OpZxS9yw@cgc4%Upb^c+(=3Nle)^6s)xLIX)hz!x=6t1}+gvVhO|iCWn9 zD?yR=X;_Dh5t6mf`aVb^+swkg!P*yMnY@el zg3;kus>{?T8a5u&L^ETA6=einnf;Qb{FHwm=A05Hoq559r z%1_rGkL(~^spIZ@X&+Ix5ckrA!BA##>Vf9LbN2IZBnD=1Qr8(_fxc9>(rHmP%&djO zg?k}rb@(AH2BSDqrHscs8?(lS&x(huF?&gufc6pmaIc%aDG=LbQ(ec;DzVwnG9bGi37*^nrYA zBmB4hr&rF}EC*@YXHDa(k^OI~NK!_SRYg&-pb6BFcdR<0*i58 z(dFtruU}W9!j?br20Ujyq>Mk|7`+m)LYZN8(aaa0(N1u1hllyj<%{jc@p_rb_ zLs%>p25ofLMj(@gK?di6a<)$8|kw5D_?>W6C7W=sB zs~*c8TNR#iQF8Ie$1MQr>pwA_sbyW^H-o<9AF+Vnd?2Zj^G)QL- zzFP{uMCxG(Sofv>xmW6b6fkDsKi6hH;7qs1e^mDQ+U=cht)3%Q{??_X`n>0GFnWFe zI;5pjK1{o zHMW={CLV)1R@03p%-UzGsF>+|$Zx;r$E~inZ>#}u%ye?@oQnB54ezVbu%q`kex2}n z7zM>b_gbw>Unj38ZrCxvE9ufZmuS0{t)>iiEY0?bw)OiW^Ny}=t>gCZNQE6!usyKN zpX41icSyp2KC^Q^|1)X-k+hxr=0yaI&dWC2FekdWutq;YTm)@o#EcU>9qK~J9o#mCG zJ&FC4nF&7k%4D;t? z^oyRLr#3nk`SP`oj4F7e({1pLrkH}zpU#ivW>=72>268FV|@X&yjXu=@w-VkHx&K^ z+kwK@1fi{?|HJ?qE4hE8`@^JT2J*+-jMChQ7NMo&vYhm^WLqJ zO)v4pOz~WhWNUb`qO7XZp%2>VSk!TZkoDwkpwmy5H=8=!iHXlNBwwSlFHG@l4*E`B zmQ7F8QQ#{p?6)?~B_FvR2i1!W5zV{=3*6jeo5CiGD0|hv)%tv~kPS-j{^qE7C;RuE z*Y7$XV5NJyls?&8L30$v5Ys2*Dxl`DtWZ#yW@0tf-rjCPUA>zz<0Crast@VL`ZX1D$@qy4h5uHSxAqfoB3O++$k+ z-u8S(*eX8&tW7#T$8V^}h0UfE z(o2MuE2eB_B*uHT1mLxfYFF+BE@1nT|6fru_5V>a|4}mkl}ctY`IOsSg)21=)puCT z`^wbx|0_F-DGDLpXyjc8nvWfmcC57)yVs2Vr-MQSOm7qPSaEc1i%&~Ap6XLS0HbN)I9LRj7#8mEa@dctJYfXXzc5#G3(SGX0G)vAs!1s z6{Cs+amF?bxC$@J>R#)=`FI>TKP7QxM#!%)tI*=GG#uoVV1Kt|`fWTYPKw1!&lW5& z*iWhW(o4y1itTTi_0s^kKLi)DI@kG_5}aMPm;}3b$p50fciQ|bfSE7jOnVK zp0bHBDw4N!=n1989sU@~7ht3DH`*ag2R>_uzmpd5>NNIUR+JbK6Ex0*eDr)~PZ^CD zEX%NZ)ajX;jJS?qDH(WSK8^{}s5Yfg>Rd6WxJuo@5+lP(gsif{5fy_q4A!;9M6?*h zInQI-p5ig_fQ|JLgT`0as2nhT(7~MyZ55m(iV-HW{U8!_NuZ!49*41q*Bny}Jf%}@ zt;#7iB>LF&`~Iy7f((3y&1G$mfb=Z_MjEa7(x=7d8-dfh)c zRM|_jv4x-sh=Ts8L^+?%HFldKlT$uJ-nyc;qET;27$6#%W=-LLaOX@EV;U6ihIhkAT$aI#R{C5lIuQv{S zTp5{eOpSpL8FCrq#pS=&O4pGKuok#F?s=-;cC=_IM}wjAYhRHMbW^K}?H_&Srkska3TUMt`f3}*PC&5eBp|(u>0ekR23Q2k z`%{h-OL~%0L>EK52;mQ5{3ew{z7MB#iGK`mAbLN9MhsC!*gR)?^oF`r8ConRJEA`| zD@<#HUrsv;6$j2#eO9kpJxUWnyD!Mlx;SfWX@;(Opyks3A|?DlN2)++;vlQ^{gvDI zhi_DUeG+f^@jyW>i!df?T8{pi%}%eJQ`J$bqx8P}Yx+#QSewqEsgh=qm7RHZowpQ~ zCy@iQ7qp@xx;DA@j4}0{^oL?8r-U#mqV6Q5TFh|NWFCSLOD!@WRen~Nti7a9Mb4Ue zT@UplRxH@TIomIeN%{DdbMmC5n5-u<^rwE>-|O|;_@OeZ$u-f%>}9eQbtLIG;vZ}? zrT9AJJ01zHp>8zn!i(1o111H7C=9csgD~@q zoxz%2saowq)d<~n*0C{aA;I$6YGe?whnKKo#2LTy2r zvqP43vQ37sZ;{dRht_3?k9`0VL2z_k(qk`GDvk59@0{Zjip~*kEh;_GsXxU(E?7~3 zd^KPy=lj{}X}G5}c}OP}I{bk?eUquF;?9Gr_k z4%1_&H!v2w$mtzDg|zK8(mL%nB6A#;cl>X-!k-wM_`=C)7RPM?S?xkv>|qz_(nHMH zWlM$tv91nZsBIv7014tV?JHqF_pEg0y*8nqN7j=iJ*J}eK*eu{z_empL|5n>rOV31 z(wSj{zET#$R3zGMnK1-LLs-)}r|qgm zmDH8iPPtJ+rjHS?plIMDtW4Q-6c58;Nk1! z|Re$=N8&^aW(`jj3ft~|pWInDfMH)Ar^dgnRXT0ZOL>%q`4&?i$1p5K9vjygVIj&W=WU&tQE;A%!qBQ0{yX3iKHKBz7tQhG%#_A2d$L$A7tRLk@Is6#)gxi zJ{K10uhO8%KUhp>rBkv zzJgw?okoC2ENJmJHqWcQ<#o(PMcG8pF%x2VZ)z#OAnkTsI&{UJA<(GW0U#3h8CY?{ z6*6-AU1993l@$59ahTYJq%@}vcTqWxVubCeUMcOER?Zt&yzb3)q*g*Cfpdgj-H5ci zrJGJ3%d@ABVhH@IDTPd?oNj~VKIC*V53Y>gDP!mWbtL#V0$Uj_0|+0-{1>^|{+*t= z5S3~45j}ODf8vrBE~rI!vH&p#2U+zRA+y8kJwqhy+D?J{1cYjjdA1Gduf4#o9SWBd zEYbGmXcSsaNv^%*_siv)Q5P4M3TcK4%TA0#hA-2+u{X#MIy>Olr>&7>?!`Xfuw>jD znH`IN7b7%4cVo9_Hx-i8NHAq*!P%j#*d6;rP(xO3wXC_kovbITm#nKU=9}n`b_(0k zI0HqP8z9vV8mps+28MU%M?iy@boZ{idr2%61QG%O#e~yedu8O&NfAByYteZStL)Zi#En*E$55ZHb< z^cI%{rq+f_97`ebNA#U*?GGHZ-A{|QCWihEeyii@*J5EkfR|7&vxZTQ8@w14{gz6N7FBVJ#wJJ z-F~)`%k54x`_V^x0|tw%1NI&ESV$~(`t6AQ0dsKQQHsC;AL)IgHGwtb1h0F%8i6St zR@3aPBe;V!$;$TMIXI@IUvaFw8Tj)>?M$bjSex+D#Jk_eZ|sKLrHnyt3&Kpe^xhYC z+5IUKZGYyxkpER& zJm|%?IBM8(1XR#~hC-gaS9+FIXJB_r)AdM7Ajtp9LD`wdrb0>qg*?x^G;_}hIWoNJ zjV;rlRog%Jf}TlHUGp>#Lf`ZMi=|jvm+6W6U-HcVJ73wPY^-dl@#1PLg&^%~!!Dhx zQ}m?hCM>>ztj(qEb->a(^>VS-MMd4cQS-&Dl(O2I>JKTNBZp{>q$BS#*5~qvp(rYL zwqM@C?Y|?Y@b7xA+@jTCDi@w&^;<-a0$?j_gkk>GMa*i|=Z~X*j6Gp;uli9#(MVpf zb_KTczrnfxZ?(=}JNNUWMzaTAduZG5GUoBVRebnEUX->6_P-plE(; zBLe+j6KT9pea-uECzyay>odYwYr6XzYPZtswn}T4{;j_|)~5k6B?^VBt?dYe>fhS` z`JS3B)^-~$x7>$G%{3|I{+pxdFS2|7h|ZrTNDWCzO?2&?JiWubTo@*j56P?Qd<>2$ z$Hyh`8>H?B;w!xjh<48>-%`G#q4HKo)mBQwRvL&If5S|Fe{e!z11=E$a`il~6GmHW zA-cOp>pN`l2YkvCK*C?FI(q>mqw;cXpq6gXo;j`z+p9$j0l}s*J87Hb5_*ro$Dc)lt_%w zUp4Qk^+=fcwQ+dk{333hj>AQ|ho%Y{^OvM{*F64<*@()_w7Mjv{X~R0XPpET&k_uB zrc07rbpE107nJv_2}zoNoC>f}$z5ymTU83WTg!<{wo@bWm-zkFOSeAW7Lurn$~R8( zU8>_ORgUKF7px+fWhXsSXPiO@M0e-R%|+=VLCSo_6^$j1IhP%2*9+f z996w7bOWbcB%7q3bo~lrp00@xbdRnP^q!8fbGwKhdy)^OzqH>f@!r1PlxFl2>sHpp z28QT+OPip#!asNSsGvo94ZD12pK`wRw>`9*f4VL0A$=L;ml6ioDSbnkgnx&v{&>IB z;6!!O?!xNKzEB0oCA~lf&J-l`tFtk)i&IRxhLKLoV{rp9y2g53M*EEgLOlQiFlN}9 zp}g87Kb@S}N5|{uuU^pO)#sIWI?faoldTOpn%8UOmW+k=8o931sRLLyTyn`Vjj>d> zA&*kDKIC4rPQj^Gv^#uF{HJ4k-}>>sp_X-HdJK;mm+TxiSBb;Jf?L^1t4CEE!RfnX z>ILvfwynRWPh><`(dSP7(YtR!!k|J&1@XikRn7d$;X%ntY0b2u%alv9wm&Dj2>$k)pP)sAWH-&Jy;|%Bn;nHxj$9_fKM5m zxX3MYNdTve80ntO$xcb|!R79S@2Q~aP1w z9~K*Yft2k_wN;@1`5VI}m_nyY{}dHZZHN4HQ|<{?{t}SI5)U}QN5drw&MWTspCtF1 zIP&Y{Hya;bRZnLc3lkf6>umWUmNkX4XiPr#LK5~FY z!>v0A)hwAQ7tCMdcL#P-G3k+lv1BY!Tm42BBK9Y<15Nueq)Ji^P3M+Yu-40?Z-J`F zdC1uh2eYE{YvfPUn?stSNxsyopG-3scU0;Iskk3MZ;-(O_eKY3TB+xE3f1L~kq^^104@1@z#gD>*|-yf;R(uHYnYXvmlgP>JRr4~!sJroUtDzbkOyFx?}> zBXdbeMg{T4VtRdzw2o;P!x=6F>AXBCX5H~R(?Tr>-7Q6j{&XZy;-b$pzj~S2)2!nS zp6;!ohuiIere7~T)bu_{XA6_^L zKi@-Y>gCt_>$BSb4NJz2}@UHFM`ZJfm|CwM>ZH#^1J zs`Vl&_k0W|Dqf!@lQQ{JMF_O*s-WWf*Dc%AeGa+W1?=q>?2-H||k2CLR_1izMSOy+#m*^-EvzZyMS zR^@qtt=6>8)4ytnCv&$AG83J%ouKqXA_2hbW|{#qGt;Idb9|cjue$s#C-27*2B0uE z?9%T^Bs(?kmL<9kT-|woa%~!)-!fo+NGE_?++3RPpP3+ed%~c0U*BF4^=#|&-CrOC z#r|k0ZzJ=gKxK$pL)FvPjwaTwuekzy0kfYc>46eE^d%8V9YS|@MxHLt-M0Ksy=!%6 z^BlRo0S-@(_>9rXCRgxI{D6c z9K{PS9))88*>A6(feT}L{5ldcIb zOID5!MRpO>I*BBGj*}wiJWMKoje<5;?V^`ed>_4z5@5IIvm}{e0i`A!bRZ{~5%#>n zW3(wkDCqvzCOR3&&)Jywt9DL-)<<*jo$L(Z33CNJP?O3L>{)&3)yN2LxXJfLO^*a1 z-g-hnaS=;yjSV%M`5^4Eg{5z9ZT6PjJ~;%+k-PT1dtoAcucEqNZ*--Q(VW9E*pef) zn|$#5I$nzcBzoEuR)TI(FG73D0=YD!+H}x%mXXCodVIP}W{Q&ACH79rW@mm)hfZ`1 z(|2A9^20aa=GqTEp@2<@GTwVS)k1-d$7mS@<6Lf55+|FVo}KgDULxiFH#@~P8XT0a zCL3u0E3tE9$d7IaTlNEDcef#>SFzN#|Fi! z$Ns9Fn{Q-a)(FiZ^W868mgk$AP%>6hQp%RxcfXCX$?Mxq_5~wG;pr_vPRhX(2scm; z?K9I+SlzR*3F;07U+gzdFD{@Fq4erh8>qCs&sn5?&;{;jdr#xJm zuyP4(ADmS$tqy`w7gkmhx_u^td$bT7F5y^b(!Ek^n!E|a4n0&qbqkO<(4KjhI3rhO z$}dS4dzK1xlB^r@o{gSv*4rbI)xZ{e(IzwUzuFZy%>c4>9EFVlYs?T?Q zkj+ZS*xH$~BAVInn=p#fH$E5Wb6|v4KVphJtoonu;4T{!)-xyFxnVUHj3=NIYppV{2{&l{ zdxQf0vr$EzO`nS7IDH!I`uB)tYp39=T%B$eXRE`XyHyN*kRwE(YOPywN7ze07<;a< zN)UASVlKQW$x6i&qNL;SxiK5MLSnDl0|b#13svDq)%${iTS;pRm~3irlqT#Jeb#v zvh3!@HSc}h8+(a?3}&}At#tCSRs%ziOH9hZCO!>7F#CD3^QUK;>Y{7KyC8ut*$yvfMLGoQ-xX8XsL{Es6Bxz&bVk`4Kdp780D^ z)8GJFt~u&eXT1F0!eIXC0D<_B>}W`5tRf$jE@VkDw4p4L|)Z#Nd`z;pDmbBg3w zt3B`WeKHM{l>q_7!Pr5tSTf}v8wZA#KYkRIn_XJFWXxC(Tv=Qh1SfJ0zPSm8@cc&@;O}~;1 zi8J+lyZO&gb)?Bf)1TLN1@(Skw$;%|5dLj^X#I@oz<9g=rg ziu)_O^BXLCqa+k3mQe!k4;LE*w-zawAo5VecQQ?FMX_D3#qAnLoOQk)=g|)-oIy*h zcJ|hhCC$Z*-O8a!&)vWnoeAP=k8iy>a6+r#3WC8N5s;!sA7HPm@M{o^QJ` zsIVc$xacz>YnreI?JXNX8{iyT&J%=7?XnLOK1xIe6k_pX3m}LPA$YmgMrh=*5NN=` zn1x6t)~Ke4892p(#;AABZJbVdiU{V~)RO;?uy>DV`u+dMNhKxZtT2)sqvb`2O(caJ z%c(Vo5rt~@njE%K&Wy=f$wJaW&dG|A!{$7doJ$NV6J~6f>9^|rdVk*E@8|vd{r-FY z@w{!<<9b}z<9gihkNfp_b_UBl3^;Y+pxh?;vNQRpLEzQe)UFkXpcIofHH(ua&9W%HE%}fPvM~1e3i1Ov#&>y3w1g+vu)+pS3(^D80 zXqlK5m9wP)BW9kb%;JvKeC7#|HBXM*mZ_UvYo~l<101Tajw9KzNa$&;9wp0D+?fw`M?8jqfGW-FDk7g>YV;$lIujB+&VSCW zaMS07bpycU`@NyY-PAp?|e zHEv^g^x0cnrCY7q|H=y@+yY;|I+33|yr*mveqCSHi3hTJf*`JCSN@%4e1(lgbW#>J zPeSW+6*=xkp@S^e1KP3Nbbm+yE`I)_4X*AP^T}9*|CD4Pui4DU>*G4%-9Z~pZ)vKv zxrzlhV_MgT9soq-dKSh~hyk@SxudJG`+EX++THzD$CKH;4>tJrP2fjyuIpI$Yv}7) zR`C_&4Wr86OSWQoe8L0s>Ot_UFp0}c%kBo$*HJZ`N#SR_lk{>NT=l)j{kQ(VQ!)cD zt|GG~ju3z@mK+}|BpjMdKYdTS%=Fhk_)NU6$~#1P+2Ty+d(*24JoQYoYjSE0x4%)PeOt`u z@(51%&9C4uIgaceS)QCfm1S3#Ho?se{oHhWe5v_lkzqw&=w`pkDPMM9knd66S7Q)q z>(7sM6Y*=>98$x|{eN=Q-+^r>xBmXtzk^5Pqn8Om z!DMjSFkPqi)S^)r5wp3?YC5%8O`9~hywSThE-lgDJ#edb+~^~CoR zOOPA*v^v3h!+}ELisNNC<$Gx5xa-Tui#D$12j6eXoVw0D#$$JGSD7~d+;{5d9A}}> zChhg8%IjBgxfXSWH#osEn`zrkR}ij_b!ng5?7E00YqqDprCc77!RcVE=%DrS#M0n`#~-%|11b+^R7 zBF<^>^&db1TGTs{W}0%O_b$on>+TzGOc^uyAM|}sMjw^bzqT-+O!?M&`!y)E(p366 z<(R1e;l9P-Skl}XfM9g*kl7H36csBH>K_x4+u!lA{ zJqwJW7QN7SqnOmO-}u4rVUp=lnU`Dc*KUG;ibi@fau?=bF}EKK7y7)`CVu|nRya8r zMcjPc)DY(SR(UnsGLRkqT6n`Htbc>OMhyQ_82WJxu~4`VP$%WSClC}sk^hT)Fh9P0k(UB$aqNuFCk;rQ9#v9e5r5kV8x@&*j&W$Yy#N0R)M+9D0xatpu zzdiP@;Z((IuW+`#C#1hoGAN0hY#ZUV$(pL39O!PeZ0*$uA=VGGE^Iweg!QQpR)+ ziisj;P_caKwfIv>Te)E0im)~mCla2R{ur02ov^~XHrfTWgzNIHeDH1 zsj;9C7|V@{y1zeGtbeoBV|46-!7U7MNZ=P*xdDwd#}T|=0z==Iot2S;<)R~aJqo)C z*M7i5Kb0{XZNR2O6~{Qefsxt02$z{!Ro!?z}f@Ri{YdwvN0L3Sl) zQ@;aMtguzyZJKf-?%f6VN`iM1BlS~onnPAn91G8DTjvfP2w?(MYDW_96{y^VK`Sn6 z{oe^@$fdi^&lMCD>VIx?Tstq-@i68uteZh~+4bjDC9(8k;P0SXH?;l-RjwruMM?eN z%m3e9Kz6E~w1oX$MvRZtFKfRx;(weo=6|LAzCOM5hfOfB)vmZ+?oQ^!!O5w_7>j zs(3VCnfs|Emvev0gwvnfBPMT3??1f8V`=7bxVk`)!St1V72sdI%E!Q$nMs}1Ff#k{ ze~hg94KFPDMHLY?neWl6XCFQt-8zYSDA)%S*!un+@i*CG#K_I$`uA8F>{?7` zlR*Qo1oi6Oe{6++y`DJ#n<5yF}&wignC?`;kBGbH4q3Kf7}O z+%*?nkCG+-?Eg(f|NUnTLTY&A1d$mS^Izub^X~>NQ?2`S>w0vXCn}m)9&f)td9aXn zYO#tJA%_)F%cmn(-&_6YQp4Bzb6dq#c!5=Px0$?Q8B+>tC* zA2Mql$@%eGZ<|-jz52}xy!jr7SuFu@|34n>fA5p#ty$gBce`Xp{Bo~c9flxMuS9Xz zLVJ$A_HA8Te7jW7S$wOTS%EWINi=1R!1BY;^Uul_^8E|Db}ld}U_AeUw?U&dSQ$^0 z<3IEGZ)cZRefe6nd-r~Y8v+T!J@ddsiOIPl5UlFxjb)eK3;l>6=n|9DQ zAfD{uIR?F?9raXi66cS(F5lBny=B@FDKjPjwD)pou&W!kEDWs0BUd>lgQHi|06myN zA%xJ1kxpUM^71{Y@I=J6;ci15g&)&5s5lK`m86Puz7{~**eZA!cMPL5$HCO0wTaMv zKpT9){~>H^dvxyL0yEM=#9EYt2FznT*HMhxZ&Ua~EDqR85u?M8IAB4<$Kbu^N^r<+ zx#jSu98fC|^Kx-BK^SnU9HyJi&QpC?OXVI04G-U=Q;!hId7{WU4x`sT6*l_WkR)sM zfLYy#88S)>e_Goo56zEltx#u{g12u`O$8`+%Y`_fDxaA1!BzQc=DptQ$uX8h5l^(O)Ywms+ z>lZad8(QO-dzMx6S9D8#ix`9)`_Xw=;DXd5yf{W1aV&uMjA zoi*Bt?&Wd9fZ;vyY4Xm`nb4X=7#~IFt*6c$0&Vb14N7#3b< z1Q_Q{AT=++c)XVZ8^uNJF4PD~p&S&JlVeFvtB>aP0emd1QlE9U)mr5z^Y>E`(LYhy zU{~*`1Bm)BLsz5bYUOwjM*~Z?dJV=$Cnz^ulQ)dJO~8P+m!9e3a%tU6bQFka0vPfJ z_*|Bv;ZDnA@rGSbC=&x$CEw9LO-2ol&iNay1*K=20tA2g4ifWY(9Ps^dGoqKV)Rhe6T{KW6K2;9?Lqe5hw3F^tA$AB9YCg1k;rB%71qqYl)>4E?9vzzl z?`1PzbBQfg12i_)p!)#z=+(%nEn=ED0^T70ZOLk!d=~rQ;=F}0I*1l) zK#B#e>LnntR!I+h&ZFOSWmFl=+)0L@{^QM)hUnKaG+v% z-fgb7LCDr_gOJwU2IYpKPY)$*)DV3X*ecMNNM8VL&RC^&tEKY6JU}0A{j6Vp$ST%U zm~3o$)~=x7$47Er%!gsC_;BXt%-(qK{pB+A>Iw1OM};&P>PvzFQ;QVGd)cESWaja4 z5xO)iphP~ND+R-rq&D27am(#B(%RMs&f0wwY%>R2x1X&5>%Z_vNOBz2FjtOi&Zwki zpw$l?YC7#~q&o@8MA4eQ){~#)Uset{u=+*l?Mp4L$0ANU}x`_ zsGal&l8kg)*04g{Jefy7V6ZYq}rb!Y`%_nyqH@io1? zZzC-k?OTo7u6Dj`O@HM3XO3(eZ%50n80}`aFYV*VB@lfcMy~$a=ozU(l#qps3qqX! z@z`J%?&ghSpYq!xq^;b2Q4*|Jf48($t+_|5$eB$;If)_N)Cb92+gEVq+vX$WhJoF( zDWM=M=V$G*gXnx*53NGp^$R(+`Iy~{=gSq*On2FFww+D0<{WD

J^gs5-{fM;qR+z##=;@ze0$; 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�ZypQwL8tp3P&iDb$8kc>i?|*9i0Xbu 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. - * Review the configuration parameters for PV creation [here](https://oracle.github.io/weblogic-kubernetes-operator/samples/storage/#configuration-parameters). Based on your requirements, update the values in the `create-pv-pvc-inputs.yaml` file located at `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/`. Sample configuration parameter values for the Oracle WebCenter Content domain are: + * Review the configuration parameters for PV creation [here](https://oracle.github.io/weblogic-kubernetes-operator/samples/storage/#configuration-parameters). Based on your requirements, update the values in the `create-pv-pvc-inputs.yaml` file located at `${WORKDIR}/create-weblogic-domain-pv-pvc/`. Sample configuration parameter values for the Oracle WebCenter Content domain are: * `baseName`: domain * `domainUID`: wccinfra * `namespace`: wccns @@ -145,7 +132,7 @@ In the following example commands to install the WebLogic Kubernetes Operator, ` * Run the `create-pv-pvc.sh` script: ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc + $ cd ${WORKDIR}/create-weblogic-domain-pv-pvc $ rm -rf output/ @@ -166,13 +153,13 @@ In the following example commands to install the WebLogic Kubernetes Operator, ` Create the Kubernetes secrets `username` and `password` of the administrative account in the same Kubernetes namespace as the domain: - ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-weblogic-domain-credentials + ``` + $ cd ${WORKDIR}/create-weblogic-domain-credentials - $ ./create-weblogic-credentials.sh -u weblogic -p welcome1 -n wccns -d wccinfra -s wccinfra-domain-credentials - ``` + $ ./create-weblogic-credentials.sh -u weblogic -p welcome1 -n wccns -d wccinfra -s wccinfra-domain-credentials + ``` - For more details, see [this document](https://github.com/oracle/weblogic-kubernetes-operator/blob/v3.3.0/kubernetes/samples/scripts/create-weblogic-domain-credentials/README.md). + For more details, see [this document](https://github.com/oracle/weblogic-kubernetes-operator/blob/v3.4.2/kubernetes/samples/scripts/create-weblogic-domain-credentials/README.md). You can check the secret with the `kubectl get secret` command. @@ -226,7 +213,7 @@ from this secret. Use the provided sample script to create the secret: ```bash -$ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-rcu-credentials +$ cd ${WORKDIR}/create-rcu-credentials $ ./create-rcu-credentials.sh -u weblogic -p welcome1 -a sys -q welcome1 -d wccinfra -n wccns -s wccinfra-rcu-credentials ``` @@ -297,7 +284,7 @@ Sample provides steps to create the database in a container. The database in a container can be created with a PV attached for persisting the data or without attaching the PV. In this setup we will be creating database in a container without PV attached. ```bash -$ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-oracle-db-service +$ cd ${WORKDIR}/create-oracle-db-service $ ./start-db-service.sh -i phx.ocir.io/xxxxxxxxxxxx/oracle/database/enterprise:x.x.x.x -s image-secret -n wccns ``` @@ -379,6 +366,8 @@ echo -e welcome1"\n"welcome1> /tmp/pwd.txt # Exit from the container exit ``` +> Note: In the create and drop schema commands above, pass additional components ( -component IPM -component CAPTURE ) if IPM and CAPTURE applications are enabled resepectively. + ### Create Oracle WebCenter Content domain Now that you have your Docker images and you have created your RCU schemas, you are ready to create your domain. To continue, follow the Step-3 and Step-4. diff --git a/docs-source/content/wccontent-domains/oracle-cloud/prepare-oke-environment.md b/docs-source/content/wccontent-domains/oracle-cloud/prepare-oke-environment.md index 1ce8543ca..a1b61636e 100644 --- a/docs-source/content/wccontent-domains/oracle-cloud/prepare-oke-environment.md +++ b/docs-source/content/wccontent-domains/oracle-cloud/prepare-oke-environment.md @@ -38,7 +38,7 @@ Within your tenancy, there must be a compartment to contain the necessary networ 1. On the Create Cluster page specify the values as per your environment (like the sample values shown below) * NAME: WCCOKEPHASE1 * COMPARTMENT: WCCStorage - * KUBERNETES VERSION: v1.18.10 + * KUBERNETES VERSION: v1.23.4 * CHOOSE VISIBILITY TYPE: Private * SHAPE: VM.Standard.E3.Flex (Choose the available shape for worker node pool. The list shows only those shapes available in your tenancy that are supported by Container Engine for Kubernetes. See Supported Images and Shapes for Worker Nodes.) * NUMBER OF NODES: 3 (The number of worker nodes to create in the node pool, placed in the regional subnet created for the 'quick cluster'). @@ -196,18 +196,18 @@ Login to OCI Console and navigate to `User Settings`, which is in the drop down ```bash $ kubectl get nodes NAME STATUS ROLES AGE VERSION - 10.0.10.197 Ready node 14d v1.18.10 - 10.0.10.206 Ready node 14d v1.18.10 - 10.0.10.50 Ready node 14d v1.18.10 + 10.0.10.197 Ready node 14d v1.23.4 + 10.0.10.206 Ready node 14d v1.23.4 + 10.0.10.50 Ready node 14d v1.23.4 ``` 1. Install required add-ons for Oracle WebCenter Content Cluster setup * Install helm v3 ```bash - $ wget https://get.helm.sh/helm-v3.1.1-linux-amd64.tar.gz - $ tar -zxvf helm-v3.1.1-linux-amd64.tar.gz + $ wget https://get.helm.sh/helm-v3.5.4-linux-amd64.tar.gz + $ tar -zxvf helm-v3.5.4-linux-amd64.tar.gz $ sudo mv linux-amd64/helm /bin/helm $ helm version - version.BuildInfo{Version:"v3.1.1", GitCommit:"afe70585407b420d0097d07b21c47dc511525ac8", GitTreeState:"clean", GoVersion:"go1.13.8"} + version.BuildInfo{Version:"v3.5.4", GitCommit:"1b5edb69df3d3a08df77c9902dc17af864ff05d1", GitTreeState:"clean", GoVersion:"go1.15.11"} ``` * Install git ```bash diff --git a/docs-source/content/wccontent-domains/patch_and_upgrade/upgrade-operator-release.md b/docs-source/content/wccontent-domains/patch_and_upgrade/upgrade-operator-release.md index 89011d3f8..1c6256f64 100644 --- a/docs-source/content/wccontent-domains/patch_and_upgrade/upgrade-operator-release.md +++ b/docs-source/content/wccontent-domains/patch_and_upgrade/upgrade-operator-release.md @@ -15,7 +15,7 @@ To upgrade WebLogic Kubernetes Operator, use the `helm upgrade` command. Make su ``` $ helm upgrade \ --reuse-values \ - --set image=oracle/weblogic-kubernetes-operator:3.3.0 \ + --set image=oracle/weblogic-kubernetes-operator:3.4.2 \ --namespace weblogic-operator-namespace \ --wait \ weblogic-kubernetes-operator \ diff --git a/docs-source/content/wccontent-domains/release-notes.md b/docs-source/content/wccontent-domains/release-notes.md index 77a33e07c..8bc1788da 100644 --- a/docs-source/content/wccontent-domains/release-notes.md +++ b/docs-source/content/wccontent-domains/release-notes.md @@ -12,6 +12,7 @@ Review the latest changes for Oracle WebCenter Content on Kubernetes. | Date | Version | Change | | --- | --- | --- | +| October 28, 2022 | 22.4.1 | Supports Oracle WebCenter Content 12.2.1.4 domains deployment using July 2022 PSU and known bug fixes - certified for Oracle WebLogic Kubernetes Operator version 3.4.2. Oracle WebCenter Content 12.2.1.4 container image for this release can be downloaded from My Oracle Support (MOS patch [34409720](https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=34409720)). | June 28, 2022 | 22.2.3 | Supports Oracle WebCenter Content 12.2.1.4 domains deployment using May 2022 PSU and known bug fixes - certified for Oracle WebLogic Kubernetes Operator version 3.3.0. Oracle WebCenter Content 12.2.1.4 container image for this release can be downloaded from My Oracle Support (MOS patch [34192566](https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=34192566)). | March 11, 2022 | 22.1.3 | Supports Oracle WebCenter Content 12.2.1.4 domains deployment using January 2022 PSU and known bug fixes - certified for Oracle WebLogic Kubernetes Operator version 3.3.0. Oracle WebCenter Content 12.2.1.4 container image for this release can be downloaded from My Oracle Support (MOS patch [33771196](https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=33771196)). | December 7, 2021 | 21.4.3 | Supports Oracle WebCenter Content 12.2.1.4 domains deployment using April 2021 PSU and known bug fixes - certified for Oracle WebLogic Kubernetes Operator version 3.2.5. Oracle WebCenter Content 12.2.1.4 container image for this release can be downloaded from My Oracle Support (MOS patch [32822360](https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=32822360)). From 27b1239b3e8de26cd05b5712695aff79939e7848 Mon Sep 17 00:00:00 2001 From: DEBOJYOTI GHOSH Date: Fri, 28 Oct 2022 18:22:25 +0530 Subject: [PATCH 2/4] For WCContent Kubernetes release 22.4.1 Signed-off-by: DEBOJYOTI GHOSH --- OracleWebCenterContent/kubernetes/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OracleWebCenterContent/kubernetes/README.md b/OracleWebCenterContent/kubernetes/README.md index fa0cfe8e0..36146a00d 100755 --- a/OracleWebCenterContent/kubernetes/README.md +++ b/OracleWebCenterContent/kubernetes/README.md @@ -3,7 +3,7 @@ WebLogic Kubernetes Operator (the “operator”) supports deployment of Oracle WebCenter Content servers such as Oracle WebCenter Content Server and Oracle WebCenter Inbound Refinery Server. *** -The current supported production release is [22.2.3](https://github.com/oracle/fmw-kubernetes/releases). +The current supported production release is [22.4.1](https://github.com/oracle/fmw-kubernetes/releases). *** In this release, Oracle WebCenter Content domain is supported using the “domain on a persistent volume” From 8b60eff03b7366ee12894cc8d7a47272eb1f7e79 Mon Sep 17 00:00:00 2001 From: DEBOJYOTI GHOSH Date: Mon, 31 Oct 2022 13:26:29 +0530 Subject: [PATCH 3/4] Changing copyright info Signed-off-by: DEBOJYOTI GHOSH --- .../charts/ingress-per-domain/tls/nginx-capture-tls.yaml | 2 +- .../kubernetes/charts/ingress-per-domain/tls/nginx-ipm-tls.yaml | 2 +- .../charts/ingress-per-domain/tls/nginx-wccadf-tls.yaml | 2 +- .../charts/ingress-per-domain/tls/traefik-capture-tls.yaml | 2 +- .../charts/ingress-per-domain/tls/traefik-ipm-tls.yaml | 2 +- .../charts/ingress-per-domain/tls/traefik-wccadf-tls.yaml | 2 +- .../kubernetes/charts/ingress-per-domain/values.yaml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-capture-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-capture-tls.yaml index ecb428a19..6a5e14cb5 100644 --- a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-capture-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-capture-tls.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2021, 2022, Oracle and/or its affiliates. +# Copyright (c) 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. diff --git a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ipm-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ipm-tls.yaml index d317f31a4..9824663d6 100644 --- a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ipm-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-ipm-tls.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2021, 2022, Oracle and/or its affiliates. +# Copyright (c) 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. diff --git a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-wccadf-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-wccadf-tls.yaml index 9cf9e86d8..b8211beac 100644 --- a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-wccadf-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/nginx-wccadf-tls.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2021, 2022, Oracle and/or its affiliates. +# Copyright (c) 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. diff --git a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-capture-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-capture-tls.yaml index 2ad361af4..462294d91 100644 --- a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-capture-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-capture-tls.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2021, Oracle and/or its affiliates. +# Copyright (c) 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. diff --git a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ipm-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ipm-tls.yaml index 8a4296c79..de91cd423 100644 --- a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ipm-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-ipm-tls.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2021, Oracle and/or its affiliates. +# Copyright (c) 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. diff --git a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-wccadf-tls.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-wccadf-tls.yaml index 3e57366bd..a5fca0995 100644 --- a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-wccadf-tls.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/tls/traefik-wccadf-tls.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2021, Oracle and/or its affiliates. +# Copyright (c) 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at # https://oss.oracle.com/licenses/upl. diff --git a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/values.yaml b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/values.yaml index 937516d33..77d69ddd3 100644 --- a/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/values.yaml +++ b/OracleWebCenterContent/kubernetes/charts/ingress-per-domain/values.yaml @@ -1,4 +1,4 @@ -# Copyright (c) 2021, Oracle and/or its affiliates. +# Copyright (c) 2021, 2022, Oracle and/or its affiliates. # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. # Default values for ingress-per-domain. From cf030e0f06ca673205e66e95eb08112ad9352424 Mon Sep 17 00:00:00 2001 From: DEBOJYOTI GHOSH Date: Mon, 31 Oct 2022 13:40:32 +0530 Subject: [PATCH 4/4] correcting minor version info Signed-off-by: DEBOJYOTI GHOSH --- OracleWebCenterContent/kubernetes/imagetool-scripts/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OracleWebCenterContent/kubernetes/imagetool-scripts/README.md b/OracleWebCenterContent/kubernetes/imagetool-scripts/README.md index c8cefb07c..d589c7e61 100755 --- a/OracleWebCenterContent/kubernetes/imagetool-scripts/README.md +++ b/OracleWebCenterContent/kubernetes/imagetool-scripts/README.md @@ -1,3 +1,3 @@ ### Create or update an Oracle WebCenter Content Docker image using WebLogic Image Tool -For the release 22.2.3, follow the instructions in this [document](https://oracle.github.io/fmw-kubernetes/wccontent-domains/create-or-update-image/#create-an-image) to create or update an Oracle WebCenter Content Docker image using WebLogic Image Tool. +For the release 22.4.1, follow the instructions in this [document](https://oracle.github.io/fmw-kubernetes/wccontent-domains/create-or-update-image/#create-an-image) to create or update an Oracle WebCenter Content Docker image using WebLogic Image Tool.

9~^%HC*I)rR`VmCe(O} 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 D6jg-@ diff --git a/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-gp-import-json.png b/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-gp-import-json.png deleted file mode 100644 index 777daa9743902c20cbe055395947ed30b004f84a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34638 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 z zMFct#iqB~G+r1FH5~^A|^g7v8X(L9z_Es7;=5kc1n3c&7D{ z5tArlh1ZKKF0yN2n>1;f4T#H1cH`}Mf&z5c6UVAwHbnK0aiUS!-K_B02WAn>A0igD zW^5o04K7hZGw>{`9T0`9b{;4vU|oAy4SH{cJ0g>w;4C%F!}hRjN!4=EcwAk%UntICMRyfgNv3xHem^YeiS{G7<=$*71d$ z7hdEMJ6xD&=h5!grcd)CN~&hx5O(J#0S|Vtwo-0HD4!A6%yWk=P2a8&$jx;^>5iP) z+<|?OxDz}2af`WJGRUJR3eQP0Eiwsbr3U#pst>zwQ-c!Q8s%_y_)91QasvIUMClvc(1Xns~j0zR1sSmRR(KmT}LC ziYbalLN=L8cJHeq#d#}{#(5t#WzT8EVT$voF=BUk%w4ib&zeW*Yvn%3c=Jw=|pF7yeijf%YA%$+*V0ye^B&liMchGaa(=?UyB$} ztg;IK2U`f*H}spePc^ht8y>b>lg0u(i26c zH*jVRrA}!jm3bz!b6gsANP8u5!vG5)p^VJQGm_1{!k6y!&rkoa;ndq58zJyTgU;^m zZFONYaV!?=^WxAv7jJe@Tmk@SfH3OAfhJJ*{^_VFilWA*u#{^FG}Jhh4ry>XvliXR{)|d zAh=0j)Wo#{a9;OIR9{F1X<>kzSfKbgc*CxK+_*S)U|?WZu_-`M++Bdw_vaD_3ZU1+ zr2#J3?jCo88C+lbDKG@Pzrlk05qWMfqRW0H2t~*86bFOJz|l^0d_StG+yJ_jCIxZ` z1jB3B#z|>MjU6stR0nw4!NmofwgG(_7(RZC1gKdGW|MVX_ObRG?3JR7ttx?VHLh$( zNXQ=kjqiX{IZ_O|$;+o`9~Zh69llZX4%90^4NPXA4yc2~#pS&$vepNf_bHdi?%3wI zg`1k1DuEV-1OfjJES&I$DP>leiSbsYpiyr%!)b{i~qe@_~pwuP|%4! zE(D1)u(IoyTZ2KBX1youHh`q7J*SQGBC&GjrU2QzN!~^mc9rU1scECX^J!l zs9051WqsGAk*R5>36p+vx=^xoZ~)EGWFsE<%YJEWczdTLv*VX2;lqb-zP%3c;#pOY zEofI)E`%v|%>w2Ad85=6bk;(XXFz5#C`bdfApEYIUW1&7>Ew^Jw@Ydk3xI{m$gFe~ zEo3-A*@=xrHUVNJS+HV&vVq@t)7Gh`b#)!to4p9|=G$nAzy5CfJz+?WB~yt~0gEsk zv|v?d8+=QVpudnH32iHr;@_XY^@OE^8V!Kq!SnW}idk4-D4!N@-=Yr;Tn@(p;Olr( z4=C`NjDPppaZ-wKfo*+X4`!@a?*YEWU00VIuwGL8`CYe1q|9MG^0R!xAfThV^?;b0 zUQ^OdnVSc~k@89znKJMLX-HC&$Tt|*I5afm8{liEH36zhl6nvj_K$z3o|{OB1_FHe z(*5;;n>TN+cOd5GP9)e!*8r?WMn<}ZFRZqpKnIYH94eqY;M81NrqpKz6Qw97F7A*gY}LvvzZ?VHmCZ%|nFk+5 zc<8`~086K*A6%J=gzNsPj0ENreDPApq?00YB11DY{>gFokKcBQcpsnru8af-Ud!Cr z#?o-k!>1_G9X~O|I*^&y>}R(oBhP|sX{jrduUk4N%2@Z5HSrA~)itN6 z{FbsqGBRt%P96XI1!=jJp; z@#kx698iCR|igEj%Wh?f;Z^ zPPA+H?j)SoVe(1#xQ}SF0x@2!e-~^2^=k4`@n@P~yeMIpfW2fIjbr5oTkekJzL(#J z7H~d>jKX#^OgWPqxW*qT>%g`mAFZgAHp2YyIICg@Xu2v!)uqCeunNbl}lKXcWd3v{^j+9?!_T&7&_1t9i2eEo^vP z%o1g(=Uk+5H60}aPtH5%k)X6&(pKxNXjC4Yk~`l=^{M?zCoT`Mu@Wk&L zlJy_NHp!LTU@hg0G(C^&^;;`0McdD_G{LTtTTv{{yg z)ln(7P)!tPuOH43!NB(qYPAvAqTa1dP{nr5;)ES1)xWl zW5RcFaW{u6wsM9kyBSJil|DDzZVdtYxL^)G(!dtboVlcCPWuGES+potmd(J&h#~#p zU@>9+|7qV!&~q)l6oC;zOcN)>h!f~AUcMQ3K4z&$pOHMh>4b36mT_B?xLN;rOT50o zIzuqT<~ND{SyW2-+FSI%G1s?f;Jpz`mvzwC2m0bekvEsRm1)2U5bL?$>0pH=lm?N1 z>1ewwzY;^c?aa+VEHrSViLo#GEUl~YRalE;0%y8(bPol=PJT&?TCpzaZMpasi5uEu6@n&L#sMSHRD{{FD7du^M zJ-)->YiH9&7yVc{#6PKnZtf#r2_a;j{(ybI)7S5O=U?lrv;P1518XVkdDb)B z_rCYN_jO%+KV1GP(BE?9rj-^J7M2Hp`0j{>#WI+M#iHQlOU-A(K8^m({Oc3M5r1Ec znqIp}^TFcSZx4TKVNr`)r9ZXAe7xf94<`{87VEdp|NG?Nk*{VfEKCm%e)sLMw8&|L zn2;EYc1#oIny#n!H@+bh*{pF6J+#yCkCjKRyB@x^+_T_d+x|rdKikhwja#aE@zQ&B z>{(Sj{l%*dZ$I7aIuQ5yOZRVoE=u~xtvxr2AFn<4W^?13UoRcE`|aWu>(p;TRV`C* z8+r*f+K9^IVsfQ&KuS&Nh36s}=?`r*j#oArG$mxzDexa|6p z`i=iL-X_B80VetGyJnJZoO25|_0qsTX3TUC+&ivpQF()Eq}UBf6d$ae zQ#sNKNJksgQBpu;KFDhRQD@O+ubEh0D&|>ZXFGGUmtn?htPSP7jg*;K-lj++S9_~A zGHt?-hCb<)sL}Z2?Tj-ca7*V_{U9IsJ6-x2EAklFAfX@smLmY9r=@l6lp}VOik%3X zBq*9!&N8ric;>wzx<-;QO~Y9?g49NSK5wptkAKMU!PQhrS&DBbR{a*UW+~!hf44bn;*=1M6llo18bDm_4?Es zUf}h`e8Nzy6~uT9V`Xc$$6#f4<7n&JE3HzPiU3a54bMDh#0a^Y>wEO?X2uAd0=hp> zKEb~|>5)&%S`EX#4R+^R@oS}T{O6X%?uKrBTFV`u*Mf5IdCKT z{j@65AyPdBu%y;1^m~HHth-dV`rUF>JAWsZ87aC-bL1*mGp(aRWEC^VxyqO)(KbJP zo#`$AbLIkboKes=PBoSBkI$wxcwNF6W-c)F{WG_l)<5hJVdV@Ayh(9q+QX)AC-d75 ze+LKdexr#=mG*|{xEV++VL7bPFh?4~u2u6m8zPInF$LkT`jl9-sW|9@bWKx)uuo}8 zRTCuBbe~(oGcfy0|8kXx*Fh|b{$Ws}_j?UwC#LChRun=E*iuqWoKrJB;J?J zv<76v#3WHv)qHD!cu6C{J_*gY6;7$McZ>*A^3%-G@#g?u3s|C^yg zhu?q^P_xHm;{+>eGM0Uyi3_B<-YS|Y#47*PW)SQ#MyyG}w>D`duEr^A3|xIkLv_YN z)il#Ngu3EQhlmTxeD4CG*#1e;kMq}#IHGtu6b&eHJYX_b(xe#uL<@lc;LZ-;q~U*L zZWKDLII1#a{0YYxY>`H!9V16Vl~?o*7U@sIVyoboIt^1aPeEtBV?e3T}M;PfePQ{BC1UU_~7tkWaS!J(*?5L1trRA0?$*#^)L zD(tH9%uDyf7`mA#y!+e^4qurJDJDO!@u-EO}e0ILI2_JW|7NYJ^&VDGoqCX+)`*lmpR@ z6*r{K-S86W&Mv~A}RFsIcwO-OXxli8mXyMs6@4h9$+O--6% zYvavAn$47>zbVPaQ{YkPJ;F4v!X=rZT3MkgM}QPcYUyB4Z_k?X2}f&e zM%sXmd4X9b-H7o_kL)+1xgo~39xuZ#yoC`jbpYpm_GTT9vxzHvgh}%vAzuqny+S>6 z3w}?%Pn$!@swBqNr@N=1G1jm+FZ5Oofs9Qvp!u~SlqB_d%4Zl+gbd0>ULp!af7a5? z5&KQ1RzGOkF|E0Y`Q2fDoyLA`es0dUIe6^Y`;<|f9P-!n4h=FhUCupEg zxym|AkRN0)2cgoTpwSHuky&3*J@vCemjuxGI31X0c^-=qK@Vcn)Uj|>T1s{9msQzY zVRvo2m%?4uBP*GCi5y&#`v%`W(mhSs9-9cTOyVUPy!7)x3JFWA!&D>m4^q-1*G_O{ zEWUl?YeWVl1QjPD&@3U4ur_uxAxBaj5E2Wr{+#6yZyozW+`NSNy}imG~f7z;fJ&xanr|bv-8-3)VN9cIv)} zTmG}qmpTJXwpoJO{2&p$#4AEt2(fcmP6z%d$VgY;#BIe9Mh)L3X)YyXCdOaaTr^QI zJDM`@A?3AZ|E?Z$Uny_g$il>_X^Lpp-ujFvPjs9u=(c{gG21ya(J(fnlZrul#EEwzVM%^!Rd#d|r{-t*R+AV3i z0;D0~bKewSc0u!r?bsXz4492<74p3xWwyT6k#V~Bgx2J`-1{Z+nMFuuvja&{LxOCz zJIqL@m+)r`G88idaFl6gCc)YUV4p-WlmmMUI9`Je^7QL{%HL4#OB;oohSw`x5pM|o zHTa(#@ObPSZT^rHo?M-JiAYr%`LXY0?=3}$B(m;z3U9%Li7o07Bk3=~TQkDzCZ#Fs$3@{GSVD@S@wiv1 zc+~N9ora@m)wp^P=Me*Z%3*_WzaGtvFpMG>yei!~|EY3x5&K!F|4ftPF=UExCnU-q(Lft0VR`4h`x zTcyQFYR$QCPdxkj%T{SF&6zAbzI+ViIhw(APNgwiRIfKpj6)nb_bg#3#Lob%zLsAK zNdn&}$oZMn#yowGHxoY^!3eA0=I>@e56pCSjbKXt39??xswq}EfQWS~VIiAQvmlpr zq#DJE{fyO%-ej{7YCdoNsZ{)IPYN4TD&DGlARcv1bx)1+GU+Midn$F@xl%r`t#U1amLy08H`YMIKW3hrj*5l-gBARz6eX!GD9-<+WAQ%w}Rb@8$dAtN3+ zXOT6Bz{n*q#}zQ_M2Mu@PkXyvAzgtq1Dip5VPp#MGu=3e?i>~8)dRVEu^Cfx24ua7 z71#^428_h}u^Vfs+s7`F@K|PEU+TooSyPn~Nf0ei%kXffV?DY{dKi0CK`6<9VgmQ0 zIg->@sB3-7GDs-)^f~|Q9zyq0m`OV8QSk{xr%X^64)&2_G5eXZar3HbemN2j>C$-sy}?O zvLS?EDmm+1zx&kNN}8+_I)sgFS|Jt5or2>EGrw1agM;?r<)z}vN7O}VxwtdLHisJF z1z>TLHw)Ffirwm~P5jPzxc*EnwU91{(U~v2BG={xVKUO_)n4dV#tz{8@;r||hxTP- z&5WxJ$P}XGS80Be9)nQn(n|-grF^D8(Rkik7DXw^)KejwK=rbsXa{v$ zBQP^~@4Z>HECUCsRJtmm@9G zQ5rcuKudc+5{_argIU=1UwF1T5aU=i|ANo2uWxUXeD#SO%FT#M>tawc1SeK7xN{f0 zAmYsF^W%e25D{-1dY%I^4QXCfGr86^V|`kkbuY*Bnjhm=@0NeIXxN-g)vemwE#y98 z=AeYc^KRYet-NT?>S;4fiMO;?WqQ+5e$n|%oQ_I~RRlMJO$Y)<`;{E5!%F}Tp}6R% zo>*n?!3nvfJldSJ=T^zo_5;|}vf&=SLX|~t3vU!*`js>NMP{0XI4AG5^HEBTP5 zLHly%Xs1UzdZ0X!E;pXl4V2NBn-wlcELsg$h|nepF58;y3R?UFzkM}3-piQt@1HZ`rJBry1L(sX55DwhA~74DxQ(>TXj#y+a8ms98=y&Yd3*ra_HV>l|u8 zsCKJzdR-Ib*(i8Az$0>f)aiuKiO(Ti^$#*X_$4s&^uFgw2{z?O@j=Z#$~_s>|^3M zEd|*M8@M%~v%;)E?8NT9#22&-Qp*jmI0k#FSspOQc`mk`JW1YJ)$VWRS(&sN)2jvC zIyT#Myi{yPnvFQ&P}{lL>vk9YW1h4D$ zLdTI%k#I|Z!5QKpIp?}6oK}9Hz6L8Vs3nM!Yli-0ymm~6m>E4OBll4**5pqEn*No* zti5N3w!dnX9tP&%j4wC}ePuZpqw=tM^@S%#&-5}Wr(VxB)F7$8jkc`y<7*oLY12u= zKYJVd`TaROu>K7-5%hD@SM~N}EyN5O(+rn+pFj52KQE^GW$ruA9o zX>X8lV&;)r4K;7SH23LFoHuARgGY4`dYB4{HmTMC*2zo6?=|0vNpKj2cdO5pv)0R( z{U(19_~}cfGFQQ0 zOD3RcS3)lIx0%uwFJ!tM&E^#M8k(~Vq(ss1nF47}epIiT zoS$Pukv-%i!OEXz*O8I-&h=zLIaep5naSwTjPC$5-z2f6;r01JtF6DnFD+@6T;?OG zo_Tdk|KRC#{6g%^ckaS#zUW26lF6<}%pK%0sZg-p&;@tLXoz&sy?9^M3An&RDwpx$EY?o%yPMiTmfJyLWwA z|AEA9HeYaKIqcLYAGFxBmS(Lr@4L8FtClZluIHgY{D-uj_a92S@c-;&LLBMp2kpnq zKP;Y|ciZyebru%x=NGi!4|=YJ)t9T{Ts}y6=EYp}>QmOW|Igf3w~n>r;jJTww*UP< zPqbN8JrGy<@%bam9xvGK_D9zrnX;Idgk3CQ)Y%63yl0w!_PqX-)m@N7{P#!C-`Oj> z`QJHv=|7)KsWCrxV`=rruRCOae_=I)KYn(_qGJoSmXFVGPdRTM&9%Pc|2EC}$6Ecg zP^$S)HhBBVjs>UqyIB^7;rY$~jBWmRoW#VNY$8Ob(B*`T>To$G{yMW}sh?mn{RcH~ z0oGE3zaaD&KrK+nCIJFf;mFw}@er3Ga6k{h#Qhpa2)kJn}s#gXpc4DYP}cqN6w=4EM4 zD-~x0Hbg2Y3~L4&ZWs+UYv9Ly*`dB+A1zDpPV-{fc$>qVjyE&OhaNtwYv5)6Gi^{S zy1~yhUL^j3Q{)O5bOr1qk3Uvz z-Us1TeW_3KvtvOsQJeKUBmj`g3_PcPz1>H=^Pe1TaDFo^v4qjJ+&UT^`;Q`Ei%gS0 zWbL+@Zng7jR$&gsDCNxQVXt_ZcjQVQsKQ&o=1iV`K1;GJioYt0x@@(lx zC=<;k@(G5O?P0xG%y$8#$!DGbv=VIR#Yj!?s!t*<^e-U~LJeOvSGK5+i-c zheFI{q&s-B*M!tm8e$FCKQGUTb=&6h);)-7x}nPf5YQWibGbOP?pbr~REy;O`BHHJ z)}xnh=9bK zP^Z*a%U>4((Ezq~3=Sd<-uY~JVis0VVWa9U^=J0@@GMxvRzgSu*5ao z6Orf20k+2WFDOa6=AfKC()QRK95r26SqL083$FcOvMrT7r^#`1;KdQ%imk0p`@M}F z46daEUZ?Nz!ZrfE9SpCiMsY4x!CsmzB`dP|I+_Xp>B|T~T*uQVRK1ulE>1TXkv{ud zeH^@w#j#7MzL6_D#%AnJVY%L&(4!y#kRp4Nb{oqy^UX&g zC_+2$8d+AboN{>5(y)PML!Yw1x_fcd_pMw=9=c$~pI1nmMZDGcf>oS9P`o{vkFryo z(aB9~2(lp_SN)YZAEe*HZ??8HHOD+`1dpz;0k(gZ=CUVo(4sa|i+tgZQBTbLC=OU* zXUhMxs06VJb`@xi*RU0us2;{asJyuxa*~hSB7L2Eg$3n9`po(6pDv@6?SW++rN!bbgswprkrm}j8TTvAGmO682qts8VAPB+5uFaT^p@^T1(VtA(=KH+T8ILa}& z23JS0XD>FQ5zcb}DTX%OqgyC<4UHwmko8|r=JXf%)e|hg<{9657OifO zb#hUFO&F};R*yz!3`0(!tEv}JHkxB)#J!cqCz zmi}V8Nic_mS)piIfSBlcYPbYgHqqF}#l>`_#hh&c(5pMu1f!*J~oI z&ujoTbEoML8- zAJ#=)G#N*FLz1bd)iNYHL;YqHyZ8P_$iyjnz6|^>o9Jwi&2Rx$LRe;79e{NwW0C>( zYE@Yl;we=Wlck7I3ZrCb?w5*BKr;3(?lb9c(jcpyElrvTBm+B0$4B5jj_Vrw>Xa*B zg+Ys?&q50)JSr)TDcAZ^>j2}T3a~tjO=B9BS;_qVe3&y>>xW|=D<&A(1m_ZKSb2s_WZoM(J|EKh zkD@S2c2j0w!z5kBd|Gp~5Q5WB@LjMZ%s-zHtO2IWBrzt*P3E4T?ZorqIO%I{k@FQo-wUG(iXAdgl9rH8u2+XS%s`rk8dMc4891Z^fb zs>n?rc19TFf-bw~dW|j1T*4}_9<>80vSM?Dk>U0y1_Q8Xp=sZ{n|gV-V7^1xxkWS_ zPy24BLE9=N@6op(1vqeZBVMOC0p@fkxJlxfvV*K3Pq5d|d8+~dSXzg`bnf+km)X`Ls$LO? zlo~E7*ZyYcOBFIrT;21TW`%z$BtsixRKYK9|3SxP<^+*TS2&_1=r}cF^Zpuz4FIb+ z*9$iANsxSf2O|mF_UuyS2-6GBS{-A9el15e=J;dxmoV2XdP_Bk`MW21Q4u87GB;hu zn?7QBm2|YZM@)ps`joz92lAqkn zCW75s4L~Zzvu=oqkzW`YOBD>@oVgAT=$^bW!hrv@{3fse4oPdKHdLid>A6v(WEuL!WR~NmawOTm4j|m9jcJPD zS6JEGVrc7W?cC(fY=A}xH~Zft*rBA*U|TB=*=G{)b=dK%b*DIuc!PfCh7Oxr36IV* zXN^L9UxXd&&c|5ILuKrnd6H~r_Mdh>^k8|UR?e`J7IzpH(RN0fTUl;^zy2h?&cW}g|UX+9|7Qs$`j`8=z;m~P&VfOPnG_Txc(ROy`uDg2@}tOZ~n&u zL#zV}BQNAF2saiMP0If_=n=y8ERed{CIF)OnyRiH0*W-q*DBcHU#@%|} zs}thFC~f;!g>?NgT6nxA*} z_-oydO5;L(&*E(2hX)ld*=5t_BKqW-LSNS@$YqNVInvcM_V4ry^4nz7htb-FEl3Di zeai2qyuB5F?(vq57GoJb5FeA$oi`$Y+u}(-2MB>xykh|+BzlXKJaG_T@~Rga9d$Bf zh+Y8^g+9aLH_@L~vM5C6Wc4Ywvc~u$w4_@!H{8@nfsaNp2qx+8>D^rHhZpAUo>v;! zr*Shi!(Puxe@uB#uY|F`bY7*Ok~bzW?Q-@wS2mw_UU~x|qVzW|fl}6ia#$PPoh)Io zycxvOVWqIu zGeZ}mR)b=h55mh%=4^PTEMYILV+{KVrdX-!C7$MC{sa1*6kX|G>&7lAp?6%I!X- z?EfkkN2qL+gy9cy`t!N&b=O^8e6aMCN6L5VHV}7Z2l6iKDpTAY<<@bo+86syKcsMi z`ZRX@CCZIG>oWVt?G>lRNpyPNU@RLi&PWF9)^Z6M+u=wWz4^hI! z24(2O)7VrW%#G-8A-9)i%hV?Ver@UO&RE~TVGE*Mmv{GGEj>lRRX15j;ZZNn?TmCm zwZ5)dD@)9)tkFCCOI?gpKaPQeomDwk4VVCZ2&nCj$-F(*9j9_-`vm|tYZUtRT zs_#$NzirD@ObweC-7e~`d+e51iNCg`_L53r?vXmr2KHQS!&eqQ2jjw?6gTFQHzY*W zw6#29ihEu>CdG&mZLW8w4RbPkc?)6Mux!BuW5e?!8TV!9_9aEQ{xG#9;pF>z_$zmN z+e&6C;n3Y7C5b#yLw9aL3+vw3glt=UxiZ18?Wxs(!s|lx`u&0Eck7H0b* zu_-l?kmo3Q@sN2}6k?uucyBf_`7ldyLR4*tkN()|9nYUsmzn3O{(>bLd}7#eHtY4L z9VcKsrzaP)i9Mrd5c^ashEB+&wv1pnm*H8zo5)%%;4DArpW?(8_;Ao(pa12rMS*62 zt@$p_miBP_{zJc3%dKF*PpdZ`4HG3S>WaYOe|R5DP+HoSHEXV2h_UP1-y1j<(yn>0 zkew)n*~LzG)vE$O3rrHT`{)wx=-$|!rN!sq+X$uqu#L*#6kv`I$OHE{Bc7=M3l=*c zwcx(XVRe1Zt9}ur@4a-Tly}a1ap2ycSj$aqvgVoXMCzIyd8QI$3{2jdRyDH!4SFZ^s(We^*S4FUmiQR&x1LE4W;)x_R4gQx_ zcDZ^q#yM%p9|zmV5X=&Su!B+`75@2?q-(Vmx%ZJ14THK{u+4vo?={cnwX*_hJZa6X z+ZJ)#uCteSyl&onH-Q0L)b#nW=x+ylXDZev^kk*fI+Glz?^Cmg-+M7f)KlJX>8VRa zQH3zun*}~^4*9WvX5$lf9y_ev+py6gfIeXBM=WO{Xxt?5VG@FIyfYlJD?c3-v9i>edjoO8_M)o1|oh)G-TBc>7&g7{g~>6 zs(jNa1Fou94GnfKi@@^s>p~|&^Cx%SIdyp!bo1Y`NZzJ}^f+*R$yn7bRl&dSptpU* zySn<_&*Rm%K72%Q_QrfS`1?}v00U(1ZtD&I@8(GMlgzC66(=RlHGl@AT|MlTPc=ST-|G)Ax1dql({)VwLAF}^YdEzHyv$FUP9oaWK&57e@KQ=1q zPvFH*&R?z6>w7UZ3uD;hY&Mp^C9KXIg)-Q6qE0)J(naH;^Zc&R?o|`0p#;F(?IT?6 zBOBG8=516RoK=6XcstAs4f+b_uQatIQDhKF$*-3PC_N6~iib>UqB6aB*9}AXLYVw# zmtfs~0gL4#77apcs2NtKC zzkVo=ojjIK-IH*C-_TxP_EE3$lxC|^@fVMADJOl|=%KBim3?y$dbif+GFK9GM|9mB zyAOrB=NfZlGm9e-U$%U6J^Ah>;<7FEJ|zfin18aQH-Vh>;j0(nys1OB)pMHGI9z;C zo1k9jcm2r8$9*Mh;Z1O#<4|YUSJ#3GR8UEk{=PwJVg&OH;r3dQcvj6FSmwQH7M zGT!#^5s6?v$9F2@6J2W3E0mri+G*Qsfx5&9*mCzqYqrO(ciwldAU5iVaFQ)!#h^s9 z>uo#^R)4gH3WE2ybidN(gMi%!EA~0ZZ)g}&sxHTX?;uz{q4>2-1eAKIHe|%^rQ4mV z7kAD$GoPR`I!AYJ6#U-&niUpYgp-X%itVIvQ~q%XK|`%WSSq)pb_pRj)h;>73|PJ- zL)&E?s+vjtPm@J%(5Ir5Up^mUq%3&x#Jm?zWf6-rK%=cCPnt`4uqZSF9rD8%z13cF2g4vguS75R9#Ce z(WUg*rkd0zws*HS1d(h}>5m8xPXnI)RNhEzNT8-xcU2`*6~A_>^;=QMm1PsG@DO{H zxzR*DYBznaJlNI+J+iT+#~Z2e^cf!&PeH1=pm?Zj$zKy>@dPQap_nr1sUOAZwsg;R z^nOlVgD)w76{$C_ITJN}mzt3o6By8*ELM1WWK9b_7bYp6-+5d8*cmP)^0yFpC>;LALhBr&jqy>TC)5 z_JuXBdC^Z|tOim%E+jfXh`Nm4SXp9==M|QnJKXUER*#D|qi7OPQfv4ncetZI$NwQt z7K(V6b{f2IWV9z&_5d+hj8oJmf_LwYXq>KgZ%igM2pi}f_fS2ss*w|u-ijJ#g}d@$ zYQssPdr5u|s=_mSZZz5Hw7AZ}=ik;j0ps(Fk3&)@y-;-Wd9CPxc21vW?o0n9ci4EW z7!hWBilLTr8!|2gre>D)eD>u!aqI5loDID%MK)wnG(E^mYI`A|{PiZf@lJy9)bU|| z@)N{$3GL4`;OI)`6%>&v87fLG!IyYBbZPrVVHvG;PFLH7IiWqm?i0@_yGqI?hQrzM z)$|bwCztu{d)D6AdIm^M@=cNd}FDBgGeJxnq|_0^@{s19UQZ~F1&{jV;qYfo(IFJiBSzoIAj zWy{S0%zdKmJXi5dP+qL!X10g+_+?@qr-F_MJV*&p?_|I>b7O{0%{o;gfm7`v_6GYP zz3(W>n2mF3u@R{&4c!S1F)mS^+GlBbp7bZfsi6&q-VIYCC(8Qr1g%@SEz7BZBx`Nn zD{%?ADlGFrMnR-|6pqLDg`A|KqT+G*Ga#!|{S9rKq?z`N|2%qMcFOZw^&>+XX48=@ zXuIGjNjADsY^j;lM70-6$lo|}AMiGEzlu8PX^lAbjWlCKHqeVgCc3;Uy2IKSb4@&y z;CJIV+*>S@=u>J2p-3p8d(O46vI;<^JfwSxo&_ZCWS5gVepfsM`j0dTm51T_h-9ln zJ>k^1H9p6R=Uhwdq4Xw3xYz}NVsJvI8EZ?e#o^HgN$x`*%L(!*B%CjIWJMZ}Ih2z|Yro0neZEO4DlNump{J@eV)m<_ZQ;!Js18)U4y4#c%Z zwgyVo`^$@K=?FpQ8G2pHbTur)TUokMUR2>M@O~RrYZ$acb~M)F>94h%!m^CkMt?S) z#e|(~98?@4^+d_ECdP2b0a7iXN1pM{;WBLZJ(6sAbVHD52uE|GOI!PL|09_u+FHSi zXNc?ra5zE1jv`xOGy6a}OI5Ws!(jF~x(C;jTNUQhsPgp4{d-8+QeS=H8-xH=mdbhM z{Oy6&i=QR5<(2G;yZlMV{=8;m&CXTuH&+BKdtQs$|Kq5~6mR<*U^$@*iRa za~++x>P)JGbFjlI!TYQiGEr0jtmmk%=qGV#v}ibtExE_2?z%Qi-8a+(eka;zzOaK7 z1bK!AHriC~T3$Hxpw8x*GO9sN4PfVZItNT72{+KAYzGS}6H-CHDjQnQbSGn(OnQf6 zh+Zdu7KNbKd5DWq%XN`ZPw+9fa&gH{5ffcp^wZy6w0U3Y?(k^(>f23})Au)CM11{s z6Z{K;{dytYH>~%V=D`f2knRSmh{yMT4W`!p%~%Up0yIe(E={i}pFSJvGCei=AJ5+& z{`I$=E$ovD%A?z~1nTkn>N<63|3FKkxfNREp*zG8O^ga->8Spb63sO9cKPR4kWJ%4 zWmWd@I9r)As!f{^p%t>2Gb zjz>qHU1gE~jV3(;lN1YPEMV^8dGW^I8dfB%pX<%uliPaV$_$t46J&0R=R~}FKOPpnx_i1u-I^% zYI}#brb~KdM0$Pxm1hh78v~)XtjXs*SY&bjiN5y)2HA}%pI0u=cg^=ondiI2jO=y= ze|+8&*2Nr+1_~@J?$blI&cp1pC+88+%5^<>e3z1VMRn3Xhp}z-eW~2i2}9dsU>&{XM|{1H zvL!sfkEk^4TjG-vBo56N?aDr8v%B8sW)RCkgPyLknP| zQ>po)KNc}`S;-@9c?k23pRoeJWt_<0TF;4%sHt0J&nmglrM*Y`9K6%{q81Uj;9$>P zZ!C<4Vr6$^12`8Q&ZLQ!OON?TIt^tY2V$y#D{;63jP7Y$s zPIXd%fiB9fXp`qpbGA3#g(4zSrpc)y0Rr(9T5=rLJr}(tuCx2U0{$}5#H}cNf?d#1 zU?w1Zmhx<$i!!v96Y(ykT(qD0SbUi9BH5e7EzIveMKT)vol(4%Ksvcf zMUT``2ZR-#sQ3)y*LjtBQAt$~A2stDBFnx zL#8-!r%6=zVJ?E|K}PAEpzdam6==)U8yGW4!OYA~Cej1%WWU%EZ=@!o;H z#=N(dzE*dmb0R6}nqzULB(n0hoT-$#GIxE z?)-bO3-2+13Pq<`(&u6(PE1-3KX@d}v3+0*Y`^#yF#!hBv8tMNgf(zV44nk*^Iu>l zX|(kI9$xP}7*4DUiO!9}1~ka`?3^x(9Q61>b?O&y(q&%cPRU3lDGb3%$7D#-5<~8O zrn}=Ht?D{0)07^Ud$`=Ga=t2j?BT{t4HYF5QAk0`XIjdWM?nE|k%F7e&9(r%tpJ2* zI0s@OfJ%iG**KRcby2EAc?~%t?{=Xo0WT9nr-T_vA`>-2^ zk;{^=#Y27%ZM6ydx0DdB>vJQ$xO<%3xiKk`2n5yH_8g4{9$ZVdeQFD&_>*lrMr0Dp zxu3n@0m4!wt@(X~vloVy4*7+a;c9K3E=%)6u5kKEwQN6dh%Mk~R{a;8%_|EN(-2x$ zP4+0Xk4BXimZ33W{86rGulH+2Z>QE5pM;x(M~NfYMkB{zJiD!Kvg z3lYiGEutR5SM_X8PBG$6&Ceb~#nb{3UHBs|OO~p$-NgZrYabXSbImGkH>+0}A#Hf$ z75UP5dxv4NHw79asT>|!n@kv#?T#yBHGkwM%VA957D25t=Fg*osH27a12NKVDXA9` z@%I~277+&yc*CdQ)9e!s0NLoUFtIy8cxp0tJZ-JVytBaRt^N73O$yIO0ph@j!(A6K zq1LSzV6rzkB}osYpjv^Fv|_F-KF}))C+yI?%ENp9_!~N|!#j4W%iUUWA`$CKFP6ck zg|*Kxs)@%AQgOesR+$nu1WO^mNs^yvHJV(Awf#xc{_@t6CjZl6S0|FZ-GCi8dxMdn zp=X#~dvoJ6jiaK8dh_!ip_+*7?(glQG9eWvY>3#!CfHsi7lD{=EJ3YvG9$4n_`Q68 zPE-RUBG=`bBicHY&^{`Ya7FbIFDXn-p158Z`-pO>HdYsfH}FJ=X?Qp<5%dh5FKPcX zt>9v=$2G$)L88{4eMJNUs&4ij=Ri0L2WS)oXNsJyo2h@s+dU7V$NpI0NJQ?r#H7rm zx7~-kf^XZF^F!ma3SS|f6>?(Fu(e$Q( z!CI9v&K1b36!lc|hK0?B-y@uFHvBvhJvrKwmyB!Pk=jcSB}U3*CDlxSp*o&kBH=gP zIVE*Uhj=_lt!kjcs4R`Rdho5VpaIgb&H>zyVm~ISJYkKD&L=+Lx^vj+29p;$Pqe4O z>-EGIHgYoZ$2>+)fLQPcnYGcsvY3V*+FrtDJD1=7JNmsu)_tGI78Js73 zh`D5ifjvY=G`}IqE%ynWFu@Iym$2x@3otVD?HeUBQXXZP7g* zNNwnszKJ|hIIZvg-B9~Ell(SKT+b^8(J39Nb(&Y^t?5(cL#eg)g^_D~!R0H_!>+1e z6gibwRgY+_88&~433tHrKch>8SlC*XHIpOC%lo(KEvUC{!a-D3aB|Ad{7&5(@ z+LyJenD9l_ZA{koWlWv6Gc*k1mu}@07U!kPh}624hm15c7PF=wA&S7Qc1zdq zp!&u9jVH{H!5SlJpF3c;hv5kGI9l9y{JvHAv2o<9f1Ac%)gcRu??BP>e^u&v^nBsD zEQc5b*0qkUw>V$?T6%39NuNd@njdr1>iN0P^$~YK5Ftq~IfyOPgUc+QD~@7-yQo{V zhtAAjRP*cqmOQjc`^$!`bJXb=*FvsxI%6Nb#qcAhmtxhwZP`9E zZxqr~0vH~CLEep&VPpsTcW+E^nq~M;r>J1XnOXG;Z&%6qe60v_Y=rUS!jPRl)La&b zC-ToerBWOEuy@CP(r>LxdjmNx(bTtnrU$4LEpBOtXQctdEfpUWI_e4*Sn>1m|KOP2 z;CyiECSP`X&OOyC!K+g7N%R}#AB3xY%ITu$IMh0D{LT-R)-TN@d%iXkWJQyUWGi8~ z_s`{+Q+6KpJ`DlSoP61Jh)1R3Pd<=Ni>4nwu+IEGW#)32v-!_(G;FCacKmNons2`l z<<1T=TRXmtugajca=#(m=JdfCm%n{G6xA>!eEH9>k2j}7*uz^b^UYP99oe5eJgpm% z5qnbYPMRhrN{5#p@HM?IDp4qi4wdV4`-vNwt;bNsiD;!|;UhG$#?7LLog=nepX?CO z-h2(sZsg<&FD0ll*Pm^myRo)2A^66)h>Uy5MCi>Wl_QF0@+(9}&?P0?{7w7SJsn$> zCkqn~vk<9d%yH4%a7PXu2I+VmiHe0y8n?4*Yw{coPPg-tGXtxB2_%;16FnO5C`Qlu z^nRmsSv$Wv=erhaR3Av&0pqcNPj4R)-9PoAQ1kHA!S$zKVg^&+HJoOT$f|$ZQ8C<6 zlm4}^{!~=;=l`5;jf{)!RHXLkMio95PD_QyB6Uo;%>VT1bWlKb~6DOSYf$M2`u+gaB1ds%6iZTUY%KB_C z$Le7}GbT#HD;C)sq#^9c^^G%;l6L&NUfzH;0w^1x^oT%IsoWkb8u9!=L|(N?mddea zq>|~-M1iaV(n+S3AL?p5S+}kJiJaC-^b?tl-iXA|xlyCUsAs~T9TJ&D0I6@}&FZrV z2t!e98MiuS^kx5D;KNTbPVxR7Fx43^FS&Z=2|CS484Lf?`B&PgfwN=wO$n zpccXL+Vc5ZkyAP;dn${m`2(M{3K9T%RoVL04X|z}|1WNKa;t4(FyL6qG;;K`w)>mrKhxlrvFQaCt}`<%m-<4Zlbk)$KEh2Ah1ju2uMoVga0O5Ydt1oFt8tCoGQg?4i`@ zn*l3d+z*0Lb#J(m<>$7@a%nU&NfiwvdyXl-szkNSf=Z}^1cT*o0 z=K>M~BE(HkD%_ z#n{)&2V?cpTE^~mfk}{|Tq$>dkq%63V486Fr6to7K6@I9#YB0`dZ^B_N4AP=eUMXu zAn;Lde-HTl!CGJC*B>VR*32jU`st0nCPsKJM#K!>drj3!(Ym)v_sPRk9t)~m-gFJm zH@`dA4;t+bd}6(|OP=_=JDgy-HdIFIH0n3*ZpHbh!6g@R8Uqm-pISk~GIMKw-+I(Y ze*wht%FVJ^Ik#69=VvpEqHcN|uh`PqWcmWjDf90s58=~FSZT`mDAS4hK9TB_SF?Ob zJtYh#IZpb>IOFqa9GC^smG(xwh4X0iLQBYjWyFk2X8M0T?cN82Gug zndvuI(M(!Hq>=C|lIi6kRUK0e;lFtvgZX*ERo3bN)CuQB=#PNCZplpnHG(dlNOeJQ zSEKAe%>76^RcoP;4q21CgQZ750)_P56hsgQ6IxU04sv0!QGblzHCPuir2}c8%tOLZ z^rG1{#1%>`6)cE}W+uX_E6v<#@>5uSsad}FyQ#~k98stmTXwsGkMIx-U5kJmriZff zVdh3D(AC1t4vGDW>wXpZ9QFF*o1pF#v9XfF3mzOTXB=(lX)0NkIkM1k&k=KD?XZre zr-@DC*7G;22H&q_?$ujMknJg&0Nw$#oe`%J;Br1e=#Zr^#VGs66Vq|?T-_sZ(UO*! za7rqbEHRV<4d!;b6_Y>KGe#FnbWz1tGqp$_8fX(!@&yqy6~ps$#PW{GH09>D=5)@J zJ0p5QzMQbKN~pcNp|V#O+J(rX_pS2TR*`8MLA5gcT$ecMkc64P&0mNm>yjoF#RP^X8%VK?R z0$pNK_3nCN#0()s5nJ*_uf_$|zAkJihmQC6`IXDJF*p z#xv1T?~Z>p@iKj_C9bkWUYbwJc~`mPpWm)Vph*@g1X^n<*MXV2UQXQnItcQ`VhCts zQfggzUp7Lod{^1+8gZ3*rg)MlYUZ7{dS#TC5|8b$jO%=NX1 zx$n$LA4bMAo~p-(qrzv*tsjlpHLYscp>~1)581L2;ddk#@TiCyK+?5X(W{#zMHy@P zCcF;vp6qc?panQ8)hAj5)*x#6P!Qg~ubml={Q9BW(FAq|KDLLoNBt3EvIWts5fBxK}YODXMoW7Uy&y}`ndLdfA{+h}{42-8Q$N{E~i#?+uiK=(R)jH#r zfk*eSe${+KqXx7x!UHRZU@W3BqKwD-OEe;03Ol=2F!eGn!MA!M&wSzuLY#sQ>NS2Q zct9$mQICtS{5AI5WAW{mt}dHIdF&hh&@YY%06bOqBl@qkLn;uuc-ggxkS^*``ENRk ztdVD(NtCha683KZ-s^5vzIn-t2(Li+{Nn&F!7GAI8@!s9+>tcwWdJP-0MM2JDx@BE zL8|fz{u}CiVBG>*9K+jojC+?#b6}pPntOgiH3mO$N5#)h#w6H-??`?yi~&?k>ys%( z$nQC?gYUfB7!3v<_t8g974_rZ*qOaa<#U$*Je9{7cv+TlalqHM07|Ngirvx)=9r94`@ug!se*Jj`kCj>tqX?c( zfj~=I_HAE2RXOI|Y*Y+$lv8{~Ph`9Oeiz_*pM3EK7qi#0MUoh4iXNt4^R%c*S zg5J}Sg+-5Rcbvm^CTW-Z@3?rG4!M2Zuz$hcJrBtd@%8}6_~3^>3IC!PN~}Y^afuz3 zyv?)j9B(EItSYH)N*n`$EW13eM_A$hFw;hK)}B!mDLte6>&F*oxHKv)>}1u>$A zJy$g`_q*1Y&*q%|5P>^|9U5!rM9$E-(ayrtj>|Q0d`dNqSTq^c8u_1bZJfVg$GN9l zv=7FuI~Aoy2*RgD|*M%=sv-TlWTc5Mrl z_dTK(cc8Nkr1O&pydzk0ZeMOEbG#Elhj=;0p`FsA*#Sj434rH-*%b^0@2RKGw2?tU zLtJOp6~yvTj`%Fcjx*_9r-0T6g{H|&=!Mq9FVm@D2DM2p+-1*Sy%+F0S5@GzsHYxZ zH1M9*%I`?ryV<3BS}kh}jeJs0wzyk}d&)sLY4VjTQZK49`lD7h_L9=bn7dKTqEhVUo?I6hhCcU7VX-&>c_C(AK%P4L)dlh zGJr;#FXyQn zT6%mwl-qEnfAwwzge3gDn`JP$Uazdq*M^0XOm8=%UX`x5WwasKv;5wG4g_Sj*#XP! z+hIHwwbSrl&d~t?pX=1%Ge!kIcT#VkWV*j;{~LH3d<357N#HZ-p8?OfeBPM#-LNHX zIdYEYoP4Kxl{1-+5~Om54DrG$bD$@bmo^fkLTG)fH(5e(7OCspVQ>g374gz21(9yF zL_$#(Uln*($ldCbsDjQ}e?`+%Vh<{RBu~T*51RH+K~7105SazA_tf$PNS7eRUvxJN z2dQ^;6l4$Qou==Lkh+X7V`9)((S6y?uC1TH%lm?TzCO3C-Fgm~&d4WQ|rQsZ+6XVOG3`bFLKBcw$SiJ@`YQ|{u$oum$C!XZx zzM5S#DB@skkByuS=>4jNTrb@YHC!JR|x!a&Nq6pFz!O>s5kn5{p;k2MXp1Z$)F@LG};caS<|5qu+ z{_BosS8nKT+mk#;tzwSc{r*si-}v?UPEhLhlIRAjk7693m48j_p%Ud&;;RA|#X!2C zpcQh`ASBopH~woj{g}`AO9xU8D=T?-;`5Z$mFE_N$A#EFceS5ApEC( zP$p#FksQ<=KYn=4k^;Y*J5xs;R+GoUC4EiQ*l>~?7stdPI!5TonIiF}Sg7Kl{sC=G z6uDI~01td~+E)@Qz}KTf7~ce*SrPEX#G`gYO)|nx;M!MiBfYCMQ|2sCz1|PI06t00 zhdR9Ln@B?b(Bxc2&+eFIO8H@M{s5;VaajuZI6O%v#m^)tT2B_^8)G zV0qs^MVKvC0E0Pz({Fx@mVR^YdGQAW6Gv7ni##GyEBUlIYPRvC>Ydkv zfos*YwX&+;A+{+e)vED_vYQ%~_bUKhSNzA%lPIrC*H`NIYMse=U!taTwf;83X%WBH zsB5&;12U(ssh;<0%g>I|3j782aQK>O5Gb~a z!iTJb-dqu}S1Fk_F6s1>&u=K+1Y}MdXjsuWKu`~8+Ry*M1taz^eiBY1xeXT^k0VYr zuO59-)QBj`f7iH+>SAA=VCNe|8J_&5m*aYAcKbSXyq`pTf|6!?+VMNh!l=U6fLQ!a z*WuYqpi#xTs{H8tfChcf5w)6KjU%u8Ri5%@4?_wZx^gkBXgaU!aXaO>L6*i7b*@ug zIesKKjeh#|2QJb;1tymsHw2DMcBuzvBB}qX|Cx-4szTa}V!K zna&mQ_}pWYx9=a&(%$rrgk4)eVQ-xXc~(U0Y)Ae`I@+|!Yi{ugQI$G?i9{bX0BPUh zuCo$}US?uz%+Hf1$b?gQx~Vj-2!5$>9(2(L+7?Mm;}d!1=Ysaz|CONKhU{NzLpZ98 zsrXk#`vU0SiuQ?Jf-p{DKIhbnDGLd^yo{-xM$VwFs*-zMh#6f@?mszd$^3qWvOF>& zs|?XKT77J+_h#D|4f5SBN!J#p8ztIXAG$h~4m~Y(1(Yj`H6W9!x-N}g{d<$li)%`~ z`@8#B{294s4KzfneLn7U-OBlF$|?PN;hnsjmmCWYW><{I-O1m`;aNx#oKi$L6cX`f z*YfuO4wW?PZkE_Ym?Ee@xD@r1*m8rh2NlxGQtMYyUg?i?*)nR7-i<-Kr# zUdQ<;Yat``@{!2=OOmo{B&pmn^gcPb&lb_!m>}=zRJO`P<=yEDZZSST0%qU{XwlcI zA8?Kna3hJQ0neTNFlI)>eSY=F(#S*e4lHuqbKvGe(Ka0uZo8%2Bx(EDd!W!*u--D2 zM6ZZ6viu4+Cne!D=Er>!k`%3Dy#IIh(<0TF!m|a7cG?r-Ng#)&-+!5n41GPs^moD;v3>I=bG!^UP@_B%2`@)RpQcRUA=aguEA@<=l&~Exh-R&lIk2y+~+gCj4P1^ z5vkTGoV7SxHqAoriy!?k+Uabi*nrpxqD#n2LXNJXdsh^WeZYjWwVicd3qVAs}YBa1{*L0aNntz*I_x?W=BoDP+ih)CbU)K)va=xWganO@^;)gz84EK+L9s?@Dn$X*U~d_hPXil@?%S^vZLl}u!W6D6=;fy+ zrOOGw>@-%Ev3gav+HR%)&44wT2xe%iAgW@R@N5}EYTZI3SH>=(7b0$sGmm}oobKW2 zad!5>v){<+<}1r6eM8XD^pRB&A#W-F?UdaQr*EQ zP2A)DnQFVHI__jUd+b|r7KK;*Pt`U%)gg1(4^=vxXDN|?^*F4l3T0Kv(wmS!YBdtO zMv8!`CXmTsqf6y^g1v7fP0xs&7*Q&$z`C^E)+2@4^-g^e_>?U_(g z6VYl0tXnl6Q~b_TcfTGtRb=;ru>2+4jtm%)h;C}?lsMU2r=GH#Btb748xO(=Cxd3Z zoroNO9EcO=>?9 z$X%izKjhOge7;`1O=+z`cCz$2WCwJ*!&D5T$R+r>Lo2KPi;D*owtT>&*NNq|{CIhT z?44uT?2WE~g-2}sNj{|ti)sURsrWc_>*R3n-ukdV271M@D>}dr+L5EupE%a5xD{#d z#{c6R)zD99xn0`&ZIVOC^A#Qm{D99_d%&BowmfS2A~j8IEzM3cADi0eOo~6mn>dOp z@ET{lucHdA#0C3gkWx)S)zaD<{qN_WdwyGutKv8AR8RP-B)0#3+UjjL-|_wU&CgM> zawCoJ)b~}phDv;+Vh^|B-{HV~UZo;leGxTG4GMNYp?yYnOCcYz*EolXmB7^jMDSMs zyE%O$-@SS_?)FUm2M>N$;bI*ax^?BN;ddIdqgMB=zwi9S*Jma(6z@ly5O$wr(;i*rK);dtPA?C9ll5AJ ztL~hzKuOhz_MBLqqsUwCeaY{;1-=(4_SaV z^C}F0Ai#u3GEN?tl*L@4?2lAg6H^ViIPOMpR*EjysNThXj`g$B*N}-$!6=7|lvOv| zkvrygb5cJ$fG0sRQElC1z6hQIboeYj%BOk)U}*h^j|Kwuk3zzvio);#{pl9?hn`d&RM+HET??x0rji zFZQQJK{3S6H7i5 z%l_R?{!vsF3$Azf=>i*5R)luZb0(kCDrHmO3wTgg-VykyfV2daltA4(jmZzX2`o{RaAgXih$IU zxvxlF`YtHo4Dz8eZXfqMb2LM^s!#y&aYa4r=AvJ+ ziPZEVSx7iu0nl1Is`)`%|1rx%Jy@LvyJV}XoxC0wOSPE4bZ)Rf8y?@71Z$9BDU)cW%M-h;HAi3DeWvqNBycC)&1{%Hgq~j6= z&4PAS&>O=bnDEw*d3%us-aj!T8Um#j`zR z#l{Z@&f_qlU!~(r^RE1&A<{}y2|D*FTT#&dnjgln zh!YC8>*%1+B>Ji{f3s_CTbScSsxFJcF0ZCgRVv68Q`wiW2myh^w=kA9)J`8YNewEM z1a4jOvlu$$BeigoR61t1sX|Y_nD^@!TbAk`>f$c^o%;}Gc#QlA{Qd62gstCK>~lKL z7>d#LFFtFh@52+O?+)eIO?=hx=c?_DZ(Tm2rRV2MOilB;z=?hlABG%!&o&&7HNAFs z)qKZ)hf0yO)dBN_wAyFlpB#+kE1_0dmiYL4M zK@G<#OX6FRj<4+gHeI1?k&i0VJUPpB?yH(-6fTawdAfN2gVT}ZC2Gov660&}7>O9?~u~8n^ zTrME?14NAPY!A!p)sYAq_z19K;%_RkI4!NL8*>3sLKTfMXFBt^0`#y|--A#spc+C{ z#|034-Tx4NbDF7sZjNX^4?|YoJPb!6?QTK*Ue$Eual4O;iZa~EnWyC z0edpEY^ zCmqk`!@^?)RIpb1=jO4s>;GGj1zX_o@A(ebLqD=%&+1Hv_6CydZSD3<P6cx)q-p~=hY2k19M7cL!F4V}-LVL67QTW$;Mp z!s5ELw2VuRIr2?$pT|Ii_ZkE6%woywJU&Bu_Upud^lxc{SlPNW!6uY)=o;GXlbl** zRegC@(3E${D&*-uj=PinE5$oUi@--fm+Z{t+`ZbIKv7KvT@ba;39Ro#>}phuRQwf1 zB`3)AwArUP;`QLtQG5$@7h-y6CfK%AZ0gJN(&lwr@Rh++%k5Y>AAz0qRM9=J17e)5lzX!X`#=YCT0 zS39dDeceP*Np<+Br3x1oN+Si0y+pp3U3t`O+1x6q)H_cDR zVEe@)cdEE0mV~yIH6#lnQj3rrj!Sd$SZ#GPLU@R^gp(?0leu)}F zdTBtcLg8GiH_UJFJr`|D7{7*=9|_dk8xw9x#E7rC@vezRsUBES(F$ScjqS5Cn{vkj zu8bsVu}(poLd*nj7*S)#ce;=* zJd}OWcmp5Q85^;fMiDE$;+^xvQw?A|ua?CQE0w%RSG+=QgER>bLHyFFm(kf%y=@^= zafg}MRQxfyt-4Iy4VX9Q1dSqL7}6ZXH)Vy!CDi=Vrwu-(bd6%dTCgu(&ySaS_b?{- zV;D=$FT1;#ypGrd7cP_kTfT3EmA?DVzeGs*AlMVAEVR7+9#vQuNGG50hY?^!+(`$h zY)WQRI_sD^B#-kg6`Zsy-9fXyB3}L^HpKtAo267qJSw#}!S&}i+XMc2wx^K0AdQTE zDrbZ!j!EOFoLE$YAzbPGR0z4tp5|FA?%-v5t~_z$6U#U<)GUxhAc!Kj5E1gq>U?Z1 z*#YzU)1u0o0L52gY5H#PozdZKt13aQSOh8#^pK~|Qa7IO-D&aGBsD10AD++%BE#PV z(GbWkcFdr|q10%RnJ@JB>`IHGd{L1omHyFek3s zQ)ww{YC9=W#4ti|&t>8%PAqXYu?)Ps%SRf_X^?u~{ZoPKvTZ_}mWIKg0n$V-0yjIS zC@jIbK1+_yha0AG7P|3Rs*9DhG0+x%_1Av(t;RJ$6PyU_Kh1?0=*3V@fd{M!#0?cj z1Qf0*y79%tUf)=bcW~^i-O&_*ur}zg8SrD}zu^Cx2D)8z=EO_w-GhuN)2i;8NBJsX z{rAPs#Z-hUn*zeB*+lGz|Jr5c^dre9^!FoY|FqxbF7e3A>WPq)lj5M)uW$~QntLEl z;afQ?v%F=ns*7Xsa$5rGaX<2NYSfOQ3ex7gwgc!&LX)+wJ~HcLXaYCKlp=)|td z#wtT|OV3K$rQFeUOLrRxjx0h9*0H&9{NJa_cYpSL16FApyUTR0e(lBuIoxX?VKaFU zBmVjN0*=34M_8YhwCV>Ic1mAq>AsRna|nWffmn_^yQP~Fke_E-w0b;sp5r|C&0+P? zj`o6o8mP<`--`p}n2)ocd(+ANR&WDlWCLW(XrV+dgd%eRQq#()94rabh#aX* zMlu*9HG?)6Id4J~!*{~2S@@c#!b;5`v#1Ql;j+5#Dkr;xFjuL-rbZp){K_g!t>T7v z5G9K?ONdHWq>W}j9v9O5ly)G+QJy<$6qwiez~!OCpvck3GRuUSO(X$&s`GPjwGY^@ z_`*-xW|Z*2Y7m+Oy2!&me@%P;k`&V!voCHrwHAzA-f-L+hatcag8A_pktgtqn=N?r znaGo!w75Xtc(nhYHN=5`p<81swn?CO+)>jwDzFRA)Me6zo`@Dv(sbl7HEwN$Z$x5P zTXekNH$KXf2K#$cdUCrW0>)op@AAj^%5dq2j7v~kXqqM0db4O-0%oLAb?IHGd=@qF zG)XctZJJu?4(|_RpxY@onJC@P;}Hh=JIp%DP7=6jR%;>*BJwSXJrhyVnGK)c;<-+J z_SZmcR)R=Pnfx7DI>~TWHR)fS+S0`P95tva7PS#6W@Qh@p8d&)ZW%Z$ zGw#C*{J)Jm?XjgwW}`*C{;vM;XYbo5%TbcCsw+QlTj78HzNNPapx?G>&voUIs@Sv_ zpE56eLtjVd{1bL3Q`{zP9-VC-$LUWpj%b}rx%Yv2EFpSKBlLWDOakO)EPN{k^1L(s#Fg(H_OVov_Q)sZLan>Cs64T zj_&mV#?mTrPUNXYS1s%s-S5}mXr&f4tO}C8P#@=EkBT(|+V!S(C;rir|7KhDh`pZr zQ&v8}cmhrL?R$Kz@_{~kG|2@uTl=B+c{n6qZSa{@{(3gt1eK<_DyBv%X&hO<=)Kl2 z*VT~}`K5b<=d3~JQdF1>h<3Yl;#Z&!{tg#STzrQxceB*ty1>@w8>{Ts?D1K-jQf$9 z{Zn;eKZ6Lpd)(0q!2MgK^T`a-5#hRpkcq zq|aj9xGCr>k{~+Ik{5A$8jDT-b3UX1w_w@?5y$56;>z4dI=cgX$B#*(DrChdNET)+ zbvBU;FKESSi{w-F<^7NIG90SVrRe?|X9M_y2&SjcqxhYmau$M=FV9V(Q8F3Pyy|?k zBlIL+Kpw0qL@yVfg5WP&hLV-R;UmhC0zYW9UJq)Q=9W_a=2Fk67w7IS0l3r+Ju8fm z8ZH&~$}6=6u={jeFGkpDU*`f&p4{ZK&WmuT03o*b;Wv@oSbRM=zZt9#>;YMMRnnGk zdkOpd+v=kbeV>zkp89u$hxA<&<3txNx@Fueq?^A%u-5S5+4M$|WVpY>!gsY|au?~O z@0easZvd&@(~0e<4Xfk^Nu1YzasSk9?BUS+Ke7n)!CKe%KYoS#Ic)f%L-Co>juXW? zFi2CO!?nRN>K@+G_hAP9X#g?^`^IGsFSGVMSk6FM8Hr*-qtVkt+#PTA@F-imAYl0P zN?MRU0}UZ|W3`X~6hbe^4s;D|12RZK_;W`jH;ZV3p1LR2ZEUF1PD%^|Nx*sIEAL5V z?`e4($P;9@!%#1d>Bt>7f^wHE2n~k&leoT$lh3-dMhiCn#~`bfk4t_zp!WuokreRz zVOH8amqh{RF|P{UMZNBek`CVPu6H+Uf0hcbs$HB~qR~I%xVuRjdk%X20r7D!0p@ya z8PW)Og_ZWlDQS$-lVEyJEMZuYI_`*qO;fY*XIw@AW#Gf# zfHUgGhp;X+uKB47!@@7;Z6iZ~cG7PB#JxK&9v}1G(VqL5GS{L;ej8j+0jMhG z63DW@Odu;fvC|>wmgEm>)meqxoB5SKAV&0369SYd8%s7#mzKzB>hj_8VoYnp!-Bj? zW7d*}ZH7K}a7aI0=IQ8L!clC&VcqKCnb}iT%%IglJcUSHmo%dQ@0Y~8bgfo8ph7tR zdA`uiJ7?gFiY>QLthozs9JE?a%y3_HCh+v5z(t6{h&EZYUsRa>Nx%8tyz z?s>=u;x3di@#{B3w`hM4DglIv9k*c|Ul;Kz`Ew@Kx>c^|C5K`W2v?qz$*3DP*k;5# zgmvOxl^7gEO@}xpMg44H=$|4sgyMm)1}7)>=&lMyuzJ#Y6{hZ<@h-0M+T1xGeXx!3YLq+xP<| z!{K6r3un=^Uj?Xh+OG;xL98+(=USfPxm>i^(nWmqXL*2#2o=aEcctHT`PzcbM>9+f zVE&?lKv9SvnNWZVdG^myQ(+XVoba`68JX1mYHmy`NX^gbz*H>bcMm6lMac0r)#{6x z>SH%q>&|8W-?^VcyMl+~4Z{co($~Vx6{LDh)Gd)uD%;JM~^nouq+E1YWa{X~z7ZZ{}06|Y99>L^$(E0l&W1RBR8(|L~p)!>TK<*%u1kDoM5@tBIY>YeK&0$Vtmsuo0b;uj!0{2$o^@ZZAo0b%Cxg#N8fip>7R z%Kj7;My#pR;15mrxT-Zgc%IfnH}`}k+nSaHH5sd}=8R0mUuwc~&xy-EIOI*^R3PPH zms(B;5Tqsp75W~)2lF+$!8u)}x__*tr3uh~Rj0u%>a1J>kjr56bJMDzCNuRHs14ab zHX5?|>OTq6=88aL1zka9Kk!A zpf#(;M0@2*b?e?kCDj7Dw%6J-ALr)x{wTbr&fqd&7wBlyr{8_3>o3@bYL9&rbzhRD zxIbhM-QVr!k7uQcg3``Z|7@Q?RY{ z$aumF-{f{m!r;)ZlgB7)0EYB3dtH!zx3AD8#u?poT58?{9r*JSWehE;n$CF)B8_j2 z!Y!FzL&$p_hdUse4r1O(aL~AIF zC(P0JfS|D~Dq|1NDM&~@^I{LL*fHpB?h3B3@W|P+y~&iIS{w=+J8Qi}*|_r05k-J% zY9MB+r&kT&;+edDc{06S{(*6EQxVudvmQw9dL#0>cx4Z-7dV_bm_=nY%;tTk>2s?& zZ6Lb~qhB)+c&a#VuNlA1G^6iHIO__iPlLqf!^-8gcXE=V285@JJHS#}7_tFYX}F)= zR2#e5^6|O$rkzDWXe!VSZ*joDXclHb8`1|~07CKJLI4D2bLSVfG~}>84CQiKc_Nu_ z2OAlG;2tm{$$J9Le`b?PeldGyn&Livh+Tf%x5!UdInXWje9s7%5v6x` z?c(ot$;eDEU4H{t_~D{PlCsaI2(yD|!t1w}j6>E8#>=OC)8G>%zvs+evmqrdHx*qf z`!%TP)-W~Gy{paNc9!fS5eGr-Q`+%6mq^H=j+V6AGuz_COHHuKp`f8Uyaf6ur3V^q zV~p*O!j=PV&IErIets3Is(-q)VYagPv*tvqS2vK_3km1wyaNKf0_J&asy}J?ce6db zW79{r_HgIf3kZ=cS3e)<0@sSWtVhT{z#CXYnCOxM$QJUbqSZ=D)t8XD*w^+5bY8e! zGIp3+BEt39WR^g1wKKzY=4l)DM~KNtLd%~VX&rNr z`T(?_+@x$9Naw)qjEQc@hG@zA2J6ml4rD7`o-=D*&;8kg+|{$Z0C+c^mh?ThRX8JN z971{Jm@pz}%2yE(gD(@;$a-@W9Yg37%=44m1`P;Y3`d7_*AG!UmW!=L7S}|hpmiIn z@_9?@`3fG#g@Uu~AE$|f(7nN^LQEWiZ#66!>Ln?Dj~}fvLrU_&cs9%#?Re+&huZg9 zJB6{*+OTn0~?rAzG{BaWYnm(PQ zN@5+t$N)lfu;B|arYhCTOOxu=sSmdUEA{BNE-I_Ni}$uTpYWJwuIG8VS2u>47E%5-*Tn=G=gjKHt`%|PtgBfeMd(Boi| z!EgfH@(f~zq@YIFGHAU>Qm70>gO!b*ES`;#Xv1jASh;GX^ERMO$eoX6=@1I1o#jLU3?Wse( zXTqM@yhNnLQ03)TiC(i@Mb=qoxHDca%`CQ0nm*mAnfg^SFpV`{RLE!Qw*c5X@$3i1 zlqa&e>as>W3U|)jT^>!~AAX|Jjt(T9exah0FM}KevXsxsWO(lzqtg6jzY2Y-$ulD- z#i<+D?nICF=1MwJ$uD=M{ho-TyHurW(|jXEl?$h@Smg6Us=I;AW#LiFOmII^UTcBq zt976Va(LQ3Vtc<7XMblIxQ6wf&24NcmzCJf{)&q5lPEj4A<(`%XAwf~K@MTTxB)bm zg9d9u`=EwTU#1l%Mue44`pnLX=;OoLtz#kl$K%zscBbo23KD+Ho8c6c3TcsH#9-)9 zT)5Q}pgi=-2 z(#*!NZflAbD#*XweS9f?O-X(lZZw820s_TN`%-?}nZ&O}K-uP?tj-yiDV}Y@pHaTs zg@1zZ^=yPqb!YgFXx9Wt+ublzY9m83`LZp_1yBOXsbLMYU;4EbtNXoq)qY~Xl8I8# zcYxE3-I0+SVm_XTx!g+KTh`*7Rt*%)H4yi zK|Q*IafenI;c?4L(9^P#dT>E{>4EBFNXTX{`HGi=8a3f&h8>i{i$5iexz;pd#5G3kJ z8=zu|xqy6z>4|GVEw@~)Dp=|xdh5X|Hn(wnKH?`JC2WKiT?*n;X;t)isVy;Pri#-n zD}+FN$d=(pjOi$}l_WcbA5S9}(*mOMf+J84z|%#TD?!8z1H%Q!2rMc? zIk8uYS^1OrDJz`EtlyM3-h=3+Tp_9fCH=%i6z5MHasFhd@1RB9?{Xk_9B#v{A)n9Mq2rjQe96%Fyb z%J;OTr^&&(bPxJbmbk6Uy?;=b#?9uGPlvD~i7PnpsPGW@N&mP&rLL$dI-W-3CX2!t zvBAnRe{FrqE)iW`$>n0}FE+Mt5_d5Gf}pEbEaTbm#p0qLQG1UT3J#uZ5a`<(4F zC;=RwO!XA5XGX+>!{EanBb}a6hX-qiY%p$VQZ9?C=$$|t+Z9n(uz22;?X!{g*xF)x zr6T7~zh(>svehpcY3Eh%W|=sa8{r!TZk-LEC@^P!@hStdCH`goSrGqF-+dv?zu{4J z$=T-Z{M~IOwZ+{x`?h01tBXEXg&=69I$9b5N=1Rto$6%i&+Te125@%?hBqoZ*g|~( z?Z37{^dN|%=Q6F$;k`kejVDDJY&9C+>{D5h7Rb{z871=*4k!Y3{oNxBs8suEk*h7y zYm3;wKI^KVxZY&J5IM0#@%XO>E)q_xXxth*9d1|cT8a=&@kbuv%F>i=vw41!C(uzn zxDAOc1Z$6dI78igSs-Z)%;h|*a>SCu{8veIg+j~GySQ2r9SUdo0a3URAZ+rk3&Ws_ z{MU4GEA6O4)B^B zATVsT11sTgy0~=%Jie)K|9u$TG82n-ZFtZOCEy9P$C zb4Q!O-w6$r9l|JBuNMC#q=7+>lbi;{Rnv}d5aeP@aTsw%c`~xdA*m5QVQZa`9_4E% zJX$X-Mc*2cbqi@=@knwlHAiwmp2r^-aSvM{a#O1jqx)>#Z289^SczD1UwY|I-!Za; z?^}R2$wj(%;X1E1`9gsop&N2+pL6y^UkfS&7u6SW2JN1p zb(Q_ZleS4#)#WRx?xoC`V%U=e+RT##b~$av{>22LdJRNL26nb)?+Wct7UTs=UqqmV z{C?*=jlqQYk=!o=whVay7O%N8YCRhFJBRr@$L zRbATaefF+_W#m_jh@{%xBdy;no2Hk1MZ8e^>g};Qp*Z$HkMy~!Eb!f`s$w;QrKA=Dz&{bFIsB?<>^zog&;IPbIB_>--#(5+lXj=Te&NtQWQ)Exr- zYU@AgA#P24H++5=O$a0`>%c_^V-xHl1e0Y8eJv4EuhQ%8!KeX)iKwbq)6?ESu2gRQ zS$x&&wXM>Yf1H#iO56LfHJ@(cscyd3 z#GE8)GVamHCY2)Ul_tpS99r`Wb)a@u&YZSM`C0A08))QQcvpW&ZmSVVZBh+5u+I$^ z{~!C@WLntP0-`3D-e_9vAtTXSoSvwWz5JPARnJRB#F~J#y*H*))n|GAlkM-AXXVX$ zDz5sNi+v8h`J^AW9ocKfA}RfbE52p!H*Yj1gif#7_ma~)5m%bVdO0pY`G%P{iU=i& zHGUg_2n$!w&XMW0a_Y=?Yhe95d!$zCtIbhYz^c7%6k7Nv%eYM2mks{AIP0ni^PYvA z2R7$;e^2rQ;p=kCzux`MOBpf+BTOu;?0*B4Qk+6gm=6OQW74gYfhm@kW@@?^>a7ET zmaV!qo?9!%*wS z*~2K4Mxl88rYM}e`k+Qbm8S~(0J*d zwr`hI9}^$BgLY<1buEAWzpvW!{=Zl4h;+{JdiX)uNXn`3*^6{;D|`A#q5X@t9;N`2 zkwB}xI-N?7rWyyN;g5g*OwJ`_&wqQIwKWWaHn-OP%AFiuqy#qXgRcx)_bZT)T@=0E z#unE%0at0Aj9RV7lH$tFnxp@zhXQQeFZ89yo#@9y`=l8W{L1S)*&Po;h-t1*cPxMP z@?(L`U$K^92j+xw5`vp?ew?i{#(#VATp6tM$@V2?qo-CK$ zWJLc!2NU~dX5+xppn(oLumTvW%@Au<@4CrqE*m=zt8s--&@>z6?0x_2d4v~tzc8O(NBwHkp zv0T;Z36!Du880k~L7r|cK{FjX z?8y|1ey9WyH=TxN(F}RdfE~0(q7772!MQ^!1E-L)o+B98htyke%?&<7d;3%A(B#-Y zbj=MTK!QJ<$GZx;?WF1)N%uvnHq+Tu6D)!a**(#JBf-4=yK?2~&lF_Nw{io$Js|h2 zTa|Kp5fvd~hh-swbn@6ke^+3(c(*q$WkbEr^)2o^>W;LE@`))*C5wL`X zs>}+lxov@{lUK>P$?rcLk;G3#(rq1@-1{IyVAJ#+6U=;{N?dJi@9L_Ja~1f65W$Ia z79qL7)`z2**jtzaPIaw4KDTx>MCr+B%))T2-k=5?1U^tD1xj_w0PMK2QT%FY!0BV#a7Aq_WmBvI5d_wUYsKiXK--n zvXxC)QC!C^)W9KpG*Mb7sV)DFI(}-l8n;Gqpx95~#VbmqDh6=jKF<m4L>z=$KQa^ueyQ3u6Ey9SaXuu>yg}%VK92)N_bIQON z8)5st)~4l4#sKf(=OBQ>e}VzM;)RAkrQbf`_Im!=hC6v~qNFI3dM`sb#YK=Umevh- zBl*|URD1IvemM}=OpX2zkLMKuqeN#>9miya;xQ3z?w$wC$WS|(nJ@e<>)9BU9Z?kn zFd>Xqhg=w>tcDY(T-S#^8Sm8+F(H@t;#?#(fyHHs67Uuz0lw&NVeA!DedkOuU;E~G zD34m(Iz{ zJW32$G&ZI7hlI#*q%=1fyxH|0B- zAP;+ejtOLm#2LK^-Twx-=^Ml~z$GIY9?H!<;&KLt%I;Z$K$-KtlUP$lEHXA!xXTbO z>ct>SkPQViOCCphv|oE~eSzwN4=UYvNyi&iJrvf1D^VQ?AWs4Y@ib7n?VHQm>p zmQNW(gu)~@wkP&Yo9Fgj`0nj2TsnHg_ZjB5dCzlX!6wmWJK;|*ve%*-s^|Z9&73yA zF}e(-e;r|ZX^)YJ)_E)ezBEDa+v0e8hOB{vC__zGu zxo3gTe*HU-bqAgK%t4?=g{LdNfeGDiQW8Hrmk!MfzB%2~0iK!0iybS@zGJyI77w~a z%LkXv!cHe9?8?l%hZf(1$%B$P?{47!a5*it7pLFLs6t2MrVI`@G&yk-7E3A*$yd*< z#2bUnNx4WO(D;BcgPXJ_<(<$B&<@w0}}A08U32j5@zeNsvHj& z?u?`wzN}j7VRDB~_c|%+W1)2zcV0dokEhNEeq1M|>ZqO~cR|{UV zC(vjHa02kmk2!en+ki{m*YQyw_5J_I|AdTmO5)5UzJK<8R)5p%TY*BF_#UoxF0B}y z8G;Yt24P3c)vDyTQ32m`+e(dLvvOYb^GAWmH{WZ$y+LMKNh+P?tJSvS_i?Iw)pe7y zjH2~0i0vRgjsHVE7$jq-_CT;j2(Vr431kiMcRBA})gIQ}H#N6F<^%kN$E#|!{qx)= z&8L;kX_JpO0Y~a^7(b1_q&d=p%t>Ce&QqFR#GC1mnXaC5W5YEY{Jh(==3&a zT5TeY$2XalOJ5iLB~yeMDl5_|I0M&4G>I~A$)~^PUb`o;T_55EVT>xo7U6^s?>G%Q ztpA6(caKXd>)(c(d+z&ox~I{Zno7&VG^L#^GD|T9YnsN)%ub#Ul&GkPMC1{{>8{C4 zl(N!1GL6~66CsL6q)CO$17#@!3ZtZ?h(rh|h&~&gLo>g_^Sqz;ecsQH|B$_xd+)XO zTHot?UDtQ1&fcVV5@zEq61H3I7@m7Mji`k@(5J>IP)YJmeoHNmosVC$Xe4RLu{}_5 zqlWQnbeU#3Gu=9>N$!tHMYnv@OWzE&bSH-Een#_KenMtrkA}>821az*d;=R{jGV|` ztfKgYvDmrl3S{=k$>MVlK~aH;=LbavoZ=ch_>rbv-P%+$*%<;o)tke$zxfFsgmYgS z7xlitxH`-)wvN&{Y(lxNb{BZ<@69oCU)s?Vc3|m!L%AMj%(=h5^TPj#tDnrMk`ZR~ z1YU6G^TwpgTx7wW$c$2p_iAX?y^hA~=26y`>*`kOI1_9rJ1I;o$T&!II&30F+Tq7_ zL(Tmj=C67YK}sK%E=+2VeJdoUUy5Va_NoV8v~;k7t>8l^3}SYiSkQxexX)wm`GIFz3z~aGdu2*^K=&NcsT)b z#oMaj-auA#3o@_h)OIcgW{Y9E|NXP@qdQNlS@kxfIW1X7(7I6Rz!9>tM-S2rB{7bG zt45Pac4reWhhUo1i3y7SLsLjHmvwTo#RsoJVo5-tHPU9#SMqp zO(9)E1wRpWVc)4;91AoLN>5W{Q@N$F$xP8!o$X>Zqm&)~|8`J1Ex4SgEa+-uw?=() zW~=^sy!LU!zC;rTBRS(slv}~U(NR$!V+0cV@6F{D7RTC=KA!5ZN!xm@&IU+;; zVg{#!yOVBom#z~G-*I!+46PS~$qdGI2mmy`geSdayz82)Vo}>0yi0>qxgpIt3jO#q zp($d7DT$0xsG>>j13ns}IKX4TS8R^ccL%ku^Bs*z;gqRQnoGN|!F?p;?i{L|_NSKt z28|M!6q1Z%xgX0*^+&7U-d};*t~lyR zImINL=vG=NKaU6DNu@Zd``Gc?p+MU65L>REOsp$oA}uzL4R&n`t*)l;(4u0sRb$Q1 z#!hCU(3}VHQ@XdNO+%XMQA;m8$i<#nj)`%T4jozVyZTZMl(;w$r%z%gaVB8r3Vz9G8cGV6QZk{@J zbmYgvSLuo5BHtM1l!`*Yl?xk0`8nZwm{y6=P7z_(3UB@RMllzC5}oBW7pc zfLfgrEopI7>~mtpY8e%87w&4F7TH-<$!q0|hC|*>;CTQDT1JgVLVXb|KZc3bHkQLG z-Fd4ks;itfKElUwP!a*X%fV#YBbkTt#^I;C6VSmuleu|!T)+NsJZ_A_K_W?Uj?1r( z*4A|lBsHYp8Vs>h;%K8EA=M1{|`S3Y0PC>Xm+d7n6JzA_v({ zBzGb($%W9Ksh<>sMc|%0_nxUw7N+`G>4F8u*lYOHp(4mX$1VM}6XC1m_vVFhL{zyJ zEZ;kSR_IOSsxs}?Eg}u8L-^Xda_z~hQQP(Trc70yG0IWedm6iA0w!bZ>Y;E->b8f* z+0(&kr7hp|fCr#yCH#nORtFDTo-2Kzm(PW@;!x^3G#jxWB%h8-XEvG3{fir!kZS~vJXn*EOBB+4z$iQd&_nV;U>`AmrtjSN9jv2unEWXth>{?TOF5&EpLNG z6~r|Cs6HSaHykOlwPrm&U&E5lJk>kEk4<=0ibIouUhd{Y`7-!c48?m9ZV>#_l@HZw zVX>FRAnkTciZ~=XtKZRv)?eSo2%cVefjiq>&1C9 zxi)N{ZW{Zi!L+lPuXbZdA)$ksv0_Rou?$QW@!3VrVn&~q%f0G+G-^&+*7H-@oU3eQb zm);Q)GU8=-UO2P)5W6?K23=IsJs&g?uqi~?CdBnyyKj%uO}VI?wEN}qY&xX`Kh^>L zbTMrM^DxBq(Yw-OG;IgI%y$D+5x9-WLk>sR5btZr!W z;@#pJy#OuR6#LQlUXSpsC~{miXTRasC)~wwxVT2fCw~@WRNy*y$13@6%ToRhU>4m` zvDcDnu>=S_lW6wN~1cD*-=VTf!A=?S#2Jj6c9QuOQ!gQY`>_zbq{q_ z5Kw)2fB#g#^Tf?u7j1=xAyVTPtUyE!NxlP_bn%T=>zeaSo1Y1{pCtQ~)em-!W`%hU zI(j!CT`el)r}{TEAoi)#O+`xkEd{R*az?sRvK<&iThpSP@CPrfJ5iz~~f^X!XKX9k5ka1L2jG`5D#LN++&2p zHRoQaaIRKZFkt5Gv+e51Eo~_Y#qJ`UZbMdGK5mVU0rr;Ty7TUkbauFZ;tJN>g!bfV z#wL#f7_z18H&m6;Sp>VHX>L34~`JQkBR_Ge7}jw>v&d@TzMY51za_o z4vsJ)GKiQiV+YXa8<(P5}dDe;=&PZ?fC z>Hhun!B=;Qa+Da_n65gOa$g-#4`pG|6})7UuH>3mpL}Kx(eHOTNtUS;>g^z!q5;?U z6~RQjFVa8rY^1A-P_wqAv;wF6F?hRl&Z`YChm2KeE+2A|ml8SrXjA2M{y%V7-n3>V z_K}*Eg%f6|2UW`9uX;d@h)YyabV^@gnSR&&(WVAXk6*bTxR0Z8+M?@*-A(#|Npk6FdG6y3$&pM)zOj20`HcUTb2o3@mG?S^8<0J5SnkyP5;hGXU3DT)$sC&&DcJ?|Dq$*#h9LB#eW9}`YPr%ircM5K3MKpu_AkrRH4Mfehs-bxhEuOr8IqE=E39LQQxVQBV&0F`}e)pNWJtc{>5ceMeEt)vu(h>$PPFV?cMXugY~*rzvS{?yb@pr;lka)4!C;uem*x+kt85 zeCWJ`n&HIhp-sRmVcK+=qgG4b&6|qkgkxL-GU6r^SP*rCv;2h@$R6n+j>y_PmhGf( zIro)%tvGHA(J@OLA^Yi^CkRvJ#iMa?bU!((s*&I}Ny#;BrO7|?90cXAgk!!QLk6$R z@Tsn^gX#*iiX}GAtNym^d&)K-!vpo~jaU9-C*f|uk%e#U2vN^lE(lYo|AK{9gMxF< zqgF95w4WdAJg;rvk&+Z`P4JJlR+IZk_$=i!R^8gP2yFf5EN-Z_SJMO}Jizx$IrU?e zL=CVN@mOaBEl>Vl#MSp7nR&lHTwK*cBvw$WGBUuvqt>b{xlTdmvhmM5OKQypRVvRl z%FtpSq@S9GtZv-Ns>{WEwhbq(Yl^k2%6NpZKGlZF>^w(4L4>L2ntzD)3b{P1K2J-{ zuTL`$J$IrF6Wsb3-Cz5!IR7S3{YeL;lQZeA%+uux7dMWFRJZim+e5L8ws|ojOPQt0 zRUaC3#5Pum>Om|-ggx`|JXHjJ;OD5E^yDBO1+tSYG&Q@%rujv2Qx0;w&PJJj5c(?K zyDjckdpJjE@7m(Z<|L4^&dOWTI74SrcJlZ3+3(pV+Wb?I{v}0Zfw;r5iM=~tg+M)a zl&EUY&Xtsr>Jgn_Z>9NZ&UEJ2Q+@gET93kGZIJ#-q}dd?5>4s=wdSk1Y&@^C3!6kU zKAVz;bw4fLH$@4F;FbnR>R~%eMRoP`I*!))8g?&0P`Iflg*yKrab8@oypE{KeSvNy zrOlr1x3krka*MAfsbg49Q&So4ygWm^;BAN(X0z#sqEao#@7uyo-`Ca?z9?&Xt0p|> z=I&Ot$J$v6YZ}2-LNC=1y8)#BMQA$Sy!~!%x{)=t29%Jd$$;6eC9!@@=k%>rpV%v^ z?do}STMA?r>M2I24|N!4?Z&}_m>1Goua$+t_^-}$3KOPM8{|Dwd}WsUAhC6_8NQUt zsZe}^;ZG02SE~10vAc?k{W~jA<_j;^`O0@hEmwApwE(s8;>wN&;Ub3a7vKK2Io8I3 z+C8w-=HSj!d0K2Jo;@%Bf-C@QPRa8ycvjM;GO$CR?yz}aBXbQ^B%FWkvc}(P=mhLR zzay(6cT;>HBygNs&N8PkYAmMmSa0`TY1J&0#`IV5DXoPge(YYhJ%oIBXATAyyb0c= zKF}xO$6tl}^lOCnC?j5qJx$g)kw+>YG zMZF$lVynMJ3HG47_JT7t=KcCZ3SA*t@YF>u5E8Rt}=joUq9xtpxHJ>+Tc*a z06Rq4rrCw*kj->ihTGT|;+I|1anblRL|Jb1LM0$q)v*v;vz&00W1Vrtz7$6l2Aa{W z6Vwth%{N?dpuOY*zcrlGDOnNyPD1-05RT;hD!ztpHsW$k15Wn33KU^^)W5f?y*_80 zATmQXv%!*9JdgYJs05Cas9mEl>SWt?A<*LcRXyR z%{F{iQe1(G9HhCB+S7)gO;8ieJkYM|H4H+ho+mbE1woi=?=DO*&e3{28W1MIM|(zD zZ9&g9KMfaSy7{nGS8=;>v8+2s*-o#0M{huY&7!Ax(|AzM3p5!^MocDHz^Jj*3akkV zH?*(Vl6J;sth?R_*AbdX`Xi>CEljm+;HH7%6dp&^rCW8Ot2&eMbLYKNhCP^JYf)~B zj8h(4d^BY($0Jk)P;suX-L#GeZUa?{*YYO_{y-{$(h|w)?N6M`hOmYYHxrcB4!jSN ze23$Ie9W>lLwl!k_Z{nM*ed4zplJJZE=+c=tK^)h)Be0(F3M4;sdd`872KpYJMYoR z5PQ3a{dHy{H#I*3nR;sNlxr3DRw91;a7b`1bW|ABhDg!W;{NL?9%qyg9;5@L1`zuB!rDyHE{8W$P^% zmfdZmUG_{~$#A10e@oWg=sL#--Nh?(;Xxz@w9L=Z5!Z65iM9S5gz1Clx*fwJ=Z z$wGLufWeLDI@LK)MR6&u1Jw;0MV00gF=xttz0xM@5ql<5UU>VD;MkA`WfI#!TcXBc z=SJ4veOLORqh%Q-JTj1%^5|dTbJYR(yIm7-GTe1BA4;$bIj!lOu*$@(rugl|T;-mtZRhDNc~Y@5QK>!I3%-Iug_v;F+8ECQ%pgK?LM7;$R=v<(nPo#v z<+xK-)GC$(gOWW!P8usuVndVlT{O+xln5@QK-^W^2kp>0zjDYgI*2vREnV8(Rk~aW;kyo97+foDfdp`OWeE{+vPM{yO2OOGc~r1LSU`8v*&G?m{+BFtk{joF zg#I0-P>g%o70^AO0$wE}L?ABeM5DB)R%<_Iu=yE--L zhnSj4Y}4jHR)b9_3XIh&wO4e)=FYEX9{oW(k>M9U_qXN{=B@XgXJ@`KV@|8J?>*vn z0~E)g(i&Qxx@T&1Fuv^$eRr1Yscy|{AfC}pHizosC~3ONI1d;jrse8pRiCM45%yF& zphBT|nOI#T6cn_SJAtYjPQwKP@u3eKilLHLNnDLRr9gFf9D`+8yuF$vY05?vrKslw=B< zkS3w#rNdVj#GraLm)n!cQqyDI;xnWk!}RXP(~B)X!B|NAhY~E5@5u$4(E|=G1Cp^k z6Deku1Q7SskEDulYRe+dWFrDw*btxMHLmhcMewV#P362H7?o0b8oNzmp+2Jy`nE5q zX~-!}*T!Wb)!JuMRsv4jZoUQjLMQ`(&fnqeV6Y5sPgb0n8wfMRh31~8aaW#_<1Yc5 z+piaKu=#L=%<_DF9AnvE2=+!vc` z2NLf>1e5KF<_XE&=U?rObuJ~*uD#r+_Oa4%k3~s$tyfOq6R`5IApBglM|>8}2%>-XEi4PiC4ZLEaND<_ME z&5pLEbs17x3*s^z8B=Z=p;7=l3j~S$$P6pC9|`wnOEK!0BEQ>|g01LBn0HRnvirPQ zn%oPY<%bQ9?pq-(xSgk|dYEkKR-jpRJ!abp5i(Fspd5lDwdX30}n%b5P=sqjwY+c{lsQF8S5b?)%RbfP0`ol{W-u;6hghMzp@} z$cM={H3+WA==8e+I-~I5l-7Vy!y&)~KWQ8W8ys0H|BWaZKm?4;*@!=9?;-Gd#*X&` zCGpeZW2)HpaOcbk0h+pHqN1E@hZdV7FQIpdVugksP8& zpsZwS>aBWing04z_bz5dTheJ94$aBEqVwU%>r*4t(_O-jF)Mjo4cfuzoDpY#N=|?6 z@;ICra!n!x<6O#AX6)U%ipk2KOD{thb!c{jY-nNZ+`AtvD$fqC_ZDC%A#Hl|k>0{| zajc*|cg<+f6&xwIwC{D}j}tq;AZcJ?e_< z$gkO*Md=)=@h4+G%f)5cHI>VLN(Pm;-N{lq>AFM}*sFmtI4uNCb(Hj(mY0Sh_e|AJ zBTks&y!%@+=#H9WEbb8pa*PS%HLZWB%gL^)uiLcR$yyJ2A5z?ni&^DCALE7e6q9)M z3A|=wa?`GYsHU}f0!f!qyTBhAB#JnATnrz z(vlM8n^3b8{DsieIoMmaD5Zl?0+0kV$$!oIt4XP|5dD5pSgN`#H+4axB~@%nHGVtv ze17iumTXJ3_^sFN+D)>+%_y2HrZ$H(y&~mnoZKImdQD!!7hEFsB#fDLRRK*4$?@tB zGONFd##~>t;v|m1rIg*PG}Q9C`qvAf^K_`idJ<3@W;n3ZXWg#?sZ^b;pv}PGJlWja zlg!WaieF-;JT;XJss`_41x@D zEl8BEPSg@?{7>4!gTS*qrX%)4%frdThU@=c`G;m~ncP=bk%PZtAbghfbQ<(^o_xA% zQ?3QDGtoQ3ubQ!UyA5Xmiaq35d4>8)IBfp7cB3}eQEbOC&iDR1u76dJMe@i|L3wIo__4mO4?++eCd zaTnk@*MM~J>TEjX!1Ss2{0hM3;wi}GYDzZE_^it<{wnaAs0MF=t_B)R|MqRc!r(r; z{u6(`7LHb`k&CL7fX?yIZ^>mgXrb{~?A8Qp6mx)(=%J_sxt{!5&U;=z{de9;=p4G7 zunbKH+GKqD7MDcMH$!gF*)EDA3k?(`z#KqkKlkaSzY8&D!qV@_E`sP*!t8sfW4&tp z^_rqx_Wj>{cnv_hmTvV;h_SW!!1zh+MU=}R%GzU1CTiq>v>V9?6106AXp2~B5mmj@ z99q|_EjKQsX{j8HC2vMO@**ZX_H4?I`yf2CfSa5S56}{k!sm(P7<`0@lD$dXC< zyiDSTiK|vVhNrrQ>wek4`aw6;1lczRWo;5l5A|cV7AVqmq|x0yVHSbu(hD_K>XlCm zz_8ANv918okVD%B;X*_#*Xd9i7M#51DI-C%pSq?p4C$Jj9Fwyfy50?^?iKB#Ohe9q zuDD^GuF79y?JIQanl{9ysqV(851%E%Q~{u<$@mzSGYfMEt16@@6QAyDz85_=t~+gt zEPypTWYNmdti4uTdB}%@ZZ^eT@KegCM)!~nmc^E84CHgyeV2E@V9zH%!o){fvio#S z*oOrcbdt3i^JQAUjU|}fYg}j|U#rb)5Sq>k&PZ8D%Id z@i4ZI<{Qx;QzSlM8_+Oahh^qzXuj#5+lQ0#c{E<(NQyB$@ylG^Oo&AlFx^k|YKy4t zIG>Th2juj#M{)67>g~rlI87m+yqSCUzP_tP-qY;W-pjhBH@DISNfTIjheyR7&`tvd zyG#OTEV~{Y<*QrA6fbJ5Ua;tZuq)W)eCyqJ$=_Q{jC_RMR#OCVu`uZdpvneq-oYWy zm0z1bMo&<%d6}(aPiB)*zC$1ugCrZSPt%%;YeiB$I(t1Anfe)b^3m9Osm@Pa*lV|A z^dX8)_6n?$hRZg-uI+^vcZ-E_F8SD1^13SAS=4&g@u{={!d8YnrVEZ=lM%PmF7~WB zRra#wA>YC7SRZy*i(?xS#J#M>ah~Qu9ybuS+QqvSe^F2Z>_o`}OE z3DRjw3Q(i+ygmx`Q+!)(p1%h2r!lgWnmRZzy^OF`zu(?+9m3lAwUtRg)4)Q&HF`<+ z-P!l@i4cTw9PQFfEKv|+K5|i+cs+OsWWcUePFc-fq4{-CII;CcqJHdimk-lY|GD<8 zpMHqh?J4RjT+0h8qlT+SU9xd3y4c=cWlps7*Ose~ddG`Ty!MsvbqjHEXicF(j>~u# zY=^bbtZ~zw&+EU$4B}(2^-?II=T2Eo;kUxOj0=-2^UtIH<*kbz%1>Mfxv!R_$0g>6 zk$`}Zpq1$Ah3-IsuI(SrF^f91JzQyduSrm@+CJ^EBanM}l>JZf@cZezQzz>Z4ntTd z2Vn09q-=5=PKBBtYWy#M~23N^PxBQ&leK)$PF5))BuS)0od-CnkNK#Gl zpLJW+T6^73F->>y#v@8bPN`^(vSgt4eA1e-#4lBSxb7QkN!@Y9Qe=naLv;*);b)ci zxZM`<$u_(7g2_f-yJr)C+LT#!ek>{SdF|HIG7c*uI;@MbDx;vpyb8JZE7NUw&{X@$*4x=fR0ZahmhFs;N5M zu2jUJ-06GLqCD+>zWk9>(NzsEsa-7%G01*$T9VT_-}=BZhhI85db^1E)7pA2_b)w( zP#@}}Zx#Dq)z|foc~^2Xw^<&-t3t4E#;NY={ea$XVHFo)=)f**aj>Q)*gW+-z8SV% zEaWr~@V_im!)?XjeoWfzF&Sr-bQhiSJWrqc1@~|G(~R9a+B+Bf9zL#h&oY$^2^U^K%31Ox!`G7FVn+W{#QPapYY*pFcOSUS4}IO$TVq z3IJm1BG%Zr3yOe+Q%0?zUfM^(R`u>O~PnWhZ(LJ1f7ic@ivQOAE!2zazQAWDt3_4RcgDC#N9`|F%l=IEz zWa@xzgvO`V@zp%M>!8&s!=uQ%D&}+E=tM$3?0Gt*8ev0lv?eN_y;Kg#llF)n>60QX zir>E0ovy0`RfUg9aD^I1HRrrxvVY=`q>v+MXA;o@G@+Z!g#q>)9aX}ll zKHdyDZaG!gpEg_DJ3(v6#K#)n$oN=O0-m%0`=*U}#iLhYYLrS2)h#M zefzv}<{I)&-Rwewd~SE^`GW_UQq$G}NAa-Ko2!3LQs}s4r3g0a$r5YUsIpuHj{F_b2&7K zs0`BZhl@?b=+ex+Jy_+6EKPk5FYZqRAkXV&%@2rt_iYN*z}mgkvwLjvXb#Pw4`+(s z95DX|95DNDP(jh5t%rNn@F+6x!>9X)ob7SPd`uK*VVKfTeh z%ylc@!voBS`&;y!l3eihNADwAqC?+rbg^GiJf}oNcpc^wY-RR=AI5G5P$eNRn(1n%3cMwf+*!>*8m{gM{15mh z7(KVk8T@zPY1D8KGHif)_A|pF^tm`n$0Hj zrxz>WHUA1uDh!LO4lHqWfGC=LL1VI)-)!wKAixvMH4@~Q+9ULS` zlp_J7lp#M*7v6K<#I@X-#QxDg2Dw@`eNX=+ff*w1zt*;jGWGFh6nEk0)|1enr?ac| z?327q_a5O-;d}rG3*~x^Z23>*Y;MGo z1E#sf%KGQJ-g;Z$LI|(a7XD*OR36u(q9f+(X=|a_(t4@u(S~~hN&_@n&V@XG^RvW^ zbGRQ;!tvF-sb@NpL%ZXrzx`%=g7u!3U(pQEW4>m&qd*b|UEZ<^)NEr9*sew5kgH3& z$Y#c(jtt__t40B1ep@!(Ds2(He4I4A_r{Xps^=L1FoCx-cp=qxL8aG`L%%@)%6|vT z>bh);ds(QF;jzDh7q9`mto*0Hen0{y#iZackq$<^{}p(7$NqR`W}zTJZzhZxl;#_= z{*Rq99!pM{yxNu~)YXH{3*CcN*lWg;bJMn$aq_8)p*sRP`U%t11GeEQ4q58SQs&u^ zaom%T6{L~#pNk$zBK$Oa;|~rROAqoUZ#*?+PSl3<4#)6x1M-1ElOjfNLht z{rn!@aE!UHe6w)7x~NZNK4G(jVD9hx1lYg))o$}`Ku(pRQvSz12)`~$1dUjdAB>qj%m$Jd#(i$B8J00?Hzn6sz~((<$l z0`{=E@qnX>+t9^2i}g$SPt*lcMr$I!mU#uKKCR4D;VUr5#_!~uf9)XPJlMfiRja?4 z2pG5HjA7*aEV~=hHGy2lWBO)=MCYN?}Lu(pHG@{^@=0-J4cP+BAKZ)EkUJD=uu080s%rqjzw``(i`Fu#Z?deYwiRQ)YrJPS_q$g>Uc8%LIZ#2G=}EF|b0} zt=?aYctyP|)q(HB>kXkjM$@qM2(#td&z|^tO)1gN`P^^OJ$fpzZ5OKPwM<6ND4H)W zy%uP`&^1`59Y_thqG`v4k;R4yeJO9%xf!MVNS=)M)_xS3z2$AZ$%)M-$Hl`jwu)tS zN#*xYWVZ0YeBLF=2k?ccczEl-g)e#TkzwJez-htn?w~-Q)Ckxu)LI(nKuQa@dRh=l z__E1oC+C~hq@P-j9A6fmx)RsrqQG-k8~rZ_tUQ|-vCtVb#PuM;65?#;F!Ar@BH~#=g^~p?k2NF2;*Nm z{{w{KZ31O$qgRl68Xk?90cBg*jFvwchIW*@8eVo!Gv+sw%-ar>Xh!U5#g>WAH*YRJ zVB7FM_FmCD?-fMeY5-?aT>Q|hc+6afNj3@{;vK01$$44nQ#P$|xY2OhC< zi&@Vu>`pRZQC8p2*d>b%npHhmB9d?uyT2BEj2lT2gT-f4|M%F1okUTXD62x7tI))k zkLf%h1l=-G&M4|*HJNWOzO+Wu9dgyqkKYCT6rtXKs&e=SqHQb^?TvGg zr4mJcb+>k3$=JQKlZi`LLX%_5;+S*JL?+u-%_U!Kh4e~4<(a~R_mVM_x9fpT2{Z06 z+w7bEh0Jc>pw7F^n?1zK-|J8GZ3olp+X*bETKsL+@V!4r1?twm@0zNNM&H-7@1#NRhXU{N?l0K2 zl5RT=)?Y3q)jc{G`T|TbqdjvDUWg0@h1}dwE#JNo?l_f!&f1$J6>B zGv_BW@&|UUyV>QxUP$_IkQiJrX;#Wh2LLwa$7hS+W>b_7Q^P@i7(f`n4ZsrMlEDLE zsehyX%EF}FYZWOt4aTKf<#iWd)#gLEsO1mpj_nUm{Tp`2%CFF42L*T z)XVo|?3YkV_=hvEp&|faTOS|(sySih@vy~<%&yUc`I6edT;#7Dj4*4-xc`0bqKD*n z56&`So_e+df2b0#uTM@cUj6YhISha`+l$&oD4*JE(5Y7J& zC1KoNLpy6Z7i6?xb>5jWnBkWhD+Bl|a}PA|TJL6OmuRlv{wgp$Hnrh! zKB8rk_Lbp`l)X!52quq{DqZ#QpN*X)=yAfa3dD2=)}N-+Pm_?p%-6QrC0P_lCxzf< z=`QT30?js}K9^}jX?5ortU*AN(ZI9+u2)@jqo$M^q0y<<)%k2HPK>hxM>WlxSmwMR zUfE;iDca0kz__Q1l5^$$Cd9ou+ojv|T+CPr$InO3lICjN0ENzf3tFcC&OJGIe@CgM zwB*~j??ucVDs*FR1Uvs3^ix9-fG57ck|n_=$3cgB)hZXKDS0;ns0s0&B7Ku{-nUl` z==CpwHPPubad}bcbZbxIGvSdO+jWAr%P;?P^)`Dz`-h9NT8M1JBxv4sZ6NLup3C@NCQwx-!V5nvJZ+_%0uyGRf8Wb3a~t z6+up`jmBERSISjiOY3iS&$Q~<=gkn+S(R;Z`}iif<-?wZl<*jAM5R1-{mAF?RQoz< z;ZLnj=8#W^g-y60{Q$XttrY~~;9*A2EP>$0(RX~cmXFuAmeiZKB}_D!_2V;#KCf%l z9(Taq+r^?JSLW`C$5jt}21m!TM1mDmneIMmV}ZuBvjmb|$>|=vX~(RYIofvKo?AMk zRgUbdYQ^6mrV@wh=QYni?4+d<0KAVP<90!Fq#q%2_S7#G09b@FcawgHGKe%8d`UC@ z$oN)Z=r8XGtrry~7*P|9bheKj(|b2x9uOgU{XA}Pt;b;b-;aZ6X%av$zRJM^=Jua4 zF>Tm(=5O>!2Sf@}cK7Y|JrxIhhcq@(>pS-zd!;Mo z@hCJ`D@_>rAB$5~xnW*ggfrdn^P4@EO*an2L;OBVdm{ZP-o@0|=;uc-;??i4E_+Dg zYiVz(P|IBiRYB{UbAC;am_6YR#swdbN^67TfQ%ZHo+h@OfD^d{ipI;NJokSpBU5%- zp$&h;0SW{}G2N4+?Az3lt`Ul%F2vR-eOxhhr?8w2>A_7pZnsB1{$k9T1#U^WO|h8F z^$e!cAFy5i^m6`+ZJyXWKg%@w(chm!GU^<@ZhuWrDUEc#mR7psuHR7kzGXlG1^ksu zbBh2c^lzaqV9Hc(9}pD}AiVkO(AnR3n2FDA3Sm069W&G-D+n|87BKcY1H~(D@6GB+ zEY~*mV?uj8%{V)Wn{#SWFVWan340}n9CD*${P9ktH^o%hOxIC}5&US*d>Q1_?V&&D zi(R4^lhZf{3y=C15`3Q_I6P#YKrZ-cT3T*8_&N;-du~emcnJcudB&tk99k^J^e-fi zLCkBquWz+{$1`ujKrvHMk67jg&*hDZL8TZYOz@tSbSeex)1zDx&fh(hevK@!?Vt zVsc(%yx%eV(tJkZjM)U202f$@FTPLKpB%ZEbbHs;w63(Y*Bu5cLBe&|5+jE*dUxCO zl@CjSD4Q+L|BodGR(|#0mKa#1s-gwA6x-Y81EZ8>{nGD#gL%m@*^uMyU&$8QRC$Z| zt_8t`pw_aiwb!yLA{>0Kvh7kI zA=1+13^!>qQxnkJ%CBgf^<-`E{C7||cFTWC?d-mI{dWD@EOj>!$ZvN;HfMnb(e`8a z=3npId0*1}tiM85G6c<8sR;l!gkYGB<=zI9qR|MIf$5XCw_zXGvG8;D2I~4nm}Y2G z!oNUk3fd=yWdJFbN=$kS-)5K!R$+p4c_|BmK%IvZ)lJ>iCcl3fGsVl04s*%~q_62f z<(MX^WH=Np567tvS?fwTI1AsE3-;JSB(Qc_{w4BCzAgwiVmhV`i4RPuo}{|W#TYe8 z>%Td9#%r=<-vI2x0tGKRE~2qtrtMjN{&vsV2Q5i|V5MfV)Aiq2o_qEGLs%YMwW>2T zSs7H<%YASawU#VbCz~rbx|-0aKoy{aPYVObH5Ob#b8G~&LPom-3Xc~}0)+wo2nESD zQJ-@5+&n!ZU1V`^HMw`jM#Dc`fPbr8U?ea4`*#KDBSna?fIyeA<$m?cO5Bx zZExHXBTQXpC7iC}XH_`Vf6@A4%`^2cjGNzo4TrsMyP^RoCshq6<-@)so@rEp}5XTYKDIw1aLR5dhxpY z)E$_kArkCNxW6cba3qA(Q-dFP->iOb(6Es=3@Qchg*WKKr=ES-=AY@G=jGPjiE;A1 z0FWa6Gv|Hu^4FWKQSia!4k2lzkbM$z$q^4)(BD|N(XK6SAdZ@JLYTn|(pNX96B5HJ zc!=$WoBjn4==Om1#5s87LD`eNNwP1p>AK?8fbD$yCKT=`$&GtQ=vH(0Wt~!;0%H9$ zU?x}7fUhB6$2YSd-9wp5?>GDOspy*tF)&dmEV(XPd3y_^P)yLTORuf zPu0K63H=68rWGZh1YEOm9$-quU6$j>aA`<6$_5FT3Ru$zWnc#10pXT6nwlr3KV7cUyIx> z{2z$itlE>>sFiRNYPyD`w`?D|5qC{*KE*rJ?4~Zv;&k69eXa|M5M5%$MTavSrVA>^ zBN*4>ip<Jm1Sj@07D#8e(>{~Yq$5_W+sRLg-h&*NSech$GR^4Yt zgTGsHY0GbZSYVB^63#HU{-%*(SG7Fn`rxC#7FeV7y(C=4+$l;RDqaS#A=n6j57C*L zkeiAayJ-0_+QOkX;@Nu+jpj! zsiwuoW>U*#N~O&*b3${S$!W|{vvky4(h`*n(bQBFk$RdmO{LV_lNN1pBV0&Luo)F{ zr8GrFp|msuBvU{+0`CEQDtqU{^WnXo>-|_4=g9e=!~gv5`?uVMcOv~P-|L)3@woXq zH6z*%jk~EqSEQ{#dmywKS-kB$jIwWc{aNBn5lVn|`2Bg89JE|aLUd^7wx^$;P+xek&_yTbN+ms`{ zKZ-se9Q;QBm7BO}~z@ei<8*wYok-z#4;@bq-3`)&D#**oIR>9I>A1e!L^{TPt z&nXqZZoPVV2pTfk*It4%hB#pRite|ETBeBKlE08Ghg%}R*BZm0bYha7IQf<;>wCQJ>67XhJGvVEB zpvwVcO1(lje|nsV#f@v7{n{gwgR-D=t%( zk9oH571Fn1{k`A5j?dwsC*`w*oc1P_@>uz9LjOF2!%+Ln#s5JemAbOV!BdPhwn;g@ zGY5V%MahvRGiv93$Lms~W@PFc`-!vw=ms1(udS$JCLwyuMq6h#hq)2Iq~SI_MRkktGJfk z*8FDr3Wl7pz3*h4WSgTAT2t#3y&sa;PyFD zopMLwD99r`N+%-SbSKDEo6bim(+w2k-Oxq9G_spjQc&%cT!qkvsLByJB>j=CZR-P?);^wF@Vu2 zBM4stj0n81zhNjyOsQfl8<>6&1(r?2s9el;-aAvBZ{UIN&+WH(hg(kN zSPH4=U6U^(+!xJRI&a|rP&7qk{j8C>;X{gB;P?&MsWis)MF2@He2({`wa$XN*8Eyb z4U^_F>RTqXZ7^+Ks8X9a3MvFaW!OD2ITy87*k6akjw^J5TnYymKW}V}VU3xYPS=fD zZQE%=#8M-@taSTOridfkXoF+M#AuA6D}8{q(Wj$fxzK+-4CThM2?jxijc_`QrDoy?Q2i^s3l`57X^e$VyJ-j-{heYRkJt*BJoww50@{#<`%=(1a2 zWD`{Mly6SmBkZcn6r=mY!Th@LuIhlJkDx-(E#8_iz$_TF)?og@kk^Z?thy>Fd3LU~ zjuz1i8gjvXz$(tqkfT1<&<#PF!YGyWgIX{x?+5Carv-NYHe@)+;?XBrGgm84#u5H{ z33zCDmpjw;&ZJ(HmR3!jpWfe?O^!`NSX44x*F10hewg{E+W<%y&Vv%{NHu2r)7OGE0ax0mI%~C#q~-Hf&gV+jIu3 zX-w#j(IZJw?^u#I@uCDN`7M6!_;JKPoL*5RZ2^O!H(di6CZk)2hJL^IK7R;)k6ZnN z{1(5XEYc%NW!#AlIiLrhcG_nY6QqXj$g6f0<|$u*GWiRzFOzf}Fv0SEd=HXnU{!IB za1R4Ljla5JujE(e{{K=;@jvk3SRgt;>o7RUhGqZjFMq6lYP~7||DAkIRID$5N;lo> zS{wewIYJ2ratgnuims@CRCJHa>zTM7xk~QR5c~qyMB$EkY^R9F15@*`-xynzf2~4+ zVs|K}`Oc-vR|C9ta?j6`IVIWj!sL^R>BuUTcqGpR1R08o>4n~+eJCiYCPXs%5V0rc zJ%>F5g-A1(D(Y|84h<}+DZ#_mZuo%{5wtV&SBV8o@Gbq2@TWXSxTEY6AYg48RXiZ#A z3o}~V1+iEA=TId`^3zoNn_w!mi~hBbbkUyRUXPv4b9YA9_1BQWSs=WwW4q}dRl6%v zMI9NTqL%nVK;w}>pfPrf@aB0DC9=DK=qD0th`59Gp7i8-%hTHEMvuZ66cko29)iOA zPscm6F*e@{x=?s`DpbAMH)ZfY#+@7#QN37u!?^_V`bRVQFS9^E6|cRoq#E zQ^)~s&p^=?OtgF9 z3I;Cl+;Y;8h`Vi81D$?sogIAwi)wmG@06sEQev8PnoDuUSKaS_>dZ0xOT8nc=dR<8 zL?W+SulwfPommbML3c-^1uh506=*qo-ielu7&ibgq^JnG7i0#CcBi^d@u#8>$Yg}&fAb-`sERTU4&vKq; zPjM+*U;po$z#XX~@p&zmz=-aX_zwdEI_cr6e>WJDE4;i)-Hx0;Q{+ zoLl$U9AJx&xJzk16o#x1MqfX}EPcqPNe7WX=cZ3Ghw z%qtx*x%3f4?QG0!2$z>U9a~qQa2HAXZBPOix{-VbDItOJ&f0#u9YJd<4K~rt6Los` zh(dOIPKr{%CO2@2TfMlA%E1=sukqH-XJ-|ucn*0aKj$7v*p<05D|g+cK*tqiw;mE* z&mrh+pCmm)J9sjD=jaD}%?EuNBwS78pV_H!*yQC2(THf1^Z;M=gP1QJ83Q%$M3oSzbFWs-1*Q$}o4eD*BEZ zQmu%CO@jgpWc9xGDVu6SmB5Srs9D2*KQJ?SN-LaO!H=pq01To7iLom`+dFBt)1wd2 zeVOY)cA8)`dJ}z5sY+XU9(7Jfl?qDkED!Moo*6HqmvlVQwIkTL7{%*pb* zt%9)EL+lV)67PTv$;BjqGpR)8)w1p<))tE0C_X>|5Ybk%VAAt)Q3nEnpFUzWjL3Xk zC)DI)!+J<>^+?_{3#~c0{bHoWfW-rP#zr?Vj!1W+QL`fgx9`3h!7~7T!nrU^YodXl zoxv;lB+_Er8b-^0f!Q7Ool?K4!H%HgDPl96fCb*PPH|iyaDNEqi6O03?`Rs6g-wSX zIQkakWKhXEJiz#71Ti7*Z-ARSER-EFD&orsv!yN^Re#8qUwSZzWRJN=9L z)iLSD9dCiU(Q2~i<=28bKNp^~S)4YLED0;3^+(56@LxxTb_n{UzJRZ^nr>0q%q90o zfG?M9T8BWJ;M=`vwOi59nS4w_{bBl1&j0uU!vS%0ODPiu0E;Ng9T!wukz3bln6{ z_b^t+bXA*~zX;7MubdmqgnX3H}Id*`i(Ez7`x!xDh|k5O=*MRAPQx^0WBhcDX@nll~d_!R^xYh1-H= zr*D-_QriqtnuT!j$`Dp$k_Pd|k6&hg89%@RaDR?WJOp&ENMhkdxBls@vIY9=4e(1e z1+T(;T&uBKkllWLu$I1J$xb65R>GBlUW|8wIi=g>MfGO`Uk(C}Ppvlv;1vK>#kxU> zdXWt2YJZD+@+)1Zt}<6RM3)LRA1@Akv3?}~(ErcuWE?KQW%?cX=s3Js0n|1y#^FC!LAC!%8 z0%WzFR-kO`bxt5%@ZR;kIP0}$+G|iYhSd3C3Y^`7J;ZFh!G$Y_4lVjtCg~s zGULZw%LQxOo@jRUsFW4ovX7Hog;w)R=#6IU5hXiVJA#2NP4_KeTZ5TwBWeI~5sEXF z3`wVZ8q zLwn}K&A~vWy`eR3p!;f#1Yb`>D47Zsmi*g+NgBNI7nYE@>>ky+v6s<12fvUEKy=Qq z8~ZzIog8ag_v#e$?K7iZKA>F7%{sL-JvH;qihmyelKDKC+R_ag^0#N~`^Zw{)=ZXN zI~ng9z5+4iyNPgL7-X0;vC}gL92pasT#fd(?#85!h~rYjpLv|67g4r$W4d#q?TA+E zCd?^Y)9Eu^MZtlmBEP>7LJk`*s0lW>%ywOEoMs#rn95-RE+k4$#E5er;ND2n=p7O7 z5jyx}nhD>lO?Q5JH{vP9$fJ~t7v^hM+b37yF4)eooae7!4FT7I=N+_gFUGdTa#{jAT7_B{@cI95)(w35K*oln3I*cD>Ebp0a+buBp2P-xz#kEy~xZ#!jtl%d)VWBRHy zE0>F294w7{_Fys;uR+{^{ione(d z)e6Z|Xpi<1!Ove~3mZ4>O)8%4h#om^~^eCZ#oA|?D! z>WsYLriVeMV~570K!-j?x59a`#L%VwajihoKe0d9hyueKsZE?9G+Fieh^SYt-4cuV+Np_u8~6;+Ot!1|F*+d+!@7lOx}TJBl3Lnue=$ zx*EP0gzJDluH4dGfuLQ9Btx`!XJctH_UJ6e|L;8bn}efT#l-7Jz^n3;0ef>;kVkOv zdC#0QzgP>FEKv^0h>iF@DI3?GckB-ltDNH!Cz%C$wp@;Ew0`74k{U}9cn8lhHIOTC zd-n)0$X*`7%Iz7b8wuNa53F=3a09I;{5CZ`!Vj(A=P{`j{kFhvG=W${-hMLF)4%xl zj6mp&_EZ#PFnZB(5uJvq-OD8p#2A@Iu816NbngS5;*H$P0eouREIE^R_cYE;Fgcu~ z#w_NqUq2O_sFO1DV;b-L=}J#bq4Op?Ex-YSH2S-c;nMQ1Bn{Csest(bDH@q~ZBpKavmrdJ>NGEb;x5uf1px0-d?k_{bnQDf(f zZL|_apkM)!S@U{luuWODG73qhaIyWVl>S^Q=)!N(UX=bM+St!muEBm2X_)a#7;GW) zJ}lUN=;7g^AnfVbUAmK+sJlWIw%x`9NaQXrx-Tj3{^ae*lX9A*2!VVYiX8i%(~x6d zpmyHLo01`{HU~5n-J{2`o>kDe%wpx7!^g~N<%kUxqn!@V(^;Ui1B`I8AO7;OMQ;N1 zA^zDQJye18rZNqJ#yx zv@om*^GItQJc*|An0d;kfcY7`Eht9zE2N?z{TC@^%K)tFA_P-WDf$uY^cI1BlqQ)- z_N7k%U)dU0Q4Ht<^SPX_k?j=ArxO3Qq6x6d(oLwNT%LD7C|&RG{uo5dMTg+}c_^p4 zJa!FSaw11?xC&i1Zxf7xI1H=!xqdjq(FF!p;^Ac@*Dl@3AniK2GkDdo9vY|olXKg= zdW5VNBzT!x5G49<_nr-Pb{~(OE#_GzGYx-1b7UBqY{iWNN0!PIT7Ibg!Nb2+9ysx@ F{{fHSg#Z8m diff --git a/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-test-url.png b/docs-source/content/wccontent-domains/adminguide/weblogic-monitoring-exporter-setup/images/wme-test-url.png deleted file mode 100644 index 94662853c740221505767cd3256da09b88f6d5c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78476 zcmdSAc~p|?_cv^#$ILt@k9l&)hLcv7R!%7?m6erKIp#=aPMKmVk|NM-Wol+>&Y3gL zBMJhRrJ0H&q9Wpq1A>Ntg22NW`hI`!v)=Wt^*sN*_gcuhZ|?iL_qDIR_qF%uvweBp z+FWjj@(w8}DY>gxF4{^-Nk>UZZ5jM!yX1=OwfQ5GuT7!0<`<;OiK_FGldZnzt4waJH_2sY6rX;OhDpFG7{Hqtw+duGNP-Sj8%w+ObKtqqKa~n1t z+p*Q^%Js?Dlh0kMi+MZCsI{$z|!EsW>OXVlnm<_od4q4ZtQlT$uf z&OU<&+%|Ky*}Jw&|2y7L$}-@(6zu!`Hn|$FCG#4sC<1>$3%>G|PVBBAVWD8PsO9s< z;}5rx@-2LMg`S_sx`E=)!u57dao=E>E2+v$8p0g?x<1_NF5R5<2^jS6xQzHB{7S}=2qA~e-(VXXo;6-5%7v^=M3;opt;7AN@N1J6LUy)zfX`tyf-2oH zc_n7j82RlZY3kg455^xc0hD|TC8+YhLvt@>BSnqr=286lLZ)7h&cizv!_8#9j(eZS zTI7Kjo@`euBW409hr7JEH9=GuF=a{mnhgtOovAGU8n!xDo*QpE;%rDI`l~=7kVqDe zSL@Yg4UoP9|MY##E8b*KC>>YaV}6(aqeEwvO93w?+L(rmr3%gCvy_d)iguYcWV>(q zN0f*D-UGikm%3vIi3e7VMQwH#R8IjBdw_jqKYrA9w&?#-TP-1Ffczb{6!6~bz1JqeF}q=lp>&L8v!GQ4JeM19fSqcMQ=@POT`lUoJNEpX?nCm4!za`> z57G3L*CHR?OS3jU>I4^XS9~-c4Lbz|l?$BoW1rz+2N|5DcCSt6Lhp?=4a+_7N?nFh zG0>&o|J9k)kh=aKYiTHteqNBZb^We0<5B>_h+SuwrR3C2M@?E&KnQ>O<{>B5aQo+K zW&y%QkUFJ`Z>iAz&+~rbHTYhs4`pBEqO3^o=WC#A%g51Wg8IHPS3_@aZ&Y~@v?0}2 zs!WMNAg5LX6HulChAv=F_I$MJKLeb*KF#~sOVHW&5NnvVG_EY}59D*2V*p z*+AmG<7A}#@b1{~;Zr|Ft|VLqtb7?Q0tTK^OG}^45DRHy_e=n^I+T*^Ke)~zi_5j$ z`y>`<4siP3rRLwpef{dy;qc@7kfjlaL`@`3jX=+$1@M?u<{2)qN)g|t25k~?Dv-nT zCM|k5*c1Gu@Ev709O^8^8+723JzO($mBm#5cgi0k;?8^|5RK^fICH%%ME}t^HNffy zTW9Wxyuq;1%PF3BSLnnurSBVQ>{Q>Z`q16bp7YZF>p!3wReIp(5{En;C+wEUI3$c{ zQzP6*-lpAo`~LY0fOGM z)oMOl*U57>)2LWr{|$4svPWB_hm5Qi`|@Lc{Ak5Y#RE-g!eKWSL5v54Eh*3IG~_>G zt*uOD>VW+}J$@!}wC<(Rf;zor{qu|Sh1mtArN=oe?eKRJ&TKf#L_p&Yl3`pC0_WMktgQT@xi zyhjy{A0&pmFkolnKqqD{jkd0PR;+IpPA4M$MH|W6@EYS0OLgP{9PH0df2(oW@+axW z9Q)7ObV!hEiVZSbZlj| z%E$B-?wyY06HJ@XathioDiD7w_-=WASw&kE*Rna_f;$^H*~z}!fqx5tER;%Y^X~Ha zfrXv}L15Xx7xROh8(RC4?dk%#Urwi-dl~$)hO`9-oi0 z*c`qY^ku~E5!kFvX8Wf=#U1IDDk_HCmz(|<0depeLley~s zr^GW;VctIbDt`QU7SwyE`n}uq;+B2~!2McNK*amLa6|zWge+bH!E;vQGCOymWZ`9| zYQ`mY(Q&rCEn&@zS_8h!+mN-|p!n_hS>5sIajR3#po7^-MUstVX0$EXx zl_%@-v#ye&SV>q0`}3HX;GxmJW^x93sLCr{jc;JMtgk-Qp+o3YLkgCZPdM97Y{zOm zR6DzNGc$a|pJ~&wwE_{^(Y|rvr5vp5{_CL#$#SMhmQw_rbu7I(Av*LuD%^B^+6$T` zBiBW5-&!LAt?6^((X$&{2E`rc+4*9LA7j~)Fr=zBToZp;G`&fU-@O!xHkY-GpA?=X60|+PSu!Kk@ey|eY7P$EIo?* zWbCGf2PX%YuUaH+P!C`Nq5oVuVKaUz?Jq{u%wGs)7rH zZn?BoTN++^I9tvzbV(W`su8W)RYa1r324=jZ#hJybhh6=etgcAjnqu`yFNV1d18BX zIgrVzo5g?mQ34Yl+@!E!fc~D+tW?FlJg%}c{0SS$?^mJja7(0?x(mtyz`Y_mvH(kv z%{F2iPCO*}#;LPLtfTVaI`0U~j`;n>hPZp#Ft;TkCiPhWp~Uw`z~m0XonE8kL7NbntIssu`bC%g}ir zv{1DS;kc|7^nDCTYOQN)Mo&#dtKY9tBP)TTnAr( zr%CdWz{hl*nOa8tTD6@tInpG!4eyH z(FrM3ahyIsJG?Ojj~WyJM%y)1i~F_J%PUYcrwb*2=T;9R35%zb@(bRyb@HUy0ul;! z3>xu~pb}GPM9`tQx5Y=Dh#DxfOmYGxtY_x=Hb8rcw6M@_isb{U)K~f0vQ$Z``}?&Dh7rF)1emnzjOJW4XM7#sgO>L zkIMevX4U)>)I;(+eY%l4W*kNuR*#pA!dXC(fViB8Yi;Zm~Ty+b9tilIu z`j$+%BIn(YFm#;bU3tfe+`OFfx8& z1E4jfb%anu0kONA?BL{{|M>CdSQSH}9Ks4xQ9P&rWUnE+^K?y|Gx?qZtLdTrt+X=+ z8z^%9EfmD+61W-_uHap*o0ytfNq#|oTOpGpS7U9}1z;MqS1#s#x@N)p*p1(~FiaK9 z7vzTMvxR8A2$F1?aAF5ld_Gn?0+z4`OwG&Qms#>=UFFU7D>dm0s6J{Xsr6}(3+NS8EZ3c&b_$-TWA8>x`SttjfU0Tj+#mV`3sz~ z7X`wa)rETG0v_q8Wm1+K8NTq5N$klnODiacI{;lch7jw;4;5B(g7p-M2DOh}I@N_R zAPx9>cw`Bl1-+krThSEqwj9TW$;hR67>`lQ56lk5>RT+R01;86!Zwx8^;EXrMvvj% zjY^VO>)FNBl!iKqawS2Mvn^#kN9R|YO8?1%&rNsqz3z!_%<@>C8%4|4g!kRaMU~L; z<*8A~ZlQF>x-{sZaCP&NtGt}@{y;Z$OW@%8N5(htgM|bW#}v@JrBYA*>%T3QL)T}* z&sbTBZO-=pSxXSj7N^zdu$Bf>?(DJ*?W=lRHk$@{65$jOMM7ioJK$yIYQ_OWkKoj1 zUdQz-YJjjF@}t}R6^eanR7%FFL~cRjvmzgg${_=&Asx)x_im6olFX>gR(@D$E*Uc&1B>;8hrbr#Owpj0Y^2<^!TQ`$m z6P=rO-@ubK>K~Efu1`tH|Vn_F2j5jj0(Dq*V=$x2VOp9cLq*{OV6pHm`K1agcK1 z(7lq|jeV%NPZf{VOwZ~rY`kr^=P~DZ&~74twXXF8m?uE0Pez4FzdQP6i2Phn`?`N? zlW7xy&ks-=oH-}AG~&8fdeyPQ+P!K21NC_t_TMxF3bCR}F6q60uY`DQe zti*_~HiY^zT=|^E!fsPRr}bCgV-xZwt0$qjBrT^ShYqy}wI4`oswHJxN5^C~=&6t@ z@}MD+Pcl_NyfNtjdVT8?PvDopV-gqc&OcC)J;I|Q$?K*T)^_Z3Uc1hGh{l8i&SjGi z7cNlGNMIrTwdv4-`(N2EUZTaXdn4nGZ9xu%3N@4G{&%uDsM3ys4;3hmDDF^_?lG%H z5%aj6j#?_o!nG@MKKkyro|e@azQf2pk7sI>&LHJMF)eJ+Q-w3Cr812(qO3Zw6!ce{ zIW9|#Tjqh%-a<-_@rUjkBcj%hk@507abzbIC6hvZ(PDkBqgq@i$urxSu0eN;CeOzf zj_pzxu)DOVT$oJ>CIFEhHRl0j*LM+Fh2%ofLl25qKisC3+v9pEkmOGJIGBA||?Hc{ZjaFt;&yCt7 zVA=zJlh?wh;~k{)l9 zUF8u7v4wK3g%-#)_q~9eBm1XP`>h zGZOsqSX7r%*1FE))~J=QN`ZqqfDeSLjqH=D@z*t(yD6EI=SZqJtI zjV$ZR?42#0x*a=_)H_%77*<~jtkN@(4|PIC7RHEYr{CNwAk1Y_?ww5CIvanS&sEDg zzs2CLdxL$QBLywr^Fj23&!KuOItceoZyc&K2XjX8?i^)L+Kv3eJ!RyFr>d;>n;XWe zlD>p=Pw8t^cGi}v&N5gtvF85G+^?uteA>%8zSF?!E@6k!UfyUV_cb!;Mz|5#$6Td< zsPQmH{_j+1_qfvX_5_En8`-&Xrm%+Z1B~bM z+&J_7ZDk(&By}iUKv4+mI6(-O)(x6X^_GBbq`kfw`|$E*B*@HmIH@?7A8turV(E~Y z%S~2k=Ci2K=v^8t60w3XaDs))=>kO+;B-zOPU73JJN&zPF5vwp8ako&} z=R$w|FL0}8;Ofn^`kgSj{)F1%r+Vt&TRmF)ZGeICP<|l3=;7>Xv6P&848d9sUvZlirZEXCnV{+nN)}B-I@|SDtHO?qqe#S zy%?z}Bv(|V2k-hLPoyC=)}W2xl*_;TA=)XGp_i|j>r|^!sgn;oh?2_ob*nl+f zuIKmyb$8vhzj98`djBB(`^SM^MJ4PDX9zmCTe8W2LE)NjUfh~n4A7Az=KN}XqePh; zt8*Bglf%wI%qwca&6^@6#UEpoZ#jcXNR4R1TAdDqg~qbIR~n5Wb45tFC>7Cgw~Dv~ zxGwuVo>URHH-EQp17PZS;3&?_M!aYOxgq_mukW2B?-@GqRm_ekKse)Fu;yamZ~UO) z>aQlzgLfAtB`Ik8%#18`8TDHLGoLbxx1`gWuyY zqZK(b!%+^7yrk;Zc!9zd z`;)7IHl7s~1+4*>hwL%+$zs9EEl1MtNcVn1(CM||;puiV=Bw8%f*=f!g$4PXoGPH* z>32u9S9fCCBll$*3N5IhBKsm&Cy0aeiQ$#1AE-SGFXPDz592aNkI}G(j`Isi-HSQ$ z$%}O(R>qaS@@mT)r=b*+dHy1@6ePyz<$Nkle^F!_1qhoP7b(U?G^+u^YeQ9h_@5=H zVA=Lvs&ibiKmR+Np4lpx4}9T&ERwT83R++V5Tj3j+i*xQ%AS3W>zZ#NpHz2b?^cB| zPBB5Z-q(M#a;5(z?Gl8&NdnX~UiC+sB-6?Eoh>b^!GJFm`>ytyr!S4f2B2)-(nMa-yJ$@{&YoZ|cy8ES&y7WL z1(^&&2GXUL(j(fQ%Xbf^4x1N|e`^`23vg;*?S%~(I1Jva7m{4Ek*F=t@1W?dhW1n8 z-vy1PCi~4=VC7_$3CI@s8VX%aG_g2Dg+3_a!#C2hQ2wR!^MR3sNbD|?Mb+497TnPh zOfnWMM2sB%URFav;+?biMJ5wXLa-T^h%0^e&cha7t*=ASdq-G@a2s^P8IH$Fqd~=3 z`B?7dXFMZ4cUpNTUT=NJuYd2`+Qb z-f>3$GUKf7+IoT!cchMmnJV+Hu8~;40)UoUWSwce_*F?MKmy1!yW@ePp+J3T=X+Ud zCE4Cc)9Of`wu)(Q3LLZ8;T3@M}LtJ1=Q@WGDca^&D(8hZ5waLHaO4bUyp!g$2Rg` z_(MnEeMFN$F&o`t%lIANRJ_j%cM>6=xFi-r4 zF5p;N|M3n_bMLtpjvTLW1xs#v+cNtUXC*X?B%zXsz{`nj&^5pJ^RAwh`aq_-aQ}TA zj2AvuELs>W!@}gJ=8+>a--q!>E~RN12scUc{CNCsKg8d(-@}0r4#}z5A|(uv^nQtg zMi;fy3lN~eeW^5sv}Cd6G6e^NLdPV$U!8xyhT((2KwY9K8<2Q^>c`SMr3F4gR*z7) zDv&Yw{{1`2J|$Em1B4&7x8A+RjJLdWr;;|-`u;dQ4uJ3~bm^{W)f3$FJL~Axk=F6F zLF4)o#jwiJ*DCzZ1#)EPWcrO6RU=M0mHnL5550POM{9g-BsjMuSV+jM^qs0xSHCtxZBAYCPH_)U6#zP&JRDav|z4MwNyv?w2SY7^b`YbATBP z%SuZ6%iXaI`;gRNvV9JBfz%;X2lzC(qJzSVl}dpE28dyQyAxQH3rtyxFUBnOx0N*M zi*rA(%4Qx3jo&~prl>V=g?}b3)pdRxOaFCkv!BILg|#%$ERs81sB9Yb;7OOYhDBgt znIv5gYu+S{AzeSe6@RXS!Fp8D+jp0?&m{7>tKmuE=JcMLQ;3s(pPdvwYkb#x5;}0h z9NT7*{NO;PA-FK}?)zd>{R8>)hRv%bJ?~H`ZyBmYw-ePDT8PqMAXvc7~6mxZ3pDVZN{I`RJ2?e@3%K@RqX z)|~Wsjpc1F&zlWD+Y5qd_!i-zJ^j%rnfp(gKIj@Hz1R2>#qL7>`MXb?GUTpp%a}>m z)^-VnLz1AyOBsH%S!w66Nb#ooX7+411Mpa>4UqFVq()t#53R@=h88JJ@|Iw4VC7bZ z=$(HH)nmLB58L%f=VARj+ea0W47@;XLvLn!daij(Zn|qwnGH~ApOoZ4ym=)P0PDKd zdQc);fyq|9Kudv(XIsbq#cKcxP5bZs*z5bc-mW-MA`5XGUZ3WAShYjKXsub*9y4-0 z*<P)NbfW`iH zC}h%6RKHE(WRozwE_1Uj=;W%2Bq~WP^Q7G;j3fx4*Kf0hle(U)tC~WrK;a)fpZgK< zh!q03G$gyfal~t!va;L~-!L54MykqnI>GrQoxZwG2Nn5tXH7(Od8fVbz;fNooNHX> z=iNz-p;L;t3fk%WOf2(nQl8^AUPnlJ2Qn6Q6}y`8^bb$?7#1jOMrY)0ak$CaIKueH zx7-W?vJwMjNjeTB<%H6CpF|q`A2Fm{TBnr?0xCvETmaF{O6Nj2i_l7mz7!;#5_--P zi@H{U2vJ0)${(qSy^?w{7=6L;w}K06+2W1D!3t!z@b*&QVUwWjIH|Xqe=yS!4PAf$ ze#c)OGLqvVJn1Oobi~tn$3F9M+5M@u)mP~^L2ynIrIRhG{g=2Y4&nkhm~%%Br-cmc8$^5bXOO(ogX3=oY>DZBEo<65pd6Y)T^j1?_S${ zr2u|#nUi{QUXpwcNXDIyOaElQNu?l?9Q7zI$IHCmMyD%fGt5lbLpJ~M4<{&f3$z5{r6ePSKg7$ zp#Pp-xv}-XjW<$nK1vMmKR@oj^#AO`k(l^@etY=)@|3!GDDILZoc!nFIRHHxSCyml zZ@BsUdaYO00dR0y^WWg^KX;B4-)az~(>7Y;F3l?Z?~i}#A@Bd6?+HI{FfC_Y_)InY z-)4%x#;8=1Osp&Ju%vb9pCSMH`+qW(YqCa+pZb(MdP~Oz6IQHdvGad)A^jgIKV+1md8Kh^QSYu`#5ub;1+kX%sfBY()=MFA=J90DfCme`Tha!J^LGz@oN z8347w*ciN9A~YztoPX#e>%7Zt!yJdZ*UT@f>z;fatZv=7W9qo9{0;ga*m5{trU<$3 z8F5URJk*G7d0|U0XL>^%FkWF`h}9x$ESGh?&-9ucJ`@h2)>x@dQ?U@2(LkXuzK{{i zEA@vsK>fm4<<}NRTyt4PA;b`H44e9+tK|UAnwf2!40AP~SCN>-QZ- zW~nQUl8G+Xp-#FRVY2OPpm>Zj=J#}n99_g?+t9UW%+2TDaE(o2h=xsc;o~AZZJcDdH zy!G0i-V$eabj2sVhbb4y$9OHN+VGtT zq#v0?-$3VtP$ynBoiz}v6KI#o&JNU}7UjX;Wk7wL{m=$y;h7&R@Q%nPdN)xF9(p?r zU2O5n^!+`U0kH{aVZMRS!mizB4bQHpXe~JSdv((yay@=nU(=yJC=5-8rL(D(ol#(X zd3q@0xKrFU6pm#N9a>LF20DE_CG21N0Vnx%5jM=NMCX6`M~6~UFRmO}?h?&}x?B&7 zi(Bds8+tRQX+dj>c(gBTluW!oD|hB%^w7$e%v|-ZGj_NPvjU#6oh~9QE|caGSO=o{ zB-vz^Mz}8J>A)ZE@)ue8ZqDo{$dtvz5qVzub zxsNfLa949^P0j8wKiVF*rqFKfwbmnmiM`>UjFbmEz0j$lh`hbNTw4q~+ryW5Jp_1d zUOD)aq24k2ZFkix@I_Hn$}B!WbHVxJvzW_^eAeYL6R!b7?Vg7PAnKnM<0cfh^5R7L zQLcl(1%1QsIdRqcnlEuJAvAf(EHWEOesK@*n++PF9B!SE<#yU;TQ4%R%4XQj)FE*Z z9`Q4bJZ#ldTl3lD&$X!`H8mY^rwf_So@$+&vT)*ZV(K8!D_FGlAZNJ!TItALLaPrh zq~B2Alh_uHF*##TTVF>?AG;I)>0T8mX6`j!9DVTQAS9v5%{k4r;tg%Q$Ji zG*9^%kssQ>xs^!tv!!0{B1Gm9adjWnR%MmFrqQdoTcK4IV})&ASSgc;(jAXaY|>eS zK&QL1?+LjoMNM7Zo%WY-qu+cFi+8StG8EhG)xSRn%=oBrDFw&}Bgx z{Ji1x&cS^7d#|42LR*KuUSIdW*RW9HTDG1TO2U@Zc<{W!R@70G(O-!XxG?A=Yok0Y zw!0h`y)fCAQhRD5_)ohO4~5blr2{zRtK!{daGMTb^;EeN=Ue}$FK9=kh~R5~Gx)rv z!<|e6d>DF%wb4at7sr?vIQKO_vbZ>rvhnJg&b|eAY$JIabTO$b+}W1o&)HB3BVK3K zBqtBLM`zf6z=B5p;CYY(qpm`gGCpp?VMpjr$Ui*y`9*l*)<4C+)tYT=Y$F<*8+L-! z#72gB-Cxr-sOP?W2+XN$`g{K32w|>DE^)OiAslm6W-KMmHue{{T#4nf!2Sa*0c$2D z@QLj+JMs1sEvR}E&tQo!Y%h5vUCefky=FeNlp9y)T=CAM)T<~YdGzX>Pol_A$Uex01jFYG)F9zRo}L;-sqb z7lW{!Rorqrvo_J1X78dZ;Do(r3YNkXc+N!t=7-f#8Aitjx=JY(`|W2lI*Er3qeC|L zdwOq65TcNCtMjrK7Q>BULnn3ga^f@91$$3^thYN-n73l%qDSAj7GgHf#LHfY2M;Z& zvR1A?iYT}yKa*^49B`3Q{yIv#KNPvwWikV_7C9PmIOluwb}T4MS=lco^}s@cxe2<> zOeLJP(*)w6jtz>On>4?zqqmQaTcMS`^3UmNJrd1vhY?ps{8dE>&akNcFoB!)_Q`l_?GqD`q8~(-0)>nL#&yO zjoKg1Hbmb6ikT4p1rGGeb{%JfiHj)~8ED-fh*lHw<%@9O5zRZ+5p)dw!eQDR-BOyU zpB&1JLEdGhs1d{QEw3{x_B?wYrlOd}9Zl;=UVh2g71+SrSjNo43dMhj*`ki?<-%Pr zgiTm7MWg%cZ=9^Q#=)lqX|Ia1{d)BEqdBj~c`k`!_|GJ-d93bE`&%D5SpH||7}#Tw zqzI^k&8Y1lXCgMguOJhoU7zrnmbw53$-{@<& zs?u(FCgD;8e5WosHEh^ct zqI{Chhpc6##`k@CCAbkXuuQ3BBZ?+~OefBBTwp?n~@(`!FXw z^hjS)1$%>OdJ*{k!RyQ*H#RdS;&SxduYjO;!b#KEBZBK#E#y36mpcSGXoswsy8MLY z+@A(R5HG0hKKseHpeT>-CJdnOPI`S>y?Wj<=$l_G_z>!_LDq<@ zgAj$CAk*S#&5L7HrB`554Hgx~8*mEa1nA7ohQ>K$hhcjf<+ps)4lfF7Vi$7Rh$o2f zRP=54OI77qpzRDTygUDB*ZRKKxO!i`{Jg?hQ9xnxyVoK0*PJek_FkJV`WbQZUg37H zSvSysb2lnY?~C4L`{zegf1B&=wBpzRw5f1FrKD+|_AZp;7YuW=Qxil*CSx*Ra;9+EhN7+92HIy3o8it5n1-!a= z0TRg&ix_GF?H5dvgIv99xr5RFI2~9IDHA#uS>vEom)aJ zg^6}cxw1*$hP_pxkJUos*49Aw-fga${0%;L!Lu!6%KOf6RXl{{&fRzKfg^j1CZ!}A zskD8ea#Q%gurKMmet6SwknRO0$YJE=4dY%94}Lq)i9~#J0YD>(J%0aXP$A^ChG_gY z{U|@fm;F#~po`sMRSTYxM2$1MHke?2_NZAV^pM?fcve-Q`9T)g&IO4WK|CrKuoOsT zl$XaMA%z#PPJaCM1VGB0Erb#p@vKvHfv=V>|6ofSb(yizOvk1iR8MXBef^vL(S&$Q zxY4oVUH+25vD!a+ktn<#OMpBl{%|V8nJ0#7_v=0jwSPw);C^Byhsgmv8`M%fGR38A zt_p0Wv33C#jMZ*n5+JwHLB>^c4of?i24Br;oHh;vwJoh?26jr= zg3mWRsHrp`t$)JeYeHiG!dB~Yn|P1#&Kors78!nvO(=Ty>kL|@*CBoQeCEN!6i5sx zwEWNeaM zSuf5`GyyBEVBwOem9n%y?xO`k+ahd4kPv!OCmy(*%kUj`EuzQ|ITW)bK4(dOs zm~HAt7w23{xbm@45T-amuP;du-nM48o@sD^skje0SvOME6<3g*FGD{ZeEvpvnTwXwNble^ppDZd zO)h3Ji?)#UmDcNUzrX!KS_FvO@Mi|?VN2SIb?s;~yVX1`k4%3RbthbshopYEXnH!< zc=j}$7X=tA3d`I`bPc<|mMpyVl@N8{D$V_08+*8mqM-gSgd-)z{rLOND7E=v3|9xd zIP><@f;v&nbPz;9W^Q)3HUPOUq4SNQGWNFkQo}U6S0fL-G(`J<{pD&B+S-W(ak}K7 z8>cEzyL9`jF>dX)lH&AN#~tC0Da{5tnp4xSA8mmYsRiPpb+?F)-VNqG?|w} zOr6U}=9(D`hUxc6rl@pQu(lpxZZEeg|PwS{U0k`HhG7kIoUpsjSzj}8& zzT6Dr(wpeg$cRt-)!G+C0*=+^o)~l#1U{P3^na(8beGeEV=I!HS7+BT#jBiIhh>ft zD8>EvD|aENa-G*NWz7*5w2rE&%VSW8GwxX9gz?dk5EOjQqbuIjsEbf+U!fTsqD6BL zYRl*s%=%r5Tn#KZTmxwXAjZQUUyhA)qqoW*(toV4wFS2|TLhk%%J&785K3LkrFBf~ zA&Q3ncX)abbq7>np>=Q5%%UCu_~{7$UGI)Pckq#ITTbyjYaH#t_nc>DPAPDn+`0`) zDG|ShBVzB0;KMZ|g7t0rT7nURAN7YcWIhLiYVgm)6hg>FeSyZ1?`Kbd3|(I$?xekS zw$Hm|Gsz<2EVSZY>yd0EzaDO;n3_^K@l{jqvLH84W;Zr(k87w-t9nf z?lM?DYxPUmm@|O21I{j>bH=ob%em?p0jdx(ip)?gLRef>cR#z14MO5B^S=UnzC<2= zk&0PWCdBEvDos8G}DNCwP&G{fe}vtKBfoLgXksDa(`z3=0`eq!eB8urK5} zRd6o%hjPRsU4*#O3RPk|&qLY{VLf_R7tb zdea_FX&cRYvGXdV90{RbSqKe%mh4Ale%7A?5YTj~}~OpyJD zF$=?iC$Pk)Ss*W$V9>}-2dkvJDb`NsUq;xC(AM<}f;eWFg;86%$SB{2hzY8z)BHL` z$1c?LG$*jPe*4JfvAR`9tA+`Yjf{9h1KO`yAu|Y}LAjXCcuq1}zMb_l^ zbpN)~cUT*Gr?NUM@p7h~bG$>k*P#EDAfT?_`E8a!9JVyfye1b=A~Ys8%uQaIyB?7k z!jJ2-D1>(mSL6oen!duzxXe(W&aHzG1(;>4GndICR)zjCRaH{)F$Rsw1!Oi%;}h^?Rss~igU+x-y%{)Q}FHzY99sk_WOl+_e; zJM_SIN{81H{NKoEr(A*;2lad;yw~^$C(@(7(m3OCzDK+UtWZTNrH2HROT=nkmX5<% zBaNH_Y$BB%GhGGPadMXzc~$$~hcz+{0^haO*^61I^wqbpZ1sMee1vCEWY9|l6f#{Q zGs0{rih7>pUF>;C~qT{p=hT+1I6;;+M|exmbUqw=-Rw zhwF6#{@k0dD&CD-czZpr=H>8l(Hn(h#r2DPM94SYi95Sw38t)ya!wuA0fg@Kr5Qb% zS~s)4T9mh6v@tH}d-1$qbjQu72xM4u)?^^y+i*@cuMn(Ap|iS3wg@BjRka@X9iz_>>YnyFxU{}M1YaMyNK4_ z^$eRuKI`kME8y+m0M`XMK@%!uT9aYf$y6!R&^oDa2)M^`XxPDo9 zZ&Fa{O32M%#bYnTEaG;aw*sOY%=iumScx7;LB`wa?YzB+tv9l1k9($6vUUhJ80T|> zd`6;JaHNM{#3&0l4OF5<>)6O<4r@`JHBAPPmRFB(4<&r#-7=%8By@|Sa|qTecv?R! zcBj>PKqB}*sVi*s?O}^F{k+uJt>=)~iC;5~*j@nA8w7uXtrF&2`Sv$KF=76>8PUF9 zJym^ST@H$Jhu`@wn`96amwDv6vtPKq`lp}Pa*O5sH-%uigF7Kx8><@xH?#3TK2~Ox zuX_p0ZpW&%iI#R!`K^f<(NhiMHPIS)^3Xr5pJarQ9glQw4LHol)zqwZIh#ScF_{I$ z>>^KIvVLUH-ME_Dm|Z3fg=jf$fCQkQW0ZpL4)(xmgM3%%hkqX_I}wnT$V)J?kGk_y zm~*ZYHubd)t+&G>{A!&dzeA;@wz!_C9Xvoyy-^BIJ#5rH!HkCsCizcU@B(H#qgTJYo#6-f z8~Da0lzRxJ1E%**L6&Tgr5mND#0+k3LDBrhu z>T&%D^0>RrtKy@i7t6Xw!^-b;AJYkoOMh!v?&+W_{?I{;uyqKJthi76TYc%=xDgnY6O6ru7?ydTG6E(X@}_}^uV zXaDoU!1DHH!XsT3xRD`bd&9HIr^IF>D<;W%u#UV$Ygsm(?BvDIfXwsc$1XFGH*bk$ z-ko|L?b>) zkI;{_@G?ylnNA`H)tIMn-PfC-e^wK|>BeC_UT=@5Zy?!?JHfPZI=Yxn>+$VOSI}`nwD2|K~q$OPi7A0qQlhf&+;kG-Le)7OC3+IvD>hebRQ7iGG^-y zji?`kb#Pfa1j))|}Hm1Z1E# z@EL6t1GTNM&UWF_?8Y-%8+(4Gq}Jov-CGD$GNM91NxSg0c8D_{+87Vr06`d)YuA0)pJzZ8S2;$73Wm?p-qSC7@rmSJ(NGwBFe|M zINh&<<0t4z->{x%cw>Td&&XZ(v&tg$IKV|BzNKxoVX>i08PMHgQV+1}`2IbEKE+{E zda%E1F;_;rFDK7h@8k+h%%>)|C&ii|YhrPlW74f-@!#mW$9tit_VGmToxWlnLyxl? zf zTEdpSY-&!PvvhIFF3OWy;>j)GsWh-R4D{DpLli3CrFZ@b`D%6y0mtF7TYO!Dq4BW^ z{{VeN-&v!zqYd`EDOBIhRBE)O>M}$5+=E!`k_#ewdQ7~R9_{p#sThKB=itk&9t|KA zC`mwf{@k~!>qrVC56dx^9kBg-LX(kvh|rMJfP~aQj=0zx4T(aFo5EPfKC4OBT_HDY z9&iD^E-1F$Baufp8r0RY|JU@fr%P&|&5xnadv$L-?*!~ok{U~Yd%bZ$;w~9GbZOqw ze`@Yg_9U$URzJMeSCIYEnInHOETPm3k`;~Q-#UM0H;pcp+LPxVuNL^yp`oh5HDKVNFLb$ zX=v%Xxb`p2NSX&<hKTYi*F7=TTKW2Qa%;dGh={(9?R@5?Q_9W*`GB6jhEGx@;SW z5ibGc($F^wG=nc+zG7gR`auBU^qEzNAFNTC@Chcre>nP0kmYJrtIg-#i;HgnF%u)U zWDbrW=)bZop;tG+?)tO`Ym`SIlkp;`{^!#9diuPBp`bE*YR}YlzQ6WoFWsfygdc0k zHn4F8B+TrxrX}6k+9=Q+`(a35p~yGcW@&TdMAJzUxW*j&&5&vO=r8Hy;^)fih^m=@ zCevD;S8=E%t$&T4K)=3p3SY36_h0HMFO(B$r-KvYDAtCx2xA$nAllK4&1YuR7IjKr z+Xb~J5=Vke42-BD$wG2E?^i83o}VfEme}m07iV=KxY1vW(6WnM9D>D7fMysEN;A`< zQWnU%^9n6swbeCPHu)wwrzgpq_#-OXnYXx+W6$fUHduLD%8p!+fa@; zg9(xD4>7x`gg=O(*d^0d2MwAFY@t5+QYZYdR90-tpUbU!_qhMQt*62JyKfQ--|;JP z$N`-*Jw9%Jbu74nK5s7`6W(xuC@bUDd@gG#@MhX?uUob-Ztm=hgkOkM!zC{$Z zhnL*a-&@I`>|{li4U5ZoI}}~lundt~NF`Ik`aZ&PV8Uq3G(%MQB`|b_Ey*6(2vZbP z;sj`_EJfQhH_?jP7KpJvf?V@=OqFuFzEy#Mg|!Addao2P0w zFyIFhKUSar&||^}nVO)a9mF$YGgxa>YXuTfH(^PZgh4(u(geRf{?Pi=uO`dD4uG(I z-c&~v0Aonu^19EDl|lomq2D~OME(F&blX%b`Z8H2Z{2sDTkID&yV(i_xoG4@dWqTI z6a+}&naJCnuUpyt4UqEBso!0v#Ir_RLf);D%kJu^Y6YB>B)VK8LJFXd&sg{?D^H2f z7(`t2tABSUAV37Z8?#?Ft}Ul;G9{j^5i0+V@Ija7pn7_1mkiP^;vQDxu_mg73BX^V zuxFMVZs>JddmCUk3B6=!lj`%@i-42Hh|UO#i8JVG)I8d5UEj9LG(6s)>*paIlB)L$ zMnCdya7b%-q_M~qwlb6id+2`Ro+g9AW4)HW#!D_pIJz4hUu&Y2nBsPv4>-X;#?IMa zrDExB_#W>} zu6pClj{5Rz+Jh$B&SEx3ZS2p=$yg8*(r1HxWwBE|RX5gX6x?Z*MF7SvdD9P2Ufr zoevU|1$!X*-Bu-ZJv3IOwEqoll8~%`lWF%xh@~o>U6Pg=$E$Ts{qJBt)`usJd4Ctx zp$aJ+;+ErMwHHs)1YY~qxg!^04K}dxR>1_YW4}}Kqb)MOPk7eVqQhL?N(JU7Np+gY z^sIy`gh)cU($BKAbXdxYx?mr2PKq5y)rfV&M)GvlZ6~%&d5#(;C+8G*IaJ3`>}Z!cHqk1T+B#Wppov>o93H&6DpFew6tjVNPA6zv!#gJT zVx*%rV3N{q&jPRvLxg3}XDd-?0xd3=&*Ja}))TxcEeQ5qGVL9=W^IKJM4P9w;RgGL zKQgcS{CN%z*RS{rB^YMAL~z(reeYPxzqF=)oVoT~Vo|y=`}`V*DzjLF1)^Zaq0)VV z&a-gdcA~g{EwZ+0!JKQ-x*cY{u`{-rwdB|KPaRl`N?mpi2jQR%RV$W*2GA@YtoSW= z{g$)9BQ@i<4t6zp1|o9Pw>F9j4~{z{&xiPJI*gp8TC?`=E(uy6BksAa75hK@r&;l* z^cfi@s7?{qCdT<$Rrynh-A(6E8zGF@172h9;#u}PzGz3d>dsnnUPT4Jo79gR)DuUa z1!Z%;2(U9wb5T+T&zYO_0#ldm#*c34>m7s(j&teF1;cA~h<@r&RM!lr#pH#!k;Jyg z1Vs)F4HcLh{mvkoOw{a&gIlC7&!dkI-QXo}w_JwBLh2ed)j`)<%-~b@Rr}O&2EHF_ z#fH$(fJ|g7-Z()^TnA*+*Ex6xy(*~hWAn2>ip{gt+OVHOY0BLo!#N#A~ei7*-8(fLBGFv~I$L`~mPxRI2w)9xB-sA34^Tu(F*LQx$lt@S_ z-kv>!q40J;2D?wVOgyG_FLFwffoguSVr6jC%oVlU%T3<@sx>E3|CETF*MFj4szrHZ zRB;Zd1p+yiCl+P}*!DMI$6wBF(V?Ao$!oXq3KhLYFq^cl@IJ&3IntM|$F{-G5bT|0 zLs6-ptt}>b@#32nxRGvk`VXLGQ0fuo&;qk~4)MOt0`iO%_QN04j$yRDOXS&!b$CVJ zMe2mH7IS@*gap)$AeirS*r*(!%B5_5*$K&Trb9L>&AIwbov$pwAKXLUchfnX-! zy2!G!b6}BPNK-YxI89Mk>C<|$_^y(2@qG6A<%&Vjiv@Ztog}12+5+fU=-*_TQa4%R zX2ve*QT{Iax1&k&Wb?t*y~bi8LuhshgBe9tcCQ+~*5B!68N1?L;dMHFA^*U^q4So9 zD*l|Y&)>;djNJ(xb;@3$sdadsBsrm9Xc$6@7CqW8Y#Q5mo&)Y{@muw* z@W3@Gs~hmefM*X+27gf1y+kVyd$0oMdcolSzJMdeRxHhk(&G8i0pY>(3|Uj=eTr;q zeKjY8@COg*<`{S-?ipGn5(r;;+;YchaOa3k4vXs8iSv5v6p_v_XWzp>CcBYbyc%i3 zns~C|!u4^ft$#~syrPgQ{wtESnm2&pLY^Q<{iML3wJpA)MYU33oj*?jN<0Ps%)Wa% zz*z;q{WwOukXj4>{Ba~Itg&IZHH!V7w2u4stPgGwNDsOwv0itu+T-G8>0QP9o=e7I zJadHRbGyc4{8FZ*yX({&(v?IP3Qdl=n;4dX-Ag4y0l-luv@+))SWFt#U|c(~7UQ!M z2ki5&-=k=->4=3W_Z_ae%P=YJbqYtb9Gbe~^aJeIC7Jio80-0(P<9D1^?~S+>!%gw z8C=A#WdglbQ~C>O*(NH6x(ty#G0hQmA1%8`L!R&Pibf1X1Qc225@T9U!7hta1-0v* zyp=4?wkvVq*{R6xUDJJF~jer4w<=1BVw_d5+|nj z2bkS$b9}`b)PH{2ynw)=B|O51Vp(d`MCFu&MtO)|lb#Vk&&Y`73h>BfRG5e=erw&w zoi-Di3POx9y7RxB#1Pv%1k5ww^Z_7758q=m;nWf|F}0t&Ttto)v0*_5w$e?Sz_L{a zYOoAhAfV}T29?E&6P+CKI!-V5hX(`S0(e2_rJ{d8Yu}VW} zUT;gCT5tlePGvKp^!W5*o0D?o zZsvN8&=Jjrycl%ch~F1^SQ?0JE8YgZ;>&2QZKs#kcsLPN^$dMU-EBsOZ)ca=VumO; z0%La9cIj9xH8S4$%!W?0&Wb00j~!S%ng7qjc(^WbwC9hV^r{6lF<)*3(X)I3u@COp zRMbX#AIMoObbf@=g@Jl9QCCTiF z6<$I*#A1bW79AOxv!*Ek0_lSm$sT~Jpfk(a5drHGLqSq7+SPX46h zKmT?c&ypH;WbW4n%-Pi1CGe7oaX|&x_R)I- zpr2Jv-}p9E;AnuY>k&QjP_`+(NzKiTUf{$7UxR2|q?H__-#)f4 zIud2mYA4!YqfJr2P3}jh7-|BC*w4ycOh1-OnRJ1J8cWWfgBuq^ack$TzM`P~Y`#wx z5zGvb*tLQ(^+8%1eTJHVI3c!t+`|T9R`QEko(Znof{2}x2b9o{R_=6!74P>#1TZyk z+~~2(#7|d|rIqr1P5kmnmj)Y84>UWhZ+3LwP_*NMI5weY$OCJiw9tu6pF?l9cDr^BY*-ujRz)vjPxkpF)|ag9z%Erw0?+de z+#=SF+sx>0PUaAMIm$KktXTa-9^KiT}_sSe>Z{y~7)_B#RNc+GF z)KvY%EOU%bPxP72&XtAbJbyU~0K_3X(k-rFak=9p@G6$2ls znUi+2S{FXvM|`nQYa$ICr`p$=9kL~%1o z-h^%g(XA%naD9r(C4PYh9ms_EQ_LYk0hM=5w-q6`^CU*cpyX?X6DVNO>>@EvPgPej zQwCg?3fK)a&~NCi;l+A~q=LZqHGrlITEaq(6e15Eba8W+czh&Y=v*A(wY>jw9ueU9 z^*{MCqUY~7h_Ua#V*&rjpFI)iFXd}Mzjj&U?x~gfEg1tRI>dwiL+RQuXqtt3K>hi8Br0h-})utenPBE}xDTrN5KA;A@}DO0>4D9>kK_l$J)cj-I{ z$=^%)x$fVysn{!7j;pDCVZukLjjZ4&dJW5&bpFRG{4lJBrmg2wq{WcW-#w>)uNk;| zhszYjd8*q;R@@X4xGPP>~c*f88|nf89CyZ?ho6bqZimP*G7K8~W9`&i>UG zaQ_(g!yuhlnkcbfN*JHrU-M358f}9UiBh%lDwItGt}cxr3tXRD`!oIKiNLB6(;$rYKxN7ld2C_V9qAAG15=?%(!zwCG{=u(IQ(^Pj!l5skt5QgL>b}1I@_t@w zGn6JOSdp6Rl9diYl}ZZ9Juue`a)*)HtPg^ z*Cll*-B@Lw?ka?-MmAUb2DnT4_X8xBdS|E`$w7~gn$8{U+JQ_ki955!Ydc{!@p5<$ zfWfUXZtw9ICruP~0G#;h)x~>)qYyjkBPyTek9<}{zrktb(#k#a^D$e_A=h%PE8+z} zCqGz9?s+oQ_4I^KfL~y~u8HG*2yj>TNEo;>e=EbIFvyb-NNWkRB=Eb}fgfGM!E!Bj zVW*RREI}WGmQ={oTpg3~}EL_b*>U1`C^0y9=TJ4Lj0z*o=U{mOD z;NG%OC{hDQJ=mJLz&?~`deh4LX~v9@Ac>%Do4w=u*ICo=YGH;+bWB~zp&_oP~9nvN@Z+%l#4u_ALLBAKb6lwv+1NoGh>m39bXuT&_% zoF5VO#ASe@gz5`q<~o+UZJS)rz?v`@IU@kn)A5zrt_?Pj>ga92P()}`(&BOpckER3Dw zLK5Ph^wWYKZfDJeAm=mPF7lw&cjvyXL7G>JIW?{(TI{N6U46}(e_w;qEj3m3=~HD> zFQX52#aqD7sm=B4SF7U_m)ENzAhq9^#&z<0m_5#01Ux1<@$_ADQ+~U@5rlULE$~70 zAC-7aB-*%Nx#e?Zts&Z*N#u@)$4+{U&~x}bZw%Rk`O(R$0W4E>lNy23F&)SV!;ARZ zQ}{CJ6<6=BiwJG%ol>^Jj0geOOE=gfi*on^E>%s|hv>{W$HiaKQX4#2LJK8=mSs%L zkv5`rc@-Kq;o$`ZzjN{=pKTWhbKN-~zg%b)a{EFPrLJ-5D={wMYj$;47R-jAZqszX z+ni*W^*E^EH+7$gm7ZwsWy^0LuGOxTcTWI6 zv>%;T`}BYMC#GH@yneIXfQ0 zj9eFeIXE~f?a`u2X`%=UrrF0^0h_VF>gA*zdUbVCC6`p7OWp&qW<^1&59Wo{8{LJh zyZ#b{6{tNGJU`VroG_#)IyP zSLEr;JWt#qf~Q;L&lC=1)x3K8G>TX-8-a40Nh!=SL$Et3SBkvDFYjZ4$Vj2d0uPLz zwxRDvFmb7rex&7rzs^3i;i|9|zR2vf7J|eGXQehpm``z7!VrfKtZK|UySV%W0v{_B z?o!Z5mC%Pqu(Hd=C66~!VQ!L7LZl9-DcAa5=e@MZ?mVrvAtBKsTKHUmssaa0qdVv) z=*`GaNDd9Zxh-sgk#FO;>xS!){KkaLPRc`fLK$P`ARPpP@jgNdR!%(R*`BYH&isld z8<%ueI%$~;c8aHe>+dS}rKF6Hil*L>UeMMtpnVf7=)h0sl0T+;^HqV$xSeQdS!q6C zhvQkcI(&`>jg^rL~2@gBA4VQB(B6;xm#{s_8C*w<>*(3R$ z=951`+YzyF2KfW(bqw;(^bS-wKG7kz(x$EOI*f-37`m)}eolr%HoqlB1IrHgBPSsu zvtR$R9+?OO2_pH%C&jyi8nlHi77cB5-1*kjIW1Ctnl>%c%0*!zge>MKSA(CQ577@fpC@xJ{ zcKQtBaDx{;2v1^uac;}P=S>#T$&>)t*C*-ZgeqA;UFN~{g>x*vse&C8_gddrIprep z#o-k_LFsT7GP65gV~a*+WCvx%Y-xESWM=M3V>_N^DM8h=MCS6r5Yh>JBM5E7)nnTg ze-YNja|MWb)XXj#P;woMVvm4+MG`aDtggVBN8>>~wFZ?Xbv!_;aKHoaQ63(5WF@|z z6U^UIZa6KbJZbgmk5a$R;jCtSc{leEaqL40r0Ez159{L;BFfV;m|6Lt#pwNCrccae zs~97A+-t~P8?4m>UTZY;76Rnsib)xi;D$7Eb&~dVYWa2YBT*sk40j#UE2w z)gw<6a~W>L%RcJX<7Y%|g6K)&L*M3M;=}y&ZEQfC7F?F>ow*~2J+`3GSXIcer*qIq zjFH3L3(*z7eJ6!Yh_YChmi4ug-pUd0^cwJZo3-KiV0lf2&u(7GyD7^QwD1NZGS9KJ z6A36>GI!;h81-`{keBeb*c~}eP=s@U5mT9TfKy-cHXHGC=+yHR2Z)d)xi%#=vVG!P zA0?0XOo$_GX#Re0%A9$_L6@d*iTne9Y{SzendCM1^MG6GbAZB{X~B;TOH=O_Wn$(t z==IVI?^=ZBeHI=KwN+zjjOE5QLWVXBmv5N=MK<9Jj>9@K!oW9{N_( zm%6o`UPig#WFLB3&%rBYSyF1F;dCwEgc&Bo#@D+&Pe>N6p1J!4i2gmJ8{#Ts>@sBfL#374>0rSJaD_cF{I9-5s3aA_>-J zN|zWg8n?w*X)5iWhRK7%1w4$mkEswS!dz;NJm?-ZEU(k7$wB`l`Tf?%bqV`z$+ig} zm(?~7(hfMet#$@4ENQ`+`k>db?r>k$r2ACvzCm3VUx~#hYMpQN38G+s|J343UVLk- z-{}>Gs+>R9$YuYh2~g@$dD4t5mKUHP)dmT3)H>*Dt9MUNOa8WRNC>IJ|7kRk+6{){ zh&SGwj{Z*y+%3wOGz zvJG}{uhIA!Ke}bD6Vz?bG%34t7W<+ed294OU)sH?N@yao@{wpEExG-%SaqpZTY+}^+`W0Pt-^W3~0$Vwcy`NCmzA4bbSxX=+bBl^Ot6C8h z45*!9#PrU@oqFdif~9T4f|->zh8Zim1VOG#_MGmENQkK`OHOq6& zFFe*a1VI&Viyho#6zYatkW_|!6nwgVJ1r%l7=*x$tr`puZI$OD`Z}YD&+6xr)1=Rl zwa3QGfx?k}gJ(S`sOVG%H-TKc^E}5%@wi^=**og|`a?58P$GFUW6YDKBb;4ZRi(~S z&}FeXa1UyBAy&aXwfN<`bvcqe3?=n`aj-s37}!~{-cM99cx@IIC3C&SckL)78DZ+W^yZeHmr{p?K48iCiKB>>37~G;j^$+X+nnkOF71+<7MP z$|)|7U?)LI3wFQ?R`p$Mpt_R9GkAm-V~t&qqyzNn$AiZsjw0x@*zhXEw(XBB_-n6E zIrVmt9bw%KY<*;&On+7LFW-ugJ-a6<>oDs|#VEqe(AI?Y9W|2*ckas~<;cCei@^XbvfSdFu!ou?Ra zQbWL;Mpcnp=~|)EV^G)Wv+6N6ATK-Wbsd_eYQWk+1g?@WygK4n%kf+!;K=D9j)CxSqD8oC2@MdKr$7<^S5PZu(t2k}1M}ub8>7xiZ zn*TzDmLpxJ5HSd|Kz5G)I}weDtrTE2-i)*>7a84lzC0eZrPy>qQ^AK0%Q2%Y>42{c_k>DSI+l{OI~JuzH--_S zY}L(Yi}GfK2mJV}((RJHJ_2}ci$;3D7AQxt{*SKNgj;zG*r=eC&+fSBzHMAeUd8(H zZ^apSq%e-37PHAbw0B(=Q^<`7V6h;rJ9a*@bt}{}HMNGO zaBo*{{9{ESi@hx~{D@pojT$+6O}ah((WB+cP(kll=hz7FdP+|8-Ri zo_DEZ!7kimpX|RkW zv~nuFZfw^n&ri)A+_~h|ds}Sm2GwqDzHOh!Mqh>R^~^tZzspne7FUa{$gqCLE#9qM z2Yq>LKo#O?@;&=`-R;3-{3(?B^@lK>8AH-kNK6`~%m(8>RmieTG^im#tOwk8x6!JpV7U{Dg8R?b~i5M+w*>X+XVqRuG6*H1# zR^sv*E^!GGDzUl@##)Q<2paFWDkw|AQam%+J4ADNn^delZE<$`6=e(+)xwpZOlkG5 zd0lyI6d)Z{HPo0L`moNrauOO#vGr_jP71(KaOKLmZn#L_mo@(G5uV{R zuQ8DBy58Po{ob~?88*$P)$#PKEz|D{E!sXCX*)==A6Rfi*p$*$v5g&!nbLQsyJfNz z$b(x8ZH&e;T0~1Gx1Ecv)Vh3A&vmergst^y@vCf%M_0YY4^4kVigbt_Ety+v2&nUC zTE9(q!4tC5(-Vs8UBY~ROC?E#;%8FB)}Y3`EChYM@q}kDo6wvkMQ2sE9lLUAoqZ&q zkn&ZA8c zCEn%`UK8UYX;bbWFQLLmYNrLMgA{DA6e+1AG+_(zUT^aoz%Y<#2Y z>g}ymCp=O|i+R7@yvd_6PK_xU@-vaM+4<6*;vc1{rk45Bn*1YUFiOLvUppN2Ag`CO zuEh4fWFSo{wwRY`+;gaht8z_*t3X~>9dXJ=yB=p7AD`2QsuEF^JwmDqH~lu!0U9zc z@Y6r}9N6qZDF$|J7!k_nvN-*J%O_v`_Kb1al&6&zL=`h3=}UF-&-zI_NX=WGKh@on z@c-I`J#{MnUr48EY@NYuKFiI`4Gz7QD`1{?@ltog99u!2>+@lOnuJ%x1QH(g`8zQg zw(fLMb8S)qo3B41Dcm>M^oL49HJl~I(8Wc)P)Aj>$7zJ#xaif|TKmk(YL>sFBu=;9 zkq;~kFx&O+dF0>dlBUxJDz|wM>QYo>t>h7{mUjjlr3BDf`Piq`sGsfk9chbYuz*2g zPd%Xiz@RgjpZO2Hr0ma2X6#)Re2m1#sT;(^n)<4Ol2s-h#~>FE|5LZOUB=Ilhhuj% z6Ml>q-e&_sL_~DxR+K$6m&&IiCjh9d&!=(JW~SID#CHDAGxCK--WsFy@rFg$i#6)P zDQx83WSs5^)WSEdTyj!B&s0-a5ku>7`VH;Ml?J_CKSnOG%0xWk$k&vXhV)fTc5SxS2%4O>K5G0=PDRRls zlcOU3L$%2$ldygIW6+mkM!&em#sjwjA) z-2{KrVX!hs@jqSV1Ze$8eaTVXp`HUYw7{_3caz4jz}xE1SA{L4Ue`=nP1}lbv9rIx zU_^}XGYoyJ5Q%DVSQCWqNMn<;l9Qrpkmdk~02h8_lLcJKHDxAVqNGj*E8dWjV`gvo zb^hwlZYlOxKlX!a`fN*B4vqvnL*c7u6N!;(70dAL^-+oSDuyz(T&hHwMkqgpk_xoE8+YNzZv)Cb?_ zo#w!Dzf!u?*A_Hbc61g(Oku6Hc>1I&MkXzALW;ERQYgsnYG*9Ib%&wX$0_QGMUx!f z^cp;+9_jB~&~Yu;nWC*yktnY#Em)oT;O#+TRLtX4qh%-wFz#J}J4-io-QTrJxdq5v z*2+I-TGqGa=>Ms`cSh&Ei9pxC+i8U`erg)S{1YRr!dWy~rA0m|EqaK|sxXig{VfR zgmb&s$WdsJiA%I1u%Sd)N$=G99km&J#-gvN>Xo^wAjH}4QEc|Eo3jZz`tEw12DQ!F zH)}3>=!<*hiZ85aYK|I{n}z#fw!|jmx1f>H*_!bJRjcWw`Mn{{Gy&ylkq7Xy@R5Q? zy(u({hJxvdvvtJuGT<73N!;8BsJ1nmrjWz}XQZhNaPg;H4*xE(8BODI8R#J~e@+f) z^YmpHC>(2@<#N)&d2wQEYF};@`h<+kg}*~_{!4+kPRz(29yx)ZiE~Pi=6j`1Cm`i3 z`FQJ67bs4kc-rERN;|86>O!ovrXs4;)pZMqi7dHbtgMn%;m8eYHMLVKc;!4XufZ~$ z!-smUR9Nz`q@3z6_~G@)J1eK@sH-$@9eh3!W4sDEGeyMGcCrwTRIjoJO{W}XH1H=# zaK-;~{RagVpIW1cppnF>L05>#*6C?f7~-(l;%oP0t5121WaVF?h_0u_3=qcU5a@k}^%V45xn@4cMjar1Xu{@#-3SCrIIIF*o<}(#?lSp~A~W&_?A0BDj>$0J{rw z->rWMZFDjm@)q}CFiyJ*9LoScFFi25QdG~sPgbPF%`B#6qJ3qkA}*J%P^U{_3s0}s zl;s%~&g<+p4mu!2VRw**Na8RgRzWJmVw1klXe)Vt0^oX>knyYUw_k8nmx!Vk$FBlrIS$yRI|^)?+})j&abpTS3_*4cL|*s=iN5Cy`t3f zBCg~z+m|QA;pZ$)Z~a=rsX27@?)*+81o{EKzI9mMdsEEF9%3ac8*?aL&GnHz24?l?x>vZp&!HLp7M=0pK?je$$=t7!r2sCgWU0V-7eY-?PLQKd@9ND5a$3!sCY|W3cU+) zQ1)_6cdeMo5x@1YszcuL?Z|^kex(%i5L_XERgB&;w1=5T&#{Hf{o-#reRy#xNiZJo zLL6p*AkKH20Jbw9ub(GQ2?$*iE)_~D#kZVi9wrWEw*Ql~Re#6XZ=Jyi8 zF?u$EBhqdO0ZvGxGQ>?bpfeK8JAZF+mzfC4U%E^8{GL-#_3yPU|1(rl@Hb^ue*c=} zNjMQf%YqR*t{A3hVMp?EugN!X65~4)mrJ3 z*cIE~%ad3ZvXEkQyz=e}NXtOOzg#O(b;~o6*K620ydzq_lVFw@`8BTeSkz!=Iqnk8 zQrG&f)efmTmztXFksqtE>7snFR=jmiT2!U!;f+1EJ-+h5i$m?Y9aW(sk(mM=u}Is0o4B6nttnLwje+cXxdCSK$gLE&O+ zS6Hmx@*Pc$mU;JMCTVZpZ#X+b`7y0UB(x@%q763E? zdxtO{su5$zgud_cOc&ZfV@-HdMgO5=nf14pBOyt?)6(ow5JCaVCIrUhy2LdZ8)TgE z$knR1lk=nP2u-n!LZDU!oZoFy1D^gCL=uwTSfi;rd6?2i{sG$_?`O5&xGK|f6!`Du zsbC%?!;BMI_y?ApD&o95FvQ@Sp`$IdgA3P+fahR^ZybT}UEqieRpPifFn=w^NaoO!cBB12#$sOnVJ#mi>V9`+9}m*;qV={w$&=MBo-#PeedJ)S!s=_| z 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 D3$X(r diff --git a/docs-source/content/wccontent-domains/appendix/quickstart-deployment-guide.md b/docs-source/content/wccontent-domains/appendix/quickstart-deployment-guide.md index 1dae2a630..7b6969fd1 100644 --- a/docs-source/content/wccontent-domains/appendix/quickstart-deployment-guide.md +++ b/docs-source/content/wccontent-domains/appendix/quickstart-deployment-guide.md @@ -274,8 +274,8 @@ Any time you see `YOUR_USERID` in a command, you should replace it with your act $ export HTTPS_PROXY=http://REPLACE-WITH-YOUR-COMPANY-PROXY-HOST:PORT $ export HTTP_PROXY=http://REPLACE-WITH-YOUR-COMPANY-PROXY-HOST:PORT - ### install kubernetes 1.18.4-1 - $ VERSION=1.18.4-1 + ### install kubernetes 1.23.6-0 + $ VERSION=1.23.6-0 $ yum install -y kubelet-$VERSION kubeadm-$VERSION kubectl-$VERSION --disableexcludes=kubernetes ### enable kubelet service so that it auto-restart on reboot @@ -300,17 +300,25 @@ Any time you see `YOUR_USERID` in a command, you should replace it with your act $ systemctl restart kubelet ``` +1. From Kubernetes version v1.22 onward, `kubeadm` will default `cgroup-driver` to `systemd`. If your Docker is using cgroup driver as `cgroupfs`, set `--cgroup-driver=cgroupfs` for kubelet. + ``` + $ sed -i 's/^KUBELET_EXTRA_ARGS=.*/KUBELET_EXTRA_ARGS="--fail-swap-on=false --cgroup-driver=cgroupfs"/' /etc/sysconfig/kubelet + $ cat /etc/sysconfig/kubelet + ### Reload and restart kubelet + $ systemctl daemon-reload + $ systemctl restart kubelet + ``` #### 1.4 Set up Helm 1. Install Helm v3.x. - a. Download Helm from https://github.com/helm/helm/releases. Example to download Helm v3.2.4: + a. Download Helm from https://github.com/helm/helm/releases. Example to download Helm v3.5.4: ``` - $ wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz + $ wget https://get.helm.sh/helm-v3.5.4-linux-amd64.tar.gz ``` b. Unpack `tar.gz`: ``` - $ tar -zxvf helm-v3.2.4-linux-amd64.tar.gz + $ tar -zxvf helm-v3.5.4-linux-amd64.tar.gz ``` c. Find the Helm binary in the unpacked directory, and move it to its desired destination: ``` @@ -320,7 +328,7 @@ Any time you see `YOUR_USERID` in a command, you should replace it with your act 1. Run `helm version` to verify its installation: ``` $ helm version - version.BuildInfo{Version:"v3.2.4", GitCommit:"0ad800ef43d3b826f31a5ad8dfbb4fe05d143688", GitTreeState:"clean", GoVersion:"go1.13.12"} + version.BuildInfo{Version:"v3.5.4", GitCommit:"1b5edb69df3d3a08df77c9902dc17af864ff05d1", GitTreeState:"clean", GoVersion:"go1.15.11"} ``` ### 2. Set up a single instance Kubernetes cluster @@ -391,7 +399,9 @@ Any time you see `YOUR_USERID` in a command, you should replace it with your act > Note: If you are using a different cidr block than `10.244.0.0/16`, then download and update `kube-flannel.yml` with the correct cidr address before deploying into the cluster: ``` - $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.12.0/Documentation/kube-flannel.yml + $ wget https://raw.githubusercontent.com/flannel-io/flannel/v0.17.0/Documentation/kube-flannel.yml + $ ### Update the CIDR address if you are using a CIDR block other than the default 10.244.0.0/16 + $ kubectl apply -f kube-flannel.yml ``` 1. Verify that the master node is in Ready status: @@ -401,7 +411,7 @@ Any time you see `YOUR_USERID` in a command, you should replace it with your act For example: ``` NAME STATUS ROLES AGE VERSION - mymasternode Ready master 8m26s v1.18.4 + mymasternode Ready master 8m26s v1.23.6 ``` or: ``` @@ -435,18 +445,13 @@ For additional references on Kubernetes cluster setup, check the [cheat sheet](h Follow [these steps]({{< relref "/wccontent-domains/installguide/prepare-your-environment/#set-up-the-code-repository-to-deploy-oracle-webcenter-content-domain" >}}) to set up the source code repository required to deploy Oracle WebCenter Content domains. -#### 3.2 Get required Docker images and add them to your local registry +#### 3.2 Get dependent images and add them to your local registry -Follow [these steps]({{< relref "/wccontent-domains/installguide/prepare-your-environment/#pull-dependent-images" >}}) to set up the source code repository required to deploy Oracle WebCenter Content domains. +Follow [these steps]({{< relref "/wccontent-domains/installguide/prepare-your-environment/#pull-dependent-images" >}}) to pull dependent Docker images required to deploy Oracle WebCenter Content domains. -#### 3.3 Build Oracle WebCenter Content Docker image and add it to your local registry - -Follow [these steps]({{< relref "/wccontent-domains/installguide/prepare-your-environment/#obtain-the-oracle-webcenter-content-docker-image" >}}) to set up the source code repository required to deploy Oracle WebCenter Content domains. - - -> Note: For test and development purposes this Oracle WebCenter Content image need not contain any product patches. - +#### 3.3 Get Oracle WebCenter Content Docker image and add it to your local registry +Follow [these steps]({{< relref "/wccontent-domains/installguide/prepare-your-environment/#obtain-the-oracle-webcenter-content-docker-image" >}}) to obtain Oracle WebCenter Content image. ### 4. Install WebLogic Kubernetes Operator @@ -466,13 +471,13 @@ Follow [these steps]({{< relref "/wccontent-domains/installguide/prepare-your-en Use Helm to install and start WebLogic Kubernetes Operator from the directory you just cloned: ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator - $ helm install weblogic-kubernetes-operator kubernetes/charts/weblogic-operator \ - --namespace opns \ - --set image=oracle/weblogic-kubernetes-operator:3.3.0 \ - --set serviceAccount=op-sa \ - --set "domainNamespaces={}" \ - --wait +$ cd ${WORKDIR} +$ helm install weblogic-kubernetes-operator charts/weblogic-operator \ +--namespace opns \ +--set image=oracle/weblogic-kubernetes-operator:3.4.2 \ +--set serviceAccount=op-sa \ +--set "domainNamespaces={}" \ +--wait ``` #### 4.3 Verify the WebLogic Kubernetes Operator @@ -486,7 +491,7 @@ Use Helm to install and start WebLogic Kubernetes Operator from the directory yo $ kubectl logs -n opns -c weblogic-operator deployments/weblogic-operator ``` -The WebLogic Kubernetes Operator v3.3.0 has been installed. Continue with the load balancer and Oracle WebCenter Content domain setup. +The WebLogic Kubernetes Operator v3.4.2 has been installed. Continue with the load balancer and Oracle WebCenter Content domain setup. ### 5. Install the Traefik (ingress-based) load balancer @@ -506,10 +511,10 @@ This Quick Start demonstrates how to install the Traefik ingress controller to p 1. Install the Traefik operator in the `traefik` namespace with the provided sample values: ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ cd ${WORKDIR} $ helm install traefik traefik/traefik \ --namespace traefik \ - --values kubernetes/samples/scripts/charts/traefik/values.yaml \ + --values charts/traefik/values.yaml \ --set "kubernetes.namespaces={traefik}" \ --set "service.type=NodePort" \ --wait @@ -525,8 +530,8 @@ This Quick Start demonstrates how to install the Traefik ingress controller to p 1. Use Helm to configure the WebLogic Kubernetes Operator to manage Oracle WebCenter Content domains in this namespace: ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator - $ helm upgrade weblogic-kubernetes-operator kubernetes/charts/weblogic-operator \ + $ cd ${WORKDIR} + $ helm upgrade weblogic-kubernetes-operator charts/weblogic-operator \ --reuse-values \ --namespace opns \ --set "domainNamespaces={wccns}" \ @@ -538,8 +543,8 @@ This Quick Start demonstrates how to install the Traefik ingress controller to p a. Create a Kubernetes secret for the domain in the same Kubernetes namespace as the domain. In this example, the username is `weblogic`, the password in `welcome1`, and the namespace is `wccns`: ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-weblogic-domain-credentials - $ ./create-weblogic-credentials.sh \ + $ cd ${WORKDIR}/create-weblogic-domain-credentials + $ ./create-weblogic-credentials.sh \ -u weblogic \ -p welcome1 \ -n wccns \ @@ -557,7 +562,7 @@ This Quick Start demonstrates how to install the Traefik ingress controller to p * Secret name : wccinfra-rcu-credentials ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-rcu-credentials + $ cd ${WORKDIR}/create-rcu-credentials $ ./create-rcu-credentials.sh \ -u WCC1 \ -p Oradoc_db1 \ @@ -594,13 +599,10 @@ This Quick Start demonstrates how to install the Traefik ingress controller to p * namespace: wccns * weblogicDomainStoragePath: /scratch/k8s_dir - ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc - $ cp create-pv-pvc-inputs.yaml create-pv-pvc-inputs.yaml.orig - $ sed -i -e "s:baseName\: weblogic-sample:baseName\: domain:g" create-pv-pvc-inputs.yaml - $ sed -i -e "s:domainUID\::domainUID\: wccinfra:g" create-pv-pvc-inputs.yaml - $ sed -i -e "s:namespace\: default:namespace\: wccns:g" create-pv-pvc-inputs.yaml - $ sed -i -e "s:#weblogicDomainStoragePath\: /scratch/k8s_dir:weblogicDomainStoragePath\: /scratch/k8s_dir:g" create-pv-pvc-inputs.yaml + Review and update if any changes required. + ``` + $ cd ${WORKDIR}/create-weblogic-domain-pv-pvc + $ vim create-pv-pvc-inputs.yaml ``` c. Run the `create-pv-pvc.sh` script to create the PV and PVC configuration files: @@ -625,11 +627,11 @@ Now the environment is ready to start the Oracle WebCenter Content domain creati #### 6.2 Create an Oracle WebCenter Content domain -1. The sample scripts for Oracle WebCenter Content domain deployment are available at `/kubernetes/samples/scripts/create-wcc-domain`. You must edit `create-domain-inputs.yaml` (or a copy of it) to provide the details for your domain. +1. The sample scripts for Oracle WebCenter Content domain deployment are available at `${WORKDIR}/create-wcc-domain/domain-home-on-pv`. You must edit `create-domain-inputs.yaml` (or a copy of it) to provide the details for your domain. 1. Run the `create-domain.sh` script to create a domain: ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-wcc-domain/domain-home-on-pv/ + $ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ $ ./create-domain.sh -i create-domain-inputs.yaml -o output ``` @@ -638,7 +640,7 @@ Now the environment is ready to start the Oracle WebCenter Content domain creati Once the create-domain.sh is successful, it generates the `output/weblogic-domains/wccinfra/domain.yaml` that you can use to create the Kubernetes resource domain, which starts the domain and servers: ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-wcc-domain/domain-home-on-pv + $ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv $ kubectl create -f output/weblogic-domains/wccinfra/domain.yaml ``` @@ -673,11 +675,12 @@ Watch the `wccns` namespace for the status of domain creation: 1. Create an ingress for the domain in the domain namespace by using the sample Helm chart: ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator - $ helm install wcc-traefik-ingress kubernetes/samples/charts/ingress-per-domain \ + $ cd ${WORKDIR} + $ helm install wcc-traefik-ingress charts/ingress-per-domain \ --namespace wccns \ - --values kubernetes/samples/charts/ingress-per-domain/values.yaml \ - --set "traefik.hostname=$(hostname -f)" + --values charts/ingress-per-domain/values.yaml \ + --set "traefik.hostname=$(hostname -f)" \ + --set tls=NONSSL ``` 1. Verify the created ingress per domain details: ``` diff --git a/docs-source/content/wccontent-domains/create-or-update-image/_index.md b/docs-source/content/wccontent-domains/create-or-update-image/_index.md index 5bdc0b70e..ee710583f 100644 --- a/docs-source/content/wccontent-domains/create-or-update-image/_index.md +++ b/docs-source/content/wccontent-domains/create-or-update-image/_index.md @@ -40,7 +40,7 @@ Using the WebLogic Image Tool, you can [create]({{< relref "/wccontent-domains/c Verify that your environment meets the following prerequisites: -* Docker client and daemon on the build machine, with minimum Docker version 18.03.1.ce. +* Docker client and daemon on the build machine, with minimum Docker version 19.03.1. * Bash version 4.0 or later, to enable the command complete feature. * JAVA_HOME environment variable set to the appropriate JDK location. diff --git a/docs-source/content/wccontent-domains/installguide/additional-steps-to-launch-native-binaries/_index.md b/docs-source/content/wccontent-domains/installguide/additional-steps-to-launch-native-binaries/_index.md index ff0a4fc1f..2fe0bb7f2 100644 --- a/docs-source/content/wccontent-domains/installguide/additional-steps-to-launch-native-binaries/_index.md +++ b/docs-source/content/wccontent-domains/installguide/additional-steps-to-launch-native-binaries/_index.md @@ -48,8 +48,8 @@ The arguments required for updating the image can be passed as file to the WebLo '--fromImage' option provides the existing docker image that has to be updated. '--tag' option should be provided with the new tag for the updated image. '--additionalBuildCommands' option should be provided with the above created additional build commands file. - '--chown oracle:root' option should be provided to update file permissions. - + '--chown oracle:root' option should be provided to update file permissions. + Below is a sample build argument (buildArgs) file, to be used for updating the image, diff --git a/docs-source/content/wccontent-domains/installguide/create-wccontent-domains/_index.md b/docs-source/content/wccontent-domains/installguide/create-wccontent-domains/_index.md index 15bd46488..8602cc775 100644 --- a/docs-source/content/wccontent-domains/installguide/create-wccontent-domains/_index.md +++ b/docs-source/content/wccontent-domains/installguide/create-wccontent-domains/_index.md @@ -8,6 +8,20 @@ description = "Create Oracle WebCenter Content domain home on an existing PV or The WebCenter Content deployment scripts demonstrate the creation of Oracle WebCenter Content domain home on an existing Kubernetes persistent volume (PV) and persistent volume claim (PVC). The scripts also generate the domain YAML file, which can then be used to start the Kubernetes artifacts of the corresponding domain. +#### Contents +* [Prerequisites](#prerequisites) +* [Prepare to use the create domain script](#prepare-to-use-the-create-domain-script) +* [Configuration parameters](#configuration-parameters) +* [Run the create domain script](#run-the-create-domain-script) +* [Run the managed-server-wrapper script](#run-the-managed-server-wrapper-script) +* [Verify the results](#verify-the-results) +* [Verify the domain](#verify-the-domain) +* [Verify the pods](#verify-the-pods) +* [Verify the services](#verify-the-services) +* [Scale-up/down Managed Server Counts](#scale-updown-managed-server-counts) +* [Details required for configuring IBR provider on UCM](#details-required-for-configuring-ibr-provider-on-ucm) +* [Configure an additional mount or shared space to a domain for Imaging and Capture](#configure-an-additional-mount-or-shared-space-to-a-domain-for-imaging-and-capture) + #### Prerequisites Before you begin, complete the following steps: @@ -20,9 +34,9 @@ Before you begin, complete the following steps: #### Prepare to use the create domain script -The sample scripts for Oracle WebCenter Content domain deployment are available at `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-wcc-domain`. +The sample scripts for Oracle WebCenter Content domain deployment are available at `${WORKDIR}/create-wcc-domain`. -You must edit `create-domain-inputs.yaml` (or a copy of it) located under `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-wcc-domain/domian-home-on-pv` to provide the details for your domain. +You must edit `create-domain-inputs.yaml` (or a copy of it) located under `${WORKDIR}/create-wcc-domain/domian-home-on-pv` to provide the details for your domain. Refer to the configuration parameters below to understand the information that you must provide in this file. @@ -50,7 +64,7 @@ The following parameters can be provided in the inputs file. | `imagePullPolicy` | WebLogic Docker image pull policy. Legal values are `IfNotPresent`, `Always`, or `Never`. | `IfNotPresent` | | `imagePullSecretName` | Name of the Kubernetes secret to access the Docker Store to pull the WebLogic Server Docker image. The presence of the secret will be validated when this parameter is specified. | | | `includeServerOutInPodLog` | Boolean indicating whether to include the server .out to the pod's stdout. | `true` | -| `initialManagedServerReplicas` | Number of Managed Servers to initially start for the domain. | `3` | +| `initialManagedServerReplicas` | Number of UCM Managed Servers to initially start for the domain. | `3` | | `javaOptions` | Java options for starting the Administration Server and Managed Servers. A Java option can have references to one or more of the following pre-defined variables to obtain WebLogic domain information: `$(DOMAIN_NAME)`, `$(DOMAIN_HOME)`, `$(ADMIN_NAME)`, `$(ADMIN_PORT)`, and `$(SERVER_NAME)`. If `sslEnabled` is set to `true` and the WebLogic demo certificate is used, add `-Dweblogic.security.SSL.ignoreHostnameVerification=true` to allow the Managed Servers to connect to the Administration Server while booting up. The WebLogic generated demo certificate in this environment typically contains a host name that is different from the runtime container's host name. | `-Dweblogic.StdoutDebugEnabled=false` | | `logHome` | The in-pod location for the domain log, server logs, server out, and Node Manager log files. If not specified, the value is derived from the `domainUID` as `/shared/logs/`. | `/u01/oracle/user_projects/domains/logs/wccinfra` | | `managedServerNameBase` | Base string used to generate Managed Server names. | `ucm_server` | @@ -71,6 +85,9 @@ The following parameters can be provided in the inputs file. | `ipmEnabled` | Boolean indicating whether to enable WebCenter Imaging application | `false` | | `captureEnabled` | Boolean indicating whether to enable WebCenter Capture application | `false` | | `adfuiEnabled` | Boolean indicating whether to enable WebCenter ADF UI application | `false` | +| `initialIpmServerReplicas` | Number of IPM Managed Servers to initially start for the domain. | `0` | +| `initialCaptureServerReplicas` | Number of CAPTURE Managed Servers to initially start for the domain. | `0` | +| `initialAdfuiServerReplicas` | Number of ADFUI Managed Servers to initially start for the domain. | `0` | Note that the names of the Kubernetes resources in the generated YAML files may be formed with the value of some of the properties specified in the `create-inputs.yaml` file. Those properties include @@ -80,6 +97,8 @@ valid values in the generated YAML files. For example, an uppercase letter is co lowercase letter and an underscore `("_")` is converted to a hyphen `("-")`. >Note: The properties ipmEnabled, captureEnabled, adfuiEnabled are set to `false` by default and should be updated to `true` if you need to enable the respective applications. + If any of those three applications (IPM, CAPTURE & ADFUI) are enabled, respective initial replica count must be a non-zero number. + The sample demonstrates how to create the Oracle WebCenter Content domain home and associated Kubernetes resources for that domain. In addition, the sample provides the capability for users to supply their own scripts @@ -91,7 +110,7 @@ Run the create domain script, specifying your inputs file and an output director generated artifacts: ``` -$ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-wcc-domain/domain-home-on-pv/ +$ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ $ ./create-domain.sh \ -i create-domain-inputs.yaml \ @@ -108,21 +127,50 @@ The script will perform the following steps: * Run and wait for the job to finish. * Create a Kubernetes domain YAML file, `domain.yaml`, in the "output" directory that was created above. This YAML file can be used to create the Kubernetes resource using the `kubectl create -f` - or `kubectl apply -f` command. -* Run `managed-server-wrapper` script, which intrenally applies the domain YAML. This script also applies initial - configurations for Managed Server containers and readies Managed Servers for future inter-container communications. + or `kubectl apply -f` command. +* Create a convenient utility script, `delete-domain-job.yaml`, to clean up the domain home + created by the create script. - ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-wcc-domain/domain-home-on-pv/ +#### Run the managed-server-wrapper script - $ ./start-managed-servers-wrapper.sh -o -p - ``` +Run `managed-server-wrapper` script, which internally applies the domain YAML. This script also applies initial configurations for Managed Server containers and readies Managed Servers for future inter-container communications. -* Create a convenient utility script, `delete-domain-job.yaml`, to clean up the domain home - created by the create script. +``` +$ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ + +$ ./start-managed-servers-wrapper.sh -o -p -n -m +``` + +> Note: In the above command, parameters `-n` and `-m` refers to the node-ports to be used for exposing `IBR intradoc port` and `UCM intradoc port` respectively. + Suggested values for both these node-ports should be within a range of 30000-32767. + Please keep in mind that `` value must be specified at all time, whereas `` value is only required when IPM and ADFUI Managed Servers are enabled. + +#### Run the startup configuration scripts for IPM and WCCADF applications as applicable +Run the script configure-ipm-connection.sh to do startup configurations if IPM is enabled. + +``` +$ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ +$ ./configure-ipm-connection.sh -l -p +``` +Run the script configure-wccadf-domain.sh to do startup configurations if ADFUI is enabled. + +``` +$ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ +$ ./configure-wccadf-domain.sh -n + +``` +Patch the domain for the changes to be applied to the domain. + +``` +#STOP +$ kubectl patch domain DOMAINUID -n NAMESPACE --type='json' -p='[{"op": "replace", "path": "/spec/serverStartPolicy", "value": "NEVER" }]' +$ sleep 2m +#START +$ kubectl patch domain DOMAINUID -n NAMESPACE --type='json' -p='[{"op": "replace", "path": "/spec/serverStartPolicy", "value": "IF_NEEDED" }]' +``` The default domain created by the script has the following characteristics: * An Administration Server named `AdminServer` listening on port `7001`. @@ -810,7 +858,8 @@ $ kubectl get services -n wccns NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE wccinfra-adminserver ClusterIP None 7001/TCP 9d wccinfra-adminserver-external NodePort 10.104.100.193 7001:30701/TCP 9d -wccinfra-cluster-ibr-cluster ClusterIP 10.98.100.212 16250/TCP 114s +wccinfra-cluster-ibr-cluster ClusterIP 10.98.100.212 16250/TCP 9d +wccinfra-cluster-ibr-cluster-ext NodePort 10.109.247.52 5555:30555/TCP 9d wccinfra-cluster-ucm-cluster ClusterIP 10.108.47.178 16200/TCP 9d wccinfra-cluster-ipm-cluster ClusterIP 10.108.217.111 16000/TCP 9d wccinfra-cluster-capture-cluster ClusterIP 10.110.193.252 16400/TCP 9d @@ -843,6 +892,41 @@ wccinfra-wccadf-server5 ClusterIP 10.105.114.38 ``` {{% /expand %}} +#### Scale-up/down Managed Server Counts + +For an existing domain, these managed-server replica counts can be modified, independent of each other, by modifying the domain.yaml (to be handled by the customers with sufficient access). To scale up or scale down managed server counts in an existing domain, the following steps need to be performed. + +```bash +$ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/output/weblogic-domains/wccinfra/ + +# modify respective managed server replicas to scale up or scale down and save it. +$ vim domain.yaml + +# Apply the updated domain.yaml configuration file +$ kubectl apply -f domain.yaml +``` + +#### Details required for configuring IBR provider on UCM + +1. Obtain details for service `wccinfra-cluster-ibr-cluster-ext` for the NodePort mapped to IBR intradoc port + + ``` + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) + wccinfra-cluster-ibr-cluster-ext NodePort 10.109.247.52 5555:30555/TCP + ``` + +2. Create the outgoing provider by providing following details and restart the servers. + + Please provide the NodePort value (in the above sample - 30555), as `Server Port`. + + ```yaml + Server Host Name: + + Server Port: 30555 + ``` + ![wcc-provider-ucm-ibr](images/wcc-provider-ucm-ibr.png) + + #### Configure an additional mount or shared space to a domain for Imaging and Capture Optionally, if you want to configure an additional mount or shared space to a domain, for WebCenter Imaging and WebCenter Capture applications for file imports, refer to the [Configure an Additional Mount or Shared-Space to a Domain for Imaging and Capture]({{< relref "/wccontent-domains/adminguide/configure-mount-share.md" >}}). diff --git a/docs-source/content/wccontent-domains/installguide/create-wccontent-domains/images/wcc-provider-ucm-ibr.png b/docs-source/content/wccontent-domains/installguide/create-wccontent-domains/images/wcc-provider-ucm-ibr.png new file mode 100644 index 0000000000000000000000000000000000000000..561e9402fd6d18e61af08103b922798ed859f372 GIT binary patch literal 165685 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�hPmh`{jxzI(;$fPji605f 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 *rD)!IxR_n7K!%A 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 Ys`c-he1Crs4qfY20~7s{OHNV$2mY@=y#N3J literal 0 HcmV?d00001 diff --git a/docs-source/content/wccontent-domains/installguide/prepare-your-environment/_index.md b/docs-source/content/wccontent-domains/installguide/prepare-your-environment/_index.md index 4fab392cc..70e2ee722 100644 --- a/docs-source/content/wccontent-domains/installguide/prepare-your-environment/_index.md +++ b/docs-source/content/wccontent-domains/installguide/prepare-your-environment/_index.md @@ -58,13 +58,13 @@ This step is required once at every node to get access to the Oracle Container R WebLogic Kubernetes Operator image: ```bash -$ docker pull container-registry.oracle.com/middleware/weblogic-kubernetes-operator:3.3.0 -$ docker tag container-registry.oracle.com/middleware/weblogic-kubernetes-operator:3.3.0 oracle/weblogic-kubernetes-operator:3.3.0 +$ docker pull container-registry.oracle.com/middleware/weblogic-kubernetes-operator:3.4.2 +$ docker tag container-registry.oracle.com/middleware/weblogic-kubernetes-operator:3.4.2 oracle/weblogic-kubernetes-operator:3.4.2 ``` Pull Traefik Image ```bash -$ docker pull traefik:2.2.8 +$ docker pull traefik:2.6.0 ``` ### Set up the code repository to deploy Oracle WebCenter Content domain @@ -73,73 +73,87 @@ Oracle WebCenter Content domain deployment on Kubernetes leverages the WebLogic 1. Create a working directory to set up the source code: ```bash - $ export WORKDIR=$HOME/wcc_3.3.0 - $ mkdir ${WORKDIR} + $ mkdir $HOME/wcc_3.4.2 + $ cd $HOME/wcc_3.4.2 ``` - -1. Download the supported version of the WebLogic Kubernetes Operator source code from WebLogic Kubernetes Operator github project. Currently the supported WebLogic Kubernetes Operator version is [3.3.0](https://github.com/oracle/weblogic-kubernetes-operator/releases/tag/v3.3.0): - - ``` bash - $ git clone https://github.com/oracle/weblogic-kubernetes-operator.git --branch v3.3.0 - ``` -1. Download the Oracle WebCenter Content Kubernetes deployment scripts from the WCC [repository](https://github.com/oracle/fmw-kubernetes.git) and copy them to the WebLogic Kubernetes Operator samples location: +1. Download the WebLogic Kubernetes Operator source code and Oracle WebCenter Content Suite Kubernetes deployment scripts from the WebCenter Content [repository](https://github.com/oracle/fmw-kubernetes.git). Required artifacts are available at `OracleWebCenterContent/kubernetes`. ``` bash $ git clone https://github.com/oracle/fmw-kubernetes.git - - $ cp -rf ${WORKDIR}/fmw-kubernetes/OracleWebCenterContent/kubernetes/create-wcc-domain ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/ - - $ cp -rf ${WORKDIR}/fmw-kubernetes/OracleWebCenterContent/kubernetes/ingress-per-domain ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ - - $ cp -rf ${WORKDIR}/fmw-kubernetes/OracleWebCenterContent/kubernetes/charts ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/ - - $ cp -rf ${WORKDIR}/fmw-kubernetes/OracleWebCenterContent/kubernetes/imagetool-scripts ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/ - ``` + $ export WORKDIR=$HOME/wcc_3.4.2/fmw-kubernetes/OracleWebCenterContent/kubernetes + ``` ### Obtain the Oracle WebCenter Content Docker image +Obtain the Oracle WebCenter Content image using any one of the options. + +1 Get Oracle WebCenter Content image from `My Oracle Support (MOS)` + +2 Get Oracle WebCenter Content image from `Oracle Container Registry (OCR)` + +3 Build Oracle WebCenter Content Container image + +#### 1. Get Oracle WebCenter Content image from My Oracle Support (MOS): The Oracle WebCenter Content image with latest bundle patch and required interim patches can be obtained from My Oracle Support (MOS). This is the only image supported for production deployments. Follow the below steps to download the Oracle WebCenter Content image from My Oracle Support. -1. Download patch [34192566](https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=34192566) from My Oracle Support (MOS). +1. Download patch [34409720](https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=34409720) from My Oracle Support (MOS). 1. Unzip the downloaded patch zip file. For example: ```bash - $ unzip p34192566_122140_Linux-x86-64.zip + $ unzip p34409720_122140_Linux-x86-64.zip # sample output - Archive: p34192566_122140_Linux-x86-64.zip - inflating: wccontent-12.2.1.4-jdk8-ol7-220519.2037.tar + Archive: p34409720_122140_Linux-x86-64.zip + inflating: wccontent-12.2.1.4-jdk8-ol7-220721.1014.tar inflating: README.html ``` 1. Load the image archive using the `docker load` command. For example: ```bash - $ docker load < wccontent-12.2.1.4-jdk8-ol7-220519.2037.tar + $ docker load < wccontent-12.2.1.4-jdk8-ol7-220721.1014.tar ``` {{%expand "Click here to see sample output" %}} ``` - d0df970fe76a: Loading layer [==================================================>] 138.3MB/138.3MB - 3b64a4bdc552: Loading layer [==================================================>] 13.45MB/13.45MB - ee5141cc5c13: Loading layer [==================================================>] 20.99kB/20.99kB - 51f637dc720f: Loading layer [==================================================>] 334MB/334MB - ffc8b247ad07: Loading layer [==================================================>] 3.98GB/3.98GB - cd87862f5c14: Loading layer [==================================================>] 4.608kB/4.608kB - 12661fb5186c: Loading layer [==================================================>] 137.2kB/137.2kB - f84db83c8dfa: Loading layer [==================================================>] 69.12kB/69.12kB - Loaded image: oracle/wccontent:12.2.1.4-jdk8-ol7-220519.2037 + 9ba403017e5e: Loading layer [==================================================>] 139.7MB/139.7MB + d8b11c461bec: Loading layer [==================================================>] 10.97MB/10.97MB + f4a30ae83f54: Loading layer [==================================================>] 20.99kB/20.99kB + 8c8c62aea489: Loading layer [==================================================>] 344.3MB/344.3MB + 2aaff97723b2: Loading layer [==================================================>] 4.084GB/4.084GB + 13861e24e5de: Loading layer [==================================================>] 4.608kB/4.608kB + fb87a672a557: Loading layer [==================================================>] 138.2kB/138.2kB + 67c9ad2fbf79: Loading layer [==================================================>] 70.14kB/70.14kB + Loaded image: oracle/wccontent:12.2.1.4-jdk8-ol7-220721.1014 ``` {{% /expand %}} -1. Run the `docker inspect` command to verify that the downloaded image is the latest released image. The value of label `com.oracle.weblogic.imagetool.buildid` must match to `f83a7f6c-b564-4367-93e3-f809371dfa79`. +1. Run the `docker inspect` command to verify that the downloaded image is the latest released image. The value of label `com.oracle.weblogic.imagetool.buildid` must match to `38be8314-7315-4cc8-95a1-0b4970b2b92c`. For example: ```bash - $ docker inspect --format='{{ index .Config.Labels "com.oracle.weblogic.imagetool.buildid" }}' oracle/wccontent:12.2.1.4-jdk8-ol7-220519.2037 - f83a7f6c-b564-4367-93e3-f809371dfa79 + $ docker inspect --format='{{ index .Config.Labels "com.oracle.weblogic.imagetool.buildid" }}' oracle/wccontent:12.2.1.4-jdk8-ol7-220721.1014 + 38be8314-7315-4cc8-95a1-0b4970b2b92c + ``` + +#### 2. Get Oracle WebCenter Content image from the Oracle Container Registry (OCR): +For first time users, to pull an image from the Oracle Container Registry, navigate to https://container-registry.oracle.com and log in using the Oracle Single Sign-On (SSO) authentication service. If you do not already have SSO credentials, you can create an Oracle Account using: + https://profile.oracle.com/myprofile/account/create-account.jspx. + +Use the web interface to accept the Oracle Standard Terms and Restrictions for the Oracle software images that you intend to deploy. Your acceptance of these terms are stored in a database that links the software images to your Oracle Single Sign-On login credentials. + +To obtain the image, log in to the Oracle Container Registry: + + ```bash + $ docker login container-registry.oracle.com ``` +Find and then pull the prebuilt Oracle WebCenter Content Suite image 12.2.1.4: + ```bash + $ docker pull container-registry.oracle.com/middleware/webcenter-content_cpu:12.2.1.4-jdk8-ol7-220721 + ``` + +#### 3. Build Oracle WebCenter Content Container image : Alternatively, if you want to build and use Oracle WebCenter Content Container image, using WebLogic Image Tool, with any additional bundle patch or interim patches, then follow these [steps]({{< relref "/wccontent-domains/create-or-update-image/#create-or-update-an-oracle-webcenter-content-docker-image-using-the-weblogic-image-tool" >}}) to create the image. > Note: The default Oracle WebCenter Content image name used for Oracle WebCenter Content domain deployment is `oracle/wccontent:12.2.1.4.0`. The image created must be tagged as `oracle/wccontent:12.2.1.4.0` using the `docker tag` command. If you want to use a different name for the image, make sure to update the new image tag name in the `create-domain-inputs.yaml` file and also in other instances where the `oracle/wccontent:12.2.1.4.0` image name is used. @@ -147,8 +161,8 @@ Alternatively, if you want to build and use Oracle WebCenter Content Container i ### Install the WebLogic Kubernetes Operator -The WebLogic Kubernetes Operator supports the deployment of Oracle WebCenter Content domain in the Kubernetes environment. Follow the steps in [this document](https://github.com/oracle/weblogic-kubernetes-operator/blob/v3.3.0/documentation/3.3/content/quickstart/install.md) to install WebLogic Kubernetes Operator. -> Note: Optionally, you can execute these [steps](https://oracle.github.io/weblogic-kubernetes-operator/samples/simple/elastic-stack/operator/) to send the contents of the operator’s logs to Elasticsearch. +The WebLogic Kubernetes Operator supports the deployment of Oracle WebCenter Content domain in the Kubernetes environment. Follow the steps in [this document](https://github.com/oracle/weblogic-kubernetes-operator/blob/v3.4.2/documentation/3.4/content/quickstart/install.md) to install WebLogic Kubernetes Operator. +> Note: Optionally, you can execute these [steps](https://oracle.github.io/weblogic-kubernetes-operator/samples/elastic-stack/operator/) to send the contents of the operator’s logs to Elasticsearch. In the following example commands to install the WebLogic Kubernetes Operator, `opns` is the namespace and `op-sa` is the service account created for WebLogic Kubernetes Operator: @@ -156,14 +170,13 @@ In the following example commands to install the WebLogic Kubernetes Operator, ` ``` $ kubectl create namespace opns - $ kubectl create serviceaccount -n opns op-sa - + $ kubectl create serviceaccount -n opns op-sa ``` ### Install WebLogic Kubernetes Operator ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ cd ${WORKDIR} - $ helm install weblogic-kubernetes-operator kubernetes/charts/weblogic-operator --namespace opns --set image=oracle/weblogic-kubernetes-operator:3.3.0 --set serviceAccount=op-sa --set "domainNamespaces={}" --set "javaLoggingLevel=FINE" --wait + $ helm install weblogic-kubernetes-operator charts/weblogic-operator --namespace opns --set image=oracle/weblogic-kubernetes-operator:3.4.2 --set serviceAccount=op-sa --set "domainNamespaces={}" --set "javaLoggingLevel=FINE" --wait ``` ### Prepare the environment for Oracle WebCenter Content domain @@ -176,27 +189,31 @@ For details, see [Prepare to run a domain](https://oracle.github.io/weblogic-kub ``` $ kubectl create namespace wccns - $ cd ${WORKDIR}/weblogic-kubernetes-operator - $ helm upgrade --reuse-values --namespace opns --set "domainNamespaces={wccns}" --wait weblogic-kubernetes-operator kubernetes/charts/weblogic-operator - + $ cd ${WORKDIR} + $ helm upgrade --reuse-values --namespace opns --set "domainNamespaces={wccns}" --wait weblogic-kubernetes-operator charts/weblogic-operator ``` #### Create a persistent storage for the Oracle WebCenter Content domain - In the Kubernetes namespace you created, create the PV and PVC for the domain by running the [create-pv-pvc.sh](https://oracle.github.io/weblogic-kubernetes-operator/samples/simple/storage/) script. Follow the instructions for using the script to create a dedicated PV and PVC for the Oracle WebCenter Content domain. + In the Kubernetes namespace you created, create the PV and PVC for the domain by running the [create-pv-pvc.sh](https://oracle.github.io/weblogic-kubernetes-operator/samples/storage/) script. Follow the instructions for using the script to create a dedicated PV and PVC for the Oracle WebCenter Content domain. - * Review the configuration parameters for PV creation [here](https://oracle.github.io/weblogic-kubernetes-operator/samples/simple/storage/#configuration-parameters). Based on your requirements, update the values in the `create-pv-pvc-inputs.yaml` file located at `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc/`. Sample configuration parameter values for the Oracle WebCenter Content domain are: + * Review the configuration parameters for PV creation [here](https://oracle.github.io/weblogic-kubernetes-operator/samples/storage/#configuration-parameters). Based on your requirements, update the values in the `create-pv-pvc-inputs.yaml` file located at `${WORKDIR}/create-weblogic-domain-pv-pvc/`. Sample configuration parameter values for the Oracle WebCenter Content domain are: * `baseName`: domain * `domainUID`: wccinfra * `namespace`: wccns * `weblogicDomainStorageType`: HOST_PATH * `weblogicDomainStoragePath`: /net//scratch/k8s_dir/wcc + > Note: Alternatively, you can use `NFS` as the value of `weblogicDomainStorageType` if you choose to use an NFS server for the persistent storage. + + * Ensure that the path for the `weblogicDomainStoragePath` property exists and have the ownership for 1000:0. If not, you need to create it as follows: + ``` + $ sudo mkdir /scratch/k8s_dir/wcc + $ sudo chown -R 1000:0 /scratch/k8s_dir/wcc - * Ensure that the path for the `weblogicDomainStoragePath` property exists (if not, please refer subsection 4 of [this](https://oracle.github.io/fmw-kubernetes/wccontent-domains/appendix/quickstart-deployment-guide/#61-prepare-for-an-oracle-webcenter-content-domain) document to create it first) and - has full access permissions, and that the folder is empty. + ``` * Run the `create-pv-pvc.sh` script: ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-weblogic-domain-pv-pvc + $ cd ${WORKDIR}/create-weblogic-domain-pv-pvc $ rm -rf output/ $ ./create-pv-pvc.sh -i create-pv-pvc-inputs.yaml -o output @@ -219,12 +236,12 @@ For details, see [Prepare to run a domain](https://oracle.github.io/weblogic-kub Create the Kubernetes secrets `username` and `password` of the administrative account in the same Kubernetes namespace as the domain: ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-weblogic-domain-credentials + $ cd ${WORKDIR}/create-weblogic-domain-credentials $ ./create-weblogic-credentials.sh -u weblogic -p welcome1 -n wccns -d wccinfra -s wccinfra-domain-credentials ``` - For more details, see [this document](https://github.com/oracle/weblogic-kubernetes-operator/blob/v3.3.0/kubernetes/samples/scripts/create-weblogic-domain-credentials/README.md). + For more details, see [this document](https://github.com/oracle/weblogic-kubernetes-operator/blob/v3.4.2/kubernetes/samples/scripts/create-weblogic-domain-credentials/README.md). You can check the secret with the `kubectl get secret` command. @@ -279,7 +296,7 @@ from this secret. Use the provided sample script to create the secret: ```bash -$ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-rcu-credentials +$ cd ${WORKDIR}/create-rcu-credentials $ ./create-rcu-credentials.sh -u weblogic -p welcome1 -a sys -q welcome1 -d wccinfra -n wccns -s wccinfra-rcu-credentials @@ -347,10 +364,10 @@ type: Opaque Run a container to create `rcu pod` ```bash - kubectl run rcu --generator=run-pod/v1 --image oracle/wccontent:12.2.1.4 -n wccns -- sleep infinity +$ kubectl run rcu --image oracle/wccontent:12.2.1.4 -n wccns -- sleep infinity - #check the status of rcu pod - kubectl get pods -n wccns +#check the status of rcu pod +$ kubectl get pods -n wccns ``` #### Run the Repository Creation Utility to set up your database schemas @@ -362,24 +379,25 @@ To create the database schemas for Oracle WebCenter Content, run the `create-rcu For example: ```bash - # make sure rcu pod status is running before executing this - kubectl exec -n wccns -ti rcu /bin/bash - - # DB details - export CONNECTION_STRING=your_db_host:1521/your_db_service - export RCUPREFIX=your_schema_prefix - echo -e welcome1"\n"welcome1> /tmp/pwd.txt - - # Create schemas - /u01/oracle/oracle_common/bin/rcu -silent -createRepository -databaseType ORACLE -connectString $CONNECTION_STRING -dbUser sys -dbRole sysdba -useSamePasswordForAllSchemaUsers true -selectDependentsForComponents true -schemaPrefix $RCUPREFIX -component CONTENT -component MDS -component STB -component OPSS -component IAU -component IAU_APPEND -component IAU_VIEWER -component WLS -tablespace USERS -tempTablespace TEMP -f < /tmp/pwd.txt +# make sure rcu pod status is running before executing this +kubectl exec -n wccns -ti rcu /bin/bash + +# DB details +export CONNECTION_STRING=your_db_host:1521/your_db_service +export RCUPREFIX=your_schema_prefix +echo -e welcome1"\n"welcome1> /tmp/pwd.txt - # Drop schemas - /u01/oracle/oracle_common/bin/rcu -silent -dropRepository -databaseType ORACLE -connectString $CONNECTION_STRING -dbUser sys -dbRole sysdba -selectDependentsForComponents true -schemaPrefix $RCUPREFIX -component CONTENT -component MDS -component STB -component OPSS -component IAU -component IAU_APPEND -component IAU_VIEWER -component WLS -f < /tmp/pwd.txt +# Create schemas +/u01/oracle/oracle_common/bin/rcu -silent -createRepository -databaseType ORACLE -connectString $CONNECTION_STRING -dbUser sys -dbRole sysdba -useSamePasswordForAllSchemaUsers true -selectDependentsForComponents true -schemaPrefix $RCUPREFIX -component CONTENT -component MDS -component STB -component OPSS -component IAU -component IAU_APPEND -component IAU_VIEWER -component WLS -tablespace USERS -tempTablespace TEMP -f < /tmp/pwd.txt - #exit from the container - exit +# Drop schemas +/u01/oracle/oracle_common/bin/rcu -silent -dropRepository -databaseType ORACLE -connectString $CONNECTION_STRING -dbUser sys -dbRole sysdba -selectDependentsForComponents true -schemaPrefix $RCUPREFIX -component CONTENT -component MDS -component STB -component OPSS -component IAU -component IAU_APPEND -component IAU_VIEWER -component WLS -f < /tmp/pwd.txt + +#exit from the container +exit ``` +> Note: In the create and drop schema commands above, pass additional components ( -component IPM -component CAPTURE ) if IPM and CAPTURE applications are enabled respectively. ### Create Oracle WebCenter Content domain diff --git a/docs-source/content/wccontent-domains/installguide/prerequisites/_index.md b/docs-source/content/wccontent-domains/installguide/prerequisites/_index.md index 03cced17b..ed734aaf8 100644 --- a/docs-source/content/wccontent-domains/installguide/prerequisites/_index.md +++ b/docs-source/content/wccontent-domains/installguide/prerequisites/_index.md @@ -10,15 +10,15 @@ This section provides information about the system requirements and limitations ### System requirements for Oracle WebCenter Content domains -For the current production release 22.2.3: +For the current production release 22.4.1: * Oracle Linux 7 (UL6+) and Red Hat Enterprise Linux 7 (UL3+ only with standalone Kubernetes) are supported. -* Supported Kubernetes versions are: 1.16.15+, 1.17.13+ and 1.18.10+ (check with `kubectl version`). -* Docker 18.09.1ce, 19.03.1 (check with `docker version`) or CRI-O 1.14.7 (check with `crictl version | grep RuntimeVersion`). -* Flannel networking v0.12.0-amd64 or later (check with `docker images | grep flannel`). -* Helm 3.4.1 (check with `helm version --client --short`). -* Oracle WebLogic Kubernetes Operator 3.3.0 (see [WebLogic Kubernetes Operator releases](https://github.com/oracle/weblogic-kubernetes-operator/releases) page). -* Oracle WebCenter Content 12.2.1.4 Docker image downloaded from My Oracle Support (MOS patch [34192566](https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=34192566)). This image contains the latest bundle patch and one-off patches for Oracle WebCenter Content. +* Supported Kubernetes versions are: 1.19.15+, 1.20.11+, 1.21.5+, 1.22.5+ and 1.23.4+ (check with `kubectl version`). +* Docker 19.03.1+ (check with `docker version`). +* Flannel networking v0.13.0-amd64 or later (check with `docker images | grep flannel`). +* Helm 3.3.4+ (check with `helm version --client --short`). +* Oracle WebLogic Kubernetes Operator 3.4.2 (see [WebLogic Kubernetes Operator releases](https://github.com/oracle/weblogic-kubernetes-operator/releases) page). +* Oracle WebCenter Content 12.2.1.4 Docker image downloaded from My Oracle Support (MOS patch [34409720](https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=34409720)). This image contains the latest bundle patch and one-off patches for Oracle WebCenter Content. * You must have the `cluster-admin` role to install WebLogic Kubernetes Operator. The WebLogic Kubernetes Operator does not need the `cluster-admin` role at runtime. * We do not currently support running Oracle WebCenter Content in non-Linux containers. * Additionally, see the Oracle WebCenter Content [documentation](https://docs.oracle.com/en/middleware/fusion-middleware/12.2.1.4/inecm/preparing-install-and-configure-product.html#GUID-16F78BFD-4095-45EE-9C3B-DB49AD5CBAAD) for other requirements such as database version. diff --git a/docs-source/content/wccontent-domains/oracle-cloud/_index.md b/docs-source/content/wccontent-domains/oracle-cloud/_index.md index 8c6fe9d12..0f0d273e6 100644 --- a/docs-source/content/wccontent-domains/oracle-cloud/_index.md +++ b/docs-source/content/wccontent-domains/oracle-cloud/_index.md @@ -7,6 +7,6 @@ pre = "7. " This is a guide to run WebLogic Kubernetes Operator managed WebCenter Content domain on Oracle Cloud Infrastructure. -This section of the documentation is certified for WebLogic Kubernetes Operator version 3.3.0 and Oracle WebCenter Content 12.2.1.4 May'22 PSU (container image for this release can be downloaded from My Oracle Support MOS patch [34192566](https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=34192566)). +This section of the documentation is certified for Kubernetes version 1.23.4+, WebLogic Kubernetes Operator version 3.4.2 and Oracle WebCenter Content 12.2.1.4 July'22 PSU (container image for this release can be downloaded from My Oracle Support MOS patch [34409720](https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=34409720)). {{% children style="h4" description="true" %}} diff --git a/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/_index.md b/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/_index.md index 4da04e8f4..b3f2fa6de 100644 --- a/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/_index.md +++ b/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/_index.md @@ -7,7 +7,7 @@ pre: "3. " description: "Configure different load balancers for Oracle WebCenter Content domains." --- -WebLogic Kubernetes Operator supports ingress-based load balancers such as Traefik. +WebLogic Kubernetes Operator managed Oracle WebCenter Content domain on Oracle Cloud Infrastructure supports ingress-based load balancers such as Traefik and NGINX. {{% children style="h4" description="true" %}} diff --git a/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/nginx.md b/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/nginx.md new file mode 100644 index 000000000..a0a2ff010 --- /dev/null +++ b/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/nginx.md @@ -0,0 +1,510 @@ +--- +title: "NGINX" +date: 2020-12-22T15:44:42-05:00 +draft: false +weight: 2 +pre: "b. " +description: "Configure the ingress-based NGINX load balancer for Oracle WebCenter Content domain." +--- + +This section provides information about how to install and configure the ingress-based *NGINX* load balancer to load balance Oracle WebCenter Content domain clusters. You can configure NGINX for non-SSL, SSL termination, and end-to-end SSL access of the application URL. + + +Follow these steps to set up NGINX as a load balancer for an Oracle WebCenter Content domain in a Kubernetes cluster: + + See the official [installation document](https://github.com/kubernetes/ingress-nginx/tree/master/charts/ingress-nginx#prerequisites) for prerequisites. + +#### Contents +* [ Non-SSL and SSL termination](#non-ssl-and-ssl-termination) + 1. [Install the NGINX load balancer](#install-the-nginx-load-balancer) + 2. [Configure NGINX to manage ingresses](#configure-nginx-to-manage-ingresses) + 3. [Create a certificate and generate a Kubernetes secret](#create-a-certificate-and-generate-a-kubernetes-secret) + 4. [Install Ingress for SSL termination configuration](#install-ingress-for-ssl-termination-configuration) + +* [ End-to-End SSL configuration](#end-to-end-ssl-configuration) + 1. [Install the NGINX load balancer for end-to-end SSL](#install-the-nginx-load-balancer-for-end-to-end-ssl) + 2. [Deploy tls to access individual Managed Servers](#deploy-tls-to-access-individual-managed-servers) + 3. [Deploy tls to access Administration Server](#deploy-tls-to-access-administration-server) + 4. [Uninstall ingress-nginx tls](#uninstall-ingress-nginx-tls) + +* [ Create Oracle WebCenter Content domain](#create-oracle-webcenter-content-domain) + +* [ Verify domain application URL access](#verify-domain-application-url-access) + 1. [Verify Non-SSL access](#verify-non-ssl-access) + 1. [Verify SSL termination and end-to-end SSL access](#verify-ssl-termination-and-end-to-end-ssl-access) + +* [ Uninstall the NGINX](#uninstall-the-nginx) + + To get repository information, enter the following Helm commands: + + ```bash + $ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx + $ helm repo update + ``` +### Non-SSL and SSL termination + +#### Install the NGINX load balancer + +1. Deploy the `ingress-nginx` controller by using Helm on the domain namespace: + + ```bash + $ helm install nginx-ingress -n wccns \ + --set controller.service.type=LoadBalancer \ + --set controller.admissionWebhooks.enabled=false \ + ingress-nginx/ingress-nginx + ``` + + {{%expand "Click here to see the sample output." %}} +```bash +NAME: nginx-ingress +LAST DEPLOYED: Fri Jul 29 00:14:19 2022 +NAMESPACE: wccns +STATUS: deployed +REVISION: 1 +TEST SUITE: None +NOTES: +The ingress-nginx controller has been installed. +Get the application URL by running these commands: + export HTTP_NODE_PORT=$(kubectl --namespace wccns get services -o jsonpath="{.spec.ports[0].nodePort}" nginx-ingress-ingress-nginx-controller) + export HTTPS_NODE_PORT=$(kubectl --namespace wccns get services -o jsonpath="{.spec.ports[1].nodePort}" nginx-ingress-ingress-nginx-controller) + export NODE_IP=$(kubectl --namespace wccns get nodes -o jsonpath="{.items[0].status.addresses[1].address}") + echo "Visit http://$NODE_IP:$HTTP_NODE_PORT to access your application via HTTP." + echo "Visit https://$NODE_IP:$HTTPS_NODE_PORT to access your application via HTTPS." +An example Ingress that makes use of the controller: + apiVersion: networking.k8s.io/v1 + kind: Ingress + metadata: + name: example + namespace: foo + spec: + ingressClassName: nginx + rules: + - host: www.example.com + http: + paths: + - pathType: Prefix + backend: + service: + name: exampleService + port: + number: 80 + path: / + # This section is only required if TLS is to be enabled for the Ingress + tls: + - hosts: + - www.example.com + secretName: example-tls +If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided: + apiVersion: v1 + kind: Secret + metadata: + name: example-tls + namespace: foo + data: + tls.crt: + tls.key: + type: kubernetes.io/tls +``` +{{% /expand %}} + +1. Check the status of the deployed ingress controller: + + Please note the EXTERNAL-IP of the nginx-controller service. + This is the public IP address of the load balancer that you will use to access the WebLogic Server Administration Console and WebCenter Content URLs. + > Note: It may take a few minutes for the LoadBalancer IP(EXTERNAL-IP) to be available. + ```bash + $ kubectl --namespace wccns get services | grep ingress-nginx-controller + ``` + Sample output: + + ```bash + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) + nginx-ingress-ingress-nginx-controller LoadBalancer 10.96.180.215 144.24.xx.xx 80:31339/TCP,443:32278/TCP + ``` + To print only the NGINX EXTERNAL-IP, execute this command: + ```bash + NGINX_PUBLIC_IP=`kubectl describe svc nginx-ingress-ingress-nginx-controller --namespace wccns | grep Ingress | awk '{print $3}'` + + $ echo $NGINX_PUBLIC_IP + 144.24.xx.xx + ``` + Verify the helm charts: + ```bash + $ helm list -A + NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION + nginx-ingress wccns 1 2022-05-13 deployed ingress-nginx-4.2.5 1.3.1 + ``` + +#### Configure NGINX to manage ingresses + +1. Create an ingress for the domain in the domain namespace by using the sample Helm chart. Here path-based routing is used for ingress. Sample values for default configuration are shown in the file `${WORKDIR}/charts/ingress-per-domain/values.yaml`. By default, `type` is `TRAEFIK`, `tls` is `Non-SSL`, and `domainType` is `wccinfra`. These values can be overridden by passing values through the command line or can be edited in the sample file `values.yaml`. If needed, you can update the ingress YAML file to define more path rules (in section `spec.rules.host.http.paths`) based on the domain application URLs that need to be accessed. Update the template YAML file for the NGINX load balancer located at `${WORKDIR}/charts/ingress-per-domain/templates/nginx-ingress.yaml` + + Install `ingress-per-domain` using Helm for non-SSL configuration: + ```bash + $ export LB_HOSTNAME= + + #OR leave it empty to point to NGINX load-balancer IP, by default + $ export LB_HOSTNAME='' + ``` + > Note: Make sure that you specify DNS name to point to the NGINX load balancer hostname, +or leave it empty to point to the NGINX load balancer IP. + + ```bash + $ cd ${WORKDIR} + $ helm install wccinfra-nginx-ingress charts/ingress-per-domain \ + --namespace wccns \ + --values charts/ingress-per-domain/values.yaml \ + --set "nginx.hostname=$LB_HOSTNAME" \ + --set type=NGINX \ + --set tls=NONSSL + ``` + + + Sample output: + ```bash + NAME: wccinfra-nginx-ingress + LAST DEPLOYED: Tue May 10 10:37:12 2022 + NAMESPACE: wccns + STATUS: deployed + REVISION: 1 + TEST SUITE: None + ``` + +#### Create a certificate and generate a Kubernetes secret + +1. For **secured access (SSL)** to the Oracle WebCenter Content application, create a certificate: + ```bash + $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls1.key -out /tmp/tls1.crt -subj "/CN=" + + #OR use the following command if you chose to leave LB_HOSTNAME empty in the previous step + + $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls1.key -out /tmp/tls1.crt -subj "/CN=*" + ``` + > Note: Make sure that you specify DNS name to point to the NGINX load balancer hostname. + +1. Generate a Kubernetes secret: + ```bash + $ kubectl -n wccns create secret tls domain1-tls-cert --key /tmp/tls1.key --cert /tmp/tls1.crt + ``` +#### Install Ingress for SSL termination configuration +1. Install `ingress-per-domain` using Helm for SSL configuration: + + ```bash + $ cd ${WORKDIR} + $ helm install wccinfra-nginx-ingress charts/ingress-per-domain \ + --namespace wccns \ + --values charts/ingress-per-domain/values.yaml \ + --set "nginx.hostname=$LB_HOSTNAME" \ + --set "nginx.hostnameorip=$NGINX_PUBLIC_IP" \ + --set type=NGINX --set tls=SSL + ``` + Sample output: + + ```bash + NAME: wccinfra-nginx-ingress + LAST DEPLOYED: Tue May 10 10:37:12 2022 + NAMESPACE: wccns + STATUS: deployed + REVISION: 1 + TEST SUITE: None + ``` + +1. For **non-SSL access or SSL** to the Oracle WebCenter Content application, get the details of the services by the ingress: + + ```bash + $ kubectl describe ingress wccinfra-nginx -n wccns + ``` + {{%expand "Click here to see the sample output of the services supported by the above deployed ingress." %}} +```bash +Name: wccinfra-nginx +Namespace: wccns +Address: 144.24.xx.xx +Default backend: default-http-backend:80 () +Rules: + Host Path Backends + ---- ---- -------- + * + /console wccinfra-adminserver:7001 (10.244.2.117:7001) + /em wccinfra-adminserver:7001 (10.244.2.117:7001) + /wls-exporter wccinfra-adminserver:7001 (10.244.2.117:7001) + /cs wccinfra-cluster-ucm-cluster:16200 (10.244.2.118:16200,10.244.2.120:16200) + /adfAuthentication wccinfra-cluster-ucm-cluster:16200 (10.244.2.118:16200,10.244.2.120:16200) + /_ocsh wccinfra-cluster-ucm-cluster:16200 (10.244.2.118:16200,10.244.2.120:16200) + /_dav wccinfra-cluster-ucm-cluster:16200 (10.244.2.118:16200,10.244.2.120:16200) + /idcws wccinfra-cluster-ucm-cluster:16200 (10.244.2.118:16200,10.244.2.120:16200) + /idcnativews wccinfra-cluster-ucm-cluster:16200 (10.244.2.118:16200,10.244.2.120:16200) + /wsm-pm wccinfra-cluster-ucm-cluster:16200 (10.244.2.118:16200,10.244.2.120:16200) + /ibr wccinfra-cluster-ibr-cluster:16250 (10.244.2.119:16250) + /ibr/adfAuthentication wccinfra-cluster-ibr-cluster:16250 (10.244.2.119:16250) + /weblogic/ready wccinfra-cluster-ucm-cluster:16200 (10.244.2.118:16200,10.244.2.120:16200) +Annotations: + nginx.ingress.kubernetes.io/affinity-mode: persistent + kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/affinity: cookie +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Sync 8m3s (x2 over 8m5s) nginx-ingress-controller Scheduled for sync +``` +{{% /expand %}} + +### End-to-End SSL configuration + +#### Install the NGINX load balancer for end-to-end SSL + +1. For **secured access (SSL)** to the Oracle WebCenter Content application, create a certificate and generate secrets: [click here](#create-a-certificate-and-generate-a-kubernetes-secret) + +1. Deploy the ingress-nginx controller by using Helm on the domain namespace: + + ```bash + helm install nginx-ingress -n wccns \ + --set controller.extraArgs.default-ssl-certificate=wccns/domain1-tls-cert \ + --set controller.service.type=LoadBalancer \ + --set controller.admissionWebhooks.enabled=false \ + --set controller.extraArgs.enable-ssl-passthrough=true \ + ingress-nginx/ingress-nginx + ``` + {{%expand "Click here to see the sample output." %}} +```bash +NAME: nginx-ingress +LAST DEPLOYED: Mon Sep 19 11:08:16 2022 +NAMESPACE: wccns +STATUS: deployed +REVISION: 1 +TEST SUITE: None +NOTES: +The ingress-nginx controller has been installed. +It may take a few minutes for the LoadBalancer IP to be available. +You can watch the status by running 'kubectl --namespace wccns get services -o wide -w nginx-ingress-ingress-nginx-controller' +An example Ingress that makes use of the controller: + apiVersion: networking.k8s.io/v1 + kind: Ingress + metadata: + name: example + namespace: foo + spec: + ingressClassName: nginx + rules: + - host: www.example.com + http: + paths: + - pathType: Prefix + backend: + service: + name: exampleService + port: + number: 80 + path: / + # This section is only required if TLS is to be enabled for the Ingress + tls: + - hosts: + - www.example.com + secretName: example-tls +If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided: + apiVersion: v1 + kind: Secret + metadata: + name: example-tls + namespace: foo + data: + tls.crt: + tls.key: + type: kubernetes.io/tls +``` + {{% /expand %}} + +1. Check the status of the deployed ingress controller: + ```bash + $ kubectl --namespace wccns get services | grep ingress-nginx-controller + ``` + Sample output: + + ```bash + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) + nginx-ingress-ingress-nginx-controller LoadBalancer 10.96.180.215 144.24.xx.xx 80:31339/TCP,443:32278/TCP + ``` + To print only the NGINX EXTERNAL-IP, execute this command: + ```bash + NGINX_PUBLIC_IP=`kubectl describe svc nginx-ingress-ingress-nginx-controller --namespace wccns | grep Ingress | awk '{print $3}'` + + $ echo $NGINX_PUBLIC_IP + 144.24.xx.xx + ``` + +#### Deploy tls to access individual Managed Servers + +1. Deploy tls to securely access the services. Only one application can be configured with `ssl-passthrough`. A sample tls file for NGINX is shown below for the service `wccinfra-cluster-ucm-cluster` and port `16201`. All the applications running on port `16201` can be securely accessed through this ingress. For each backend service, create different ingresses as NGINX does not support multiple path/rules with annotation `ssl-passthrough`. That is, for `wccinfra-cluster-ucm-cluster`, `wccinfra-cluster-ibr-cluster`, `wccinfra-cluster-ipm-cluster`, `wccinfra-cluster-capture-cluster`, `wccinfra-cluster-wccadf-cluster` and `wccinfra-adminserver`, different ingresses must be created. + + > Note: There is a limitation with load-balancer in end-to-end SSL configuration - accessing multiple types of servers (different Managed Servers and/or Administration Server) at the same time, is currently not supported. we can access only one managed server at a time. + + ```bash + $ cd ${WORKDIR}/charts/ingress-per-domain/tls + ``` +Sample nginx-ucm-tls.yaml: +```yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: wcc-ucm-ingress + namespace: wccns + annotations: + kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/ssl-passthrough: "true" +spec: + tls: + - hosts: + - '$NGINX_PUBLIC_IP' + secretName: domain1-tls-cert + rules: + - host: '' + http: + paths: + - path: + pathType: ImplementationSpecific + backend: + service: + name: wccinfra-cluster-ucm-cluster + port: + number: 16201 +``` +> Note: Make sure that you specify DNS name to point to the NGINX load balancer hostname. + +1. Deploy the secured ingress: + + ```bash + $ cd ${WORKDIR}/charts/ingress-per-domain/tls + $ kubectl create -f nginx-ucm-tls.yaml + ``` + +1. Check the services supported by the ingress: + ```bash + $ kubectl describe ingress wcc-ucm-ingress -n wccns + ``` + + {{%expand "Click here check the services supported by the ingress." %}} +```bash +Name: wcc-ucm-ingress +Namespace: wccns +Address: 10.102.97.237 +Default backend: default-http-backend:80 () +TLS: + domain1-tls-cert terminates domain1.org +Rules: + Host Path Backends + ---- ---- -------- + domain1.org + wccinfra-cluster-ucm-cluster:16201 (10.244.238.136:16201,10.244.253.132:16201) +Annotations: kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/ssl-passthrough: true +Events: + Type Reason Age From Message + ---- ------ ---- ---- ------- + Normal Sync 62s (x2 over 106s) nginx-ingress-controller Scheduled for sync +``` + {{% /expand %}} + +#### Deploy tls to access Administration Server + +1. As `ssl-passthrough` in NGINX works on the clusterIP of the backing service instead of individual endpoints, you must expose `adminserver service` created by the WebLogic Kubernetes Operator with clusterIP. + + For example: + + a. Get the name of Administration Server service: + ```bash + $ kubectl get svc -n wccns | grep wccinfra-adminserver + ``` + Sample output: + ```bash + wccinfra-adminserver ClusterIP None 7001/TCP,7002/TCP 7 + ``` + + b. Expose the Administration Server service `wccinfra-adminserver` and use the new service name `wccinfra-adminserver-nginx-ssl`: + ```bash + $ kubectl expose svc wccinfra-adminserver -n wccns --name=wccinfra-adminserver-nginx-ssl --port=7002 + ``` + c. Deploy the secured ingress: + +Sample nginx-admin-tls.yaml: +```yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: wcc-admin-ingress + namespace: wccns + annotations: + kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/ssl-passthrough: "true" +spec: + tls: + - hosts: + - '$NGINX_PUBLIC_IP' + secretName: domain1-tls-cert + rules: + - host: '' + http: + paths: + - path: + pathType: ImplementationSpecific + backend: + service: + name: wccinfra-adminserver-nginx-ssl + port: + number: 7002 +``` +> Note: Make sure that you specify DNS name to point to the NGINX load balancer hostname. + + ```bash + $ cd ${WORKDIR}/charts/ingress-per-domain/tls + $ kubectl create -f nginx-admin-tls.yaml + ``` + +#### Uninstall ingress-nginx tls + + ```bash + $ cd ${WORKDIR}/charts/ingress-per-domain/tls + $ kubectl delete -f nginx-ucm-tls.yaml + ``` + +### Create Oracle WebCenter Content domain +With the load-balancer configured, please create your domain by following the instructions documented in [Create Oracle WebCenter Content domains]({{< relref "/wccontent-domains/oracle-cloud/create-wccontent-domains" >}}), before verifying domain application URL access. + +### Verify domain application URL access + +#### Verify Non-SSL access +Verify that the Oracle WebCenter Content domain application URLs are accessible through the `LOADBALANCER-HOSTNAME`: + +```bash + http://${LOADBALANCER-HOSTNAME}/weblogic/ready + http://${LOADBALANCER-HOSTNAME}/console + http://${LOADBALANCER-HOSTNAME}/em + http://${LOADBALANCER-HOSTNAME}/cs + http://${LOADBALANCER-HOSTNAME}/ibr + http://${LOADBALANCER_HOSTNAME}/imaging + http://${LOADBALANCER_HOSTNAME}/dc-console + http://${LOADBALANCER_HOSTNAME}/wcc +``` +#### Verify SSL termination and end-to-end SSL access +Verify that the Oracle WebCenter Content domain application URLs are accessible through the `LOADBALANCER-HOSTNAME`: + +```bash + https://${LOADBALANCER-HOSTNAME}/weblogic/ready + https://${LOADBALANCER-HOSTNAME}/console + https://${LOADBALANCER-HOSTNAME}/em + https://${LOADBALANCER-HOSTNAME}/cs + https://${LOADBALANCER-HOSTNAME}/ibr + https://${LOADBALANCER_HOSTNAME}/imaging + https://${LOADBALANCER_HOSTNAME}/dc-console + https://${LOADBALANCER_HOSTNAME}/wcc +``` + +### Uninstall the NGINX + +Uninstall and delete the `ingress-nginx` deployment: + +```bash +//Uninstall and delete the `ingress-nginx` deployment +$ helm delete wccinfra-nginx-ingress -n wccns + +//Uninstall NGINX +$ helm delete nginx-ingress -n wccns +``` \ No newline at end of file diff --git a/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/traefik.md b/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/traefik.md index 6743c80b8..19ed6b38e 100644 --- a/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/traefik.md +++ b/docs-source/content/wccontent-domains/oracle-cloud/configure-load-balancer/traefik.md @@ -7,18 +7,34 @@ pre: "a. " description: "Configure the ingress-based Traefik load balancer for Oracle WebCenter Content domains." --- -This section provides information about how to install and configure the ingress-based *Traefik* load balancer (version 2.2.8 or later for production deployments) to load balance Oracle WebCenter Content domain clusters. +This section provides information about how to install and configure the ingress-based *Traefik* load balancer (version 2.6.0 or later for production deployments) to load balance Oracle WebCenter Content domain clusters. Follow these steps to set up Traefik as a load balancer for an Oracle WebCenter Content domain in a Kubernetes cluster: #### Contents -1. [Install the Traefik (ingress-based) load balancer](#install-the-traefik-ingress-based-load-balancer) -1. [Configure Traefik to manage ingresses](#configure-traefik-to-manage-ingresses) -1. [Create an Ingress for the domain](#create-an-ingress-for-the-domain) -1. [Verify domain application URL access](#verify-domain-application-url-access) -1. [Uninstall the Traefik ingress](#uninstall-the-traefik-ingress) +* [ Non-SSL and SSL termination](#non-ssl-and-ssl-termination) + 1. [Install the Traefik (ingress-based) load balancer](#install-the-traefik-ingress-based-load-balancer) + 1. [Configure Traefik to manage ingresses](#configure-traefik-to-manage-ingresses) + 1. [Create an Ingress for the domain](#create-an-ingress-for-the-domain) + 1. [Create a certificate and generate a Kubernetes secret](#create-a-certificate-and-generate-a-kubernetes-secret) + 1. [Create Traefik custom resource](#create-traefik-custom-resource) + 1. [Install Ingress for SSL termination configuration](#install-ingress-for-ssl-termination-configuration) + +* [ End-to-End SSL configuration](#end-to-end-ssl-configuration) + 1. [Install the Traefik load balancer for end-to-end SSL](#install-the-traefik-load-balancer-for-end-to-end-ssl) + 1. [Configure Traefik to manage the domain](#configure-traefik-to-manage-the-domain) + 1. [Create IngressRouteTCP](#create-ingressroutetcp) + +* [ Create Oracle WebCenter Content domain](#create-oracle-webcenter-content-domain) + +* [ Verify domain application URL access](#verify-domain-application-url-access) + 1. [Verify Non-SSL access](#verify-non-ssl-access) + 1. [Verify SSL termination and end-to-end SSL access](#verify-ssl-termination-and-end-to-end-ssl-access) + +* [ Uninstall Traefik](#uninstall-traefik) +### Non-SSL and SSL termination #### Install the Traefik (ingress-based) load balancer @@ -27,9 +43,9 @@ Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifi ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ cd ${WORKDIR} $ kubectl create namespace traefik - $ helm repo add traefik https://containous.github.io/traefik-helm-chart + $ helm repo add traefik https://helm.traefik.io/traefik --force-update ``` Sample output: ```bash @@ -38,10 +54,10 @@ Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifi 2. Install Traefik: ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ cd ${WORKDIR} $ helm install traefik traefik/traefik \ --namespace traefik \ - --values kubernetes/samples/scripts/charts/traefik/values.yaml \ + --values charts/traefik/values.yaml \ --set "kubernetes.namespaces={traefik}" \ --set "service.type=LoadBalancer" --wait ``` @@ -71,12 +87,12 @@ NOTES: {{% /expand %}} - A sample `values.yaml` for deployment of Traefik 2.2.x: + A sample `values.yaml` for deployment of Traefik 2.6.0: {{%expand "Click here to see values.yaml" %}} ```yaml image: name: traefik - tag: 2.2.8 + tag: 2.6.0 pullPolicy: IfNotPresent ingressRoute: dashboard: @@ -122,32 +138,35 @@ NOTES: # The port protocol (TCP/UDP) protocol: TCP nodePort: 30443 + additionalArguments: + - "--log.level=INFO" ``` {{% /expand %}} + 3. Verify the Traefik (load balancer) services: -Please note the EXTERNAL-IP of the traefik-operator service. -This is the public IP address of the load balancer that you will use to access the WebLogic Server Administration Console and WebCenter Content URLs. + Please note the EXTERNAL-IP of the traefik-operator service. + This is the public IP address of the load balancer that you will use to access the WebLogic Server Administration Console and WebCenter Content URLs. ```bash $ kubectl get service -n traefik NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE traefik LoadBalancer 10.96.8.30 123.456.xx.xx 9000:30734/TCP,30305:30305/TCP,30443:30443/TCP 6d23h ``` -To print only the Traefik EXTERNAL-IP, execute this command: + To print only the Traefik EXTERNAL-IP, execute this command: ```bash $ TRAEFIK_PUBLIC_IP=`kubectl describe svc traefik --namespace traefik | grep Ingress | awk '{print $3}'` $ echo $TRAEFIK_PUBLIC_IP 123.456.xx.xx ``` -1. Verify the helm charts: + Verify the helm charts: ```bash $ helm list -n traefik NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION - traefik traefik 2 2021-10-11 12:22:41.122310912 +0000 UTC deployed traefik-9.1.1 2.2.8 + traefik traefik 2 2022-09-11 12:22:41.122310912 +0000 UTC deployed traefik-10.24.3 2.8.5 ``` -1. Verify the Traefik status and find the port number + Verify the Traefik status and find the port number ```bash $ kubectl get all -n traefik ``` @@ -174,8 +193,8 @@ To print only the Traefik EXTERNAL-IP, execute this command: Configure Traefik to manage ingresses created in this namespace, where `traefik` is the Traefik namespace and `wccns` is the namespace of the domain: ```bash - $ helm upgrade traefik traefik/traefik --namespace traefik --reuse-values \ - --set "kubernetes.namespaces={traefik,wccns}" + $ helm upgrade traefik traefik/traefik --namespace traefik --reuse-values \ + --set "kubernetes.namespaces={traefik,wccns}" ``` {{%expand "Click here to see the sample output." %}} ```bash @@ -192,20 +211,29 @@ Configure Traefik to manage ingresses created in this namespace, where `traefik` #### Create an ingress for the domain Create an ingress for the domain in the domain namespace by using the sample Helm chart. Here path-based routing is used for ingress. -Sample values for default configuration are shown in the file `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/values.yaml`. +Sample values for default configuration are shown in the file `${WORKDIR}/charts/ingress-per-domain/values.yaml`. By default, `type` is `TRAEFIK` , `tls` is `Non-SSL`, and `domainType` is `wccinfra`. These values can be overridden by passing values through the command line or can be edited in the sample file `values.yaml` based on the type of configuration (non-SSL or SSL). -If needed, you can update the ingress YAML file to define more path rules (in section `spec.rules.host.http.paths`) based on the domain application URLs that need to be accessed. The template YAML file for the Traefik (ingress-based) load balancer is located at `${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/charts/ingress-per-domain/templates/traefik-ingress.yaml` +If needed, you can update the ingress YAML file to define more path rules (in section `spec.rules.host.http.paths`) based on the domain application URLs that need to be accessed. The template YAML file for the Traefik (ingress-based) load balancer is located at `${WORKDIR}/charts/ingress-per-domain/templates/traefik-ingress.yaml` 1. Install `ingress-per-domain` using Helm for non-SSL configuration: - + ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator + $ export LB_HOSTNAME= + + #OR leave it empty to point to Traefik load-balancer IP, by default + $ export LB_HOSTNAME='' + ``` + > Note: Make sure that you specify DNS name to point to the Traefik load balancer hostname, +or leave it empty to point to the Traefik load-balancer IP. + + ```bash + $ cd ${WORKDIR} $ helm install wcc-traefik-ingress \ - kubernetes/samples/charts/ingress-per-domain \ + charts/ingress-per-domain \ --set type=TRAEFIK \ --namespace wccns \ - --values kubernetes/samples/charts/ingress-per-domain/values.yaml \ - --set "traefik.hostname=" \ + --values charts/ingress-per-domain/values.yaml \ + --set "traefik.hostname=$LB_HOSTNAME" \ --set tls=NONSSL ``` Sample output: @@ -217,8 +245,249 @@ If needed, you can update the ingress YAML file to define more path rules (in se REVISION: 1 TEST SUITE: None ``` +#### Create a certificate and generate a Kubernetes secret +1. For secured access (SSL) to the Oracle WebCenter Content application, create a certificate : + + ```bash + $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls1.key -out /tmp/tls1.crt -subj "/CN=" + + #OR use the following command if you chose to leave LB_HOSTNAME empty in the previous step + + $ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls1.key -out /tmp/tls1.crt -subj "/CN=*" + ``` + > Note: Make sure that you specify DNS name to point to the Traefik load balancer hostname. + +1. Generate a Kubernetes secret: + ```bash + $ kubectl -n wccns create secret tls domain1-tls-cert --key /tmp/tls1.key --cert /tmp/tls1.crt + ``` +#### Create Traefik custom resource +1. Create Traefik Middleware custom resource + + In case of SSL termination, Traefik must pass a custom header `WL-Proxy-SSL:true` to the WebLogic Server endpoints. Create the Middleware using the following command: + ```bash + $ cat <-@kubernetescrd`. + + ```bash + $ cd ${WORKDIR} + $ helm install wcc-traefik-ingress \ + charts/ingress-per-domain \ + --set type=TRAEFIK \ + --namespace wccns \ + --values charts/ingress-per-domain/values.yaml \ + --set "traefik.hostname=$LB_HOSTNAME" \ + --set "traefik.hostnameorip=$TRAEFIK_PUBLIC_IP" \ + --set tls=SSL + ``` + Sample output: + ```bash + NAME: wcc-traefik-ingress + LAST DEPLOYED: Mon Jul 20 11:44:13 2020 + NAMESPACE: wccns + STATUS: deployed + REVISION: 1 + TEST SUITE: None + + ``` +1. Get the details of the services by the above deployed ingress: + + ```bash + $ kubectl describe ingress wccinfra-traefik -n wccns + ``` +1. To confirm that the load balancer noticed the new ingress and is successfully routing to the domain server pods, you can send a request to the URL for the "WebLogic ReadyApp framework", which should return an HTTP 200 status code, as follows: + ```bash + $ curl -v http://${LOADBALANCER_HOSTNAME}:${LOADBALANCER_PORT}/weblogic/ready + * About to connect() to abc.com port 30305 (#0) + * Trying 100.111.156.246... + * Connected to abc.com (100.111.156.246) port 30305 (#0) + > GET /weblogic/ready HTTP/1.1 + > User-Agent: curl/7.29.0 + > Host: domain1.org:30305 + > Accept: */* + > + < HTTP/1.1 200 OK + < Content-Length: 0 + < Date: Thu, 03 Dec 2020 13:16:19 GMT + < Vary: Accept-Encoding + < + * Connection #0 to host abc.com left intact + + ``` + +### End-to-End SSL configuration + +#### Install the Traefik load balancer for end-to-end SSL + +1. Use Helm to install the Traefik (ingress-based) load balancer. For detailed information, see [here](https://github.com/oracle/weblogic-kubernetes-operator/blob/master/kubernetes/samples/charts/traefik/README.md). +Use the `values.yaml` file in the sample but set `kubernetes.namespaces` specifically. + + + ```bash + $ cd ${WORKDIR} + $ kubectl create namespace traefik + $ helm repo add traefik https://helm.traefik.io/traefik --force-update + ``` + Sample output: + ```bash + "traefik" has been added to your repositories + ``` +1. Install Traefik: -#### Verify domain application URL access + ```bash + $ cd ${WORKDIR} + $ helm install traefik traefik/traefik \ + --namespace traefik \ + --values charts/traefik/values.yaml \ + --set "kubernetes.namespaces={traefik}" \ + --set "service.type=LoadBalancer" \ + --wait + ``` + + {{%expand "Click here to see the sample output." %}} + ```bash + NAME: traefik + LAST DEPLOYED: Sun Jan 17 23:30:20 2021 + NAMESPACE: traefik + STATUS: deployed + REVISION: 1 + TEST SUITE: None + ``` + {{% /expand %}} + +1. Verify the Traefik operator status and find the port number of the SSL and non-SSL services: + ```bash + $ kubectl get all -n traefik + ``` + {{%expand "Click here to see the sample output." %}} + ```bash + + NAME READY STATUS RESTARTS AGE + pod/traefik-operator-676fc64d9c-skppn 1/1 Running 0 78d + + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE + service/traefik-operator NodePort 10.109.223.59 443:30443/TCP,80:30305/TCP 78d + service/traefik-operator-dashboard ClusterIP 10.110.85.194 80/TCP 78d + + NAME READY UP-TO-DATE AVAILABLE AGE + deployment.apps/traefik-operator 1/1 1 1 78d + + NAME DESIRED CURRENT READY AGE + replicaset.apps/traefik-operator-676fc64d9c 1 1 1 78d + replicaset.apps/traefik-operator-cb78c9dc9 0 0 0 78d + + ``` + {{% /expand %}} + +#### Configure Traefik to manage the domain + +Configure Traefik to manage the domain application service created in this namespace, where `traefik` is the Traefik namespace and `wccns` is the namespace of the domain: + +```bash +$ helm upgrade traefik traefik/traefik --namespace traefik --reuse-values \ +--set "kubernetes.namespaces={traefik,wccns}" +``` +{{%expand "Click here to see the sample output." %}} +```bash + Release "traefik" has been upgraded. Happy Helming! + NAME: traefik + LAST DEPLOYED: Sun Jan 17 23:43:02 2021 + NAMESPACE: traefik + STATUS: deployed + REVISION: 2 + TEST SUITE: None +``` +{{% /expand %}} + +#### Create IngressRouteTCP + +1. To enable SSL passthrough in Traefik, you can configure a TCP router. + A sample YAML for `IngressRouteTCP` is available at `${WORKDIR}/charts/ingress-per-domain/tls/traefik-tls.yaml`. + + > Note: There is a limitation with load-balancer in end-to-end SSL configuration - accessing multiple types of servers (different Managed Servers and/or Administration Server) at the same time, is currently not supported. we can access only one managed server at a time. + + The following should be updated in `traefik-tls.yaml`: + * The service name and the SSL port should be updated in the Services. + * The load balancer hostname(DNS name) should be updated in the `HostSNI` rule. + + Sample `traefik-tls.yaml`: +```yaml +apiVersion: traefik.containo.us/v1alpha1 +kind: IngressRouteTCP +metadata: + name: wcc-ucm-routetcp + namespace: wccns +spec: + entryPoints: + - websecure + routes: + - match: HostSNI(``) + services: + - name: wccinfra-cluster-ucm-cluster + port: 16201 + weight: 3 + terminationDelay: 400 + tls: + passthrough: true +``` +> Note: Make sure that you specify DNS name to point to the Traefik load balancer hostname, +or specify '*' to point to the Traefik load balancer IP. + + +1. Create the IngressRouteTCP: +```bash +cd ${WORKDIR}/charts/ingress-per-domain/tls + +$ kubectl apply -f traefik-tls.yaml +``` + +### Create Oracle WebCenter Content domain +With the load-balancer configured, please create your domain by following the instructions documented in [Create Oracle WebCenter Content domains]({{< relref "/wccontent-domains/oracle-cloud/create-wccontent-domains" >}}), before verifying domain application URL access. + +### Verify domain application URL access + +#### Verify Non-SSL access After setting up the Traefik (ingress-based) load balancer, verify that the domain application URLs are accessible through the load balancer port `30305` for HTTP access. The sample URLs for Oracle WebCenter Content domain of type `wcc` are: @@ -226,15 +495,35 @@ After setting up the Traefik (ingress-based) load balancer, verify that the doma http://${TRAEFIK_PUBLIC_IP}:30305/weblogic/ready http://${TRAEFIK_PUBLIC_IP}:30305/console http://${TRAEFIK_PUBLIC_IP}:30305/cs -http://${TRAEFIK_PUBLIC_IP}:30305/ibr +http://${TRAEFIK_PUBLIC_IP}:30305/ibr +http://${TRAEFIK_PUBLIC_IP}:30305/imaging +http://${TRAEFIK_PUBLIC_IP}:30305/dc-console +http://${TRAEFIK_PUBLIC_IP}:30305/wcc + ``` -#### Uninstall the Traefik ingress +#### Verify SSL termination and end-to-end SSL access -Uninstall and delete the ingress deployment: +After setting up the Traefik (ingress-based) load balancer, verify that the domain applications are accessible through the SSL load balancer port `30443` for HTTPS access. The sample URLs for Oracle WebCenter Content domain are: -```bash -$ helm delete wcc-traefik-ingress -n wccns -``` +LOADBALANCER-SSLPORT is 30443 + + ```bash + https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/console + https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/cs + https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/ibr + https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/imaging + https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/dc-console + https://${LOADBALANCER_HOSTNAME}:${LOADBALANCER-SSLPORT}/wcc + ``` +### Uninstall Traefik + + ```bash + $ helm delete wcc-traefik-ingress -n wccns + + $ helm delete traefik -n wccns + + $ kubectl delete namespace traefik + ``` diff --git a/docs-source/content/wccontent-domains/oracle-cloud/configure-mount-share.md b/docs-source/content/wccontent-domains/oracle-cloud/configure-mount-share.md new file mode 100644 index 000000000..d654650c5 --- /dev/null +++ b/docs-source/content/wccontent-domains/oracle-cloud/configure-mount-share.md @@ -0,0 +1,51 @@ +--- +title: "Configure an additional mount or shared space to a domain for Imaging and Capture" +date: 2022-04-10T16:43:45-05:00 +weight: 6 +pre : "6. " +description: "Configure an additional mount or shared space to a domain, for WebCenter Imaging and WebCenter Capture" +--- + +A volume can be mounted to a server pod which can be accessible directly from outside Kubernetes cluster so that an external application could write new files to it. + +This can be used specifically in WebCenter Imaging and WebCenter Capture applications for File Imports. + +Kubernetes supports several types of volumes as given in [Volumes | Kubernetes](https://kubernetes.io/docs/concepts/storage/volumes/#volume-types). + +Further in this section, we will take `nfs` volume as an example. + +#### Mount "nfs" as volume + +Create a NFS File system as described in the section [Preparing a file system](https://oracle.github.io/fmw-kubernetes/wccontent-domains/oracle-cloud/filesystem/) or an already existing NFS server can also be used. + +To use a volume, specify the volumes to provide for the Pod in .spec.volumes and declare where to mount those volumes into containers in .spec.containers[*].volumeMounts in `domain.yaml` file. + +Update the `domain.yaml` and apply the changes as shown in sample below for mounting nfs server (for example, 100.XXX.XXX.X with shared export path at `/sharedir`) to all the server pods at `/u01/sharedir`. + +The path `/u01/sharedir` can be configured as the file import path in WebCenter Imaging and WebCenter Capture applications and the files put to `/sharedir` will be processed by the applications. + +Sample entry of `domain.yaml` with nfs-volume configuration +```bash +... +serverPod: + # an (optional) list of environment variable to be set on the servers + env: + - name: JAVA_OPTIONS + value: "-Dweblogic.StdoutDebugEnabled=false" + - name: USER_MEM_ARGS + value: "-Djava.security.egd=file:/dev/./urandom -Xms256m -Xmx1024m " + volumes: + - name: weblogic-domain-storage-volume + persistentVolumeClaim: + claimName: wccinfra-domain-pvc + - name: nfs-volume + nfs: + server: 100.XXX.XXX.XXX + path: /sharedir + volumeMounts: + - mountPath: /u01/oracle/user_projects/domains + name: weblogic-domain-storage-volume + - mountPath: /u01/sharedir + name: nfs-volume +... +``` diff --git a/docs-source/content/wccontent-domains/oracle-cloud/create-wccontent-domains/_index.md b/docs-source/content/wccontent-domains/oracle-cloud/create-wccontent-domains/_index.md index 93e76d51e..51d72fcc7 100644 --- a/docs-source/content/wccontent-domains/oracle-cloud/create-wccontent-domains/_index.md +++ b/docs-source/content/wccontent-domains/oracle-cloud/create-wccontent-domains/_index.md @@ -12,13 +12,14 @@ description = "Create Oracle WebCenter Content domain on Oracle Kubernetes Engin * [Verify the pods](#verify-the-pods) * [Verify the services](#verify-the-services) * [Expose service for IBR intradoc port](#expose-service-for-ibr-intradoc-port) +* [Expose service for UCM intradoc port](#expose-service-for-ucm-intradoc-port) #### Run the create domain script Run the create domain script, specifying your inputs file and an output directory to store the generated artifacts: ``` -$ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-wcc-domain/domain-home-on-pv/ +$ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ $ ./create-domain.sh \ -i create-domain-inputs.yaml \ @@ -34,14 +35,43 @@ The script will perform the following steps: * Run and wait for the job to finish. * Create a Kubernetes domain YAML file, `domain.yaml`, in the "output" directory that was created above. This YAML file can be used to create the Kubernetes resource using the `kubectl create -f` - or `kubectl apply -f` command. -* Run `oke-start-managed-server-wrapper.sh` script, which intrenally applies the domain YAML. This script also applies initial configurations for Managed Server containers and readies Managed Servers for future inter-container communications. + or `kubectl apply -f` command. + +#### Run the managed-server-wrapper script - ``` - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-wcc-domain/domain-home-on-pv/ +Run `oke-start-managed-server-wrapper.sh` script, which intrenally applies the domain YAML. This script also applies initial configurations for Managed Server containers and readies Managed Servers for future inter-container communications. - $ ./oke-start-managed-servers-wrapper.sh -o -l -p - ``` +``` +$ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ + +$ ./oke-start-managed-servers-wrapper.sh -o -l -p +``` +#### Run the startup configuration scripts for IPM and WCCADF applications as applicable + +Run the script `configure-ipm-connection.sh` to do startup configurations if IPM is enabled. + +``` +$ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ +$ ./configure-ipm-connection.sh -l -p +``` +Run the script `configure-wccadf-domain.sh` to do startup configurations if ADFUI is enabled. + +``` +$ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ +$ ./configure-wccadf-domain.sh -n + +``` +Patch the domain for the changes to be applied to the domain. + +``` +#STOP +$ kubectl patch domain DOMAINUID -n NAMESPACE --type='json' -p='[{"op": "replace", "path": "/spec/serverStartPolicy", "value": "NEVER" }]' + +sleep 2m + +#START +$ kubectl patch domain DOMAINUID -n NAMESPACE --type='json' -p='[{"op": "replace", "path": "/spec/serverStartPolicy", "value": "IF_NEEDED" }]' +``` #### Verify the results The create domain script will verify that the domain was created, and will report failure if there was any error. @@ -203,6 +233,88 @@ spec: replicas: 3 # The number of managed servers to start for unlisted clusters # replicas: 1 + - clusterName: ipm_cluster + clusterService: + annotations: + traefik.ingress.kubernetes.io/affinity: "true" + traefik.ingress.kubernetes.io/service.sticky.cookie: "true" + traefik.ingress.kubernetes.io/session-cookie-name: JSESSIONID + serverService: + precreateService: true + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 3 + # The number of managed servers to start for unlisted clusters + # replicas: 1 + - clusterName: capture_cluster + clusterService: + annotations: + traefik.ingress.kubernetes.io/affinity: "true" + traefik.ingress.kubernetes.io/service.sticky.cookie: "true" + traefik.ingress.kubernetes.io/session-cookie-name: JSESSIONID + serverService: + precreateService: true + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 3 + # The number of managed servers to start for unlisted clusters + # replicas: 1 + - clusterName: wccadf_cluster + clusterService: + annotations: + traefik.ingress.kubernetes.io/affinity: "true" + traefik.ingress.kubernetes.io/service.sticky.cookie: "true" + traefik.ingress.kubernetes.io/session-cookie-name: WCCSID + serverService: + precreateService: true + serverStartState: "RUNNING" + serverPod: + # Instructs Kubernetes scheduler to prefer nodes for new cluster members where there are not + # already members of the same cluster. + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: "weblogic.clusterName" + operator: In + values: + - $(CLUSTER_NAME) + topologyKey: "kubernetes.io/hostname" + replicas: 3 + # The number of managed servers to start for unlisted clusters + # replicas: 1 + ``` {{% /expand %}} @@ -305,6 +417,75 @@ Spec: Server Service: Precreate Service: true Server Start State: RUNNING + Cluster Name: ipm_cluster + Cluster Service: + Annotations: + traefik.ingress.kubernetes.io/affinity: true + traefik.ingress.kubernetes.io/service.sticky.cookie: true + traefik.ingress.kubernetes.io/session-cookie-name: JSESSIONID + Replicas: 3 + Server Pod: + Affinity: + Pod Anti Affinity: + Preferred During Scheduling Ignored During Execution: + Pod Affinity Term: + Label Selector: + Match Expressions: + Key: weblogic.clusterName + Operator: In + Values: + $(CLUSTER_NAME) + Topology Key: kubernetes.io/hostname + Weight: 100 + Server Service: + Precreate Service: true + Server Start State: RUNNING + Cluster Name: capture_cluster + Cluster Service: + Annotations: + traefik.ingress.kubernetes.io/affinity: true + traefik.ingress.kubernetes.io/service.sticky.cookie: true + traefik.ingress.kubernetes.io/session-cookie-name: JSESSIONID + Replicas: 3 + Server Pod: + Affinity: + Pod Anti Affinity: + Preferred During Scheduling Ignored During Execution: + Pod Affinity Term: + Label Selector: + Match Expressions: + Key: weblogic.clusterName + Operator: In + Values: + $(CLUSTER_NAME) + Topology Key: kubernetes.io/hostname + Weight: 100 + Server Service: + Precreate Service: true + Server Start State: RUNNING + Cluster Name: wccadf_cluster + Cluster Service: + Annotations: + traefik.ingress.kubernetes.io/affinity: true + traefik.ingress.kubernetes.io/service.sticky.cookie: true + traefik.ingress.kubernetes.io/session-cookie-name: WCCSID + Replicas: 3 + Server Pod: + Affinity: + Pod Anti Affinity: + Preferred During Scheduling Ignored During Execution: + Pod Affinity Term: + Label Selector: + Match Expressions: + Key: weblogic.clusterName + Operator: In + Values: + $(CLUSTER_NAME) + Topology Key: kubernetes.io/hostname + Weight: 100 + Server Service: + Precreate Service: true + Server Start State: RUNNING Data Home: Domain Home: /u01/oracle/user_projects/domains/wccinfra Domain Home Source Type: PersistentVolume @@ -347,6 +528,25 @@ Status: Ready Replicas: 3 Replicas: 3 Replicas Goal: 3 + Cluster Name: ipm_cluster + Maximum Replicas: 5 + Minimum Replicas: 0 + Ready Replicas: 3 + Replicas: 3 + Replicas Goal: 3 + Cluster Name: capture_cluster + Maximum Replicas: 5 + Minimum Replicas: 0 + Ready Replicas: 3 + Replicas: 3 + Replicas Goal: 3 + Cluster Name: wccadf_cluster + Maximum Replicas: 5 + Minimum Replicas: 0 + Ready Replicas: 3 + Replicas: 3 + Replicas Goal: 3 + Conditions: Last Transition Time: 2021-09-30T11:04:35.889547Z Reason: ServersReady @@ -426,6 +626,76 @@ Status: Cluster Name: ucm_cluster Desired State: SHUTDOWN Server Name: ucm-server5 + Cluster Name: ipm_cluster + Desired State: RUNNING + Health: + Activation Time: 2021-09-30T11:04:32.314000Z + Overall Health: ok + Subsystems: + Subsystem Name: ServerRuntime + Symptoms: + Node Name: MyNodeName + Server Name: ipm_server1 + State: RUNNING + Cluster Name: ipm_cluster + Desired State: SHUTDOWN + Server Name: ipm_server2 + Cluster Name: ipm_cluster + Desired State: SHUTDOWN + Server Name: ipm_server3 + Cluster Name: ipm_cluster + Desired State: SHUTDOWN + Server Name: ipm_server4 + Cluster Name: ipm_cluster + Desired State: SHUTDOWN + Server Name: ipm_server5 + Cluster Name: capture_cluster + Desired State: RUNNING + Health: + Activation Time: 2021-09-30T11:04:32.314000Z + Overall Health: ok + Subsystems: + Subsystem Name: ServerRuntime + Symptoms: + Node Name: MyNodeName + Server Name: capture_server1 + State: RUNNING + Cluster Name: capture_cluster + Desired State: SHUTDOWN + Server Name: capture_server2 + Cluster Name: capture_cluster + Desired State: SHUTDOWN + Server Name: capture_server3 + Cluster Name: capture_cluster + Desired State: SHUTDOWN + Server Name: capture_server4 + Cluster Name: capture_cluster + Desired State: SHUTDOWN + Server Name: capture_server5 + Cluster Name: wccadf_cluster + Desired State: RUNNING + Health: + Activation Time: 2021-09-30T11:04:32.314000Z + Overall Health: ok + Subsystems: + Subsystem Name: ServerRuntime + Symptoms: + Node Name: MyNodeName + Server Name: wccadf_server1 + State: RUNNING + Cluster Name: wccadf_cluster + Desired State: SHUTDOWN + Server Name: wccadf_server2 + Cluster Name: wccadf_cluster + Desired State: SHUTDOWN + Server Name: wccadf_server3 + Cluster Name: wccadf_cluster + Desired State: SHUTDOWN + Server Name: wccadf_server4 + Cluster Name: wccadf_cluster + Desired State: SHUTDOWN + Server Name: wccadf_server5 + Start Time: 2021-08-24T12:26:20.033714Z Events: ``` @@ -456,6 +726,16 @@ wccinfra-ibr-server1 1/1 Running 0 wccinfra-ucm-server1 1/1 Running 0 18d wccinfra-ucm-server2 1/1 Running 0 18d wccinfra-ucm-server3 1/1 Running 0 18d +wccinfra-ipm-server1 1/1 Running 0 18d +wccinfra-ipm-server2 1/1 Running 0 18d +wccinfra-ipm-server3 1/1 Running 0 18d +wccinfra-capture-server1 1/1 Running 0 18d +wccinfra-capture-server2 1/1 Running 0 18d +wccinfra-capture-server3 1/1 Running 0 18d +wccinfra-wccadf-server1 1/1 Running 0 18d +wccinfra-wccadf-server2 1/1 Running 0 18d +wccinfra-wccadf-server3 1/1 Running 0 18d + ``` #### Verify the services @@ -471,21 +751,40 @@ Here is an example of the output of this command. {{%expand "Click here to see a sample list of services." %}} ``` $ kubectl get services -n wccns -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -oracle-db LoadBalancer 10.96.74.187 123.45.xxx.xxx 1521:30011/TCP 80d -wccinfra-adminserver ClusterIP None 7001/TCP 18d -wccinfra-cluster-ibr-cluster ClusterIP 10.96.206.89 16250/TCP 119s -wccinfra-cluster-ucm-cluster ClusterIP 10.96.180.150 16200/TCP 54d -wccinfra-ibr-server1 ClusterIP None 16250/TCP 18d -wccinfra-ibr-server2 ClusterIP 10.96.185.209 16250/TCP 18d -wccinfra-ibr-server3 ClusterIP 10.96.43.99 16250/TCP 18d -wccinfra-ibr-server4 ClusterIP 10.96.77.52 16250/TCP 18d -wccinfra-ibr-server5 ClusterIP 10.96.63.174 16250/TCP 18d -wccinfra-ucm-server1 ClusterIP None 16200/TCP 18d -wccinfra-ucm-server2 ClusterIP None 16200/TCP 18d -wccinfra-ucm-server3 ClusterIP None 16200/TCP 18d -wccinfra-ucm-server4 ClusterIP 10.96.141.251 16200/TCP 18d -wccinfra-ucm-server5 ClusterIP 10.96.85.52 16200/TCP 18d +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +oracle-db LoadBalancer 10.96.4.194 141.148.xxx.xxx 1521:30011/TCP 15d +wccinfra-adminserver ClusterIP None 7001/TCP 43h +wccinfra-capture-server1 ClusterIP None 16400/TCP 43h +wccinfra-capture-server2 ClusterIP None 16400/TCP 43h +wccinfra-capture-server3 ClusterIP None 16400/TCP 43h +wccinfra-capture-server4 ClusterIP 10.96.162.97 16400/TCP 43h +wccinfra-capture-server5 ClusterIP 10.96.86.213 16400/TCP 43h +wccinfra-cluster-capture-cluster ClusterIP 10.96.107.96 16400/TCP 2d13h +wccinfra-cluster-ibr-cluster ClusterIP 10.96.123.229 16250/TCP 2d13h +wccinfra-cluster-ipm-cluster ClusterIP 10.96.130.117 16000/TCP 2d13h +wccinfra-cluster-ucm-cluster ClusterIP 10.96.24.88 16200/TCP 119s +wccinfra-cluster-wccadf-cluster ClusterIP 10.96.11.113 16225/TCP 2d13h +wccinfra-ibr-server1 ClusterIP None 16250/TCP 43h +wccinfra-ibr-server2 ClusterIP 10.96.57.47 16250/TCP 43h +wccinfra-ibr-server3 ClusterIP 10.96.75.252 16250/TCP 43h +wccinfra-ibr-server4 ClusterIP 10.96.120.224 16250/TCP 43h +wccinfra-ibr-server5 ClusterIP 10.96.34.58 16250/TCP 43h +wccinfra-ipm-server1 ClusterIP None 16000/TCP 43h +wccinfra-ipm-server2 ClusterIP None 16000/TCP 43h +wccinfra-ipm-server3 ClusterIP None 16000/TCP 43h +wccinfra-ipm-server4 ClusterIP 10.96.44.8 16000/TCP 43h +wccinfra-ipm-server5 ClusterIP 10.96.77.81 16000/TCP 43h +wccinfra-ucm-server1 ClusterIP None 16200/TCP 43h +wccinfra-ucm-server2 ClusterIP None 16200/TCP 43h +wccinfra-ucm-server3 ClusterIP None 16200/TCP 43h +wccinfra-ucm-server4 ClusterIP 10.96.132.1 16200/TCP 43h +wccinfra-ucm-server5 ClusterIP 10.96.199.161 16200/TCP 43h +wccinfra-wccadf-server1 ClusterIP None 16225/TCP 43h +wccinfra-wccadf-server2 ClusterIP None 16225/TCP 43h +wccinfra-wccadf-server3 ClusterIP None 16225/TCP 43h +wccinfra-wccadf-server4 ClusterIP 10.96.156.42 16225/TCP 43h +wccinfra-wccadf-server5 ClusterIP 10.96.194.175 16225/TCP 43h + ``` {{% /expand %}} @@ -503,28 +802,68 @@ wccinfra-ucm-server5 ClusterIP 10.96.85.52 wccinfra-ucm-server2 1/1 Running 0 4h46m 10.244.0.151 10.0.10.xxx wccinfra-ucm-server3 1/1 Running 0 4h44m 10.244.1.40 10.0.10.xx ``` -1. Expose service for IBR intradoc port  +1. Expose the IBR intradoc port as a NodePort + > Note: Choose NodePort value from a range (default: 30000-32767). + In this sample, we have chosen nodePort value as `30555` + ```bash - $ cd ${WORKDIR}/weblogic-kubernetes-operator/kubernetes/samples/scripts/create-wcc-domain/domain-home-on-pv/ + $ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ + + kubectl expose service/wccinfra-cluster-ibr-cluster --name wccinfra-cluster-ibr-cluster-ext --port=5555 --type=NodePort -n wccns --dry-run=true -o yaml > wccinfra-cluster-ibr-cluster-ext.yaml + + sed -i -e '/targetPort:*/a\ \ \ \ nodePort: 30555' wccinfra-cluster-ibr-cluster-ext.yaml + + kubectl -n wccns apply -f wccinfra-cluster-ibr-cluster-ext.yaml + ``` +1. Verify ibr service name 'wccinfra-cluster-ibr-cluster-ext'  + ```bash + $ kubectl get svc -n wccns + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) + wccinfra-cluster-ibr-cluster-ext NodePort 10.109.247.52 5555:30555/TCP + ``` +1. Create the outgoing provider by providing following details and restart the servers. + + Please provide the NodePort value (in the above sample - 30555), as `Server Port`. + + ```yaml + Server Host Name: - $ kubectl expose service/wccinfra-cluster-ibr-cluster --name wccinfra-cluster-ibr-cluster-ext --port=5555 --target-port=5555 --external-ip= -n wccns - #sample - $ kubectl expose service/wccinfra-cluster-ibr-cluster --name wccinfra-cluster-ibr-cluster-ext --port=5555 --target-port=5555 --external-ip=10.0.10.xx -n wccns + Server Port: 30555 + ``` + ![oke-wcc-provider-ucm-ibr](images/oke-wcc-provider-ucm-ibr.png) - $ kubectl get service/wccinfra-cluster-ibr-cluster-ext -n wccns -o yaml > - wccinfra-cluster-ibr-cluster-ext.yaml +### Expose service for UCM intradoc port +1. Get the IP address for the node, hosting ucm managed server pod. In this sample, node running wccinfra-ucm-server1 pod has ip '10.0.10.xx' + ```bash + $ kubectl get pods -n wccns -o wide - $ sed -i "0,/5555/s//16250/" wccinfra-cluster-ibr-cluster-ext.yaml - $ kubectl -n wccns apply -f wccinfra-cluster-ibr-cluster-ext.yaml + #output + NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES + wccinfra-adminserver 1/1 Running 0 4h50m 10.244.0.150 10.0.10.xxx + wccinfra-create-fmw-infra-sample-domain-job-zbsxr 0/1 Completed 0 7d22h 10.244.1.25 10.0.10.xx + wccinfra-ibr-server1 1/1 Running 0 4h48m 10.244.1.38 10.0.10.xx + wccinfra-ucm-server1 1/1 Running 0 4h48m 10.244.1.39 10.0.10.xx + wccinfra-ucm-server2 1/1 Running 0 4h46m 10.244.0.151 10.0.10.xxx + wccinfra-ucm-server3 1/1 Running 0 4h44m 10.244.1.40 10.0.10.xx ``` -1. Verify ibr service name 'wccinfra-cluster-ibr-cluster-ext'  +1. Expose the UCM intradoc port as a NodePort + > Note: Choose NodePort value from a range (default: 30000-32767). + In this sample, we have chosen nodePort value as `30444` + + ```bash + $ cd ${WORKDIR}/create-wcc-domain/domain-home-on-pv/ + + $ kubectl expose service/wccinfra-cluster-ucm-cluster --name wccinfra-cluster-ucm-cluster-ext --port=4444 --type=NodePort -n wccns --dry-run=true -o yaml > wccinfra-cluster-ucm-cluster-ext.yaml + + $ sed -i -e '/targetPort:*/a\ \ \ \ nodePort: 30444' wccinfra-cluster-ucm-cluster-ext.yaml + + $ kubectl -n wccns apply -f wccinfra-cluster-ucm-cluster-ext.yaml + ``` +1. Verify ucm service name 'wccinfra-cluster-ucm-cluster-ext'  ```bash $ kubectl get svc -n wccns - NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE - oracle-db LoadBalancer 10.96.74.187 123.45.xxx.xxx 1521:30011/TCP 13d - wccinfra-adminserver ClusterIP None 7001/TCP 5h10m - wccinfra-cluster-ibr-cluster ClusterIP 10.96.155.21 16250/TCP 20s - wccinfra-cluster-ibr-cluster-ext ClusterIP 10.96.152.184 10.0.10.xx 5555/TCP 7d3h - wccinfra-cluster-ucm-cluster ClusterIP 10.96.136.224 16200/TCP 7d4h + NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) + wccinfra-cluster-ucm-cluster-ext NodePort 10.109.247.52 4444:30444/TCP ``` - \ No newline at end of file + + diff --git a/docs-source/content/wccontent-domains/oracle-cloud/create-wccontent-domains/images/oke-wcc-provider-ucm-ibr.png b/docs-source/content/wccontent-domains/oracle-cloud/create-wccontent-domains/images/oke-wcc-provider-ucm-ibr.png new file mode 100644 index 0000000000000000000000000000000000000000..80c57d19f85e75ad7f06949d658efee5d5b4ab41 GIT binary patch literal 294556 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