Skip to content

Build monitoring exporter project before creating image #3994

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2021, 2022, Oracle and/or its affiliates.
// Copyright (c) 2021, 2023, Oracle and/or its affiliates.
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.

package oracle.weblogic.kubernetes;
Expand Down Expand Up @@ -39,7 +39,6 @@
import static oracle.weblogic.kubernetes.utils.DeployUtil.deployToClusterUsingRest;
import static oracle.weblogic.kubernetes.utils.DomainUtils.createDomainAndVerify;
import static oracle.weblogic.kubernetes.utils.FileUtils.generateFileFromTemplate;
import static oracle.weblogic.kubernetes.utils.ImageUtils.createImageAndPushToRepo;
import static oracle.weblogic.kubernetes.utils.ImageUtils.createMiiImageAndVerify;
import static oracle.weblogic.kubernetes.utils.ImageUtils.createTestRepoSecret;
import static oracle.weblogic.kubernetes.utils.ImageUtils.imageRepoLoginAndPushImageToRegistry;
Expand All @@ -48,6 +47,7 @@
import static oracle.weblogic.kubernetes.utils.IstioUtils.deployIstioDestinationRule;
import static oracle.weblogic.kubernetes.utils.IstioUtils.deployIstioPrometheus;
import static oracle.weblogic.kubernetes.utils.IstioUtils.getIstioHttpIngressPort;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.buildMonitoringExporterCreateImageAndPushToRepo;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.checkMetricsViaPrometheus;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.cloneMonitoringExporter;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.downloadMonitoringExporterApp;
Expand Down Expand Up @@ -180,7 +180,8 @@ void testIstioPrometheusWithSideCar() {

String monitoringExporterSrcDir = Paths.get(RESULTS_ROOT, "monitoringexp", "srcdir").toString();
cloneMonitoringExporter(monitoringExporterSrcDir);
String exporterImage = assertDoesNotThrow(() -> createImageAndPushToRepo(monitoringExporterSrcDir, "exporter",
String exporterImage = assertDoesNotThrow(() ->
buildMonitoringExporterCreateImageAndPushToRepo(monitoringExporterSrcDir, "exporter",
domain2Namespace, TEST_IMAGES_REPO_SECRET_NAME, getImageBuilderExtraArgs()),
"Failed to create image for exporter");
String exporterConfig = RESOURCE_DIR + "/exporter/exporter-config.yaml";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2021, 2022, Oracle and/or its affiliates.
// Copyright (c) 2021, 2023, Oracle and/or its affiliates.
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.

package oracle.weblogic.kubernetes;
Expand Down Expand Up @@ -72,11 +72,11 @@
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getNextFreePort;
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.scaleAndVerifyCluster;
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.testUntil;
import static oracle.weblogic.kubernetes.utils.ImageUtils.createImageAndPushToRepo;
import static oracle.weblogic.kubernetes.utils.ImageUtils.createImageAndVerify;
import static oracle.weblogic.kubernetes.utils.ImageUtils.imageRepoLoginAndPushImageToRegistry;
import static oracle.weblogic.kubernetes.utils.LoadBalancerUtils.createIngressForDomainAndVerify;
import static oracle.weblogic.kubernetes.utils.LoadBalancerUtils.installAndVerifyNginx;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.buildMonitoringExporterCreateImageAndPushToRepo;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.checkMetricsViaPrometheus;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.cleanupPromGrafanaClusterRoles;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.createAndVerifyDomain;
Expand Down Expand Up @@ -488,7 +488,8 @@ public static boolean installAndVerifyPodFromCustomImage(String dockerFileDir,
//build webhook image
String imagePullPolicy = IMAGE_PULL_POLICY;
logger.info("Creating and Installing {0} in namespace {1}", baseImageName, namespace);
String image = createImageAndPushToRepo(dockerFileDir,baseImageName, namespace, secretName, "");
String image = buildMonitoringExporterCreateImageAndPushToRepo(
dockerFileDir,baseImageName, namespace, secretName, "");

if (baseImageName.equalsIgnoreCase(("webhook"))) {
webhookImage = image;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2021, 2022, Oracle and/or its affiliates.
// Copyright (c) 2021, 2023, Oracle and/or its affiliates.
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.

package oracle.weblogic.kubernetes;
Expand Down Expand Up @@ -48,10 +48,10 @@
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.checkPodReadyAndServiceExists;
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.generateNewModelFileWithUpdatedDomainUid;
import static oracle.weblogic.kubernetes.utils.CommonTestUtils.getImageBuilderExtraArgs;
import static oracle.weblogic.kubernetes.utils.ImageUtils.createImageAndPushToRepo;
import static oracle.weblogic.kubernetes.utils.ImageUtils.createMiiImageAndVerify;
import static oracle.weblogic.kubernetes.utils.ImageUtils.imageRepoLoginAndPushImageToRegistry;
import static oracle.weblogic.kubernetes.utils.LoadBalancerUtils.installAndVerifyNginx;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.buildMonitoringExporterCreateImageAndPushToRepo;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.checkMetricsViaPrometheus;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.cleanupPromGrafanaClusterRoles;
import static oracle.weblogic.kubernetes.utils.MonitoringUtils.createAndVerifyDomain;
Expand Down Expand Up @@ -176,7 +176,8 @@ public static void initAll(@Namespaces(6) List<String> namespaces) {

logger.info("install monitoring exporter");
installMonitoringExporter(monitoringExporterDir);
exporterImage = assertDoesNotThrow(() -> createImageAndPushToRepo(monitoringExporterSrcDir, "exporter",
exporterImage = assertDoesNotThrow(() ->
buildMonitoringExporterCreateImageAndPushToRepo(monitoringExporterSrcDir, "exporter",
domain1Namespace, TEST_IMAGES_REPO_SECRET_NAME, getImageBuilderExtraArgs()),
"Failed to create image for exporter");
if (!OKD) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import io.kubernetes.client.openapi.models.V1EnvVar;
import io.kubernetes.client.openapi.models.V1LocalObjectReference;
import io.kubernetes.client.openapi.models.V1ObjectMeta;
import io.kubernetes.client.openapi.models.V1Pod;
import io.kubernetes.client.openapi.models.V1Secret;
import io.kubernetes.client.openapi.models.V1SecretList;
import oracle.weblogic.domain.AdminServer;
Expand Down Expand Up @@ -57,7 +56,6 @@
import static oracle.weblogic.kubernetes.TestConstants.FAILURE_RETRY_LIMIT_MINUTES;
import static oracle.weblogic.kubernetes.TestConstants.GRAFANA_REPO_NAME;
import static oracle.weblogic.kubernetes.TestConstants.GRAFANA_REPO_URL;
import static oracle.weblogic.kubernetes.TestConstants.HTTPS_PROXY;
import static oracle.weblogic.kubernetes.TestConstants.IMAGE_PULL_POLICY;
import static oracle.weblogic.kubernetes.TestConstants.K8S_NODEPORT_HOST;
import static oracle.weblogic.kubernetes.TestConstants.KUBERNETES_CLI;
Expand All @@ -69,14 +67,11 @@
import static oracle.weblogic.kubernetes.TestConstants.PROMETHEUS_REPO_NAME;
import static oracle.weblogic.kubernetes.TestConstants.PROMETHEUS_REPO_URL;
import static oracle.weblogic.kubernetes.TestConstants.TEST_IMAGES_REPO_SECRET_NAME;
import static oracle.weblogic.kubernetes.TestConstants.WLSIMG_BUILDER;
import static oracle.weblogic.kubernetes.actions.ActionConstants.MONITORING_EXPORTER_DOWNLOAD_URL;
import static oracle.weblogic.kubernetes.actions.ActionConstants.RESOURCE_DIR;
import static oracle.weblogic.kubernetes.actions.TestActions.deleteSecret;
import static oracle.weblogic.kubernetes.actions.TestActions.getPod;
import static oracle.weblogic.kubernetes.actions.TestActions.installGrafana;
import static oracle.weblogic.kubernetes.actions.TestActions.installPrometheus;
import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.copyFileToPod;
import static oracle.weblogic.kubernetes.actions.impl.primitive.Kubernetes.listSecrets;
import static oracle.weblogic.kubernetes.assertions.TestAssertions.callTestWebAppAndCheckForServerNameInResponse;
import static oracle.weblogic.kubernetes.assertions.TestAssertions.isGrafanaReady;
Expand All @@ -94,10 +89,10 @@
import static oracle.weblogic.kubernetes.utils.DomainUtils.createDomainAndVerify;
import static oracle.weblogic.kubernetes.utils.FileUtils.checkFile;
import static oracle.weblogic.kubernetes.utils.FileUtils.replaceStringInFile;
import static oracle.weblogic.kubernetes.utils.ImageUtils.createImageAndPushToRepo;
import static oracle.weblogic.kubernetes.utils.ImageUtils.createMiiImageAndVerify;
import static oracle.weblogic.kubernetes.utils.ImageUtils.createTestRepoSecret;
import static oracle.weblogic.kubernetes.utils.ImageUtils.imageRepoLoginAndPushImageToRegistry;
import static oracle.weblogic.kubernetes.utils.PodUtils.execInPod;
import static oracle.weblogic.kubernetes.utils.PodUtils.getPodName;
import static oracle.weblogic.kubernetes.utils.PodUtils.setPodAntiAffinity;
import static oracle.weblogic.kubernetes.utils.SecretUtils.createSecretWithUsernamePassword;
Expand All @@ -109,7 +104,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;

/**
* A utility class for Monitoring Weblogic Domain via Weblogic MonitoringExporter and Prometheus.
* A utility class for Monitoring WebLogic Domain via WebLogic MonitoringExporter and Prometheus.
*/
public class MonitoringUtils {

Expand Down Expand Up @@ -1000,52 +995,6 @@ public static void createAndVerifyDomain(String miiImage,
}
}

/**
* Install wls dashboard from endtoend sample and verify it is accessable.
*
* @param hostPort host:nodeport string for grafana
* @param monitoringExporterEndToEndDir endtoend sample directory
*
*/
//public static void installVerifyGrafanaDashBoard(int nodeportGrafana, String monitoringExporterEndToEndDir) {
public static void installVerifyGrafanaDashBoard(String hostPort, String monitoringExporterEndToEndDir) {
//wait until it starts dashboard
String curlCmd = String.format("curl -v -H 'Content-Type: application/json' "
+ " -X GET http://admin:12345678@%s/api/dashboards",
hostPort);
testUntil(
assertDoesNotThrow(() -> searchForKey(curlCmd, "grafana"), "Check access to grafana dashboard"),
logger,
"Check access to grafana dashboard");
logger.info("installing grafana dashboard");
// url
String curlCmd0 =
String.format("curl -v -H 'Content-Type: application/json' -H \"Content-Type: application/json\""
+ " -X POST http://admin:12345678@%s/api/datasources/"
+ " --data-binary @%s/grafana/datasource.json",
hostPort, monitoringExporterEndToEndDir);

logger.info("Executing Curl cmd {0}", curlCmd);
assertDoesNotThrow(() -> ExecCommand.exec(curlCmd0));

String curlCmd1 =
String.format("curl -v -H 'Content-Type: application/json' -H \"Content-Type: application/json\""
+ " -X POST http://admin:12345678@%s/api/dashboards/db/"
+ " --data-binary @%s/grafana/dashboard.json",
hostPort, monitoringExporterEndToEndDir);
logger.info("Executing Curl cmd {0}", curlCmd1);
assertDoesNotThrow(() -> ExecCommand.exec(curlCmd1));

String curlCmd2 = String.format("curl -v -H 'Content-Type: application/json' "
+ " -X GET http://admin:12345678@%s/api/dashboards/db/weblogic-server-dashboard",
hostPort);
testUntil(
assertDoesNotThrow(() -> searchForKey(curlCmd2, "wls_jvm_uptime"),
String.format("Check grafana dashboard wls against expected %s", "wls_jvm_uptime")),
logger,
"Check grafana dashboard metric against expected wls_jvm_uptime");
}

/**
* Verify the monitoring exporter app can be accessed from all managed servers in the domain through NGINX.
*
Expand Down Expand Up @@ -1180,63 +1129,25 @@ public static boolean verifyMonExpAppAccessSideCar(String searchKey,
return isFound;
}

/** To build monitoring exporter sidecar image.
/**
* Build exporter, create image with unique name, create corresponding repo secret and push to registry.
*
* @param imageName image nmae
* @param monitoringExporterSrcDir path to monitoring exporter src location
* @param srcDir directory where source is located
* @param baseImageName base image name
* @param namespace image namespace
* @param secretName repo secretname for image
* @param extraImageBuilderArgs user specified extra args
* @return image name
*/
public static void buildMonitoringExporterImage(String imageName, String monitoringExporterSrcDir) {
String httpsproxy = HTTPS_PROXY;
logger.info(" httpsproxy : " + httpsproxy);
String proxyHost = "";
String command;
if (httpsproxy != null) {
int firstIndex = httpsproxy.lastIndexOf("www");
int lastIndex = httpsproxy.lastIndexOf(":");
logger.info("Got indexes : " + firstIndex + " : " + lastIndex);
proxyHost = httpsproxy.substring(firstIndex,lastIndex);
logger.info(" proxyHost: " + proxyHost);

command = String.format("cd %s && mvn clean install -Dmaven.test.skip=true "
+ " && " + WLSIMG_BUILDER + " build . -t "
+ imageName
+ " --build-arg MAVEN_OPTS=\"-Dhttps.proxyHost=%s -Dhttps.proxyPort=80\" --build-arg https_proxy=%s",
monitoringExporterSrcDir, proxyHost, httpsproxy);
} else {
command = String.format("cd %s && mvn clean install -Dmaven.test.skip=true "
+ " && " + WLSIMG_BUILDER + " build . -t "
+ imageName
+ monitoringExporterSrcDir);
}
public static String buildMonitoringExporterCreateImageAndPushToRepo(String srcDir, String baseImageName,
String namespace, String secretName,
String extraImageBuilderArgs) throws ApiException {
String command = String.format("cd %s && mvn clean install -Dmaven.test.skip=true", srcDir);
logger.info("Executing command " + command);
assertTrue(Command
.withParams(new CommandParams()
.command(command))
.execute(), "Failed to build monitoring exporter image");
// login and push image to registry if necessary
imageRepoLoginAndPushImageToRegistry(imageName);
.execute(), "Failed to build monitoring exporter");
return createImageAndPushToRepo(srcDir, baseImageName, namespace, secretName, extraImageBuilderArgs);
}

/** Change monitoring exporter webapp confiuration inside the pod.
*
* @param podName pod name
* @param namespace pod namespace
* @param configYaml monitorin exporter configuration
*/
public static void changeConfigInPod(String podName, String namespace, String configYaml) {
V1Pod exporterPod = assertDoesNotThrow(() -> getPod(namespace, "", podName),
" Can't retreive pod " + podName);
logger.info("Copying config file {0} to pod directory {1}",
Paths.get(RESOURCE_DIR,"/exporter/" + configYaml).toString(), "/tmp/" + configYaml);
assertDoesNotThrow(() -> copyFileToPod(namespace, podName, "monitoring-exporter",
Paths.get(RESOURCE_DIR,"/exporter/" + configYaml), Paths.get("/tmp/" + configYaml)),
"Copying file to pod failed");
execInPod(exporterPod, "monitoring-exporter", true,
"curl -X PUT -H \"content-type: application/yaml\" --data-binary \"@/tmp/"
+ configYaml + "\" -i -u weblogic:welcome1 http://localhost:8080/configuration");
execInPod(exporterPod, "monitoring-exporter", true, "curl -X GET "
+ " -i -u weblogic:welcome1 http://localhost:8080/metrics");

}

}