@@ -32,6 +33,12 @@ import { directive as onClickaway } from 'vue3-click-away';
export default {
directives: { onClickaway },
+ props: {
+ title: {
+ type: String,
+ default: '',
+ },
+ },
emits: ['click'],
data() {
return {
diff --git a/spring-boot-admin-server-ui/src/main/frontend/services/instance.ts b/spring-boot-admin-server-ui/src/main/frontend/services/instance.ts
index b3c7d87e436..fdb5993ef9a 100644
--- a/spring-boot-admin-server-ui/src/main/frontend/services/instance.ts
+++ b/spring-boot-admin-server-ui/src/main/frontend/services/instance.ts
@@ -218,6 +218,10 @@ class Instance {
return this.axios.post(uri`actuator/refresh`);
}
+ async busRefreshContext() {
+ return this.axios.post(uri`actuator/busrefresh`);
+ }
+
async fetchLiquibase() {
return this.axios.get(uri`actuator/liquibase`);
}
diff --git a/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/busrefresh.spec.ts b/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/busrefresh.spec.ts
new file mode 100644
index 00000000000..ee1e68996ce
--- /dev/null
+++ b/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/busrefresh.spec.ts
@@ -0,0 +1,61 @@
+import userEvent from '@testing-library/user-event';
+import { screen } from '@testing-library/vue';
+import { HttpResponse, http } from 'msw';
+import { beforeEach, describe, expect, it, vi } from 'vitest';
+
+import { server } from '@/mocks/server';
+import Instance from '@/services/instance';
+import { render } from '@/test-utils';
+import Busrefresh from '@/views/instances/env/busrefresh.vue';
+
+describe('Busrefresh', () => {
+ const busRefreshInstanceContextMock = vi.fn();
+ let emitted;
+
+ function createInstance() {
+ const instance = new Instance({ id: 1233 });
+ instance.busRefreshContext = busRefreshInstanceContextMock;
+ return instance;
+ }
+
+ beforeEach(async () => {
+ server.use(
+ http.post('/instances/:instanceId/actuator/busrefresh', () => {
+ return HttpResponse.json({});
+ }),
+ );
+ const vm = render(Busrefresh, {
+ props: {
+ instance: createInstance(),
+ },
+ });
+ emitted = vm.emitted;
+ });
+
+ it('should trigger busrefresh on confirm', async () => {
+ busRefreshInstanceContextMock.mockResolvedValue({});
+ const busRefreshButton = await screen.findByText(
+ 'instances.env.bus_refresh',
+ );
+ await userEvent.click(busRefreshButton);
+
+ const confirmButton = await screen.findByText('Confirm');
+ await userEvent.click(confirmButton);
+
+ expect(emitted().refresh[0][0]).toBe(true);
+ });
+
+ it('should handle busrefresh failure gracefully', async () => {
+ busRefreshInstanceContextMock.mockRejectedValueOnce(new Error());
+
+ const busRefreshButton = await screen.findByText(
+ 'instances.env.bus_refresh',
+ );
+ await userEvent.click(busRefreshButton);
+
+ const confirmButton = await screen.findByText('Confirm');
+ await userEvent.click(confirmButton);
+
+ expect(emitted().refresh).toBeUndefined();
+ });
+});
diff --git a/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/busrefresh.vue b/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/busrefresh.vue
new file mode 100644
index 00000000000..80c02b20ece
--- /dev/null
+++ b/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/busrefresh.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
diff --git a/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/i18n.de.json b/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/i18n.de.json
index 3980d9b379d..9ea1375ef7c 100644
--- a/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/i18n.de.json
+++ b/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/i18n.de.json
@@ -5,6 +5,10 @@
"manager": "Umgebungskonfiguration anpassen",
"active_profile": "Profil",
"context_refresh": "Kontext neu laden",
+ "bus_refresh": "Spring Cloud Bus-refresh",
+ "bus_refresh_success": "Spring Cloud Bus Refresh erfolgreich!",
+ "bus_refresh_failure": "Fehlgeschlagen: Konnte Spring Cloud Bus Refresh nicht ausführen!",
+ "bus_refresh_title": "Sendet eine Refresh Message an den konfigurierten Spring Cloud Bus, der eine Refresh Message an alle verbundenen Nodes sendet",
"context_refresh_failed": "Fehlgeschlagen",
"context_refreshed": "Erfolreich!",
"context_reset": "Zurücksetzen",
diff --git a/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/i18n.en.json b/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/i18n.en.json
index 4aae46c6b68..36c08673cde 100644
--- a/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/i18n.en.json
+++ b/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/i18n.en.json
@@ -5,6 +5,10 @@
"manager": "Environment Manager",
"active_profile": "Profile",
"context_refresh": "Refresh context",
+ "bus_refresh": "Spring Cloud Bus-refresh",
+ "bus_refresh_success": "Spring Cloud Bus successfully refreshed.",
+ "bus_refresh_failure": "Failure: Unable to trigger Spring Cloud Bus refresh!",
+ "bus_refresh_title": "Sends a refresh message to the configured Spring Cloud Bus which broadcasts a refresh to all nodes listening",
"context_refresh_failed": "Failed",
"context_refreshed": "Context refreshed",
"context_reset": "Reset",
diff --git a/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/index.vue b/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/index.vue
index e51c12138ee..42db366b6fa 100644
--- a/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/index.vue
+++ b/spring-boot-admin-server-ui/src/main/frontend/views/instances/env/index.vue
@@ -26,6 +26,9 @@
@refresh="fetchEnv"
/>
+
+
+
(propertySource) => {
};
export default {
- components: { SbaInstanceSection, sbaEnvManager, refresh },
+ components: { Busrefresh, SbaInstanceSection, sbaEnvManager, refresh },
props: {
instance: {
type: Instance,