mirror of
https://gitee.com/dromara/RuoYi-Cloud-Plus.git
synced 2025-09-04 11:37:28 +00:00
update nacos 2.1.2 => 2.2.0 适配升级
This commit is contained in:
@@ -17,7 +17,7 @@
|
|||||||
<spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
|
<spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
|
||||||
<sentinel.version>1.8.6</sentinel.version>
|
<sentinel.version>1.8.6</sentinel.version>
|
||||||
<seata.version>1.6.0</seata.version>
|
<seata.version>1.6.0</seata.version>
|
||||||
<nacos.client.version>2.1.2</nacos.client.version>
|
<nacos.client.version>2.2.0</nacos.client.version>
|
||||||
<dubbo.version>3.1.3</dubbo.version>
|
<dubbo.version>3.1.3</dubbo.version>
|
||||||
<spring.context.support.version>1.0.11</spring.context.support.version>
|
<spring.context.support.version>1.0.11</spring.context.support.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
@@ -27,7 +27,7 @@
|
|||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<nacos.version>2.1.2</nacos.version>
|
<nacos.version>2.2.0</nacos.version>
|
||||||
<nacos.lib.path>${project.basedir}/src/main/resources/lib</nacos.lib.path>
|
<nacos.lib.path>${project.basedir}/src/main/resources/lib</nacos.lib.path>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
@@ -72,6 +72,13 @@
|
|||||||
<scope>system</scope>
|
<scope>system</scope>
|
||||||
<systemPath>${nacos.lib.path}/nacos-consistency-${nacos.version}.jar</systemPath>
|
<systemPath>${nacos.lib.path}/nacos-consistency-${nacos.version}.jar</systemPath>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
|
<artifactId>nacos-contrl-plugin</artifactId>
|
||||||
|
<version>${nacos.version}</version>
|
||||||
|
<scope>system</scope>
|
||||||
|
<systemPath>${nacos.lib.path}/nacos-contrl-plugin-${nacos.version}.jar</systemPath>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba.nacos</groupId>
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
<artifactId>nacos-core</artifactId>
|
<artifactId>nacos-core</artifactId>
|
||||||
@@ -100,6 +107,13 @@
|
|||||||
<scope>system</scope>
|
<scope>system</scope>
|
||||||
<systemPath>${nacos.lib.path}/nacos-plugin-default-impl-${nacos.version}.jar</systemPath>
|
<systemPath>${nacos.lib.path}/nacos-plugin-default-impl-${nacos.version}.jar</systemPath>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
|
<artifactId>nacos-prometheus</artifactId>
|
||||||
|
<version>${nacos.version}</version>
|
||||||
|
<scope>system</scope>
|
||||||
|
<systemPath>${nacos.lib.path}/nacos-prometheus-${nacos.version}.jar</systemPath>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba.nacos</groupId>
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
<artifactId>nacos-sys</artifactId>
|
<artifactId>nacos-sys</artifactId>
|
||||||
@@ -107,6 +121,26 @@
|
|||||||
<scope>system</scope>
|
<scope>system</scope>
|
||||||
<systemPath>${nacos.lib.path}/nacos-sys-${nacos.version}.jar</systemPath>
|
<systemPath>${nacos.lib.path}/nacos-sys-${nacos.version}.jar</systemPath>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
|
<artifactId>nacos-custom-environment-plugin</artifactId>
|
||||||
|
<version>${nacos.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
|
<artifactId>nacos-datasource-plugin</artifactId>
|
||||||
|
<version>${nacos.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
|
<artifactId>nacos-encryption-plugin</artifactId>
|
||||||
|
<version>${nacos.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
|
<artifactId>nacos-trace-plugin</artifactId>
|
||||||
|
<version>${nacos.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.alibaba.nacos</groupId>
|
<groupId>com.alibaba.nacos</groupId>
|
||||||
<artifactId>nacos-common</artifactId>
|
<artifactId>nacos-common</artifactId>
|
||||||
@@ -120,6 +154,12 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>org.apache.logging.log4j</groupId>
|
||||||
|
<artifactId>*</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
@@ -208,6 +248,10 @@
|
|||||||
<groupId>io.micrometer</groupId>
|
<groupId>io.micrometer</groupId>
|
||||||
<artifactId>micrometer-registry-elastic</artifactId>
|
<artifactId>micrometer-registry-elastic</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.envoyproxy.controlplane</groupId>
|
<groupId>io.envoyproxy.controlplane</groupId>
|
||||||
@@ -216,11 +260,6 @@
|
|||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- log -->
|
<!-- log -->
|
||||||
<!-- log4j通过slf4j来代理 -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.slf4j</groupId>
|
|
||||||
<artifactId>log4j-over-slf4j</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<!-- apache commons logging通过slf4j来代理 -->
|
<!-- apache commons logging通过slf4j来代理 -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.slf4j</groupId>
|
<groupId>org.slf4j</groupId>
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
package com.alibaba.nacos.console.controller;
|
package com.alibaba.nacos.console.controller;
|
||||||
|
|
||||||
import com.alibaba.nacos.config.server.service.repository.PersistService;
|
import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService;
|
||||||
import com.alibaba.nacos.naming.controllers.OperatorController;
|
import com.alibaba.nacos.naming.controllers.OperatorController;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -40,13 +40,13 @@ public class HealthController {
|
|||||||
|
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(HealthController.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(HealthController.class);
|
||||||
|
|
||||||
private final PersistService persistService;
|
private final ConfigInfoPersistService configInfoPersistService;
|
||||||
|
|
||||||
private final OperatorController apiCommands;
|
private final OperatorController apiCommands;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public HealthController(PersistService persistService, OperatorController apiCommands) {
|
public HealthController(ConfigInfoPersistService configInfoPersistService, OperatorController apiCommands) {
|
||||||
this.persistService = persistService;
|
this.configInfoPersistService = configInfoPersistService;
|
||||||
this.apiCommands = apiCommands;
|
this.apiCommands = apiCommands;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ public class HealthController {
|
|||||||
private boolean isConfigReadiness() {
|
private boolean isConfigReadiness() {
|
||||||
// check db
|
// check db
|
||||||
try {
|
try {
|
||||||
persistService.configInfoCount("");
|
configInfoPersistService.configInfoCount("");
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOGGER.error("Config health check fail.", e);
|
LOGGER.error("Config health check fail.", e);
|
||||||
|
@@ -16,27 +16,20 @@
|
|||||||
|
|
||||||
package com.alibaba.nacos.console.controller;
|
package com.alibaba.nacos.console.controller;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
import com.alibaba.nacos.auth.annotation.Secured;
|
import com.alibaba.nacos.auth.annotation.Secured;
|
||||||
import com.alibaba.nacos.common.model.RestResult;
|
import com.alibaba.nacos.common.model.RestResult;
|
||||||
import com.alibaba.nacos.common.model.RestResultUtils;
|
import com.alibaba.nacos.common.model.RestResultUtils;
|
||||||
import com.alibaba.nacos.common.utils.StringUtils;
|
import com.alibaba.nacos.common.utils.StringUtils;
|
||||||
import com.alibaba.nacos.config.server.model.TenantInfo;
|
import com.alibaba.nacos.config.server.service.repository.CommonPersistService;
|
||||||
import com.alibaba.nacos.config.server.service.repository.PersistService;
|
|
||||||
import com.alibaba.nacos.console.enums.NamespaceTypeEnum;
|
|
||||||
import com.alibaba.nacos.console.model.Namespace;
|
import com.alibaba.nacos.console.model.Namespace;
|
||||||
import com.alibaba.nacos.console.model.NamespaceAllInfo;
|
import com.alibaba.nacos.console.model.NamespaceAllInfo;
|
||||||
|
import com.alibaba.nacos.console.service.NamespaceOperationService;
|
||||||
import com.alibaba.nacos.plugin.auth.constant.ActionTypes;
|
import com.alibaba.nacos.plugin.auth.constant.ActionTypes;
|
||||||
import com.alibaba.nacos.plugin.auth.impl.constant.AuthConstants;
|
import com.alibaba.nacos.plugin.auth.impl.constant.AuthConstants;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
|
||||||
import org.springframework.web.bind.annotation.PutMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -49,28 +42,17 @@ import java.util.regex.Pattern;
|
|||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/v1/console/namespaces")
|
@RequestMapping("/v1/console/namespaces")
|
||||||
public class NamespaceController {
|
public class NamespaceController {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private PersistService persistService;
|
private CommonPersistService commonPersistService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private NamespaceOperationService namespaceOperationService;
|
||||||
|
|
||||||
private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+");
|
private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+");
|
||||||
|
|
||||||
private static final int NAMESPACE_ID_MAX_LENGTH = 128;
|
private static final int NAMESPACE_ID_MAX_LENGTH = 128;
|
||||||
|
|
||||||
private static final String DEFAULT_NAMESPACE = "public";
|
|
||||||
|
|
||||||
private static final int DEFAULT_QUOTA = 200;
|
|
||||||
|
|
||||||
private static final String DEFAULT_CREATE_SOURCE = "nacos";
|
|
||||||
|
|
||||||
private static final String DEFAULT_NAMESPACE_SHOW_NAME = "Public";
|
|
||||||
|
|
||||||
private static final String DEFAULT_NAMESPACE_DESCRIPTION = "Public Namespace";
|
|
||||||
|
|
||||||
private static final String DEFAULT_TENANT = "";
|
|
||||||
|
|
||||||
private static final String DEFAULT_KP = "1";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get namespace list.
|
* Get namespace list.
|
||||||
*
|
*
|
||||||
@@ -78,21 +60,9 @@ public class NamespaceController {
|
|||||||
*/
|
*/
|
||||||
@GetMapping
|
@GetMapping
|
||||||
public RestResult<List<Namespace>> getNamespaces() {
|
public RestResult<List<Namespace>> getNamespaces() {
|
||||||
// TODO 获取用kp
|
return RestResultUtils.success(namespaceOperationService.getNamespaceList());
|
||||||
List<TenantInfo> tenantInfos = persistService.findTenantByKp(DEFAULT_KP);
|
|
||||||
Namespace namespace0 = new Namespace("", DEFAULT_NAMESPACE, DEFAULT_QUOTA,
|
|
||||||
persistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType());
|
|
||||||
List<Namespace> namespaces = new ArrayList<>();
|
|
||||||
namespaces.add(namespace0);
|
|
||||||
for (TenantInfo tenantInfo : tenantInfos) {
|
|
||||||
int configCount = persistService.configInfoCount(tenantInfo.getTenantId());
|
|
||||||
Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(),
|
|
||||||
tenantInfo.getTenantDesc(), DEFAULT_QUOTA, configCount, NamespaceTypeEnum.CUSTOM.getType());
|
|
||||||
namespaces.add(namespaceTmp);
|
|
||||||
}
|
|
||||||
return RestResultUtils.success(namespaces);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get namespace all info by namespace id.
|
* get namespace all info by namespace id.
|
||||||
*
|
*
|
||||||
@@ -100,20 +70,10 @@ public class NamespaceController {
|
|||||||
* @return namespace all info
|
* @return namespace all info
|
||||||
*/
|
*/
|
||||||
@GetMapping(params = "show=all")
|
@GetMapping(params = "show=all")
|
||||||
public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) {
|
public NamespaceAllInfo getNamespace(@RequestParam("namespaceId") String namespaceId) throws NacosException {
|
||||||
// TODO 获取用kp
|
return namespaceOperationService.getNamespace(namespaceId);
|
||||||
if (StringUtils.isBlank(namespaceId)) {
|
|
||||||
return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA,
|
|
||||||
persistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType(),
|
|
||||||
DEFAULT_NAMESPACE_DESCRIPTION);
|
|
||||||
} else {
|
|
||||||
TenantInfo tenantInfo = persistService.findTenantByKp(DEFAULT_KP, namespaceId);
|
|
||||||
int configCount = persistService.configInfoCount(namespaceId);
|
|
||||||
return new NamespaceAllInfo(namespaceId, tenantInfo.getTenantName(), DEFAULT_QUOTA, configCount,
|
|
||||||
NamespaceTypeEnum.CUSTOM.getType(), tenantInfo.getTenantDesc());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create namespace.
|
* create namespace.
|
||||||
*
|
*
|
||||||
@@ -126,7 +86,6 @@ public class NamespaceController {
|
|||||||
public Boolean createNamespace(@RequestParam("customNamespaceId") String namespaceId,
|
public Boolean createNamespace(@RequestParam("customNamespaceId") String namespaceId,
|
||||||
@RequestParam("namespaceName") String namespaceName,
|
@RequestParam("namespaceName") String namespaceName,
|
||||||
@RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
|
@RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
|
||||||
// TODO 获取用kp
|
|
||||||
if (StringUtils.isBlank(namespaceId)) {
|
if (StringUtils.isBlank(namespaceId)) {
|
||||||
namespaceId = UUID.randomUUID().toString();
|
namespaceId = UUID.randomUUID().toString();
|
||||||
} else {
|
} else {
|
||||||
@@ -137,15 +96,14 @@ public class NamespaceController {
|
|||||||
if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) {
|
if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (persistService.tenantInfoCountByTenantId(namespaceId) > 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
persistService.insertTenantInfoAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc,
|
try {
|
||||||
DEFAULT_CREATE_SOURCE, System.currentTimeMillis());
|
return namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc);
|
||||||
return true;
|
} catch (NacosException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* check namespaceId exist.
|
* check namespaceId exist.
|
||||||
*
|
*
|
||||||
@@ -157,9 +115,9 @@ public class NamespaceController {
|
|||||||
if (StringUtils.isBlank(namespaceId)) {
|
if (StringUtils.isBlank(namespaceId)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return (persistService.tenantInfoCountByTenantId(namespaceId) > 0);
|
return (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* edit namespace.
|
* edit namespace.
|
||||||
*
|
*
|
||||||
@@ -173,11 +131,9 @@ public class NamespaceController {
|
|||||||
public Boolean editNamespace(@RequestParam("namespace") String namespace,
|
public Boolean editNamespace(@RequestParam("namespace") String namespace,
|
||||||
@RequestParam("namespaceShowName") String namespaceShowName,
|
@RequestParam("namespaceShowName") String namespaceShowName,
|
||||||
@RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
|
@RequestParam(value = "namespaceDesc", required = false) String namespaceDesc) {
|
||||||
// TODO 获取用kp
|
return namespaceOperationService.editNamespace(namespace, namespaceShowName, namespaceDesc);
|
||||||
persistService.updateTenantNameAtomic(DEFAULT_KP, namespace, namespaceShowName, namespaceDesc);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* del namespace by id.
|
* del namespace by id.
|
||||||
*
|
*
|
||||||
@@ -186,9 +142,8 @@ public class NamespaceController {
|
|||||||
*/
|
*/
|
||||||
@DeleteMapping
|
@DeleteMapping
|
||||||
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
|
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX + "namespaces", action = ActionTypes.WRITE)
|
||||||
public Boolean deleteConfig(@RequestParam("namespaceId") String namespaceId) {
|
public Boolean deleteNamespace(@RequestParam("namespaceId") String namespaceId) {
|
||||||
persistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId);
|
return namespaceOperationService.removeNamespace(namespaceId);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,146 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2022 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.alibaba.nacos.console.controller.v2;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.annotation.NacosApi;
|
||||||
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
|
import com.alibaba.nacos.api.exception.api.NacosApiException;
|
||||||
|
import com.alibaba.nacos.api.model.v2.ErrorCode;
|
||||||
|
import com.alibaba.nacos.api.model.v2.Result;
|
||||||
|
import com.alibaba.nacos.auth.annotation.Secured;
|
||||||
|
import com.alibaba.nacos.common.utils.StringUtils;
|
||||||
|
import com.alibaba.nacos.console.model.Namespace;
|
||||||
|
import com.alibaba.nacos.console.model.NamespaceAllInfo;
|
||||||
|
import com.alibaba.nacos.console.model.form.NamespaceForm;
|
||||||
|
import com.alibaba.nacos.console.service.NamespaceOperationService;
|
||||||
|
import com.alibaba.nacos.plugin.auth.constant.ActionTypes;
|
||||||
|
import com.alibaba.nacos.plugin.auth.constant.SignType;
|
||||||
|
import com.alibaba.nacos.plugin.auth.impl.constant.AuthConstants;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NamespaceControllerV2.
|
||||||
|
*
|
||||||
|
* @author dongyafei
|
||||||
|
* @date 2022/8/16
|
||||||
|
*/
|
||||||
|
@NacosApi
|
||||||
|
@RestController
|
||||||
|
@RequestMapping(path = "/v2/console/namespace")
|
||||||
|
public class NamespaceControllerV2 {
|
||||||
|
|
||||||
|
private final NamespaceOperationService namespaceOperationService;
|
||||||
|
|
||||||
|
public NamespaceControllerV2(NamespaceOperationService namespaceOperationService) {
|
||||||
|
this.namespaceOperationService = namespaceOperationService;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Pattern namespaceIdCheckPattern = Pattern.compile("^[\\w-]+");
|
||||||
|
|
||||||
|
private static final int NAMESPACE_ID_MAX_LENGTH = 128;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get namespace list.
|
||||||
|
*
|
||||||
|
* @return namespace list
|
||||||
|
*/
|
||||||
|
@GetMapping("/list")
|
||||||
|
public Result<List<Namespace>> getNamespaceList() {
|
||||||
|
return Result.success(namespaceOperationService.getNamespaceList());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get namespace all info by namespace id.
|
||||||
|
*
|
||||||
|
* @param namespaceId namespaceId
|
||||||
|
* @return namespace all info
|
||||||
|
*/
|
||||||
|
@GetMapping()
|
||||||
|
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX
|
||||||
|
+ "namespaces", action = ActionTypes.READ, signType = SignType.CONSOLE)
|
||||||
|
public Result<NamespaceAllInfo> getNamespace(@RequestParam("namespaceId") String namespaceId)
|
||||||
|
throws NacosException {
|
||||||
|
return Result.success(namespaceOperationService.getNamespace(namespaceId));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create namespace.
|
||||||
|
*
|
||||||
|
* @param namespaceForm namespaceForm.
|
||||||
|
* @return whether create ok
|
||||||
|
*/
|
||||||
|
@PostMapping
|
||||||
|
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX
|
||||||
|
+ "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE)
|
||||||
|
public Result<Boolean> createNamespace(NamespaceForm namespaceForm) throws NacosException {
|
||||||
|
|
||||||
|
namespaceForm.validate();
|
||||||
|
|
||||||
|
String namespaceId = namespaceForm.getNamespaceId();
|
||||||
|
String namespaceName = namespaceForm.getNamespaceName();
|
||||||
|
String namespaceDesc = namespaceForm.getNamespaceDesc();
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(namespaceId)) {
|
||||||
|
namespaceId = UUID.randomUUID().toString();
|
||||||
|
} else {
|
||||||
|
namespaceId = namespaceId.trim();
|
||||||
|
if (!namespaceIdCheckPattern.matcher(namespaceId).matches()) {
|
||||||
|
throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE,
|
||||||
|
"namespaceId [" + namespaceId + "] mismatch the pattern");
|
||||||
|
}
|
||||||
|
if (namespaceId.length() > NAMESPACE_ID_MAX_LENGTH) {
|
||||||
|
throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.ILLEGAL_NAMESPACE,
|
||||||
|
"too long namespaceId, over " + NAMESPACE_ID_MAX_LENGTH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Result.success(namespaceOperationService.createNamespace(namespaceId, namespaceName, namespaceDesc));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* edit namespace.
|
||||||
|
*
|
||||||
|
* @param namespaceForm namespace params
|
||||||
|
* @return whether edit ok
|
||||||
|
*/
|
||||||
|
@PutMapping
|
||||||
|
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX
|
||||||
|
+ "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE)
|
||||||
|
public Result<Boolean> editNamespace(NamespaceForm namespaceForm) throws NacosException {
|
||||||
|
namespaceForm.validate();
|
||||||
|
return Result.success(namespaceOperationService
|
||||||
|
.editNamespace(namespaceForm.getNamespaceId(), namespaceForm.getNamespaceName(),
|
||||||
|
namespaceForm.getNamespaceDesc()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* delete namespace by id.
|
||||||
|
*
|
||||||
|
* @param namespaceId namespace ID
|
||||||
|
* @return whether delete ok
|
||||||
|
*/
|
||||||
|
@DeleteMapping
|
||||||
|
@Secured(resource = AuthConstants.CONSOLE_RESOURCE_NAME_PREFIX
|
||||||
|
+ "namespaces", action = ActionTypes.WRITE, signType = SignType.CONSOLE)
|
||||||
|
public Result<Boolean> deleteNamespace(@RequestParam("namespaceId") String namespaceId) {
|
||||||
|
return Result.success(namespaceOperationService.removeNamespace(namespaceId));
|
||||||
|
}
|
||||||
|
}
|
@@ -16,10 +16,10 @@
|
|||||||
|
|
||||||
package com.alibaba.nacos.console.exception;
|
package com.alibaba.nacos.console.exception;
|
||||||
|
|
||||||
import com.alibaba.nacos.plugin.auth.exception.AccessException;
|
|
||||||
import com.alibaba.nacos.common.model.RestResultUtils;
|
import com.alibaba.nacos.common.model.RestResultUtils;
|
||||||
import com.alibaba.nacos.common.utils.ExceptionUtil;
|
import com.alibaba.nacos.common.utils.ExceptionUtil;
|
||||||
import com.alibaba.nacos.core.utils.Commons;
|
import com.alibaba.nacos.core.utils.Commons;
|
||||||
|
import com.alibaba.nacos.plugin.auth.exception.AccessException;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
@@ -37,19 +37,20 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
*/
|
*/
|
||||||
@ControllerAdvice
|
@ControllerAdvice
|
||||||
public class ConsoleExceptionHandler {
|
public class ConsoleExceptionHandler {
|
||||||
|
|
||||||
private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleExceptionHandler.class);
|
private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleExceptionHandler.class);
|
||||||
|
|
||||||
@ExceptionHandler(AccessException.class)
|
@ExceptionHandler(AccessException.class)
|
||||||
private ResponseEntity<String> handleAccessException(AccessException e) {
|
private ResponseEntity<String> handleAccessException(AccessException e) {
|
||||||
|
LOGGER.error("got exception. {}", e.getErrMsg());
|
||||||
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getErrMsg());
|
return ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getErrMsg());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ExceptionHandler(IllegalArgumentException.class)
|
@ExceptionHandler(IllegalArgumentException.class)
|
||||||
private ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException e) {
|
private ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException e) {
|
||||||
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ExceptionUtil.getAllExceptionMsg(e));
|
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ExceptionUtil.getAllExceptionMsg(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ExceptionHandler(Exception.class)
|
@ExceptionHandler(Exception.class)
|
||||||
private ResponseEntity<Object> handleException(HttpServletRequest request, Exception e) {
|
private ResponseEntity<Object> handleException(HttpServletRequest request, Exception e) {
|
||||||
String uri = request.getRequestURI();
|
String uri = request.getRequestURI();
|
||||||
|
@@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2022 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.alibaba.nacos.console.exception;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.annotation.NacosApi;
|
||||||
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
|
import com.alibaba.nacos.api.exception.api.NacosApiException;
|
||||||
|
import com.alibaba.nacos.api.model.v2.ErrorCode;
|
||||||
|
import com.alibaba.nacos.api.model.v2.Result;
|
||||||
|
import com.alibaba.nacos.common.utils.ExceptionUtil;
|
||||||
|
import com.alibaba.nacos.plugin.auth.exception.AccessException;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
|
import org.springframework.dao.DataAccessException;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.http.converter.HttpMessageConversionException;
|
||||||
|
import org.springframework.http.converter.HttpMessageNotReadableException;
|
||||||
|
import org.springframework.web.HttpMediaTypeException;
|
||||||
|
import org.springframework.web.bind.MissingServletRequestParameterException;
|
||||||
|
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||||
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseBody;
|
||||||
|
import org.springframework.web.bind.annotation.ResponseStatus;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exception Handler for Nacos API.
|
||||||
|
* @author dongyafei
|
||||||
|
* @date 2022/7/22
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Order(-1)
|
||||||
|
@ControllerAdvice(annotations = {NacosApi.class})
|
||||||
|
@ResponseBody
|
||||||
|
public class NacosApiExceptionHandler {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(NacosApiExceptionHandler.class);
|
||||||
|
|
||||||
|
@ExceptionHandler(NacosApiException.class)
|
||||||
|
public ResponseEntity<Result<String>> handleNacosApiException(NacosApiException e) {
|
||||||
|
LOGGER.error("got exception. {} {}", e.getErrAbstract(), e.getErrMsg());
|
||||||
|
return ResponseEntity.status(e.getErrCode()).body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ExceptionHandler(NacosException.class)
|
||||||
|
public ResponseEntity<Result<String>> handleNacosException(NacosException e) {
|
||||||
|
LOGGER.error("got exception. {}", e.getErrMsg());
|
||||||
|
return ResponseEntity.status(e.getErrCode()).body(Result.failure(ErrorCode.SERVER_ERROR, e.getErrMsg()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
|
@ExceptionHandler(HttpMessageNotReadableException.class)
|
||||||
|
public Result<String> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
|
||||||
|
LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
|
||||||
|
return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
|
@ExceptionHandler(HttpMessageConversionException.class)
|
||||||
|
public Result<String> handleHttpMessageConversionException(HttpMessageConversionException e) {
|
||||||
|
LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
|
||||||
|
return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
|
@ExceptionHandler(NumberFormatException.class)
|
||||||
|
public Result<String> handleNumberFormatException(NumberFormatException e) {
|
||||||
|
LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
|
||||||
|
return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
|
@ExceptionHandler(IllegalArgumentException.class)
|
||||||
|
public Result<String> handleIllegalArgumentException(IllegalArgumentException e) {
|
||||||
|
LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
|
||||||
|
return Result.failure(ErrorCode.PARAMETER_VALIDATE_ERROR, e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
|
@ExceptionHandler(MissingServletRequestParameterException.class)
|
||||||
|
public Result<String> handleMissingServletRequestParameterException(MissingServletRequestParameterException e) {
|
||||||
|
LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
|
||||||
|
return Result.failure(ErrorCode.PARAMETER_MISSING, e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
|
@ExceptionHandler(HttpMediaTypeException.class)
|
||||||
|
public Result<String> handleHttpMediaTypeException(HttpMediaTypeException e) {
|
||||||
|
LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
|
||||||
|
return Result.failure(ErrorCode.MEDIA_TYPE_ERROR, e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResponseStatus(HttpStatus.FORBIDDEN)
|
||||||
|
@ExceptionHandler(AccessException.class)
|
||||||
|
public Result<String> handleAccessException(AccessException e) {
|
||||||
|
LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
|
||||||
|
return Result.failure(ErrorCode.ACCESS_DENIED, e.getErrMsg());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||||
|
@ExceptionHandler(value = {DataAccessException.class, ServletException.class, IOException.class})
|
||||||
|
public Result<String> handleDataAccessException(Exception e) {
|
||||||
|
LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
|
||||||
|
return Result.failure(ErrorCode.DATA_ACCESS_ERROR, e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||||
|
@ExceptionHandler(Exception.class)
|
||||||
|
public Result<String> handleOtherException(Exception e) {
|
||||||
|
LOGGER.error("got exception. {} {}", e.getMessage(), ExceptionUtil.getAllExceptionMsg(e));
|
||||||
|
return Result.failure(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2022 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.alibaba.nacos.console.model.form;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
|
import com.alibaba.nacos.api.exception.api.NacosApiException;
|
||||||
|
import com.alibaba.nacos.api.model.v2.ErrorCode;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NamespaceForm.
|
||||||
|
* @author dongyafei
|
||||||
|
* @date 2022/8/16
|
||||||
|
*/
|
||||||
|
public class NamespaceForm implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -1078976569495343487L;
|
||||||
|
|
||||||
|
private String namespaceId;
|
||||||
|
|
||||||
|
private String namespaceName;
|
||||||
|
|
||||||
|
private String namespaceDesc;
|
||||||
|
|
||||||
|
public NamespaceForm() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public NamespaceForm(String namespaceId, String namespaceName, String namespaceDesc) {
|
||||||
|
this.namespaceId = namespaceId;
|
||||||
|
this.namespaceName = namespaceName;
|
||||||
|
this.namespaceDesc = namespaceDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNamespaceId() {
|
||||||
|
return namespaceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNamespaceId(String namespaceId) {
|
||||||
|
this.namespaceId = namespaceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNamespaceName() {
|
||||||
|
return namespaceName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNamespaceName(String namespaceName) {
|
||||||
|
this.namespaceName = namespaceName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNamespaceDesc() {
|
||||||
|
return namespaceDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNamespaceDesc(String namespaceDesc) {
|
||||||
|
this.namespaceDesc = namespaceDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (o == null || getClass() != o.getClass()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
NamespaceForm that = (NamespaceForm) o;
|
||||||
|
return Objects.equals(namespaceId, that.namespaceId) && Objects.equals(namespaceName, that.namespaceName)
|
||||||
|
&& Objects.equals(namespaceDesc, that.namespaceDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(namespaceId, namespaceName, namespaceDesc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "NamespaceVo{" + "namespaceId='" + namespaceId + '\'' + ", namespaceName='" + namespaceName + '\''
|
||||||
|
+ ", namespaceDesc='" + namespaceDesc + '\'' + '}';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check required param.
|
||||||
|
* @throws NacosException NacosException
|
||||||
|
*/
|
||||||
|
public void validate() throws NacosException {
|
||||||
|
if (null == namespaceId) {
|
||||||
|
throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, "required parameter 'namespaceId' is missing");
|
||||||
|
}
|
||||||
|
if (null == namespaceName) {
|
||||||
|
throw new NacosApiException(HttpStatus.BAD_REQUEST.value(), ErrorCode.PARAMETER_MISSING, "required parameter 'namespaceName' is missing");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,149 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 1999-2022 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.alibaba.nacos.console.service;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.api.exception.NacosException;
|
||||||
|
import com.alibaba.nacos.api.exception.api.NacosApiException;
|
||||||
|
import com.alibaba.nacos.api.model.v2.ErrorCode;
|
||||||
|
import com.alibaba.nacos.common.utils.StringUtils;
|
||||||
|
import com.alibaba.nacos.config.server.model.TenantInfo;
|
||||||
|
import com.alibaba.nacos.config.server.service.repository.CommonPersistService;
|
||||||
|
import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService;
|
||||||
|
import com.alibaba.nacos.console.enums.NamespaceTypeEnum;
|
||||||
|
import com.alibaba.nacos.console.model.Namespace;
|
||||||
|
import com.alibaba.nacos.console.model.NamespaceAllInfo;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NamespaceOperationService.
|
||||||
|
*
|
||||||
|
* @author dongyafei
|
||||||
|
* @date 2022/8/16
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class NamespaceOperationService {
|
||||||
|
|
||||||
|
private final ConfigInfoPersistService configInfoPersistService;
|
||||||
|
|
||||||
|
private final CommonPersistService commonPersistService;
|
||||||
|
|
||||||
|
private static final String DEFAULT_NAMESPACE = "public";
|
||||||
|
|
||||||
|
private static final String DEFAULT_NAMESPACE_SHOW_NAME = "Public";
|
||||||
|
|
||||||
|
private static final String DEFAULT_NAMESPACE_DESCRIPTION = "Public Namespace";
|
||||||
|
|
||||||
|
private static final int DEFAULT_QUOTA = 200;
|
||||||
|
|
||||||
|
private static final String DEFAULT_CREATE_SOURCE = "nacos";
|
||||||
|
|
||||||
|
private static final String DEFAULT_TENANT = "";
|
||||||
|
|
||||||
|
private static final String DEFAULT_KP = "1";
|
||||||
|
|
||||||
|
public NamespaceOperationService(ConfigInfoPersistService configInfoPersistService,
|
||||||
|
CommonPersistService commonPersistService) {
|
||||||
|
this.configInfoPersistService = configInfoPersistService;
|
||||||
|
this.commonPersistService = commonPersistService;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Namespace> getNamespaceList() {
|
||||||
|
// TODO 获取用kp
|
||||||
|
List<TenantInfo> tenantInfos = commonPersistService.findTenantByKp(DEFAULT_KP);
|
||||||
|
|
||||||
|
Namespace namespace0 = new Namespace("", DEFAULT_NAMESPACE, DEFAULT_QUOTA,
|
||||||
|
configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType());
|
||||||
|
List<Namespace> namespaceList = new ArrayList<>();
|
||||||
|
namespaceList.add(namespace0);
|
||||||
|
|
||||||
|
for (TenantInfo tenantInfo : tenantInfos) {
|
||||||
|
int configCount = configInfoPersistService.configInfoCount(tenantInfo.getTenantId());
|
||||||
|
Namespace namespaceTmp = new Namespace(tenantInfo.getTenantId(), tenantInfo.getTenantName(),
|
||||||
|
tenantInfo.getTenantDesc(), DEFAULT_QUOTA, configCount, NamespaceTypeEnum.CUSTOM.getType());
|
||||||
|
namespaceList.add(namespaceTmp);
|
||||||
|
}
|
||||||
|
return namespaceList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* query namespace by namespace id.
|
||||||
|
*
|
||||||
|
* @param namespaceId namespace Id.
|
||||||
|
* @return NamespaceAllInfo.
|
||||||
|
*/
|
||||||
|
public NamespaceAllInfo getNamespace(String namespaceId) throws NacosException {
|
||||||
|
// TODO 获取用kp
|
||||||
|
if (StringUtils.isBlank(namespaceId)) {
|
||||||
|
return new NamespaceAllInfo(namespaceId, DEFAULT_NAMESPACE_SHOW_NAME, DEFAULT_QUOTA,
|
||||||
|
configInfoPersistService.configInfoCount(DEFAULT_TENANT), NamespaceTypeEnum.GLOBAL.getType(),
|
||||||
|
DEFAULT_NAMESPACE_DESCRIPTION);
|
||||||
|
} else {
|
||||||
|
TenantInfo tenantInfo = commonPersistService.findTenantByKp(DEFAULT_KP, namespaceId);
|
||||||
|
if (null == tenantInfo) {
|
||||||
|
throw new NacosApiException(HttpStatus.NOT_FOUND.value(), ErrorCode.NAMESPACE_NOT_EXIST,
|
||||||
|
"namespaceId [ " + namespaceId + " ] not exist");
|
||||||
|
}
|
||||||
|
int configCount = configInfoPersistService.configInfoCount(namespaceId);
|
||||||
|
return new NamespaceAllInfo(namespaceId, tenantInfo.getTenantName(), DEFAULT_QUOTA, configCount,
|
||||||
|
NamespaceTypeEnum.CUSTOM.getType(), tenantInfo.getTenantDesc());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create namespace.
|
||||||
|
*
|
||||||
|
* @param namespaceId namespace ID
|
||||||
|
* @param namespaceName namespace Name
|
||||||
|
* @param namespaceDesc namespace Desc
|
||||||
|
* @return whether create ok
|
||||||
|
*/
|
||||||
|
public Boolean createNamespace(String namespaceId, String namespaceName, String namespaceDesc)
|
||||||
|
throws NacosException {
|
||||||
|
// TODO 获取用kp
|
||||||
|
if (commonPersistService.tenantInfoCountByTenantId(namespaceId) > 0) {
|
||||||
|
throw new NacosApiException(HttpStatus.INTERNAL_SERVER_ERROR.value(), ErrorCode.NAMESPACE_ALREADY_EXIST,
|
||||||
|
"namespaceId [" + namespaceId + "] already exist");
|
||||||
|
}
|
||||||
|
|
||||||
|
commonPersistService
|
||||||
|
.insertTenantInfoAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc, DEFAULT_CREATE_SOURCE,
|
||||||
|
System.currentTimeMillis());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* edit namespace.
|
||||||
|
*/
|
||||||
|
public Boolean editNamespace(String namespaceId, String namespaceName, String namespaceDesc) {
|
||||||
|
// TODO 获取用kp
|
||||||
|
commonPersistService.updateTenantNameAtomic(DEFAULT_KP, namespaceId, namespaceName, namespaceDesc);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* remove namespace.
|
||||||
|
*/
|
||||||
|
public Boolean removeNamespace(String namespaceId) {
|
||||||
|
commonPersistService.removeTenantInfoAtomic(DEFAULT_KP, namespaceId);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@@ -31,8 +31,9 @@ server.error.include-message=ON_PARAM
|
|||||||
|
|
||||||
spring.application.name=ruoyi-nacos
|
spring.application.name=ruoyi-nacos
|
||||||
#*************** Config Module Related Configurations ***************#
|
#*************** Config Module Related Configurations ***************#
|
||||||
### If use MySQL as datasource:
|
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
|
||||||
spring.datasource.platform=mysql
|
spring.sql.init.platform=mysql
|
||||||
|
nacos.plugin.datasource.log.enabled=true
|
||||||
|
|
||||||
### Count of DB:
|
### Count of DB:
|
||||||
db.num=1
|
db.num=1
|
||||||
@@ -139,6 +140,8 @@ nacos.core.auth.plugin.nacos.token.secret.key=SecretKey0123456789012345678901234
|
|||||||
#nacos.core.auth.ldap.userDn=cn=admin,${nacos.core.auth.ldap.basedc}
|
#nacos.core.auth.ldap.userDn=cn=admin,${nacos.core.auth.ldap.basedc}
|
||||||
#nacos.core.auth.ldap.password=admin
|
#nacos.core.auth.ldap.password=admin
|
||||||
#nacos.core.auth.ldap.userdn=cn={0},dc=example,dc=org
|
#nacos.core.auth.ldap.userdn=cn={0},dc=example,dc=org
|
||||||
|
#nacos.core.auth.ldap.filter.prefix=uid
|
||||||
|
#nacos.core.auth.ldap.case.sensitive=true
|
||||||
|
|
||||||
|
|
||||||
#*************** Istio Related Configurations ***************#
|
#*************** Istio Related Configurations ***************#
|
||||||
@@ -189,4 +192,5 @@ nacos.istio.mcp.server.enabled=false
|
|||||||
# nacos.core.protocol.raft.data.read_index_type=ReadOnlySafe
|
# nacos.core.protocol.raft.data.read_index_type=ReadOnlySafe
|
||||||
### rpc request timeout, default 5 seconds
|
### rpc request timeout, default 5 seconds
|
||||||
# nacos.core.protocol.raft.data.rpc_request_timeout_ms=5000
|
# nacos.core.protocol.raft.data.rpc_request_timeout_ms=5000
|
||||||
|
### enable to support prometheus service discovery
|
||||||
|
#nacos.prometheus.metrics.enabled=true
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -35,7 +35,7 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="console-ui/public/css/icon.css">
|
<link rel="stylesheet" type="text/css" href="console-ui/public/css/icon.css">
|
||||||
<link rel="stylesheet" type="text/css" href="console-ui/public/css/font-awesome.css">
|
<link rel="stylesheet" type="text/css" href="console-ui/public/css/font-awesome.css">
|
||||||
<!-- 第三方css结束 -->
|
<!-- 第三方css结束 -->
|
||||||
<link href="./css/main.css?1309f9b6b4e9f81858cb" rel="stylesheet"></head>
|
<link href="./css/main.css?c18229e4d79449526734" rel="stylesheet"></head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div id="root" style="overflow:hidden"></div>
|
<div id="root" style="overflow:hidden"></div>
|
||||||
@@ -56,6 +56,6 @@
|
|||||||
<script src="console-ui/public/js/merge.js"></script>
|
<script src="console-ui/public/js/merge.js"></script>
|
||||||
<script src="console-ui/public/js/loader.js"></script>
|
<script src="console-ui/public/js/loader.js"></script>
|
||||||
<!-- 第三方js结束 -->
|
<!-- 第三方js结束 -->
|
||||||
<script type="text/javascript" src="./js/main.js?1309f9b6b4e9f81858cb"></script></body>
|
<script type="text/javascript" src="./js/main.js?c18229e4d79449526734"></script></body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user