Skip to content

Commit 88cda3d

Browse files
committed
EAP7-2053 add new test for micrometer subsystem
1 parent 185f862 commit 88cda3d

5 files changed

Lines changed: 388 additions & 2 deletions

File tree

packages/berg/src/berg.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { PullPolicy, GenericContainer, Network, StartedNetwork, StartedTestContainer } from "testcontainers";
1+
import { PullPolicy, GenericContainer, Network, StartedNetwork, StartedTestContainer, Wait } from "testcontainers";
22

33
export class Berg {
44
private static _instance: Berg;
@@ -21,6 +21,7 @@ export class Berg {
2121
.withExposedPorts(9090)
2222
.withNetworkMode(network.getName())
2323
.withNetworkAliases("hal")
24+
.withWaitStrategy(Wait.forLogMessage(/.*started.*/i))
2425
.start();
2526
Berg._instance = new Berg(network, halContainer);
2627
}
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
describe("TESTS: Configuration => Subsystem => Micrometer => Registry => OTLP", () => {
2+
const subsystemAddress = ["subsystem", "micrometer"];
3+
const address = ["subsystem", "micrometer", "registry", "otlp"];
4+
// HAL generates form IDs with triple-dash separators for child resources,
5+
// but collapses them to single dashes in some sub-elements (editing div, save button).
6+
const configurationFormId = "model-browser-model-browser-root---registry---otlp-form";
7+
const configurationFormIdNoDash = "model-browser-model-browser-root-registry-otlp-form";
8+
const addWizardFormId = "model-browser-root-registry-singleton-add";
9+
10+
const endpoint = "endpoint";
11+
const endpointCustomValue = "http://otel-collector:4318/v1/metrics";
12+
const endpointExpressionProperty = "micrometer.otlp.endpoint";
13+
const endpointExpressionPropertyValue = "http://expression-endpoint:4318/v1/metrics";
14+
const endpointExpressionValue = "${micrometer.otlp.endpoint}";
15+
16+
const step = "step";
17+
const stepCustomValue = 30;
18+
const stepExpressionProperty = "micrometer.otlp.step";
19+
const stepExpressionPropertyValue = "45";
20+
const stepExpressionValue = "${micrometer.otlp.step}";
21+
22+
// Context value for prometheus registry (required field, avoids conflict with metrics subsystem)
23+
const prometheusContext = "/prometheus";
24+
25+
let managementEndpoint: string;
26+
27+
// Workaround for JBEAP-28819 - child resource form IDs use triple-dash separators
28+
// for the container but single-dash for the editing div.
29+
function editForm() {
30+
const editButton = "#" + configurationFormId + ' a.clickable[data-operation="edit"]';
31+
cy.get(`#${configurationFormIdNoDash}-editing`).should("not.be.visible");
32+
cy.get(editButton).click();
33+
for (let reClickTry = 0; reClickTry < 5; reClickTry++) {
34+
cy.get(editButton).then(($button) => {
35+
if ($button.is(":visible")) {
36+
cy.get(editButton).click();
37+
}
38+
});
39+
}
40+
cy.get(`#${configurationFormIdNoDash}-editing`).should("be.visible");
41+
}
42+
43+
before(() => {
44+
cy.startWildflyContainer().then((result) => {
45+
managementEndpoint = result as string;
46+
// The micrometer extension is not part of the base configuration, so it must be added explicitly
47+
cy.addAddress(managementEndpoint, ["extension", "org.wildfly.extension.micrometer"], {});
48+
// Register the micrometer subsystem as a parent for the registries
49+
cy.addAddress(managementEndpoint, subsystemAddress, {});
50+
// System properties used as expression resolution targets in the expression tests
51+
cy.addAddress(managementEndpoint, ["system-property", endpointExpressionProperty], {
52+
value: endpointExpressionPropertyValue,
53+
});
54+
cy.addAddress(managementEndpoint, ["system-property", stepExpressionProperty], {
55+
value: stepExpressionPropertyValue,
56+
});
57+
});
58+
});
59+
60+
after(() => {
61+
cy.task("stop:containers");
62+
});
63+
64+
it("Add otlp registry", () => {
65+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
66+
cy.get("#model-browser-root___registry").should("be.visible").click();
67+
cy.addInTable("model-browser-children-table");
68+
// First registry added: wizard shows radio button step, otlp has no required fields
69+
cy.get("input[type='radio'][value='otlp']").check();
70+
cy.confirmNextInWizard();
71+
cy.confirmFinishInWizard();
72+
cy.verifySuccess();
73+
});
74+
75+
it("Add prometheus registry", function () {
76+
cy.skipIf(cy.isEAP(managementEndpoint), this);
77+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
78+
cy.get("#model-browser-root___registry").should("be.visible").click();
79+
cy.addInTable("model-browser-children-table");
80+
// Second registry added: wizard skips radio button step, prometheus requires context
81+
cy.text(addWizardFormId, "context", prometheusContext);
82+
cy.confirmAddResourceWizard();
83+
cy.verifySuccess();
84+
});
85+
86+
it("Edit endpoint", () => {
87+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
88+
cy.get("#model-browser-root___registry > .jstree-ocl").click();
89+
cy.get("#model-browser-root___registry___otlp").should("be.visible").click();
90+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
91+
editForm();
92+
cy.text(configurationFormIdNoDash, endpoint, endpointCustomValue);
93+
cy.saveForm(configurationFormIdNoDash);
94+
cy.verifySuccess();
95+
cy.verifyAttribute(managementEndpoint, address, endpoint, endpointCustomValue);
96+
});
97+
98+
it("Edit step", () => {
99+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
100+
cy.get("#model-browser-root___registry > .jstree-ocl").click();
101+
cy.get("#model-browser-root___registry___otlp").should("be.visible").click();
102+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
103+
editForm();
104+
cy.text(configurationFormIdNoDash, step, stepCustomValue.toString());
105+
cy.saveForm(configurationFormIdNoDash);
106+
cy.verifySuccess();
107+
cy.verifyAttribute(managementEndpoint, address, step, stepCustomValue);
108+
});
109+
110+
it("Edit endpoint with expression", () => {
111+
const endpointExpressionSelector = `input#${configurationFormIdNoDash}-${endpoint}-editing.form-control`;
112+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
113+
cy.get("#model-browser-root___registry > .jstree-ocl").click();
114+
cy.get("#model-browser-root___registry___otlp").should("be.visible").click();
115+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
116+
editForm();
117+
cy.textExpression(configurationFormIdNoDash, endpoint, endpointExpressionValue, {
118+
selector: endpointExpressionSelector,
119+
});
120+
cy.saveForm(configurationFormIdNoDash);
121+
cy.get(".toast-notifications-list-pf .alert").should("be.visible");
122+
cy.verifyAttributeAsExpression(managementEndpoint, address, endpoint, endpointExpressionValue);
123+
});
124+
125+
it("Edit step with expression", () => {
126+
const stepExpressionSelector = `input#${configurationFormIdNoDash}-${step}-editing.form-control`;
127+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
128+
cy.get("#model-browser-root___registry > .jstree-ocl").click();
129+
cy.get("#model-browser-root___registry___otlp").should("be.visible").click();
130+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
131+
editForm();
132+
cy.textExpression(configurationFormIdNoDash, step, stepExpressionValue, {
133+
selector: stepExpressionSelector,
134+
});
135+
cy.saveForm(configurationFormIdNoDash);
136+
cy.get(".toast-notifications-list-pf .alert").should("be.visible");
137+
cy.verifyAttributeAsExpression(managementEndpoint, address, step, stepExpressionValue);
138+
});
139+
140+
it("Reset configuration", () => {
141+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
142+
cy.get("#model-browser-root___registry > .jstree-ocl").click();
143+
cy.get("#model-browser-root___registry___otlp").should("be.visible").click();
144+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
145+
cy.resetForm(configurationFormId, managementEndpoint, address);
146+
});
147+
});
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
describe("TESTS: Configuration => Subsystem => Micrometer => Registry => Prometheus", () => {
2+
const subsystemAddress = ["subsystem", "micrometer"];
3+
const address = ["subsystem", "micrometer", "registry", "prometheus"];
4+
// HAL generates form IDs with triple-dash separators for child resources,
5+
// but collapses them to single dashes in some sub-elements (editing div, save button).
6+
const configurationFormId = "model-browser-model-browser-root---registry---prometheus-form";
7+
const configurationFormIdNoDash = "model-browser-model-browser-root-registry-prometheus-form";
8+
const addWizardFormId = "model-browser-root-registry-singleton-add";
9+
10+
const context = "context";
11+
// Default context is set to "/prometheus" to avoid a capability conflict with the metrics subsystem.
12+
// Both serve an HTTP management context, and "/metrics" is already taken by the metrics subsystem.
13+
const contextDefaultValue = "/prometheus";
14+
const contextCustomValue = "/prom-custom";
15+
const contextExpressionProperty = "micrometer.prometheus.context";
16+
const contextExpressionPropertyValue = "/prom-expression";
17+
const contextExpressionValue = "${micrometer.prometheus.context}";
18+
19+
const securityEnabled = "security-enabled";
20+
21+
let managementEndpoint: string;
22+
23+
// Workaround for JBEAP-28819 - child resource form IDs use triple-dash separators
24+
// for the container but single-dash for the editing div.
25+
function editForm() {
26+
const editButton = "#" + configurationFormId + ' a.clickable[data-operation="edit"]';
27+
cy.get(`#${configurationFormIdNoDash}-editing`).should("not.be.visible");
28+
cy.get(editButton).click();
29+
for (let reClickTry = 0; reClickTry < 5; reClickTry++) {
30+
cy.get(editButton).then(($button) => {
31+
if ($button.is(":visible")) {
32+
cy.get(editButton).click();
33+
}
34+
});
35+
}
36+
cy.get(`#${configurationFormIdNoDash}-editing`).should("be.visible");
37+
}
38+
39+
before(() => {
40+
cy.startWildflyContainer().then((result) => {
41+
managementEndpoint = result as string;
42+
// The micrometer extension is not part of the base configuration, so it must be added explicitly
43+
cy.addAddress(managementEndpoint, ["extension", "org.wildfly.extension.micrometer"], {});
44+
// Register the micrometer subsystem as a parent for the registries
45+
cy.addAddress(managementEndpoint, subsystemAddress, {});
46+
// System property used as expression resolution target in the expression test
47+
cy.addAddress(managementEndpoint, ["system-property", contextExpressionProperty], {
48+
value: contextExpressionPropertyValue,
49+
});
50+
});
51+
});
52+
53+
after(() => {
54+
cy.task("stop:containers");
55+
});
56+
57+
it("Add otlp registry", function () {
58+
cy.skipIf(cy.isEAP(managementEndpoint), this);
59+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
60+
cy.get("#model-browser-root___registry").should("be.visible").click();
61+
cy.addInTable("model-browser-children-table");
62+
// First registry added: wizard shows radio button step, otlp has no required fields
63+
cy.get("input[type='radio'][value='otlp']").check();
64+
cy.confirmNextInWizard();
65+
cy.confirmFinishInWizard();
66+
cy.verifySuccess();
67+
});
68+
69+
it("Add prometheus registry", function () {
70+
cy.skipIf(cy.isEAP(managementEndpoint), this);
71+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
72+
cy.get("#model-browser-root___registry").should("be.visible").click();
73+
cy.addInTable("model-browser-children-table");
74+
// Second registry added: wizard skips radio button step, prometheus requires context
75+
cy.text(addWizardFormId, context, contextDefaultValue);
76+
cy.confirmAddResourceWizard();
77+
cy.verifySuccess();
78+
cy.verifyAttribute(managementEndpoint, address, context, contextDefaultValue);
79+
});
80+
81+
it("Edit context", function () {
82+
cy.skipIf(cy.isEAP(managementEndpoint), this);
83+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
84+
cy.get("#model-browser-root___registry > .jstree-ocl").click();
85+
cy.get("#model-browser-root___registry___prometheus").should("be.visible").click();
86+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
87+
editForm();
88+
cy.text(configurationFormIdNoDash, context, contextCustomValue);
89+
cy.saveForm(configurationFormIdNoDash);
90+
cy.verifySuccess();
91+
cy.verifyAttribute(managementEndpoint, address, context, contextCustomValue);
92+
});
93+
94+
it("Toggle security-enabled", function () {
95+
cy.skipIf(cy.isEAP(managementEndpoint), this);
96+
cy.readAttributeAsBoolean(managementEndpoint, address, securityEnabled).then((defaultValue: boolean) => {
97+
cy.navigateToGenericSubsystemPage(managementEndpoint, address);
98+
cy.get("#model-browser-root___registry > .jstree-ocl").click();
99+
cy.get("#model-browser-root___registry___prometheus").should("be.visible").click();
100+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
101+
editForm();
102+
cy.flip(configurationFormIdNoDash, securityEnabled, defaultValue);
103+
cy.saveForm(configurationFormIdNoDash);
104+
cy.verifySuccess();
105+
cy.verifyAttribute(managementEndpoint, address, securityEnabled, !defaultValue);
106+
});
107+
});
108+
109+
it("Edit context with expression", function () {
110+
cy.skipIf(cy.isEAP(managementEndpoint), this);
111+
const contextExpressionSelector = `input#${configurationFormIdNoDash}-${context}-editing.form-control`;
112+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
113+
cy.get("#model-browser-root___registry > .jstree-ocl").click();
114+
cy.get("#model-browser-root___registry___prometheus").should("be.visible").click();
115+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
116+
editForm();
117+
cy.textExpression(configurationFormIdNoDash, context, contextExpressionValue, {
118+
selector: contextExpressionSelector,
119+
});
120+
cy.saveForm(configurationFormIdNoDash);
121+
cy.get(".toast-notifications-list-pf .alert").should("be.visible");
122+
cy.verifyAttributeAsExpression(managementEndpoint, address, context, contextExpressionValue);
123+
});
124+
125+
it("Reset configuration", function () {
126+
cy.skipIf(cy.isEAP(managementEndpoint), this);
127+
cy.navigateToGenericSubsystemPage(managementEndpoint, subsystemAddress);
128+
cy.get("#model-browser-root___registry > .jstree-ocl").click();
129+
cy.get("#model-browser-root___registry___prometheus").should("be.visible").click();
130+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
131+
cy.resetForm(configurationFormId, managementEndpoint, address);
132+
});
133+
});
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
describe("TESTS: Configuration => Subsystem => Micrometer", () => {
2+
const address = ["subsystem", "micrometer"];
3+
const configurationFormId = "model-browser-model-browser-root-form";
4+
5+
const endpoint = "endpoint";
6+
const endpointCustomValue = "http://otel-collector:4318/v1/metrics";
7+
const endpointExpressionProperty = "micrometer.endpoint";
8+
const endpointExpressionPropertyValue = "http://expression-endpoint:4318/v1/metrics";
9+
const endpointExpressionValue = "${micrometer.endpoint}";
10+
11+
const step = "step";
12+
const stepCustomValue = 30;
13+
const stepExpressionProperty = "micrometer.step";
14+
const stepExpressionPropertyValue = "45";
15+
const stepExpressionValue = "${micrometer.step}";
16+
17+
let managementEndpoint: string;
18+
19+
before(() => {
20+
cy.startWildflyContainer().then((result) => {
21+
managementEndpoint = result as string;
22+
// The micrometer extension is not part of the base configuration, so it must be added explicitly
23+
cy.addAddress(managementEndpoint, ["extension", "org.wildfly.extension.micrometer"], {});
24+
// Register the micrometer subsystem so its attributes can be configured and tested
25+
cy.addAddress(managementEndpoint, address, {});
26+
// System properties used as expression resolution targets in the expression tests
27+
cy.addAddress(managementEndpoint, ["system-property", endpointExpressionProperty], {
28+
value: endpointExpressionPropertyValue,
29+
});
30+
cy.addAddress(managementEndpoint, ["system-property", stepExpressionProperty], {
31+
value: stepExpressionPropertyValue,
32+
});
33+
});
34+
});
35+
36+
after(() => {
37+
cy.task("stop:containers");
38+
});
39+
40+
it("Edit endpoint", () => {
41+
cy.navigateToGenericSubsystemPage(managementEndpoint, address);
42+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
43+
cy.editForm(configurationFormId);
44+
cy.text(configurationFormId, endpoint, endpointCustomValue);
45+
cy.saveForm(configurationFormId);
46+
cy.verifySuccess();
47+
cy.verifyAttribute(managementEndpoint, address, endpoint, endpointCustomValue);
48+
});
49+
50+
// Verify that top-level otlp-registry attributes are aliases to the registry=otlp sub-resource.
51+
// Writing endpoint at the subsystem root should be reflected in registry=otlp.
52+
it("Verify endpoint is aliased to registry=otlp", () => {
53+
cy.verifyAttribute(
54+
managementEndpoint,
55+
["subsystem", "micrometer", "registry", "otlp"],
56+
endpoint,
57+
endpointCustomValue,
58+
);
59+
});
60+
61+
it("Edit step", () => {
62+
cy.navigateToGenericSubsystemPage(managementEndpoint, address);
63+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
64+
cy.editForm(configurationFormId);
65+
cy.text(configurationFormId, step, stepCustomValue.toString());
66+
cy.saveForm(configurationFormId);
67+
cy.verifySuccess();
68+
cy.verifyAttribute(managementEndpoint, address, step, stepCustomValue);
69+
});
70+
71+
it("Edit endpoint with expression", () => {
72+
const endpointExpressionSelector = `input#${configurationFormId}-${endpoint}-editing.form-control`;
73+
cy.navigateToGenericSubsystemPage(managementEndpoint, address);
74+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
75+
cy.editForm(configurationFormId);
76+
cy.textExpression(configurationFormId, endpoint, endpointExpressionValue, {
77+
selector: endpointExpressionSelector,
78+
});
79+
cy.saveForm(configurationFormId);
80+
cy.get(".toast-notifications-list-pf .alert").should("be.visible");
81+
cy.verifyAttributeAsExpression(managementEndpoint, address, endpoint, endpointExpressionValue);
82+
});
83+
84+
it("Edit step with expression", () => {
85+
const stepExpressionSelector = `input#${configurationFormId}-${step}-editing.form-control`;
86+
cy.navigateToGenericSubsystemPage(managementEndpoint, address);
87+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
88+
cy.editForm(configurationFormId);
89+
cy.textExpression(configurationFormId, step, stepExpressionValue, {
90+
selector: stepExpressionSelector,
91+
});
92+
cy.saveForm(configurationFormId);
93+
cy.get(".toast-notifications-list-pf .alert").should("be.visible");
94+
cy.verifyAttributeAsExpression(managementEndpoint, address, step, stepExpressionValue);
95+
});
96+
97+
it("Reset configuration", () => {
98+
cy.navigateToGenericSubsystemPage(managementEndpoint, address);
99+
cy.get('#model-browser-resource-tab-container a[href="#model-browser-resource-data-tab"]').click();
100+
cy.get('#model-browser-model-browser-root-form-links > [data-toggle="tooltip"]');
101+
cy.resetForm(configurationFormId, managementEndpoint, address);
102+
});
103+
});

0 commit comments

Comments
 (0)