Commit e25fe0ce authored by jian.tan's avatar jian.tan Committed by nobodyiam

feat:添加Apollo-Portal项目删除接口.

parent 6860f0a2
......@@ -6,6 +6,7 @@ import com.ctrip.framework.apollo.common.dto.AppDTO;
import com.ctrip.framework.apollo.common.entity.App;
import com.ctrip.framework.apollo.common.exception.BadRequestException;
import com.ctrip.framework.apollo.common.exception.NotFoundException;
import com.ctrip.framework.apollo.common.exception.ServiceException;
import com.ctrip.framework.apollo.common.utils.BeanUtils;
import com.ctrip.framework.apollo.common.utils.InputValidator;
import com.ctrip.framework.apollo.core.utils.StringUtils;
......@@ -92,4 +93,20 @@ public class AppController {
return appService.isAppIdUnique(appId);
}
@RequestMapping(value = "/apps", method = RequestMethod.DELETE)
public void deleteApp(@RequestParam("appId") String appId,
@RequestParam("operator") String operator) {
App app = appService.findOne(appId);
if (Objects.isNull(app)) {
throw new NotFoundException("app not found for appId " + appId);
}
try {
adminService.deleteApp(appId, operator);
} catch (Exception e) {
String exc = String
.format("user:%s deleting app:%s,failure:%s", operator, app, e.getMessage());
throw new ServiceException(exc);
}
}
}
......@@ -2,6 +2,8 @@ package com.ctrip.framework.apollo.biz.repository;
import com.ctrip.framework.apollo.common.entity.AppNamespace;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
......@@ -24,4 +26,9 @@ public interface AppNamespaceRepository extends PagingAndSortingRepository<AppNa
List<AppNamespace> findFirst500ByIdGreaterThanOrderByIdAsc(long id);
@Modifying
@Query("UPDATE AppNamespace SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1")
int batchDeleteByDeleteApp(String appId, String operator);
int countByAppId(String appId);
}
......@@ -2,6 +2,7 @@ package com.ctrip.framework.apollo.biz.repository;
import com.ctrip.framework.apollo.common.entity.App;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
......@@ -15,4 +16,9 @@ public interface AppRepository extends PagingAndSortingRepository<App, Long> {
App findByAppId(String appId);
@Modifying
@Query("UPDATE App SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1")
int deleteApp(String appId, String operator);
int countByAppId(String appId);
}
......@@ -3,6 +3,8 @@ package com.ctrip.framework.apollo.biz.repository;
import com.ctrip.framework.apollo.biz.entity.Cluster;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
......@@ -16,4 +18,10 @@ public interface ClusterRepository extends PagingAndSortingRepository<Cluster, L
Cluster findByAppIdAndName(String appId, String name);
List<Cluster> findByParentClusterId(Long parentClusterId);
@Modifying
@Query("UPDATE Cluster SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1")
int batchDeleteByDeleteApp(String appId, String operator);
int countByAppId(String appId);
}
......@@ -18,4 +18,9 @@ public interface CommitRepository extends PagingAndSortingRepository<Commit, Lon
@Query("update Commit set isdeleted=1,DataChange_LastModifiedBy = ?4 where appId=?1 and clusterName=?2 and namespaceName = ?3")
int batchDelete(String appId, String clusterName, String namespaceName, String operator);
@Modifying
@Query("UPDATE Commit SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1")
int batchDeleteByDeleteApp(String appId,String operator);
int countByAppId(String appId);
}
......@@ -2,6 +2,8 @@ package com.ctrip.framework.apollo.biz.repository;
import com.ctrip.framework.apollo.biz.entity.GrayReleaseRule;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
......@@ -17,4 +19,9 @@ public interface GrayReleaseRuleRepository extends PagingAndSortingRepository<Gr
List<GrayReleaseRule> findFirst500ByIdGreaterThanOrderByIdAsc(Long id);
@Modifying
@Query("UPDATE GrayReleaseRule SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1")
int batchDeleteByDeleteApp(String appId, String operator);
int countByAppId(String appId);
}
......@@ -25,4 +25,9 @@ public interface NamespaceRepository extends PagingAndSortingRepository<Namespac
int countByNamespaceNameAndAppIdNot(String namespaceName, String appId);
@Modifying
@Query("UPDATE Namespace SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1")
int batchDeleteByDeleteApp(String appId,String operator);
int countByAppId(String appId);
}
......@@ -23,4 +23,9 @@ public interface ReleaseHistoryRepository extends PagingAndSortingRepository<Rel
@Query("update ReleaseHistory set isdeleted=1,DataChange_LastModifiedBy = ?4 where appId=?1 and clusterName=?2 and namespaceName = ?3")
int batchDelete(String appId, String clusterName, String namespaceName, String operator);
@Modifying
@Query("UPDATE ReleaseHistory SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1")
int batchDeleteByDeleteApp(String appId, String operator);
int countByAppId(String appId);
}
......@@ -35,4 +35,10 @@ public interface ReleaseRepository extends PagingAndSortingRepository<Release, L
// For release history conversion program, need to delete after conversion it done
List<Release> findByAppIdAndClusterNameAndNamespaceNameOrderByIdAsc(String appId, String clusterName, String namespaceName);
@Modifying
@Query("UPDATE Release SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1")
int batchDeleteByDeleteApp(String oldAppId, String operator);
int countByAppId(String appId);
}
package com.ctrip.framework.apollo.biz.service;
import com.ctrip.framework.apollo.biz.entity.Cluster;
import com.ctrip.framework.apollo.biz.entity.Namespace;
import com.ctrip.framework.apollo.common.entity.App;
import com.ctrip.framework.apollo.core.ConfigConsts;
import com.google.common.collect.Sets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@Service
public class AdminService {
......@@ -18,6 +27,18 @@ public class AdminService {
private ClusterService clusterService;
@Autowired
private NamespaceService namespaceService;
@Autowired
private ReleaseHistoryService releaseHistoryService;
@Autowired
private ReleaseService releaseService;
@Autowired
private GrayReleaseRuleService grayReleaseRuleService;
@Autowired
private CommitService commitService;
@Autowired
private ItemService itemService;
final static Logger logger = LoggerFactory.getLogger(AdminService.class);
@Transactional
public App createNewApp(App app) {
......@@ -35,5 +56,47 @@ public class AdminService {
return app;
}
@Transactional
public void deleteApp(String appId, String operator) {
logger.info("{} is deleting App:{}", operator, appId);
List<Cluster> managedClusters = clusterService.findClusters(appId);
Set<Namespace> managedNamespaces = Sets.newLinkedHashSet();
if (Objects.nonNull(managedClusters)) {
for (Cluster cluster : managedClusters) {
managedNamespaces.addAll(namespaceService.findNamespaces(appId, cluster.getName()));
}
}
//1.delete release history.
releaseHistoryService.batchDeleteByDeleteApp(appId, operator);
//2.delete release.
releaseService.deleteApp(appId, operator);
//3.delete config items.
for (Namespace namespace : managedNamespaces) {
itemService.batchDelete(namespace.getId(), operator);
}
//4.delete Namespaces
namespaceService.deleteApp(managedNamespaces, operator);
//5.delete GrayReleaseRule
grayReleaseRuleService.deleteApp(appId, operator);
//6.delete history.
commitService.deleteApp(appId, operator);
//7.delete cluster
clusterService.deleteApp(appId, operator);
//8.delete appNamespace
appNamespaceService.deleteApp(appId, operator);
//9.delete app
appService.deleteApp(appId, operator);
}
}
......@@ -137,4 +137,11 @@ public class AppNamespaceService {
namespaceService.save(namespace);
}
}
@Transactional
public void deleteApp(String appId,String operator) {
if (appNamespaceRepository.countByAppId(appId) > 0) {
appNamespaceRepository.batchDeleteByDeleteApp(appId, operator);
}
}
}
......@@ -92,4 +92,11 @@ public class AppService {
managedApp.getDataChangeLastModifiedBy());
}
@Transactional
public void deleteApp(String appId, String operator) {
if (appRepository.countByAppId(appId) > 0) {
appRepository.deleteApp(appId, operator);
}
}
}
......@@ -137,4 +137,14 @@ public class ClusterService {
return clusterRepository.findByParentClusterId(parentCluster.getId());
}
@Transactional
public void deleteApp(String appId, String operator) {
if (clusterRepository.countByAppId(appId) > 0) {
clusterRepository.batchDeleteByDeleteApp(appId, operator);
}
}
public List<Cluster> findClusters(String appId) {
return clusterRepository.findByAppId(appId);
}
}
......@@ -31,4 +31,10 @@ public class CommitService {
return commitRepository.batchDelete(appId, clusterName, namespaceName, operator);
}
@Transactional
public void deleteApp(String appId,String operator) {
if (commitRepository.countByAppId(appId) > 0) {
commitRepository.batchDeleteByDeleteApp(appId, operator);
}
}
}
package com.ctrip.framework.apollo.biz.service;
import com.ctrip.framework.apollo.biz.repository.GrayReleaseRuleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class GrayReleaseRuleService {
@Autowired
private GrayReleaseRuleRepository grayReleaseRuleRepository;
@Transactional
public void deleteApp(String appId, String operator) {
if (grayReleaseRuleRepository.countByAppId(appId) > 0) {
grayReleaseRuleRepository.batchDeleteByDeleteApp(appId, operator);
}
}
}
......@@ -395,5 +395,19 @@ public class NamespaceService {
return false;
}
@Transactional
public void deleteApp(Set<Namespace> namespaces, String operator) {
if (Objects.nonNull(namespaces)) {
String appId = namespaces.iterator().next().getAppId();
namespaceRepository.batchDeleteByDeleteApp(appId, operator);
//Publish release message
for (Namespace namespace : namespaces) {
messageSender.sendMessage(ReleaseMessageKeyGenerator
.generate(appId, namespace.getClusterName(), namespace.getNamespaceName()),
Topics.APOLLO_RELEASE_TOPIC);
}
}
}
}
......@@ -76,4 +76,11 @@ public class ReleaseHistoryService {
public int batchDelete(String appId, String clusterName, String namespaceName, String operator) {
return releaseHistoryRepository.batchDelete(appId, clusterName, namespaceName, operator);
}
@Transactional
public void batchDeleteByDeleteApp(String appId, String operator) {
if (releaseHistoryRepository.countByAppId(appId) > 0) {
releaseHistoryRepository.batchDeleteByDeleteApp(appId,operator);
}
}
}
......@@ -467,4 +467,10 @@ public class ReleaseService {
return releaseRepository.batchDelete(appId, clusterName, namespaceName, operator);
}
@Transactional
public void deleteApp(String appId, String operator) {
if (releaseRepository.countByAppId(appId) > 0) {
releaseRepository.batchDeleteByDeleteApp(appId, operator);
}
}
}
......@@ -27,4 +27,11 @@ public class AppNamespaceRepositoryTest extends AbstractIntegrationTest{
assertNull(appNamespace);
}
@Test
public void testDeleteAppNamespaceWhenDeleteApp() throws Exception{
String appId = "100003171";
int count = repository.countByAppId(appId);
assertEquals(count,repository.batchDeleteByDeleteApp(appId,null));
}
}
......@@ -56,4 +56,29 @@ public class AppRepositoryTest extends AbstractIntegrationTest{
Assert.assertEquals(0, appRepository.count());
}
@Test
public void testDelete() {
String appId = "someAppId";
String appName = "someAppName";
String ownerName = "someOwnerName";
String ownerEmail = "someOwnerName@ctrip.com";
String operator = "someOwnerName";
App app = new App();
app.setAppId(appId);
app.setName(appName);
app.setOwnerName(ownerName);
app.setOwnerEmail(ownerEmail);
Assert.assertEquals(0, appRepository.count());
appRepository.save(app);
Assert.assertEquals(1, appRepository.count());
Assert.assertEquals(1, appRepository.deleteApp(app.getAppId(), operator));
Assert.assertEquals(0, appRepository.count());
}
}
......@@ -8,7 +8,6 @@ import com.ctrip.framework.apollo.biz.repository.AppRepository;
import com.ctrip.framework.apollo.common.entity.App;
import com.ctrip.framework.apollo.common.exception.ServiceException;
import com.ctrip.framework.apollo.core.ConfigConsts;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -16,67 +15,102 @@ import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
import java.util.List;
public class AdminServiceTest extends AbstractIntegrationTest{
@Autowired
private AdminService adminService;
@Autowired
private AuditService auditService;
@Autowired
private AppRepository appRepository;
@Autowired
private ClusterService clusterService;
@Autowired
private NamespaceService namespaceService;
@Test
public void testCreateNewApp() {
String appId = "someAppId";
App app = new App();
app.setAppId(appId);
app.setName("someAppName");
String owner = "someOwnerName";
app.setOwnerName(owner);
app.setOwnerEmail("someOwnerName@ctrip.com");
app.setDataChangeCreatedBy(owner);
app.setDataChangeLastModifiedBy(owner);
app.setDataChangeCreatedTime(new Date());
app = adminService.createNewApp(app);
Assert.assertEquals(appId, app.getAppId());
List<Cluster> clusters = clusterService.findParentClusters(app.getAppId());
Assert.assertEquals(1, clusters.size());
Assert.assertEquals(ConfigConsts.CLUSTER_NAME_DEFAULT, clusters.get(0).getName());
List<Namespace> namespaces = namespaceService.findNamespaces(appId, clusters.get(0).getName());
Assert.assertEquals(1, namespaces.size());
Assert.assertEquals(ConfigConsts.NAMESPACE_APPLICATION, namespaces.get(0).getNamespaceName());
List<Audit> audits = auditService.findByOwner(owner);
Assert.assertEquals(4, audits.size());
}
@Test(expected = ServiceException.class)
public void testCreateDuplicateApp() {
String appId = "someAppId";
App app = new App();
app.setAppId(appId);
app.setName("someAppName");
String owner = "someOwnerName";
app.setOwnerName(owner);
app.setOwnerEmail("someOwnerName@ctrip.com");
app.setDataChangeCreatedBy(owner);
app.setDataChangeLastModifiedBy(owner);
app.setDataChangeCreatedTime(new Date());
appRepository.save(app);
adminService.createNewApp(app);
}
public class AdminServiceTest extends AbstractIntegrationTest {
@Autowired
private AdminService adminService;
@Autowired
private AuditService auditService;
@Autowired
private AppRepository appRepository;
@Autowired
private ClusterService clusterService;
@Autowired
private NamespaceService namespaceService;
@Autowired
private AppNamespaceService appNamespaceService;
@Test
public void testCreateNewApp() {
String appId = "someAppId";
App app = new App();
app.setAppId(appId);
app.setName("someAppName");
String owner = "someOwnerName";
app.setOwnerName(owner);
app.setOwnerEmail("someOwnerName@ctrip.com");
app.setDataChangeCreatedBy(owner);
app.setDataChangeLastModifiedBy(owner);
app.setDataChangeCreatedTime(new Date());
app = adminService.createNewApp(app);
Assert.assertEquals(appId, app.getAppId());
List<Cluster> clusters = clusterService.findParentClusters(app.getAppId());
Assert.assertEquals(1, clusters.size());
Assert.assertEquals(ConfigConsts.CLUSTER_NAME_DEFAULT, clusters.get(0).getName());
List<Namespace> namespaces = namespaceService.findNamespaces(appId, clusters.get(0).getName());
Assert.assertEquals(1, namespaces.size());
Assert.assertEquals(ConfigConsts.NAMESPACE_APPLICATION, namespaces.get(0).getNamespaceName());
List<Audit> audits = auditService.findByOwner(owner);
Assert.assertEquals(4, audits.size());
}
@Test(expected = ServiceException.class)
public void testCreateDuplicateApp() {
String appId = "someAppId";
App app = new App();
app.setAppId(appId);
app.setName("someAppName");
String owner = "someOwnerName";
app.setOwnerName(owner);
app.setOwnerEmail("someOwnerName@ctrip.com");
app.setDataChangeCreatedBy(owner);
app.setDataChangeLastModifiedBy(owner);
app.setDataChangeCreatedTime(new Date());
appRepository.save(app);
adminService.createNewApp(app);
}
@Test
public void testDeleteApp() {
String appId = "someAppId";
App app = new App();
app.setAppId(appId);
app.setName("someAppName");
String owner = "someOwnerName";
app.setOwnerName(owner);
app.setOwnerEmail("someOwnerName@ctrip.com");
app.setDataChangeCreatedBy(owner);
app.setDataChangeLastModifiedBy(owner);
app.setDataChangeCreatedTime(new Date());
app = adminService.createNewApp(app);
Assert.assertEquals(appId, app.getAppId());
Assert.assertEquals(1, appNamespaceService.findByAppId(appId).size());
Assert.assertEquals(1, clusterService.findClusters(appId).size());
Assert.assertEquals(1, namespaceService.findNamespaces(appId, ConfigConsts.CLUSTER_NAME_DEFAULT).size());
adminService.deleteApp(appId, owner);
Assert.assertEquals(0, appNamespaceService.findByAppId(appId).size());
Assert.assertEquals(0, clusterService.findClusters(appId).size());
Assert.assertEquals(0, namespaceService.findByAppIdAndNamespaceName(appId, ConfigConsts.CLUSTER_NAME_DEFAULT).size());
}
}
package com.ctrip.framework.apollo.portal.api;
import com.google.common.base.Joiner;
import com.ctrip.framework.apollo.common.dto.AppDTO;
import com.ctrip.framework.apollo.common.dto.AppNamespaceDTO;
import com.ctrip.framework.apollo.common.dto.ClusterDTO;
import com.ctrip.framework.apollo.common.dto.CommitDTO;
import com.ctrip.framework.apollo.common.dto.GrayReleaseRuleDTO;
import com.ctrip.framework.apollo.common.dto.InstanceDTO;
import com.ctrip.framework.apollo.common.dto.ItemChangeSets;
import com.ctrip.framework.apollo.common.dto.ItemDTO;
import com.ctrip.framework.apollo.common.dto.NamespaceDTO;
import com.ctrip.framework.apollo.common.dto.NamespaceLockDTO;
import com.ctrip.framework.apollo.common.dto.PageDTO;
import com.ctrip.framework.apollo.common.dto.ReleaseDTO;
import com.ctrip.framework.apollo.common.dto.ReleaseHistoryDTO;
import com.ctrip.framework.apollo.common.dto.*;
import com.ctrip.framework.apollo.core.enums.Env;
import com.google.common.base.Joiner;
import org.springframework.boot.actuate.health.Health;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
......@@ -29,417 +15,417 @@ import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
@Service
public class AdminServiceAPI {
@Service
public static class HealthAPI extends API {
public Health health(Env env) {
return restTemplate.get(env, "/health", Health.class);
}
}
@Service
public static class AppAPI extends API {
public AppDTO loadApp(Env env, String appId) {
return restTemplate.get(env, "apps/{appId}", AppDTO.class, appId);
}
public AppDTO createApp(Env env, AppDTO app) {
return restTemplate.post(env, "apps", app, AppDTO.class);
}
public void updateApp(Env env, AppDTO app) {
restTemplate.put(env, "apps/{appId}", app, app.getAppId());
}
}
@Service
public static class NamespaceAPI extends API {
private ParameterizedTypeReference<Map<String, Boolean>>
typeReference = new ParameterizedTypeReference<Map<String, Boolean>>() {
};
public List<NamespaceDTO> findNamespaceByCluster(String appId, Env env, String clusterName) {
NamespaceDTO[] namespaceDTOs = restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces",
NamespaceDTO[].class, appId,
clusterName);
return Arrays.asList(namespaceDTOs);
}
public NamespaceDTO loadNamespace(String appId, Env env, String clusterName,
String namespaceName) {
return
restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}",
NamespaceDTO.class, appId, clusterName, namespaceName);
}
public NamespaceDTO findPublicNamespaceForAssociatedNamespace(Env env, String appId, String clusterName,
String namespaceName) {
return
restTemplate
.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/associated-public-namespace",
NamespaceDTO.class, appId, clusterName, namespaceName);
}
public NamespaceDTO createNamespace(Env env, NamespaceDTO namespace) {
return restTemplate
.post(env, "apps/{appId}/clusters/{clusterName}/namespaces", namespace, NamespaceDTO.class,
namespace.getAppId(), namespace.getClusterName());
}
public AppNamespaceDTO createAppNamespace(Env env, AppNamespaceDTO appNamespace) {
return restTemplate
.post(env, "apps/{appId}/appnamespaces", appNamespace, AppNamespaceDTO.class, appNamespace.getAppId());
}
public void deleteNamespace(Env env, String appId, String clusterName, String namespaceName, String operator) {
restTemplate
.delete(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}?operator={operator}", appId,
clusterName,
namespaceName, operator);
}
public Map<String, Boolean> getNamespacePublishInfo(Env env, String appId) {
return restTemplate.get(env, "apps/{appId}/namespaces/publish_info", typeReference, appId).getBody();
}
public List<NamespaceDTO> getPublicAppNamespaceAllNamespaces(Env env, String publicNamespaceName,
int page, int size) {
NamespaceDTO[] namespaceDTOs =
restTemplate.get(env, "/appnamespaces/{publicNamespaceName}/namespaces?page={page}&size={size}",
NamespaceDTO[].class, publicNamespaceName, page, size);
return Arrays.asList(namespaceDTOs);
}
public int countPublicAppNamespaceAssociatedNamespaces(Env env, String publicNamesapceName) {
Integer count =
restTemplate.get(env, "/appnamespaces/{publicNamespaceName}/associated-namespaces/count", Integer.class,
publicNamesapceName);
return count == null ? 0 : count;
}
}
@Service
public static class ItemAPI extends API {
public List<ItemDTO> findItems(String appId, Env env, String clusterName, String namespaceName) {
ItemDTO[] itemDTOs =
restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items",
ItemDTO[].class, appId, clusterName, namespaceName);
return Arrays.asList(itemDTOs);
}
public ItemDTO loadItem(Env env, String appId, String clusterName, String namespaceName, String key) {
return restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items/{key}",
ItemDTO.class, appId, clusterName, namespaceName, key);
}
public void updateItemsByChangeSet(String appId, Env env, String clusterName, String namespace,
ItemChangeSets changeSets) {
restTemplate.post(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/itemset",
changeSets, Void.class, appId, clusterName, namespace);
}
public void updateItem(String appId, Env env, String clusterName, String namespace, long itemId, ItemDTO item) {
restTemplate.put(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items/{itemId}",
item, appId, clusterName, namespace, itemId);
}
public ItemDTO createItem(String appId, Env env, String clusterName, String namespace, ItemDTO item) {
return restTemplate.post(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items",
item, ItemDTO.class, appId, clusterName, namespace);
}
public void deleteItem(Env env, long itemId, String operator) {
restTemplate.delete(env, "items/{itemId}?operator={operator}", itemId, operator);
}
}
@Service
public static class ClusterAPI extends API {
public List<ClusterDTO> findClustersByApp(String appId, Env env) {
ClusterDTO[] clusterDTOs = restTemplate.get(env, "apps/{appId}/clusters", ClusterDTO[].class,
appId);
return Arrays.asList(clusterDTOs);
}
public ClusterDTO loadCluster(String appId, Env env, String clusterName) {
return restTemplate.get(env, "apps/{appId}/clusters/{clusterName}", ClusterDTO.class,
appId, clusterName);
}
public boolean isClusterUnique(String appId, Env env, String clusterName) {
return restTemplate
.get(env, "apps/{appId}/cluster/{clusterName}/unique", Boolean.class,
appId, clusterName);
}
public ClusterDTO create(Env env, ClusterDTO cluster) {
return restTemplate.post(env, "apps/{appId}/clusters", cluster, ClusterDTO.class,
cluster.getAppId());
}
public void delete(Env env, String appId, String clusterName, String operator) {
restTemplate.delete(env, "apps/{appId}/clusters/{clusterName}?operator={operator}", appId, clusterName, operator);
}
}
@Service
public static class ReleaseAPI extends API {
private static final Joiner JOINER = Joiner.on(",");
public ReleaseDTO loadRelease(Env env, long releaseId) {
return restTemplate.get(env, "releases/{releaseId}", ReleaseDTO.class, releaseId);
}
public List<ReleaseDTO> findReleaseByIds(Env env, Set<Long> releaseIds) {
if (CollectionUtils.isEmpty(releaseIds)) {
return Collections.emptyList();
}
ReleaseDTO[]
releases =
restTemplate.get(env, "/releases?releaseIds={releaseIds}", ReleaseDTO[].class, JOINER.join(releaseIds));
return Arrays.asList(releases);
}
public List<ReleaseDTO> findAllReleases(String appId, Env env, String clusterName, String namespaceName, int page,
int size) {
ReleaseDTO[] releaseDTOs = restTemplate.get(
env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/all?page={page}&size={size}",
ReleaseDTO[].class,
appId, clusterName, namespaceName, page, size);
return Arrays.asList(releaseDTOs);
}
public List<ReleaseDTO> findActiveReleases(String appId, Env env, String clusterName, String namespaceName,
int page,
int size) {
ReleaseDTO[] releaseDTOs = restTemplate.get(
env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/active?page={page}&size={size}",
ReleaseDTO[].class,
appId, clusterName, namespaceName, page, size);
return Arrays.asList(releaseDTOs);
}
@Service
public static class HealthAPI extends API {
public ReleaseDTO loadLatestRelease(String appId, Env env, String clusterName,
String namespace) {
ReleaseDTO releaseDTO = restTemplate
.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/latest",
ReleaseDTO.class, appId, clusterName, namespace);
return releaseDTO;
public Health health(Env env) {
return restTemplate.get(env, "/health", Health.class);
}
}
public ReleaseDTO createRelease(String appId, Env env, String clusterName, String namespace,
String releaseName, String releaseComment, String operator,
boolean isEmergencyPublish) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8"));
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
parameters.add("name", releaseName);
parameters.add("comment", releaseComment);
parameters.add("operator", operator);
parameters.add("isEmergencyPublish", String.valueOf(isEmergencyPublish));
HttpEntity<MultiValueMap<String, String>> entity =
new HttpEntity<>(parameters, headers);
ReleaseDTO response = restTemplate.post(
env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases", entity,
ReleaseDTO.class, appId, clusterName, namespace);
return response;
}
@Service
public static class AppAPI extends API {
public ReleaseDTO updateAndPublish(String appId, Env env, String clusterName, String namespace,
String releaseName, String releaseComment, String branchName,
boolean isEmergencyPublish, boolean deleteBranch, ItemChangeSets changeSets) {
public AppDTO loadApp(Env env, String appId) {
return restTemplate.get(env, "apps/{appId}", AppDTO.class, appId);
}
return restTemplate.post(env,
"apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/updateAndPublish?"
+ "releaseName={releaseName}&releaseComment={releaseComment}&branchName={branchName}"
+ "&deleteBranch={deleteBranch}&isEmergencyPublish={isEmergencyPublish}",
changeSets, ReleaseDTO.class, appId, clusterName, namespace,
releaseName, releaseComment, branchName, deleteBranch, isEmergencyPublish);
public AppDTO createApp(Env env, AppDTO app) {
return restTemplate.post(env, "apps", app, AppDTO.class);
}
}
public void updateApp(Env env, AppDTO app) {
restTemplate.put(env, "apps/{appId}", app, app.getAppId());
}
public void rollback(Env env, long releaseId, String operator) {
restTemplate.put(env,
"releases/{releaseId}/rollback?operator={operator}",
null, releaseId, operator);
public void deleteApp(Env env, String appId, String operator) {
restTemplate.delete(env, "/apps?appId={appId}&operator={operator}", appId, operator);
}
}
}
@Service
public static class CommitAPI extends API {
public List<CommitDTO> find(String appId, Env env, String clusterName, String namespaceName, int page, int size) {
CommitDTO[] commitDTOs = restTemplate.get(env,
"apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/commit?page={page}&size={size}",
CommitDTO[].class,
appId, clusterName, namespaceName, page, size);
return Arrays.asList(commitDTOs);
}
}
@Service
public static class NamespaceLockAPI extends API {
@Service
public static class NamespaceAPI extends API {
public NamespaceLockDTO getNamespaceLockOwner(String appId, Env env, String clusterName, String namespaceName) {
return restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/lock",
NamespaceLockDTO.class,
appId, clusterName, namespaceName);
}
}
@Service
public static class InstanceAPI extends API {
private Joiner joiner = Joiner.on(",");
private ParameterizedTypeReference<PageDTO<InstanceDTO>>
pageInstanceDtoType =
new ParameterizedTypeReference<PageDTO<InstanceDTO>>() {
private ParameterizedTypeReference<Map<String, Boolean>>
typeReference = new ParameterizedTypeReference<Map<String, Boolean>>() {
};
public PageDTO<InstanceDTO> getByRelease(Env env, long releaseId, int page, int size) {
ResponseEntity<PageDTO<InstanceDTO>>
entity =
restTemplate
.get(env, "/instances/by-release?releaseId={releaseId}&page={page}&size={size}", pageInstanceDtoType,
releaseId, page, size);
return entity.getBody();
public List<NamespaceDTO> findNamespaceByCluster(String appId, Env env, String clusterName) {
NamespaceDTO[] namespaceDTOs = restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces",
NamespaceDTO[].class, appId,
clusterName);
return Arrays.asList(namespaceDTOs);
}
public NamespaceDTO loadNamespace(String appId, Env env, String clusterName,
String namespaceName) {
return
restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}",
NamespaceDTO.class, appId, clusterName, namespaceName);
}
public NamespaceDTO findPublicNamespaceForAssociatedNamespace(Env env, String appId, String clusterName,
String namespaceName) {
return
restTemplate
.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/associated-public-namespace",
NamespaceDTO.class, appId, clusterName, namespaceName);
}
public NamespaceDTO createNamespace(Env env, NamespaceDTO namespace) {
return restTemplate
.post(env, "apps/{appId}/clusters/{clusterName}/namespaces", namespace, NamespaceDTO.class,
namespace.getAppId(), namespace.getClusterName());
}
public AppNamespaceDTO createAppNamespace(Env env, AppNamespaceDTO appNamespace) {
return restTemplate
.post(env, "apps/{appId}/appnamespaces", appNamespace, AppNamespaceDTO.class, appNamespace.getAppId());
}
public void deleteNamespace(Env env, String appId, String clusterName, String namespaceName, String operator) {
restTemplate
.delete(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}?operator={operator}", appId,
clusterName,
namespaceName, operator);
}
public Map<String, Boolean> getNamespacePublishInfo(Env env, String appId) {
return restTemplate.get(env, "apps/{appId}/namespaces/publish_info", typeReference, appId).getBody();
}
public List<NamespaceDTO> getPublicAppNamespaceAllNamespaces(Env env, String publicNamespaceName,
int page, int size) {
NamespaceDTO[] namespaceDTOs =
restTemplate.get(env, "/appnamespaces/{publicNamespaceName}/namespaces?page={page}&size={size}",
NamespaceDTO[].class, publicNamespaceName, page, size);
return Arrays.asList(namespaceDTOs);
}
public int countPublicAppNamespaceAssociatedNamespaces(Env env, String publicNamesapceName) {
Integer count =
restTemplate.get(env, "/appnamespaces/{publicNamespaceName}/associated-namespaces/count", Integer.class,
publicNamesapceName);
return count == null ? 0 : count;
}
}
@Service
public static class ItemAPI extends API {
public List<ItemDTO> findItems(String appId, Env env, String clusterName, String namespaceName) {
ItemDTO[] itemDTOs =
restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items",
ItemDTO[].class, appId, clusterName, namespaceName);
return Arrays.asList(itemDTOs);
}
public ItemDTO loadItem(Env env, String appId, String clusterName, String namespaceName, String key) {
return restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items/{key}",
ItemDTO.class, appId, clusterName, namespaceName, key);
}
public void updateItemsByChangeSet(String appId, Env env, String clusterName, String namespace,
ItemChangeSets changeSets) {
restTemplate.post(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/itemset",
changeSets, Void.class, appId, clusterName, namespace);
}
public void updateItem(String appId, Env env, String clusterName, String namespace, long itemId, ItemDTO item) {
restTemplate.put(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items/{itemId}",
item, appId, clusterName, namespace, itemId);
}
public ItemDTO createItem(String appId, Env env, String clusterName, String namespace, ItemDTO item) {
return restTemplate.post(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/items",
item, ItemDTO.class, appId, clusterName, namespace);
}
public void deleteItem(Env env, long itemId, String operator) {
restTemplate.delete(env, "items/{itemId}?operator={operator}", itemId, operator);
}
}
@Service
public static class ClusterAPI extends API {
public List<ClusterDTO> findClustersByApp(String appId, Env env) {
ClusterDTO[] clusterDTOs = restTemplate.get(env, "apps/{appId}/clusters", ClusterDTO[].class,
appId);
return Arrays.asList(clusterDTOs);
}
public ClusterDTO loadCluster(String appId, Env env, String clusterName) {
return restTemplate.get(env, "apps/{appId}/clusters/{clusterName}", ClusterDTO.class,
appId, clusterName);
}
public boolean isClusterUnique(String appId, Env env, String clusterName) {
return restTemplate
.get(env, "apps/{appId}/cluster/{clusterName}/unique", Boolean.class,
appId, clusterName);
}
public ClusterDTO create(Env env, ClusterDTO cluster) {
return restTemplate.post(env, "apps/{appId}/clusters", cluster, ClusterDTO.class,
cluster.getAppId());
}
public void delete(Env env, String appId, String clusterName, String operator) {
restTemplate.delete(env, "apps/{appId}/clusters/{clusterName}?operator={operator}", appId, clusterName, operator);
}
}
@Service
public static class ReleaseAPI extends API {
private static final Joiner JOINER = Joiner.on(",");
public ReleaseDTO loadRelease(Env env, long releaseId) {
return restTemplate.get(env, "releases/{releaseId}", ReleaseDTO.class, releaseId);
}
public List<ReleaseDTO> findReleaseByIds(Env env, Set<Long> releaseIds) {
if (CollectionUtils.isEmpty(releaseIds)) {
return Collections.emptyList();
}
ReleaseDTO[]
releases =
restTemplate.get(env, "/releases?releaseIds={releaseIds}", ReleaseDTO[].class, JOINER.join(releaseIds));
return Arrays.asList(releases);
}
public List<ReleaseDTO> findAllReleases(String appId, Env env, String clusterName, String namespaceName, int page,
int size) {
ReleaseDTO[] releaseDTOs = restTemplate.get(
env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/all?page={page}&size={size}",
ReleaseDTO[].class,
appId, clusterName, namespaceName, page, size);
return Arrays.asList(releaseDTOs);
}
public List<ReleaseDTO> findActiveReleases(String appId, Env env, String clusterName, String namespaceName,
int page,
int size) {
ReleaseDTO[] releaseDTOs = restTemplate.get(
env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/active?page={page}&size={size}",
ReleaseDTO[].class,
appId, clusterName, namespaceName, page, size);
return Arrays.asList(releaseDTOs);
}
public ReleaseDTO loadLatestRelease(String appId, Env env, String clusterName,
String namespace) {
ReleaseDTO releaseDTO = restTemplate
.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/latest",
ReleaseDTO.class, appId, clusterName, namespace);
return releaseDTO;
}
public ReleaseDTO createRelease(String appId, Env env, String clusterName, String namespace,
String releaseName, String releaseComment, String operator,
boolean isEmergencyPublish) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType(MediaType.APPLICATION_FORM_URLENCODED_VALUE + ";charset=UTF-8"));
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
parameters.add("name", releaseName);
parameters.add("comment", releaseComment);
parameters.add("operator", operator);
parameters.add("isEmergencyPublish", String.valueOf(isEmergencyPublish));
HttpEntity<MultiValueMap<String, String>> entity =
new HttpEntity<>(parameters, headers);
ReleaseDTO response = restTemplate.post(
env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases", entity,
ReleaseDTO.class, appId, clusterName, namespace);
return response;
}
public ReleaseDTO updateAndPublish(String appId, Env env, String clusterName, String namespace,
String releaseName, String releaseComment, String branchName,
boolean isEmergencyPublish, boolean deleteBranch, ItemChangeSets changeSets) {
return restTemplate.post(env,
"apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/updateAndPublish?"
+ "releaseName={releaseName}&releaseComment={releaseComment}&branchName={branchName}"
+ "&deleteBranch={deleteBranch}&isEmergencyPublish={isEmergencyPublish}",
changeSets, ReleaseDTO.class, appId, clusterName, namespace,
releaseName, releaseComment, branchName, deleteBranch, isEmergencyPublish);
}
public void rollback(Env env, long releaseId, String operator) {
restTemplate.put(env,
"releases/{releaseId}/rollback?operator={operator}",
null, releaseId, operator);
}
}
@Service
public static class CommitAPI extends API {
public List<CommitDTO> find(String appId, Env env, String clusterName, String namespaceName, int page, int size) {
CommitDTO[] commitDTOs = restTemplate.get(env,
"apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/commit?page={page}&size={size}",
CommitDTO[].class,
appId, clusterName, namespaceName, page, size);
return Arrays.asList(commitDTOs);
}
}
@Service
public static class NamespaceLockAPI extends API {
public NamespaceLockDTO getNamespaceLockOwner(String appId, Env env, String clusterName, String namespaceName) {
return restTemplate.get(env, "apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/lock",
NamespaceLockDTO.class,
appId, clusterName, namespaceName);
}
}
@Service
public static class InstanceAPI extends API {
private Joiner joiner = Joiner.on(",");
private ParameterizedTypeReference<PageDTO<InstanceDTO>>
pageInstanceDtoType =
new ParameterizedTypeReference<PageDTO<InstanceDTO>>() {
};
public PageDTO<InstanceDTO> getByRelease(Env env, long releaseId, int page, int size) {
ResponseEntity<PageDTO<InstanceDTO>>
entity =
restTemplate
.get(env, "/instances/by-release?releaseId={releaseId}&page={page}&size={size}", pageInstanceDtoType,
releaseId, page, size);
return entity.getBody();
}
public List<InstanceDTO> getByReleasesNotIn(String appId, Env env, String clusterName, String namespaceName,
Set<Long> releaseIds) {
InstanceDTO[]
instanceDTOs =
restTemplate.get(env,
"/instances/by-namespace-and-releases-not-in?appId={appId}&clusterName={clusterName}&namespaceName={namespaceName}&releaseIds={releaseIds}",
InstanceDTO[].class, appId, clusterName, namespaceName, joiner.join(releaseIds));
return Arrays.asList(instanceDTOs);
}
public PageDTO<InstanceDTO> getByNamespace(String appId, Env env, String clusterName, String namespaceName,
String instanceAppId,
int page, int size) {
ResponseEntity<PageDTO<InstanceDTO>>
entity =
restTemplate.get(env,
"/instances/by-namespace?appId={appId}"
+ "&clusterName={clusterName}&namespaceName={namespaceName}&instanceAppId={instanceAppId}"
+ "&page={page}&size={size}",
pageInstanceDtoType, appId, clusterName, namespaceName, instanceAppId, page, size);
return entity.getBody();
}
public int getInstanceCountByNamespace(String appId, Env env, String clusterName, String namespaceName) {
Integer
count =
restTemplate.get(env,
"/instances/by-namespace/count?appId={appId}&clusterName={clusterName}&namespaceName={namespaceName}",
Integer.class, appId, clusterName, namespaceName);
if (count == null) {
return 0;
}
return count;
}
}
@Service
public static class NamespaceBranchAPI extends API {
public NamespaceDTO createBranch(String appId, Env env, String clusterName,
String namespaceName, String operator) {
return restTemplate
.post(env, "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/branches?operator={operator}",
null, NamespaceDTO.class, appId, clusterName, namespaceName, operator);
}
public NamespaceDTO findBranch(String appId, Env env, String clusterName,
String namespaceName) {
return restTemplate.get(env, "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/branches",
NamespaceDTO.class, appId, clusterName, namespaceName);
}
public GrayReleaseRuleDTO findBranchGrayRules(String appId, Env env, String clusterName,
String namespaceName, String branchName) {
return restTemplate
.get(env, "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/branches/{branchName}/rules",
GrayReleaseRuleDTO.class, appId, clusterName, namespaceName, branchName);
}
public void updateBranchGrayRules(String appId, Env env, String clusterName,
String namespaceName, String branchName, GrayReleaseRuleDTO rules) {
restTemplate
.put(env, "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/branches/{branchName}/rules",
rules, appId, clusterName, namespaceName, branchName);
}
public void deleteBranch(String appId, Env env, String clusterName,
String namespaceName, String branchName, String operator) {
restTemplate.delete(env,
"/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/branches/{branchName}?operator={operator}",
appId, clusterName, namespaceName, branchName, operator);
}
}
@Service
public static class ReleaseHistoryAPI extends API {
private ParameterizedTypeReference<PageDTO<ReleaseHistoryDTO>> type =
new ParameterizedTypeReference<PageDTO<ReleaseHistoryDTO>>() {
};
public PageDTO<ReleaseHistoryDTO> findReleaseHistoriesByNamespace(String appId, Env env, String clusterName,
String namespaceName, int page, int size) {
return restTemplate.get(env,
"/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/histories?page={page}&size={size}",
type, appId, clusterName, namespaceName, page, size).getBody();
}
public PageDTO<ReleaseHistoryDTO> findByReleaseIdAndOperation(Env env, long releaseId, int operation, int page,
int size) {
return restTemplate.get(env,
"/releases/histories/by_release_id_and_operation?releaseId={releaseId}&operation={operation}&page={page}&size={size}",
type, releaseId, operation, page, size).getBody();
}
public PageDTO<ReleaseHistoryDTO> findByPreviousReleaseIdAndOperation(Env env, long previousReleaseId,
int operation, int page, int size) {
return restTemplate.get(env,
"/releases/histories/by_previous_release_id_and_operation?previousReleaseId={releaseId}&operation={operation}&page={page}&size={size}",
type, previousReleaseId, operation, page, size).getBody();
}
}
public List<InstanceDTO> getByReleasesNotIn(String appId, Env env, String clusterName, String namespaceName,
Set<Long> releaseIds) {
InstanceDTO[]
instanceDTOs =
restTemplate.get(env,
"/instances/by-namespace-and-releases-not-in?appId={appId}&clusterName={clusterName}&namespaceName={namespaceName}&releaseIds={releaseIds}",
InstanceDTO[].class, appId, clusterName, namespaceName, joiner.join(releaseIds));
return Arrays.asList(instanceDTOs);
}
public PageDTO<InstanceDTO> getByNamespace(String appId, Env env, String clusterName, String namespaceName,
String instanceAppId,
int page, int size) {
ResponseEntity<PageDTO<InstanceDTO>>
entity =
restTemplate.get(env,
"/instances/by-namespace?appId={appId}"
+ "&clusterName={clusterName}&namespaceName={namespaceName}&instanceAppId={instanceAppId}"
+ "&page={page}&size={size}",
pageInstanceDtoType, appId, clusterName, namespaceName, instanceAppId, page, size);
return entity.getBody();
}
public int getInstanceCountByNamespace(String appId, Env env, String clusterName, String namespaceName) {
Integer
count =
restTemplate.get(env,
"/instances/by-namespace/count?appId={appId}&clusterName={clusterName}&namespaceName={namespaceName}",
Integer.class, appId, clusterName, namespaceName);
if (count == null) {
return 0;
}
return count;
}
}
@Service
public static class NamespaceBranchAPI extends API {
public NamespaceDTO createBranch(String appId, Env env, String clusterName,
String namespaceName, String operator) {
return restTemplate
.post(env, "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/branches?operator={operator}",
null, NamespaceDTO.class, appId, clusterName, namespaceName, operator);
}
public NamespaceDTO findBranch(String appId, Env env, String clusterName,
String namespaceName) {
return restTemplate.get(env, "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/branches",
NamespaceDTO.class, appId, clusterName, namespaceName);
}
public GrayReleaseRuleDTO findBranchGrayRules(String appId, Env env, String clusterName,
String namespaceName, String branchName) {
return restTemplate
.get(env, "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/branches/{branchName}/rules",
GrayReleaseRuleDTO.class, appId, clusterName, namespaceName, branchName);
}
public void updateBranchGrayRules(String appId, Env env, String clusterName,
String namespaceName, String branchName, GrayReleaseRuleDTO rules) {
restTemplate
.put(env, "/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/branches/{branchName}/rules",
rules, appId, clusterName, namespaceName, branchName);
}
public void deleteBranch(String appId, Env env, String clusterName,
String namespaceName, String branchName, String operator) {
restTemplate.delete(env,
"/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/branches/{branchName}?operator={operator}",
appId, clusterName, namespaceName, branchName, operator);
}
}
@Service
public static class ReleaseHistoryAPI extends API {
private ParameterizedTypeReference<PageDTO<ReleaseHistoryDTO>> type =
new ParameterizedTypeReference<PageDTO<ReleaseHistoryDTO>>() {
};
public PageDTO<ReleaseHistoryDTO> findReleaseHistoriesByNamespace(String appId, Env env, String clusterName,
String namespaceName, int page, int size) {
return restTemplate.get(env,
"/apps/{appId}/clusters/{clusterName}/namespaces/{namespaceName}/releases/histories?page={page}&size={size}",
type, appId, clusterName, namespaceName, page, size).getBody();
}
public PageDTO<ReleaseHistoryDTO> findByReleaseIdAndOperation(Env env, long releaseId, int operation, int page,
int size) {
return restTemplate.get(env,
"/releases/histories/by_release_id_and_operation?releaseId={releaseId}&operation={operation}&page={page}&size={size}",
type, releaseId, operation, page, size).getBody();
}
public PageDTO<ReleaseHistoryDTO> findByPreviousReleaseIdAndOperation(Env env, long previousReleaseId,
int operation, int page, int size) {
return restTemplate.get(env,
"/releases/histories/by_previous_release_id_and_operation?previousReleaseId={releaseId}&operation={operation}&page={page}&size={size}",
type, previousReleaseId, operation, page, size).getBody();
}
}
}
package com.ctrip.framework.apollo.portal.controller;
import com.google.common.collect.Sets;
import com.ctrip.framework.apollo.common.entity.App;
import com.ctrip.framework.apollo.common.exception.BadRequestException;
import com.ctrip.framework.apollo.common.http.MultiResponseEntity;
......@@ -14,12 +12,16 @@ import com.ctrip.framework.apollo.portal.component.PortalSettings;
import com.ctrip.framework.apollo.portal.entity.model.AppModel;
import com.ctrip.framework.apollo.portal.entity.vo.EnvClusterInfo;
import com.ctrip.framework.apollo.portal.listener.AppCreationEvent;
import com.ctrip.framework.apollo.portal.listener.AppDeletionEvent;
import com.ctrip.framework.apollo.portal.listener.AppInfoChangedEvent;
import com.ctrip.framework.apollo.portal.service.AppService;
import com.ctrip.framework.apollo.portal.service.RolePermissionService;
import com.ctrip.framework.apollo.portal.spi.UserInfoHolder;
import com.ctrip.framework.apollo.portal.util.RoleUtils;
import com.google.common.collect.Sets;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.domain.Pageable;
......@@ -36,10 +38,6 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.HttpClientErrorException;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@RestController
@RequestMapping("/apps")
......@@ -82,8 +80,9 @@ public class AppController {
Set<String> admins = appModel.getAdmins();
if (!CollectionUtils.isEmpty(admins)) {
rolePermissionService.assignRoleToUsers(RoleUtils.buildAppMasterRoleName(createdApp.getAppId()),
admins, userInfoHolder.getUser().getUserId());
rolePermissionService
.assignRoleToUsers(RoleUtils.buildAppMasterRoleName(createdApp.getAppId()),
admins, userInfoHolder.getUser().getUserId());
}
return createdApp;
......@@ -113,8 +112,8 @@ public class AppController {
response.addResponseEntity(RichResponseEntity.ok(appService.createEnvNavNode(env, appId)));
} catch (Exception e) {
response.addResponseEntity(RichResponseEntity.error(HttpStatus.INTERNAL_SERVER_ERROR,
"load env:" + env.name() + " cluster error." + e
.getMessage()));
"load env:" + env.name() + " cluster error." + e
.getMessage()));
}
}
return response;
......@@ -124,8 +123,9 @@ public class AppController {
"application/json"})
public ResponseEntity<Void> create(@PathVariable String env, @RequestBody App app) {
RequestPrecondition.checkArgumentsNotEmpty(app.getName(), app.getAppId(), app.getOwnerEmail(), app.getOwnerName(),
app.getOrgId(), app.getOrgName());
RequestPrecondition.checkArgumentsNotEmpty(app.getName(), app.getAppId(), app.getOwnerEmail(),
app.getOwnerName(),
app.getOrgId(), app.getOrgName());
if (!InputValidator.isValidClusterNamespace(app.getAppId())) {
throw new BadRequestException(InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE);
}
......@@ -141,6 +141,17 @@ public class AppController {
return appService.load(appId);
}
@RequestMapping(value = "/{appId:.+}", method = RequestMethod.DELETE)
public void deleteApp(@PathVariable String appId) {
App app = appService.load(appId);
publisher.publishEvent(new AppDeletionEvent(app));
appService.deleteAppInLocal(appId);
}
@RequestMapping(value = "/{appId}/miss_envs", method = RequestMethod.GET)
public MultiResponseEntity<Env> findMissEnvs(@PathVariable String appId) {
......@@ -154,9 +165,9 @@ public class AppController {
response.addResponseEntity(RichResponseEntity.ok(env));
} else {
response.addResponseEntity(RichResponseEntity.error(HttpStatus.INTERNAL_SERVER_ERROR,
String.format("load appId:%s from env %s error.", appId,
env)
+ e.getMessage()));
String.format("load appId:%s from env %s error.", appId,
env)
+ e.getMessage()));
}
}
}
......@@ -175,16 +186,17 @@ public class AppController {
RequestPrecondition.checkArgumentsNotEmpty(appId, appName, ownerName, orgId, orgName);
if (!InputValidator.isValidClusterNamespace(appModel.getAppId())) {
throw new BadRequestException(String.format("AppId格式错误: %s", InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE));
throw new BadRequestException(
String.format("AppId格式错误: %s", InputValidator.INVALID_CLUSTER_NAMESPACE_MESSAGE));
}
return App.builder()
.appId(appId)
.name(appName)
.ownerName(ownerName)
.orgId(orgId)
.orgName(orgName)
.build();
.appId(appId)
.name(appName)
.ownerName(ownerName)
.orgId(orgId)
.orgName(orgName)
.build();
}
}
package com.ctrip.framework.apollo.portal.listener;
import com.ctrip.framework.apollo.common.entity.App;
import com.google.common.base.Preconditions;
import org.springframework.context.ApplicationEvent;
public class AppDeletionEvent extends ApplicationEvent {
public AppDeletionEvent(Object source) {
super(source);
}
public App getApp() {
Preconditions.checkState(source != null);
return (App) this.source;
}
}
......@@ -5,6 +5,7 @@ import com.ctrip.framework.apollo.common.utils.BeanUtils;
import com.ctrip.framework.apollo.core.enums.Env;
import com.ctrip.framework.apollo.portal.api.AdminServiceAPI;
import com.ctrip.framework.apollo.portal.component.PortalSettings;
import com.ctrip.framework.apollo.portal.spi.UserInfoHolder;
import com.ctrip.framework.apollo.tracer.Tracer;
import org.slf4j.Logger;
......@@ -23,7 +24,8 @@ public class AppInfoChangedListener {
private AdminServiceAPI.AppAPI appAPI;
@Autowired
private PortalSettings portalSettings;
@Autowired
private UserInfoHolder userInfoHolder;
@EventListener
public void onAppInfoChange(AppInfoChangedEvent event) {
......@@ -39,7 +41,22 @@ public class AppInfoChangedListener {
Tracer.logError(String.format("Update app's info failed. Env = %s, AppId = %s", env, appId), e);
}
}
}
@EventListener
public void onAppDelete(AppDeletionEvent event) {
AppDTO appDTO = BeanUtils.transfrom(AppDTO.class, event.getApp());
String appId = appDTO.getAppId();
String operator = userInfoHolder.getUser().getName();
List<Env> envs = portalSettings.getActiveEnvs();
for (Env env : envs) {
try {
appAPI.deleteApp(env, appId, operator);
} catch (Throwable e) {
logger.error("Delete app failed. Env = {}, AppId = {}", env, appId, e);
Tracer.logError(String.format("Delete app failed. Env = %s, AppId = %s", env, appId), e);
}
}
}
}
package com.ctrip.framework.apollo.portal.repository;
import com.ctrip.framework.apollo.common.entity.AppNamespace;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
public interface AppNamespaceRepository extends PagingAndSortingRepository<AppNamespace, Long> {
......@@ -16,4 +16,9 @@ public interface AppNamespaceRepository extends PagingAndSortingRepository<AppNa
List<AppNamespace> findByIsPublicTrue();
@Modifying
@Query("UPDATE AppNamespace SET IsDeleted=1,DataChange_LastModifiedBy=?2 WHERE AppId=?1")
int batchDeleteByDeleteApp(String appId, String operator);
int countByAppId(String appId);
}
......@@ -3,6 +3,8 @@ package com.ctrip.framework.apollo.portal.repository;
import com.ctrip.framework.apollo.common.entity.App;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
......@@ -17,4 +19,7 @@ public interface AppRepository extends PagingAndSortingRepository<App, Long> {
List<App> findByAppIdIn(Set<String> appIds);
@Modifying
@Query("UPDATE App SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1")
int deleteApp(String appId, String operator);
}
......@@ -3,6 +3,8 @@ package com.ctrip.framework.apollo.portal.repository;
import com.ctrip.framework.apollo.portal.entity.po.Favorite;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
......@@ -16,4 +18,10 @@ public interface FavoriteRepository extends PagingAndSortingRepository<Favorite,
Favorite findFirstByUserIdOrderByPositionAscDataChangeCreatedTimeAsc(String userId);
Favorite findByUserIdAndAppId(String userId, String appId);
@Modifying
@Query("UPDATE Favorite SET IsDeleted=1,DataChange_LastModifiedBy = ?2 WHERE AppId=?1")
int batchDeleteByDeleteApp(String appId, String operator);
int countByAppId(String appId);
}
......@@ -2,6 +2,8 @@ package com.ctrip.framework.apollo.portal.repository;
import com.ctrip.framework.apollo.portal.entity.po.Permission;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.Collection;
......@@ -21,4 +23,13 @@ public interface PermissionRepository extends PagingAndSortingRepository<Permiss
*/
List<Permission> findByPermissionTypeInAndTargetId(Collection<String> permissionTypes,
String targetId);
/**
* delete Permission when delete app.
*/
@Modifying
@Query("UPDATE Permission SET IsDeleted=1," +
"TargetId=CONCAT('DELETED_',TargetId,'_',CURRENT_TIMESTAMP)," +
"DataChange_LastModifiedBy = ?2 WHERE TargetId LIKE ?1 OR TargetId LIKE CONCAT(?1,'+%')")
Integer batchDeleteByDeleteApp(String appId, String operator);
}
......@@ -2,6 +2,8 @@ package com.ctrip.framework.apollo.portal.repository;
import com.ctrip.framework.apollo.portal.entity.po.Role;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
......@@ -12,4 +14,12 @@ public interface RoleRepository extends PagingAndSortingRepository<Role, Long> {
* find role by role name
*/
Role findTopByRoleName(String roleName);
@Modifying
@Query("UPDATE Role SET IsDeleted=1," +
"RoleName=CONCAT('DELETED_',RoleName,'_',CURRENT_TIMESTAMP)," +
"DataChange_LastModifiedBy = ?2 WHERE RoleName LIKE CONCAT('Master+',?1) " +
"OR RoleName LIKE CONCAT('ModifyNamespace+',?1,'+%') " +
"OR RoleName LIKE CONCAT('ReleaseNamespace+',?1,'+%')")
Integer batchDeleteByDeleteApp(String appId, String operator);
}
......@@ -118,4 +118,9 @@ public class AppNamespaceService {
return createdAppNamespace;
}
public void deleteApp(String appId, String operator) {
if (appNamespaceRepository.countByAppId(appId) > 0) {
appNamespaceRepository.batchDeleteByDeleteApp(appId, operator);
}
}
}
......@@ -41,6 +41,10 @@ public class AppService {
@Autowired
private RoleInitializationService roleInitializationService;
@Autowired
private RolePermissionService rolePermissionService;
@Autowired
private FavoriteService favoriteService;
@Autowired
private UserService userService;
......@@ -139,4 +143,23 @@ public class AppService {
return node;
}
@Transactional
public void deleteAppInLocal(String appId) {
App managedApp = appRepository.findByAppId(appId);
if (managedApp == null) {
throw new BadRequestException(String.format("App not exists. AppId = %s", appId));
}
String operator = userInfoHolder.getUser().getUserId();
//删除portal数据库中的app
appRepository.deleteApp(appId, operator);
//删除portal数据库中的appNamespace
appNamespaceService.deleteApp(appId, operator);
//删除portal数据库中的收藏表
favoriteService.deleteApp(appId, operator);
//删除portal数据库中Perimission、Role相关数据
rolePermissionService.deleteRolePermissionsByAppId(appId, operator);
}
}
package com.ctrip.framework.apollo.portal.service;
import com.ctrip.framework.apollo.common.exception.BadRequestException;
import com.ctrip.framework.apollo.portal.entity.po.Favorite;
import com.ctrip.framework.apollo.portal.entity.bo.UserInfo;
import com.ctrip.framework.apollo.portal.entity.po.Favorite;
import com.ctrip.framework.apollo.portal.repository.FavoriteRepository;
import com.ctrip.framework.apollo.portal.spi.UserInfoHolder;
import com.ctrip.framework.apollo.portal.spi.UserService;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@Service
public class FavoriteService {
......@@ -110,4 +108,9 @@ public class FavoriteService {
}
}
public void deleteApp(String appId, String operator) {
if (favoriteRepository.countByAppId(appId) > 0) {
favoriteRepository.batchDeleteByDeleteApp(appId, operator);
}
}
}
......@@ -56,4 +56,8 @@ public interface RolePermissionService {
*/
public Set<Permission> createPermissions(Set<Permission> permissions);
/**
* delete permissions when delete app.
*/
public void deleteRolePermissionsByAppId(String appId, String operator);
}
......@@ -220,4 +220,10 @@ public class DefaultRolePermissionService implements RolePermissionService {
return FluentIterable.from(results).toSet();
}
@Transactional
@Override
public void deleteRolePermissionsByAppId(String appId, String operator) {
permissionRepository.batchDeleteByDeleteApp(appId, operator);
roleRepository.batchDeleteByDeleteApp(appId, operator);
}
}
......@@ -364,38 +364,38 @@ CREATE TABLE `ServerConfig` (
# ------------------------------------------------------------
INSERT INTO `ServerConfig` (`Key`, `Cluster`, `Value`, `Comment`)
VALUES
('eureka.service.url', 'default', 'http://localhost:8080/eureka/', 'Eureka服务Url,多个service以英文逗号分隔'),
('namespace.lock.switch', 'default', 'false', '一次发布只能有一个人修改开关'),
('item.value.length.limit', 'default', '20000', 'item value最大长度限制'),
('config-service.cache.enabled', 'default', 'false', 'ConfigService是否开启缓存,开启后能提高性能,但是会增大内存消耗!'),
('item.key.length.limit', 'default', '128', 'item key 最大长度限制');
('eureka.service.url', 'default', 'http://localhost:8080/eureka/', 'Eureka服务Url,多个service以英文逗号分隔'),
('namespace.lock.switch', 'default', 'false', '一次发布只能有一个人修改开关'),
('item.value.length.limit', 'default', '20000', 'item value最大长度限制'),
('config-service.cache.enabled', 'default', 'false', 'ConfigService是否开启缓存,开启后能提高性能,但是会增大内存消耗!'),
('item.key.length.limit', 'default', '128', 'item key 最大长度限制');
# Sample Data
# ------------------------------------------------------------
INSERT INTO `App` (`AppId`, `Name`, `OrgId`, `OrgName`, `OwnerName`, `OwnerEmail`)
VALUES
('SampleApp', 'Sample App', 'TEST1', '样例部门1', 'apollo', 'apollo@acme.com');
('SampleApp', 'Sample App', 'TEST1', '样例部门1', 'apollo', 'apollo@acme.com');
INSERT INTO `AppNamespace` (`Name`, `AppId`, `Format`, `IsPublic`, `Comment`)
VALUES
('application', 'SampleApp', 'properties', 0, 'default app namespace');
('application', 'SampleApp', 'properties', 0, 'default app namespace');
INSERT INTO `Cluster` (`Name`, `AppId`)
VALUES
('default', 'SampleApp');
('default', 'SampleApp');
INSERT INTO `Namespace` (`Id`, `AppId`, `ClusterName`, `NamespaceName`)
VALUES
(1, 'SampleApp', 'default', 'application');
(1, 'SampleApp', 'default', 'application');
INSERT INTO `Item` (`NamespaceId`, `Key`, `Value`, `Comment`, `LineNum`)
VALUES
(1, 'timeout', '100', 'sample timeout配置', 1);
(1, 'timeout', '100', 'sample timeout配置', 1);
INSERT INTO `Release` (`ReleaseKey`, `Name`, `Comment`, `AppId`, `ClusterName`, `NamespaceName`, `Configurations`)
VALUES
('20161009155425-d3a0749c6e20bc15', '20161009155424-release', 'Sample发布', 'SampleApp', 'default', 'application', '{\"timeout\":\"100\"}');
('20161009155425-d3a0749c6e20bc15', '20161009155424-release', 'Sample发布', 'SampleApp', 'default', 'application', '{\"timeout\":\"100\"}');
INSERT INTO `ReleaseHistory` (`AppId`, `ClusterName`, `NamespaceName`, `BranchName`, `ReleaseId`, `PreviousReleaseId`, `Operation`, `OperationContext`, `DataChange_CreatedBy`, `DataChange_LastModifiedBy`)
VALUES
......
......@@ -307,16 +307,16 @@ CREATE TABLE `Authorities` (
# ------------------------------------------------------------
INSERT INTO `ServerConfig` (`Key`, `Value`, `Comment`)
VALUES
('apollo.portal.envs', 'dev', '可支持的环境列表'),
('organizations', '[{\"orgId\":\"TEST1\",\"orgName\":\"样例部门1\"},{\"orgId\":\"TEST2\",\"orgName\":\"样例部门2\"}]', '部门列表'),
('superAdmin', 'apollo', 'Portal超级管理员'),
('api.readTimeout', '10000', 'http接口read timeout'),
('consumer.token.salt', 'someSalt', 'consumer token salt'),
('admin.createPrivateNamespace.switch', 'false', '是否允许项目管理员创建私有namespace');
('apollo.portal.envs', 'dev', '可支持的环境列表'),
('organizations', '[{\"orgId\":\"TEST1\",\"orgName\":\"样例部门1\"},{\"orgId\":\"TEST2\",\"orgName\":\"样例部门2\"}]', '部门列表'),
('superAdmin', 'apollo', 'Portal超级管理员'),
('api.readTimeout', '10000', 'http接口read timeout'),
('consumer.token.salt', 'someSalt', 'consumer token salt'),
('admin.createPrivateNamespace.switch', 'false', '是否允许项目管理员创建私有namespace');
INSERT INTO `Users` (`Username`, `Password`, `Email`, `Enabled`)
VALUES
('apollo', '$2a$10$7r20uS.BQ9uBpf3Baj3uQOZvMVvB1RN3PYoKE94gtz2.WAOuiiwXS', 'apollo@acme.com', 1);
('apollo', '$2a$10$7r20uS.BQ9uBpf3Baj3uQOZvMVvB1RN3PYoKE94gtz2.WAOuiiwXS', 'apollo@acme.com', 1);
INSERT INTO `Authorities` (`Username`, `Authority`) VALUES ('apollo', 'ROLE_user');
......@@ -324,39 +324,39 @@ INSERT INTO `Authorities` (`Username`, `Authority`) VALUES ('apollo', 'ROLE_user
# ------------------------------------------------------------
INSERT INTO `App` (`AppId`, `Name`, `OrgId`, `OrgName`, `OwnerName`, `OwnerEmail`)
VALUES
('SampleApp', 'Sample App', 'TEST1', '样例部门1', 'apollo', 'apollo@acme.com');
('SampleApp', 'Sample App', 'TEST1', '样例部门1', 'apollo', 'apollo@acme.com');
INSERT INTO `AppNamespace` (`Name`, `AppId`, `Format`, `IsPublic`, `Comment`)
VALUES
('application', 'SampleApp', 'properties', 0, 'default app namespace');
('application', 'SampleApp', 'properties', 0, 'default app namespace');
INSERT INTO `Permission` (`Id`, `PermissionType`, `TargetId`)
VALUES
(1, 'CreateCluster', 'SampleApp'),
(2, 'CreateNamespace', 'SampleApp'),
(3, 'AssignRole', 'SampleApp'),
(4, 'ModifyNamespace', 'SampleApp+application'),
(5, 'ReleaseNamespace', 'SampleApp+application');
(1, 'CreateCluster', 'SampleApp'),
(2, 'CreateNamespace', 'SampleApp'),
(3, 'AssignRole', 'SampleApp'),
(4, 'ModifyNamespace', 'SampleApp+application'),
(5, 'ReleaseNamespace', 'SampleApp+application');
INSERT INTO `Role` (`Id`, `RoleName`)
VALUES
(1, 'Master+SampleApp'),
(2, 'ModifyNamespace+SampleApp+application'),
(3, 'ReleaseNamespace+SampleApp+application');
(1, 'Master+SampleApp'),
(2, 'ModifyNamespace+SampleApp+application'),
(3, 'ReleaseNamespace+SampleApp+application');
INSERT INTO `RolePermission` (`RoleId`, `PermissionId`)
VALUES
(1, 1),
(1, 2),
(1, 3),
(2, 4),
(3, 5);
(1, 1),
(1, 2),
(1, 3),
(2, 4),
(3, 5);
INSERT INTO `UserRole` (`UserId`, `RoleId`)
VALUES
('apollo', 1),
('apollo', 2),
('apollo', 3);
('apollo', 1),
('apollo', 2),
('apollo', 3);
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
......
......@@ -364,11 +364,11 @@ CREATE TABLE `ServerConfig` (
# ------------------------------------------------------------
INSERT INTO `ServerConfig` (`Key`, `Cluster`, `Value`, `Comment`)
VALUES
('eureka.service.url', 'default', 'http://localhost:8080/eureka/', 'Eureka服务Url,多个service以英文逗号分隔'),
('namespace.lock.switch', 'default', 'false', '一次发布只能有一个人修改开关'),
('item.key.length.limit', 'default', '128', 'item key 最大长度限制'),
('item.value.length.limit', 'default', '20000', 'item value最大长度限制'),
('config-service.cache.enabled', 'default', 'false', 'ConfigService是否开启缓存,开启后能提高性能,但是会增大内存消耗!');
('eureka.service.url', 'default', 'http://localhost:8080/eureka/', 'Eureka服务Url,多个service以英文逗号分隔'),
('namespace.lock.switch', 'default', 'false', '一次发布只能有一个人修改开关'),
('item.key.length.limit', 'default', '128', 'item key 最大长度限制'),
('item.value.length.limit', 'default', '20000', 'item value最大长度限制'),
('config-service.cache.enabled', 'default', 'false', 'ConfigService是否开启缓存,开启后能提高性能,但是会增大内存消耗!');
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
......
......@@ -307,16 +307,16 @@ CREATE TABLE `Authorities` (
# ------------------------------------------------------------
INSERT INTO `ServerConfig` (`Key`, `Value`, `Comment`)
VALUES
('apollo.portal.envs', 'dev', '可支持的环境列表'),
('organizations', '[{\"orgId\":\"TEST1\",\"orgName\":\"样例部门1\"},{\"orgId\":\"TEST2\",\"orgName\":\"样例部门2\"}]', '部门列表'),
('superAdmin', 'apollo', 'Portal超级管理员'),
('api.readTimeout', '10000', 'http接口read timeout'),
('consumer.token.salt', 'someSalt', 'consumer token salt'),
('admin.createPrivateNamespace.switch', 'false', '是否允许项目管理员创建私有namespace');
('apollo.portal.envs', 'dev', '可支持的环境列表'),
('organizations', '[{\"orgId\":\"TEST1\",\"orgName\":\"样例部门1\"},{\"orgId\":\"TEST2\",\"orgName\":\"样例部门2\"}]', '部门列表'),
('superAdmin', 'apollo', 'Portal超级管理员'),
('api.readTimeout', '10000', 'http接口read timeout'),
('consumer.token.salt', 'someSalt', 'consumer token salt'),
('admin.createPrivateNamespace.switch', 'false', '是否允许项目管理员创建私有namespace');
INSERT INTO `Users` (`Username`, `Password`, `Email`, `Enabled`)
VALUES
('apollo', '$2a$10$7r20uS.BQ9uBpf3Baj3uQOZvMVvB1RN3PYoKE94gtz2.WAOuiiwXS', 'apollo@acme.com', 1);
('apollo', '$2a$10$7r20uS.BQ9uBpf3Baj3uQOZvMVvB1RN3PYoKE94gtz2.WAOuiiwXS', 'apollo@acme.com', 1);
INSERT INTO `Authorities` (`Username`, `Authority`) VALUES ('apollo', 'ROLE_user');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment