diff --git a/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/HawkbitMgmtClient.java b/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/HawkbitMgmtClient.java index d98dafad1..76f83b730 100644 --- a/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/HawkbitMgmtClient.java +++ b/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/HawkbitMgmtClient.java @@ -23,6 +23,7 @@ import org.eclipse.hawkbit.mgmt.rest.api.MgmtTargetFilterQueryRestApi; import org.eclipse.hawkbit.mgmt.rest.api.MgmtTargetRestApi; import org.eclipse.hawkbit.mgmt.rest.api.MgmtTargetTagRestApi; import org.eclipse.hawkbit.mgmt.rest.api.MgmtTargetTypeRestApi; +import org.eclipse.hawkbit.mgmt.rest.api.MgmtTenantManagementRestApi; import org.springframework.http.ResponseEntity; import java.util.function.Supplier; @@ -42,6 +43,7 @@ public class HawkbitMgmtClient { private final MgmtTargetTagRestApi targetTagRestApi; private final MgmtTargetFilterQueryRestApi targetFilterQueryRestApi; private final MgmtRolloutRestApi rolloutRestApi; + private final MgmtTenantManagementRestApi tenantManagementRestApi; HawkbitMgmtClient(final Tenant tenant, final HawkbitClient hawkbitClient) { this.tenant = tenant; @@ -57,6 +59,7 @@ public class HawkbitMgmtClient { targetTagRestApi = service(MgmtTargetTagRestApi.class); targetFilterQueryRestApi = service(MgmtTargetFilterQueryRestApi.class); rolloutRestApi = service(MgmtRolloutRestApi.class); + tenantManagementRestApi = service(MgmtTenantManagementRestApi.class); } boolean hasSoftwareModulesRead() { @@ -74,6 +77,9 @@ public class HawkbitMgmtClient { boolean hasTargetRead() { return hasRead(() -> targetRestApi.getTarget("_#ETE$ER")); } + boolean hasConfigRead() { + return hasRead(() -> tenantManagementRestApi.getTenantConfigurationValue("_#ETE$ER")); + } private boolean hasRead(final Supplier> doCall) { try { diff --git a/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/MainLayout.java b/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/MainLayout.java index 2ee52a3f9..a98868806 100644 --- a/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/MainLayout.java +++ b/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/MainLayout.java @@ -13,6 +13,7 @@ import org.eclipse.hawkbit.ui.simple.view.TargetView; import org.eclipse.hawkbit.ui.simple.view.RolloutView; import org.eclipse.hawkbit.ui.simple.security.AuthenticatedUser; import org.eclipse.hawkbit.ui.simple.view.AboutView; +import org.eclipse.hawkbit.ui.simple.view.ConfigView; import org.eclipse.hawkbit.ui.simple.view.DistributionSetView; import org.eclipse.hawkbit.ui.simple.view.SoftwareModuleView; import com.vaadin.flow.component.Unit; @@ -102,6 +103,9 @@ public class MainLayout extends AppLayout { if (accessChecker.hasAccess(SoftwareModuleView.class)) { nav.addItem(new SideNavItem("Software Modules", SoftwareModuleView.class, VaadinIcon.FILE.create())); } + if (accessChecker.hasAccess(ConfigView.class)) { + nav.addItem(new SideNavItem("Config", ConfigView.class, VaadinIcon.COG.create())); + } if (accessChecker.hasAccess(AboutView.class)) { nav.addItem(new SideNavItem("About", AboutView.class, VaadinIcon.INFO_CIRCLE.create())); } diff --git a/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/SimpleUIApp.java b/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/SimpleUIApp.java index 8ff7f6b0b..3e3e1452d 100644 --- a/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/SimpleUIApp.java +++ b/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/SimpleUIApp.java @@ -110,6 +110,9 @@ public class SimpleUIApp implements AppShellConfigurator { if (hawkbitClient.hasTargetRead()) { roles.add("TARGET_READ"); } + if (hawkbitClient.hasConfigRead()) { + roles.add("CONFIG_READ"); + } } finally { SecurityContextHolder.setContext(currentContext); } diff --git a/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/view/ConfigView.java b/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/view/ConfigView.java new file mode 100644 index 000000000..d22bad094 --- /dev/null +++ b/hawkbit-runtime/hawkbit-simple-ui/src/main/java/org/eclipse/hawkbit/ui/simple/view/ConfigView.java @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2023 Contributors to the Eclipse Foundation + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.hawkbit.ui.simple.view; + +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.hawkbit.ui.simple.HawkbitMgmtClient; +import org.eclipse.hawkbit.ui.simple.MainLayout; +import org.eclipse.hawkbit.mgmt.json.model.system.MgmtSystemTenantConfigurationValueRequest; + +import com.vaadin.flow.component.Key; +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.checkbox.Checkbox; +import com.vaadin.flow.component.Component; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.textfield.TextField; +import com.vaadin.flow.component.textfield.NumberField; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import jakarta.annotation.security.RolesAllowed; + +@PageTitle("Config") +@Route(value = "config", layout = MainLayout.class) +@RolesAllowed({ "CONFIG_READ" }) +public class ConfigView extends VerticalLayout { + private final Map configValue = new HashMap(); + + public ConfigView(final HawkbitMgmtClient hawkbitClient) { + setSpacing(false); + Button saveButton = new Button("Save"); + hawkbitClient.getTenantManagementRestApi().getTenantConfiguration().getBody().forEach((k, v) -> { + Component value = null; + if (v.getValue() instanceof String) { + TextField tf = new TextField(k, v.getValue().toString(), event -> { + MgmtSystemTenantConfigurationValueRequest vre = new MgmtSystemTenantConfigurationValueRequest(); + vre.setValue(event.getValue()); + configValue.put(k, vre); + }); + tf.getElement().getStyle().set("width", "300px"); + value = tf; + } else if (v.getValue() instanceof Boolean) { + value = new Checkbox(k, (Boolean) v.getValue(), event -> { + MgmtSystemTenantConfigurationValueRequest vre = new MgmtSystemTenantConfigurationValueRequest(); + vre.setValue(event.getValue()); + configValue.put(k, vre); + }); + } else if (v.getValue() instanceof Long) { + Double d = (double) ((Long) v.getValue()); + NumberField nf = new NumberField(k, d, event -> { + MgmtSystemTenantConfigurationValueRequest vre = new MgmtSystemTenantConfigurationValueRequest(); + vre.setValue(event.getValue()); + configValue.put(k, vre); + }); + nf.getElement().getStyle().set("width", "300px"); + value = nf; + } else if (v.getValue() instanceof Integer) { + Double d = (double) ((Integer) v.getValue()); + NumberField nf = new NumberField(k, d, event -> { + MgmtSystemTenantConfigurationValueRequest vre = new MgmtSystemTenantConfigurationValueRequest(); + vre.setValue(event.getValue()); + configValue.put(k, vre); + }); + nf.getElement().getStyle().set("width", "300px"); + value = nf; + } else { + System.out.println(k + ":" + v); + } + if (value != null) { + add(value); + } + }); + + saveButton.addClickListener(click -> { + configValue.forEach((key, value) -> { + hawkbitClient.getTenantManagementRestApi().updateTenantConfigurationValue(key, value); + }); + }); + saveButton.addClickShortcut(Key.ENTER); + add(saveButton); + } +}