This is an automated email from the ASF dual-hosted git repository.

wuzhiguo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bigtop-manager.git


The following commit(s) were added to refs/heads/main by this push:
     new a9aa638  BIGTOP-4163: Add quick links for service (#20)
a9aa638 is described below

commit a9aa638e6b452fa822eee047e68459b070fe50b5
Author: Zhiguo Wu <[email protected]>
AuthorDate: Thu Jul 18 17:55:22 2024 +0800

    BIGTOP-4163: Add quick links for service (#20)
---
 .../bigtop/manager/agent/utils/LogFileUtils.java   |  4 +-
 .../bigtop/manager/common/utils/JsonUtils.java     | 18 +++++++
 .../bigtop/manager/dao/entity/Component.java       |  3 ++
 .../apache/bigtop/manager/dao/entity/Service.java  |  2 +-
 .../manager/server/controller/SseController.java   |  4 +-
 .../manager/server/model/dto/ComponentDTO.java     |  2 +
 .../dto/{ComponentDTO.java => QuickLinkDTO.java}   | 14 ++---
 .../server/model/mapper/ComponentMapper.java       |  1 +
 .../vo/QuickLinkVO.java}                           | 12 ++++-
 .../bigtop/manager/server/model/vo/ServiceVO.java  |  2 +
 .../server/service/impl/ServiceServiceImpl.java    | 62 +++++++++++++++++++++-
 .../manager/server/stack/pojo/ComponentModel.java  |  3 ++
 .../manager/server/stack/pojo/QuickLinkModel.java  | 26 ++++++++-
 .../services/hdfs/configuration/hdfs-site.xml      |  2 +-
 .../stacks/bigtop/3.3.0/services/hdfs/metainfo.xml |  7 +++
 .../services/yarn/configuration/yarn-site.xml      | 20 +++----
 .../stacks/bigtop/3.3.0/services/yarn/metainfo.xml |  7 +++
 .../nop/1.0.0/services/zookeeper/metainfo.xml      |  7 +++
 .../stack/bigtop/v3_3_0/hdfs/HdfsParams.java       | 11 ----
 .../stack/bigtop/v3_3_0/yarn/YarnParams.java       | 12 -----
 bigtop-manager-ui/src/api/service/types.ts         |  6 +++
 bigtop-manager-ui/src/locales/en_US/service.ts     |  3 +-
 bigtop-manager-ui/src/locales/zh_CN/service.ts     |  3 +-
 bigtop-manager-ui/src/pages/service/index.vue      | 38 ++++++++-----
 24 files changed, 203 insertions(+), 66 deletions(-)

diff --git 
a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/utils/LogFileUtils.java
 
b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/utils/LogFileUtils.java
index e87929a..de3f482 100644
--- 
a/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/utils/LogFileUtils.java
+++ 
b/bigtop-manager-agent/src/main/java/org/apache/bigtop/manager/agent/utils/LogFileUtils.java
@@ -18,6 +18,8 @@
  */
 package org.apache.bigtop.manager.agent.utils;
 
+import org.apache.bigtop.manager.common.utils.Environments;
+
 import org.apache.commons.lang3.SystemUtils;
 
 import java.io.File;
@@ -26,7 +28,7 @@ public class LogFileUtils {
 
     public static String getLogFilePath(Long taskId) {
         String baseDir;
-        if (SystemUtils.IS_OS_WINDOWS) {
+        if (Environments.isDevMode()) {
             baseDir = SystemUtils.getUserDir().getPath();
         } else {
             File file = new File(LogFileUtils.class
diff --git 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/utils/JsonUtils.java
 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/utils/JsonUtils.java
index 787d369..963b48a 100644
--- 
a/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/utils/JsonUtils.java
+++ 
b/bigtop-manager-common/src/main/java/org/apache/bigtop/manager/common/utils/JsonUtils.java
@@ -18,6 +18,7 @@
  */
 package org.apache.bigtop.manager.common.utils;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -34,6 +35,7 @@ public class JsonUtils {
     static {
         OBJECTMAPPER = new ObjectMapper();
         
OBJECTMAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, 
false);
+        OBJECTMAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
     }
 
     public static <T> void writeToFile(String fileName, T obj) {
@@ -73,6 +75,10 @@ public class JsonUtils {
     }
 
     public static <T> T readFromString(String json) {
+        if (json == null) {
+            return null;
+        }
+
         try {
             return OBJECTMAPPER.readValue(json, new TypeReference<>() {});
         } catch (Exception e) {
@@ -81,6 +87,10 @@ public class JsonUtils {
     }
 
     public static <T> T readFromString(String json, TypeReference<T> 
typeReference) {
+        if (json == null) {
+            return null;
+        }
+
         try {
             return OBJECTMAPPER.readValue(json, typeReference);
         } catch (Exception e) {
@@ -89,6 +99,10 @@ public class JsonUtils {
     }
 
     public static <T> T readFromString(String json, Class<T> clazz) {
+        if (json == null) {
+            return null;
+        }
+
         try {
             return OBJECTMAPPER.readValue(json, clazz);
         } catch (Exception e) {
@@ -105,6 +119,10 @@ public class JsonUtils {
     }
 
     public static <T> String writeAsString(T obj) {
+        if (obj == null) {
+            return null;
+        }
+
         try {
             return OBJECTMAPPER.writeValueAsString(obj);
         } catch (Exception e) {
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Component.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Component.java
index e7597e5..a2411c4 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Component.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Component.java
@@ -81,6 +81,9 @@ public class Component extends BaseEntity {
     @Column(name = "category")
     private String category;
 
+    @Column(name = "quick_link")
+    private String quickLink;
+
     @ManyToOne
     @JoinColumn(name = "service_id", foreignKey = 
@ForeignKey(ConstraintMode.NO_CONSTRAINT))
     private Service service;
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Service.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Service.java
index af9bcd8..eca5499 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Service.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/entity/Service.java
@@ -79,7 +79,7 @@ public class Service extends BaseEntity {
     @Column(name = "service_group")
     private String serviceGroup;
 
-    @Column(name = "required_service")
+    @Column(name = "required_services")
     private String requiredServices;
 
     @ManyToOne
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/SseController.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/SseController.java
index 7ed8642..9309a74 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/SseController.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/controller/SseController.java
@@ -44,8 +44,8 @@ public class SseController {
     @Operation(summary = "get task log", description = "Get a task log")
     @GetMapping("/tasks/{id}/log")
     public SseEmitter log(@PathVariable Long id, @PathVariable Long clusterId) 
{
-        // Default timeout to 5 minutes
-        SseEmitter emitter = new SseEmitter(5 * 60 * 1000L);
+        // Default timeout to 30 minutes
+        SseEmitter emitter = new SseEmitter(30 * 60 * 1000L);
 
         Flux<String> flux =
                 Flux.create(sink -> taskLogService.registerSink(id, sink), 
FluxSink.OverflowStrategy.BUFFER);
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentDTO.java
index 3589161..8f42108 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentDTO.java
@@ -36,4 +36,6 @@ public class ComponentDTO {
     private ScriptDTO commandScript;
 
     private List<CustomCommandDTO> customCommands;
+
+    private QuickLinkDTO quickLink;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentDTO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/QuickLinkDTO.java
similarity index 79%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentDTO.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/QuickLinkDTO.java
index 3589161..9db2a09 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ComponentDTO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/QuickLinkDTO.java
@@ -20,20 +20,16 @@ package org.apache.bigtop.manager.server.model.dto;
 
 import lombok.Data;
 
-import java.util.List;
-
 @Data
-public class ComponentDTO {
-
-    private String componentName;
+public class QuickLinkDTO {
 
     private String displayName;
 
-    private String category;
+    private String httpPortProperty;
 
-    private String cardinality;
+    private String httpPortDefault;
 
-    private ScriptDTO commandScript;
+    private String httpsPortProperty;
 
-    private List<CustomCommandDTO> customCommands;
+    private String httpsPortDefault;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/ComponentMapper.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/ComponentMapper.java
index 43cec48..961967f 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/ComponentMapper.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/mapper/ComponentMapper.java
@@ -39,6 +39,7 @@ public interface ComponentMapper {
 
     @Mapping(target = "commandScript", source = "commandScript", 
qualifiedByName = "obj2Json")
     @Mapping(target = "customCommands", source = "customCommands", 
qualifiedByName = "obj2Json")
+    @Mapping(target = "quickLink", source = "quickLink", qualifiedByName = 
"obj2Json")
     @Mapping(target = "service", expression = "java(service)")
     @Mapping(target = "cluster", expression = "java(cluster)")
     Component fromDTO2Entity(ComponentDTO componentDTO, @Context Service 
service, @Context Cluster cluster);
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/QuickLinkModel.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/QuickLinkVO.java
similarity index 83%
copy from 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/QuickLinkModel.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/QuickLinkVO.java
index e688cbf..4567093 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/QuickLinkModel.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/QuickLinkVO.java
@@ -16,6 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.server.stack.pojo;
+package org.apache.bigtop.manager.server.model.vo;
 
-public class QuickLinkModel {}
+import lombok.Data;
+
+@Data
+public class QuickLinkVO {
+
+    private String displayName;
+
+    private String url;
+}
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ServiceVO.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ServiceVO.java
index 568fb4a..4310951 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ServiceVO.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/vo/ServiceVO.java
@@ -46,4 +46,6 @@ public class ServiceVO {
     private Boolean isClient;
 
     private Boolean isHealthy;
+
+    private List<QuickLinkVO> quickLinks;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
index 63fbbaa..8a13917 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ServiceServiceImpl.java
@@ -20,14 +20,28 @@ package org.apache.bigtop.manager.server.service.impl;
 
 import org.apache.bigtop.manager.common.constants.ComponentCategories;
 import org.apache.bigtop.manager.common.enums.MaintainState;
+import org.apache.bigtop.manager.common.utils.JsonUtils;
+import org.apache.bigtop.manager.dao.entity.Cluster;
+import org.apache.bigtop.manager.dao.entity.Component;
+import org.apache.bigtop.manager.dao.entity.Host;
 import org.apache.bigtop.manager.dao.entity.HostComponent;
 import org.apache.bigtop.manager.dao.entity.Service;
+import org.apache.bigtop.manager.dao.entity.ServiceConfig;
+import org.apache.bigtop.manager.dao.entity.TypeConfig;
 import org.apache.bigtop.manager.dao.repository.HostComponentRepository;
+import org.apache.bigtop.manager.dao.repository.ServiceConfigRepository;
 import org.apache.bigtop.manager.dao.repository.ServiceRepository;
+import org.apache.bigtop.manager.server.model.dto.PropertyDTO;
+import org.apache.bigtop.manager.server.model.dto.QuickLinkDTO;
+import org.apache.bigtop.manager.server.model.dto.TypeConfigDTO;
 import org.apache.bigtop.manager.server.model.mapper.ServiceMapper;
+import org.apache.bigtop.manager.server.model.mapper.TypeConfigMapper;
+import org.apache.bigtop.manager.server.model.vo.QuickLinkVO;
 import org.apache.bigtop.manager.server.model.vo.ServiceVO;
 import org.apache.bigtop.manager.server.service.ServiceService;
 
+import org.apache.commons.lang3.StringUtils;
+
 import lombok.extern.slf4j.Slf4j;
 
 import jakarta.annotation.Resource;
@@ -46,6 +60,9 @@ public class ServiceServiceImpl implements ServiceService {
     @Resource
     private HostComponentRepository hostComponentRepository;
 
+    @Resource
+    private ServiceConfigRepository serviceConfigRepository;
+
     @Override
     public List<ServiceVO> list(Long clusterId) {
         List<ServiceVO> res = new ArrayList<>();
@@ -58,11 +75,20 @@ public class ServiceServiceImpl implements ServiceService {
             List<HostComponent> hostComponents = entry.getValue();
             Service service = 
hostComponents.get(0).getComponent().getService();
             ServiceVO serviceVO = 
ServiceMapper.INSTANCE.fromEntity2VO(service);
+            serviceVO.setQuickLinks(new ArrayList<>());
 
             boolean isHealthy = true;
             boolean isClient = true;
             for (HostComponent hostComponent : hostComponents) {
-                String category = hostComponent.getComponent().getCategory();
+                Component component = hostComponent.getComponent();
+
+                String quickLink = component.getQuickLink();
+                if (StringUtils.isNotBlank(quickLink)) {
+                    QuickLinkVO quickLinkVO = resolveQuickLink(hostComponent, 
quickLink);
+                    serviceVO.getQuickLinks().add(quickLinkVO);
+                }
+
+                String category = component.getCategory();
                 if (!category.equalsIgnoreCase(ComponentCategories.CLIENT)) {
                     isClient = false;
                 }
@@ -88,4 +114,38 @@ public class ServiceServiceImpl implements ServiceService {
         Service service = serviceRepository.findById(id).orElse(new Service());
         return ServiceMapper.INSTANCE.fromEntity2VO(service);
     }
+
+    private QuickLinkVO resolveQuickLink(HostComponent hostComponent, String 
quickLinkJson) {
+        QuickLinkVO quickLinkVO = new QuickLinkVO();
+
+        QuickLinkDTO quickLinkDTO = JsonUtils.readFromString(quickLinkJson, 
QuickLinkDTO.class);
+        quickLinkVO.setDisplayName(quickLinkDTO.getDisplayName());
+
+        Component component = hostComponent.getComponent();
+        Cluster cluster = component.getCluster();
+        Host host = hostComponent.getHost();
+        Service service = component.getService();
+        ServiceConfig serviceConfig =
+                
serviceConfigRepository.findByClusterAndServiceAndSelectedIsTrue(cluster, 
service);
+        List<TypeConfig> typeConfigs = serviceConfig.getConfigs();
+
+        // Use HTTP for now, need to handle https in the future
+        for (TypeConfig typeConfig : typeConfigs) {
+            TypeConfigDTO typeConfigDTO = 
TypeConfigMapper.INSTANCE.fromEntity2DTO(typeConfig);
+            for (PropertyDTO propertyDTO : typeConfigDTO.getProperties()) {
+                if 
(propertyDTO.getName().equals(quickLinkDTO.getHttpPortProperty())) {
+                    String port = propertyDTO.getValue().contains(":")
+                            ? propertyDTO.getValue().split(":")[1]
+                            : propertyDTO.getValue();
+                    String url = "http://"; + host.getHostname() + ":" + port;
+                    quickLinkVO.setUrl(url);
+                    return quickLinkVO;
+                }
+            }
+        }
+
+        String url = "http://"; + host.getHostname() + ":" + 
quickLinkDTO.getHttpPortDefault();
+        quickLinkVO.setUrl(url);
+        return quickLinkVO;
+    }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/ComponentModel.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/ComponentModel.java
index ece81ab..10c5416 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/ComponentModel.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/ComponentModel.java
@@ -46,4 +46,7 @@ public class ComponentModel {
     @XmlElementWrapper(name = "custom-commands")
     @XmlElements(@XmlElement(name = "custom-command"))
     private List<CustomCommandModel> customCommands;
+
+    @XmlElement(name = "quick-link")
+    private QuickLinkModel quickLink;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/QuickLinkModel.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/QuickLinkModel.java
index e688cbf..f600333 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/QuickLinkModel.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/stack/pojo/QuickLinkModel.java
@@ -18,4 +18,28 @@
  */
 package org.apache.bigtop.manager.server.stack.pojo;
 
-public class QuickLinkModel {}
+import lombok.Data;
+
+import jakarta.xml.bind.annotation.XmlAccessType;
+import jakarta.xml.bind.annotation.XmlAccessorType;
+import jakarta.xml.bind.annotation.XmlElement;
+
+@Data
+@XmlAccessorType(XmlAccessType.FIELD)
+public class QuickLinkModel {
+
+    @XmlElement(name = "display-name")
+    private String displayName;
+
+    @XmlElement(name = "http-port-property")
+    private String httpPortProperty;
+
+    @XmlElement(name = "http-port-default")
+    private String httpPortDefault;
+
+    @XmlElement(name = "https-port-property")
+    private String httpsPortProperty;
+
+    @XmlElement(name = "https-port-default")
+    private String httpsPortDefault;
+}
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/configuration/hdfs-site.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/configuration/hdfs-site.xml
index bc3335e..74b2354 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/configuration/hdfs-site.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/configuration/hdfs-site.xml
@@ -179,7 +179,7 @@
     </property>
     <property>
         <name>dfs.namenode.rpc-address</name>
-        <value>localhost:8020</value>
+        <value>0.0.0.0:8020</value>
         <description>RPC address that handles all clients 
requests.</description>
     </property>
     <property>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/metainfo.xml
index 2d4f9f0..c2fc518 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/hdfs/metainfo.xml
@@ -57,6 +57,13 @@
                         </command-script>
                     </custom-command>
                 </custom-commands>
+                <quick-link>
+                    <display-name>NameNode UI</display-name>
+                    
<http-port-property>dfs.namenode.http-address</http-port-property>
+                    <http-port-default>50070</http-port-default>
+                    
<https-port-property>dfs.namenode.http-address</https-port-property>
+                    <https-port-default>50470</https-port-default>
+                </quick-link>
             </component>
             <component>
                 <name>datanode</name>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/configuration/yarn-site.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/configuration/yarn-site.xml
index f7d5dd3..996cb2e 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/configuration/yarn-site.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/configuration/yarn-site.xml
@@ -26,17 +26,17 @@
     </property>
     <property>
         <name>yarn.resourcemanager.resource-tracker.address</name>
-        <value>localhost:8025</value>
+        <value>0.0.0.0:8031</value>
         <description> The address of ResourceManager. </description>
     </property>
     <property>
         <name>yarn.resourcemanager.scheduler.address</name>
-        <value>localhost:8030</value>
+        <value>0.0.0.0:8030</value>
         <description>The address of the scheduler interface.</description>
     </property>
     <property>
         <name>yarn.resourcemanager.address</name>
-        <value>localhost:8050</value>
+        <value>0.0.0.0:8032</value>
         <description>
             The address of the applications manager interface in the
             RM.
@@ -44,7 +44,7 @@
     </property>
     <property>
         <name>yarn.resourcemanager.admin.address</name>
-        <value>localhost:8141</value>
+        <value>0.0.0.0:8033</value>
         <description>The address of the RM admin interface.</description>
     </property>
     <property>
@@ -277,14 +277,14 @@
     </property>
     <property>
         <name>yarn.resourcemanager.webapp.address</name>
-        <value>localhost:8088</value>
+        <value>0.0.0.0:8088</value>
         <description>
             The address of the RM web application.
         </description>
     </property>
     <property>
         <name>yarn.resourcemanager.webapp.https.address</name>
-        <value>localhost:8090</value>
+        <value>0.0.0.0:8090</value>
         <description>
             The https address of the RM web application.
         </description>
@@ -316,7 +316,7 @@
     <property>
         <name>manage.include.files</name>
         <value>false</value>
-        <description>If true Ambari will manage include file if
+        <description>If true this will manage include file if
             yarn.resourcemanager.nodes.include-path is 
configured.</description>
     </property>
     <property>
@@ -351,21 +351,21 @@
     </property>
     <property>
         <name>yarn.timeline-service.webapp.address</name>
-        <value>localhost:8188</value>
+        <value>0.0.0.0:8188</value>
         <description>
             The http address of the timeline service web application.
         </description>
     </property>
     <property>
         <name>yarn.timeline-service.webapp.https.address</name>
-        <value>localhost:8190</value>
+        <value>0.0.0.0:8190</value>
         <description>
             The http address of the timeline service web application.
         </description>
     </property>
     <property>
         <name>yarn.timeline-service.address</name>
-        <value>localhost:10200</value>
+        <value>0.0.0.0:10200</value>
         <description>
             This is default address for the timeline server to start
             the RPC server.
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/metainfo.xml
index d3fc224..44ea8ff 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/bigtop/3.3.0/services/yarn/metainfo.xml
@@ -57,6 +57,13 @@
                         </command-script>
                     </custom-command>
                 </custom-commands>
+                <quick-link>
+                    <display-name>ResourceManager UI</display-name>
+                    
<http-port-property>yarn.resourcemanager.webapp.address</http-port-property>
+                    <http-port-default>8088</http-port-default>
+                    
<https-port-property>yarn.resourcemanager.webapp.https.address</https-port-property>
+                    <https-port-default>8090</https-port-default>
+                </quick-link>
             </component>
             <component>
                 <name>nodemanager</name>
diff --git 
a/bigtop-manager-server/src/main/resources/stacks/nop/1.0.0/services/zookeeper/metainfo.xml
 
b/bigtop-manager-server/src/main/resources/stacks/nop/1.0.0/services/zookeeper/metainfo.xml
index 97b88cb..55db55e 100644
--- 
a/bigtop-manager-server/src/main/resources/stacks/nop/1.0.0/services/zookeeper/metainfo.xml
+++ 
b/bigtop-manager-server/src/main/resources/stacks/nop/1.0.0/services/zookeeper/metainfo.xml
@@ -42,6 +42,13 @@
                     <script-type>java</script-type>
                     <timeout>1200</timeout>
                 </command-script>
+                <quick-link>
+                    <display-name>ZooKeeper UI(Test)</display-name>
+                    <http-port-property>admin.serverPort</http-port-property>
+                    <http-port-default>9393</http-port-default>
+                    <https-port-property>admin.serverPort</https-port-property>
+                    <https-port-default>9393</https-port-default>
+                </quick-link>
             </component>
 
             <component>
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsParams.java
index 114e17d..24c8d61 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/hdfs/HdfsParams.java
@@ -97,17 +97,6 @@ public class HdfsParams extends BaseParams {
     @GlobalParams
     public Map<String, Object> hdfsSite() {
         Map<String, Object> hdfsSite = 
LocalSettings.configurations(serviceName(), "hdfs-site");
-        List<String> namenodeList = LocalSettings.hosts("namenode");
-        if (!namenodeList.isEmpty()) {
-            hdfsSite.put("dfs.namenode.rpc-address", 
MessageFormat.format("{0}:8020", namenodeList.get(0)));
-            hdfsSite.put("dfs.namenode.http-address", 
MessageFormat.format("{0}:50070", namenodeList.get(0)));
-            hdfsSite.put("dfs.namenode.https-address", 
MessageFormat.format("{0}:50470", namenodeList.get(0)));
-        }
-        List<String> snamenodeList = LocalSettings.hosts("secondary_namenode");
-        if (!snamenodeList.isEmpty()) {
-            hdfsSite.put(
-                    "dfs.namenode.secondary.http-address", 
MessageFormat.format("{0}:50090", snamenodeList.get(0)));
-        }
 
         dfsDataDir = (String) hdfsSite.get("dfs.datanode.data.dir");
         dfsNameNodeDir = (String) hdfsSite.get("dfs.namenode.name.dir");
diff --git 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnParams.java
 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnParams.java
index cc9e0eb..7b3f215 100644
--- 
a/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnParams.java
+++ 
b/bigtop-manager-stack/bigtop-manager-stack-bigtop/src/main/java/org/apache/bigtop/manager/stack/bigtop/v3_3_0/yarn/YarnParams.java
@@ -81,18 +81,6 @@ public class YarnParams extends BaseParams {
         List<String> resourcemanagerList = 
LocalSettings.hosts("resourcemanager");
         if (!resourcemanagerList.isEmpty()) {
             yarnSite.put("yarn.resourcemanager.hostname", 
MessageFormat.format("{0}", resourcemanagerList.get(0)));
-            yarnSite.put(
-                    "yarn.resourcemanager.resource-tracker.address",
-                    MessageFormat.format("{0}:8025", 
resourcemanagerList.get(0)));
-            yarnSite.put("yarn.resourcemanager.address", 
MessageFormat.format("{0}:8050", resourcemanagerList.get(0)));
-            yarnSite.put(
-                    "yarn.resourcemanager.admin.address", 
MessageFormat.format("{0}:8141", resourcemanagerList.get(0)));
-            yarnSite.put(
-                    "yarn.resourcemanager.webapp.address",
-                    MessageFormat.format("{0}:8088", 
resourcemanagerList.get(0)));
-            yarnSite.put(
-                    "yarn.resourcemanager.webapp.https.address",
-                    MessageFormat.format("{0}:8090", 
resourcemanagerList.get(0)));
         }
 
         rmNodesExcludeDir = (String) 
yarnSite.get("yarn.resourcemanager.nodes.exclude-path");
diff --git a/bigtop-manager-ui/src/api/service/types.ts 
b/bigtop-manager-ui/src/api/service/types.ts
index d4669ae..d6a5d0d 100644
--- a/bigtop-manager-ui/src/api/service/types.ts
+++ b/bigtop-manager-ui/src/api/service/types.ts
@@ -28,4 +28,10 @@ export interface ServiceVO {
   serviceGroup?: string
   isClient?: boolean
   isHealthy?: boolean
+  quickLinks?: QuickLinkVO[]
+}
+
+export interface QuickLinkVO {
+  displayName: string
+  url: string
 }
diff --git a/bigtop-manager-ui/src/locales/en_US/service.ts 
b/bigtop-manager-ui/src/locales/en_US/service.ts
index d003f77..06cb845 100644
--- a/bigtop-manager-ui/src/locales/en_US/service.ts
+++ b/bigtop-manager-ui/src/locales/en_US/service.ts
@@ -37,5 +37,6 @@ export default {
   summary: 'Summary',
   config: 'Config',
   components: 'Components',
-  quicklinks: 'Quick Links'
+  quick_links: 'Quick Links',
+  no_link: 'No Link'
 }
diff --git a/bigtop-manager-ui/src/locales/zh_CN/service.ts 
b/bigtop-manager-ui/src/locales/zh_CN/service.ts
index 3070cf2..dee4c8a 100644
--- a/bigtop-manager-ui/src/locales/zh_CN/service.ts
+++ b/bigtop-manager-ui/src/locales/zh_CN/service.ts
@@ -37,5 +37,6 @@ export default {
   summary: '总览',
   config: '配置',
   components: '组件',
-  quicklinks: '快速链接'
+  quick_links: '快速链接',
+  no_link: '无'
 }
diff --git a/bigtop-manager-ui/src/pages/service/index.vue 
b/bigtop-manager-ui/src/pages/service/index.vue
index c1c1d98..c05f821 100644
--- a/bigtop-manager-ui/src/pages/service/index.vue
+++ b/bigtop-manager-ui/src/pages/service/index.vue
@@ -18,7 +18,7 @@
 -->
 
 <script setup lang="ts">
-  import { onMounted, ref, watch } from 'vue'
+  import { computed, onMounted, ref, watch } from 'vue'
   import { useRoute } from 'vue-router'
   import type { SelectProps, MenuProps } from 'ant-design-vue'
   import {
@@ -32,6 +32,8 @@
   import { useComponentStore } from '@/store/component'
   import { HostComponentVO } from '@/api/component/types.ts'
   import DotState from '@/components/dot-state/index.vue'
+  import { useServiceStore } from '@/store/service'
+  import { ServiceVO } from '@/api/service/types.ts'
 
   const menuOps = [
     {
@@ -60,18 +62,18 @@
     Stopped: '#ff4d4f'
   }
 
-  const links = [
-    'NameNode UINameNode UINameNode',
-    'NameNode Logs',
-    'NameNode JMX',
-    'Thread Stacks'
-  ]
-
   const route = useRoute()
   const configStore = useConfigStore()
   const { allConfigs } = storeToRefs(configStore)
   const componentStore = useComponentStore()
   const { hostComponents } = storeToRefs(componentStore)
+  const serviceStore = useServiceStore()
+  const { installedServices } = storeToRefs(serviceStore)
+  const selectedService = computed(() => {
+    return installedServices.value.filter(
+      (service: ServiceVO) => service.serviceName === serviceName.value
+    )[0]
+  })
 
   const serviceName = ref<string>(route.params.serviceName as string)
 
@@ -217,13 +219,18 @@
           </div>
         </div>
         <div class="right-section">
-          <h2>{{ $t('service.quicklinks') }}</h2>
-          <ul v-if="links.length > 0">
-            <li v-for="link in links" :key="link">
-              <a>{{ link }}</a>
+          <h2>{{ $t('service.quick_links') }}</h2>
+          <ul
+            v-if="
+              selectedService.quickLinks &&
+              selectedService.quickLinks.length > 0
+            "
+          >
+            <li v-for="link in selectedService.quickLinks" :key="link.url">
+              <a :href="link.url" target="_blank">{{ link.displayName }}</a>
             </li>
           </ul>
-          <a-empty v-else />
+          <div v-else class="no-link-text">{{ $t('service.no_link') }}</div>
         </div>
       </a-layout-content>
     </a-tab-pane>
@@ -297,6 +304,11 @@
       box-sizing: border-box;
       min-height: 33.75rem;
 
+      .no-link-text {
+        color: #999999;
+        padding: 0.25rem;
+      }
+
       ul {
         list-style: none;
         margin: 0;

Reply via email to