Skip to content

Commit d3e0fdb

Browse files
authored
Merge pull request apolloconfig#536 from lepdou/delete_namespace
delete namespace
2 parents 202363b + a684730 commit d3e0fdb

39 files changed

+962
-225
lines changed

apollo-adminservice/src/main/java/com/ctrip/framework/apollo/adminservice/controller/AppNamespaceController.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,33 @@
11
package com.ctrip.framework.apollo.adminservice.controller;
22

3+
import com.ctrip.framework.apollo.biz.entity.Namespace;
34
import com.ctrip.framework.apollo.biz.service.AppNamespaceService;
5+
import com.ctrip.framework.apollo.biz.service.NamespaceService;
46
import com.ctrip.framework.apollo.common.dto.AppNamespaceDTO;
7+
import com.ctrip.framework.apollo.common.dto.NamespaceDTO;
58
import com.ctrip.framework.apollo.common.entity.AppNamespace;
69
import com.ctrip.framework.apollo.common.exception.BadRequestException;
710
import com.ctrip.framework.apollo.common.utils.BeanUtils;
811
import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
912
import com.ctrip.framework.apollo.core.utils.StringUtils;
1013

1114
import org.springframework.beans.factory.annotation.Autowired;
15+
import org.springframework.data.domain.Pageable;
16+
import org.springframework.web.bind.annotation.PathVariable;
1217
import org.springframework.web.bind.annotation.RequestBody;
1318
import org.springframework.web.bind.annotation.RequestMapping;
1419
import org.springframework.web.bind.annotation.RequestMethod;
1520
import org.springframework.web.bind.annotation.RestController;
1621

22+
import java.util.List;
23+
1724
@RestController
1825
public class AppNamespaceController {
1926

2027
@Autowired
2128
private AppNamespaceService appNamespaceService;
29+
@Autowired
30+
private NamespaceService namespaceService;
2231

2332
@RequestMapping(value = "/apps/{appId}/appnamespaces", method = RequestMethod.POST)
2433
public AppNamespaceDTO create(@RequestBody AppNamespaceDTO appNamespace) {
@@ -40,4 +49,17 @@ public AppNamespaceDTO create(@RequestBody AppNamespaceDTO appNamespace) {
4049

4150
}
4251

52+
@RequestMapping(value = "/appnamespaces/{publicNamespaceName}/namespaces", method = RequestMethod.GET)
53+
public List<NamespaceDTO> findPublicAppNamespaceAllNamespaces(@PathVariable String publicNamespaceName, Pageable pageable) {
54+
55+
List<Namespace> namespaces = namespaceService.findPublicAppNamespaceAllNamespaces(publicNamespaceName, pageable);
56+
57+
return BeanUtils.batchTransform(NamespaceDTO.class, namespaces);
58+
}
59+
60+
@RequestMapping(value = "/appnamespaces/{publicNamespaceName}/associated-namespaces/count", method = RequestMethod.GET)
61+
public int countPublicAppNamespaceAssociatedNamespaces(@PathVariable String publicNamespaceName) {
62+
return namespaceService.countPublicAppNamespaceAssociatedNamespaces(publicNamespaceName);
63+
}
64+
4365
}

apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/repository/NamespaceRepository.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.ctrip.framework.apollo.biz.entity.Namespace;
44

5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.Pageable;
57
import org.springframework.data.jpa.repository.Modifying;
68
import org.springframework.data.jpa.repository.Query;
79
import org.springframework.data.repository.PagingAndSortingRepository;
@@ -19,4 +21,9 @@ public interface NamespaceRepository extends PagingAndSortingRepository<Namespac
1921
int batchDelete(String appId, String clusterName, String operator);
2022

2123
List<Namespace> findByAppIdAndNamespaceName(String appId, String namespaceName);
24+
25+
List<Namespace> findByNamespaceName(String namespaceName, Pageable page);
26+
27+
int countByNamespaceNameAndAppIdNot(String namespaceName, String appId);
28+
2229
}

apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/AppNamespaceService.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.ctrip.framework.apollo.biz.entity.Namespace;
99
import com.ctrip.framework.apollo.biz.repository.AppNamespaceRepository;
1010
import com.ctrip.framework.apollo.common.entity.AppNamespace;
11+
import com.ctrip.framework.apollo.common.exception.BadRequestException;
1112
import com.ctrip.framework.apollo.common.exception.ServiceException;
1213
import com.ctrip.framework.apollo.common.utils.BeanUtils;
1314
import com.ctrip.framework.apollo.core.ConfigConsts;
@@ -54,12 +55,13 @@ public List<AppNamespace> findPublicNamespacesByNames(Set<String> namespaceNames
5455
return appNamespaceRepository.findByNameInAndIsPublicTrue(namespaceNames);
5556
}
5657

57-
public List<AppNamespace> findPrivateAppNamespace(String appId){
58+
public List<AppNamespace> findPrivateAppNamespace(String appId) {
5859
return appNamespaceRepository.findByAppIdAndIsPublic(appId, false);
5960
}
6061

61-
public AppNamespace findOne(String appId, String namespaceName){
62-
Preconditions.checkArgument(!StringUtils.isContainEmpty(appId, namespaceName), "appId or Namespace must not be null");
62+
public AppNamespace findOne(String appId, String namespaceName) {
63+
Preconditions
64+
.checkArgument(!StringUtils.isContainEmpty(appId, namespaceName), "appId or Namespace must not be null");
6365
return appNamespaceRepository.findByAppIdAndName(appId, namespaceName);
6466
}
6567

@@ -90,7 +92,7 @@ public void createDefaultAppNamespace(String appId, String createBy) {
9092
}
9193

9294
@Transactional
93-
public AppNamespace createAppNamespace(AppNamespace appNamespace){
95+
public AppNamespace createAppNamespace(AppNamespace appNamespace) {
9496
String createBy = appNamespace.getDataChangeCreatedBy();
9597
if (!isAppNamespaceNameUnique(appNamespace.getAppId(), appNamespace.getName())) {
9698
throw new ServiceException("appnamespace not unique");
@@ -109,12 +111,13 @@ public AppNamespace createAppNamespace(AppNamespace appNamespace){
109111
return appNamespace;
110112
}
111113

112-
public AppNamespace update(AppNamespace appNamespace){
114+
public AppNamespace update(AppNamespace appNamespace) {
113115
AppNamespace managedNs = appNamespaceRepository.findByAppIdAndName(appNamespace.getAppId(), appNamespace.getName());
114116
BeanUtils.copyEntityProperties(appNamespace, managedNs);
115117
managedNs = appNamespaceRepository.save(managedNs);
116118

117-
auditService.audit(AppNamespace.class.getSimpleName(), managedNs.getId(), Audit.OP.UPDATE, managedNs.getDataChangeLastModifiedBy());
119+
auditService.audit(AppNamespace.class.getSimpleName(), managedNs.getId(), Audit.OP.UPDATE,
120+
managedNs.getDataChangeLastModifiedBy());
118121

119122
return managedNs;
120123
}

apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/service/NamespaceService.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@
1818
import com.ctrip.framework.apollo.core.ConfigConsts;
1919

2020
import org.springframework.beans.factory.annotation.Autowired;
21+
import org.springframework.data.domain.Pageable;
2122
import org.springframework.stereotype.Service;
2223
import org.springframework.transaction.annotation.Transactional;
2324
import org.springframework.util.CollectionUtils;
2425

2526
import java.util.Collections;
2627
import java.util.Date;
28+
import java.util.LinkedList;
2729
import java.util.List;
2830
import java.util.Map;
2931
import java.util.Objects;
@@ -117,7 +119,46 @@ public Namespace findPublicNamespaceForAssociatedNamespace(String clusterName, S
117119
//and default cluster's namespace exist but never published.
118120
//return custom cluster's namespace
119121
return namespace;
122+
}
123+
124+
public List<Namespace> findPublicAppNamespaceAllNamespaces(String namespaceName, Pageable page) {
125+
AppNamespace publicAppNamespace = appNamespaceService.findPublicNamespaceByName(namespaceName);
126+
127+
if (publicAppNamespace == null) {
128+
throw new BadRequestException(
129+
String.format("Public appNamespace not exists. NamespaceName = %s", namespaceName));
130+
}
131+
132+
List<Namespace> namespaces = namespaceRepository.findByNamespaceName(namespaceName, page);
133+
134+
return filterChildNamespace(namespaces);
135+
}
136+
137+
private List<Namespace> filterChildNamespace(List<Namespace> namespaces) {
138+
List<Namespace> result = new LinkedList<>();
139+
140+
if (CollectionUtils.isEmpty(namespaces)) {
141+
return result;
142+
}
143+
144+
for (Namespace namespace : namespaces) {
145+
if (!isChildNamespace(namespace)) {
146+
result.add(namespace);
147+
}
148+
}
149+
150+
return result;
151+
}
152+
153+
public int countPublicAppNamespaceAssociatedNamespaces(String publicNamespaceName) {
154+
AppNamespace publicAppNamespace = appNamespaceService.findPublicNamespaceByName(publicNamespaceName);
155+
156+
if (publicAppNamespace == null) {
157+
throw new BadRequestException(
158+
String.format("Public appNamespace not exists. NamespaceName = %s", publicNamespaceName));
159+
}
120160

161+
return namespaceRepository.countByNamespaceNameAndAppIdNot(publicNamespaceName, publicAppNamespace.getAppId());
121162
}
122163

123164
public List<Namespace> findNamespaces(String appId, String clusterName) {

apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/AllTests.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.ctrip.framework.apollo.biz.service.InstanceServiceTest;
1313
import com.ctrip.framework.apollo.biz.service.NamespaceBranchServiceTest;
1414
import com.ctrip.framework.apollo.biz.service.NamespacePublishInfoTest;
15+
import com.ctrip.framework.apollo.biz.service.NamespaceServiceIntegrationTest;
1516
import com.ctrip.framework.apollo.biz.service.NamespaceServiceTest;
1617
import com.ctrip.framework.apollo.biz.service.ReleaseCreationTest;
1718
import com.ctrip.framework.apollo.biz.service.ReleaseServiceTest;
@@ -39,8 +40,9 @@
3940
NamespaceBranchServiceTest.class,
4041
ReleaseCreationTest.class,
4142
NamespacePublishInfoTest.class,
42-
NamespaceServiceTest.class,
43-
BizConfigTest.class
43+
NamespaceServiceIntegrationTest.class,
44+
BizConfigTest.class,
45+
NamespaceServiceTest.class
4446
})
4547
public class AllTests {
4648

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.ctrip.framework.apollo.biz;
2+
3+
import com.ctrip.framework.apollo.biz.entity.Namespace;
4+
import com.ctrip.framework.apollo.biz.entity.Release;
5+
import com.ctrip.framework.apollo.biz.entity.ServerConfig;
6+
import com.ctrip.framework.apollo.common.entity.AppNamespace;
7+
8+
public class MockBeanFactory {
9+
10+
public static Namespace mockNamespace(String appId, String clusterName, String namespaceName) {
11+
Namespace instance = new Namespace();
12+
13+
instance.setAppId(appId);
14+
instance.setClusterName(clusterName);
15+
instance.setNamespaceName(namespaceName);
16+
17+
return instance;
18+
}
19+
20+
public static AppNamespace mockAppNamespace(String appId, String name, boolean isPublic) {
21+
AppNamespace instance = new AppNamespace();
22+
23+
instance.setAppId(appId);
24+
instance.setName(name);
25+
instance.setPublic(isPublic);
26+
27+
return instance;
28+
}
29+
30+
public static ServerConfig mockServerConfig(String key, String value, String cluster) {
31+
ServerConfig instance = new ServerConfig();
32+
33+
instance.setKey(key);
34+
instance.setValue(value);
35+
instance.setCluster(cluster);
36+
37+
return instance;
38+
}
39+
40+
public static Release mockRelease(long releaseId, String releaseKey, String appId,
41+
String clusterName, String groupName, String configurations) {
42+
Release instance = new Release();
43+
44+
instance.setId(releaseId);
45+
instance.setReleaseKey(releaseKey);
46+
instance.setAppId(appId);
47+
instance.setClusterName(clusterName);
48+
instance.setNamespaceName(groupName);
49+
instance.setConfigurations(configurations);
50+
51+
return instance;
52+
}
53+
54+
}

apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/service/BizDBPropertySourceTest.java

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.common.collect.Lists;
44

55
import com.ctrip.framework.apollo.biz.AbstractUnitTest;
6+
import com.ctrip.framework.apollo.biz.MockBeanFactory;
67
import com.ctrip.framework.apollo.biz.entity.ServerConfig;
78
import com.ctrip.framework.apollo.biz.repository.ServerConfigRepository;
89
import com.ctrip.framework.apollo.core.ConfigConsts;
@@ -45,19 +46,19 @@ public void initTestData() {
4546

4647
//cluster config
4748
String cluster = "cluster";
48-
configs.add(createServerConfig(clusterConfigKey, clusterConfigValue, cluster));
49+
configs.add(MockBeanFactory.mockServerConfig(clusterConfigKey, clusterConfigValue, cluster));
4950
String dc = "dc";
50-
configs.add(createServerConfig(clusterConfigKey, clusterConfigValue + "dc", dc));
51-
configs.add(createServerConfig(clusterConfigKey, clusterConfigValue + ConfigConsts.CLUSTER_NAME_DEFAULT,
51+
configs.add(MockBeanFactory.mockServerConfig(clusterConfigKey, clusterConfigValue + "dc", dc));
52+
configs.add(MockBeanFactory.mockServerConfig(clusterConfigKey, clusterConfigValue + ConfigConsts.CLUSTER_NAME_DEFAULT,
5253
ConfigConsts.CLUSTER_NAME_DEFAULT));
5354

5455
//dc config
55-
configs.add(createServerConfig(dcConfigKey, dcConfigValue, dc));
56-
configs.add(createServerConfig(dcConfigKey, dcConfigValue + ConfigConsts.CLUSTER_NAME_DEFAULT,
56+
configs.add(MockBeanFactory.mockServerConfig(dcConfigKey, dcConfigValue, dc));
57+
configs.add(MockBeanFactory.mockServerConfig(dcConfigKey, dcConfigValue + ConfigConsts.CLUSTER_NAME_DEFAULT,
5758
ConfigConsts.CLUSTER_NAME_DEFAULT));
5859

5960
//default config
60-
configs.add(createServerConfig(defaultKey, defaultValue, ConfigConsts.CLUSTER_NAME_DEFAULT));
61+
configs.add(MockBeanFactory.mockServerConfig(defaultKey, defaultValue, ConfigConsts.CLUSTER_NAME_DEFAULT));
6162

6263
System.setProperty(ConfigConsts.APOLLO_CLUSTER_KEY, cluster);
6364

@@ -99,14 +100,5 @@ public void testGetNull() {
99100
assertNull(propertySource.getProperty("noKey"));
100101
}
101102

102-
private ServerConfig createServerConfig(String key, String value, String cluster) {
103-
ServerConfig config = new ServerConfig();
104-
105-
config.setKey(key);
106-
config.setValue(value);
107-
config.setCluster(cluster);
108-
109-
return config;
110-
}
111103

112104
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package com.ctrip.framework.apollo.biz.service;
2+
3+
import com.ctrip.framework.apollo.biz.AbstractIntegrationTest;
4+
import com.ctrip.framework.apollo.biz.entity.Cluster;
5+
import com.ctrip.framework.apollo.biz.entity.Commit;
6+
import com.ctrip.framework.apollo.biz.entity.InstanceConfig;
7+
import com.ctrip.framework.apollo.biz.entity.Item;
8+
import com.ctrip.framework.apollo.biz.entity.Namespace;
9+
import com.ctrip.framework.apollo.biz.entity.Release;
10+
import com.ctrip.framework.apollo.biz.entity.ReleaseHistory;
11+
import com.ctrip.framework.apollo.biz.repository.InstanceConfigRepository;
12+
import com.ctrip.framework.apollo.common.entity.AppNamespace;
13+
14+
import org.junit.Test;
15+
import org.springframework.beans.factory.annotation.Autowired;
16+
import org.springframework.data.domain.Page;
17+
import org.springframework.data.domain.PageRequest;
18+
import org.springframework.test.context.jdbc.Sql;
19+
20+
import java.util.List;
21+
22+
import static org.junit.Assert.assertEquals;
23+
import static org.junit.Assert.assertNotNull;
24+
import static org.junit.Assert.assertNull;
25+
import static org.junit.Assert.assertTrue;
26+
27+
public class NamespaceServiceIntegrationTest extends AbstractIntegrationTest {
28+
29+
30+
@Autowired
31+
private NamespaceService namespaceService;
32+
@Autowired
33+
private ItemService itemService;
34+
@Autowired
35+
private CommitService commitService;
36+
@Autowired
37+
private AppNamespaceService appNamespaceService;
38+
@Autowired
39+
private ClusterService clusterService;
40+
@Autowired
41+
private ReleaseService releaseService;
42+
@Autowired
43+
private ReleaseHistoryService releaseHistoryService;
44+
@Autowired
45+
private InstanceConfigRepository instanceConfigRepository;
46+
47+
private String testApp = "testApp";
48+
private String testCluster = "default";
49+
private String testChildCluster = "child-cluster";
50+
private String testPrivateNamespace = "application";
51+
private String testUser = "apollo";
52+
53+
@Test
54+
@Sql(scripts = "/sql/namespace-test.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
55+
@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD)
56+
public void testDeleteNamespace() {
57+
58+
Namespace namespace = new Namespace();
59+
namespace.setAppId(testApp);
60+
namespace.setClusterName(testCluster);
61+
namespace.setNamespaceName(testPrivateNamespace);
62+
namespace.setId(1);
63+
64+
namespaceService.deleteNamespace(namespace, testUser);
65+
66+
List<Item> items = itemService.findItems(testApp, testCluster, testPrivateNamespace);
67+
List<Commit> commits = commitService.find(testApp, testCluster, testPrivateNamespace, new PageRequest(0, 10));
68+
AppNamespace appNamespace = appNamespaceService.findOne(testApp, testPrivateNamespace);
69+
List<Cluster> childClusters = clusterService.findChildClusters(testApp, testCluster);
70+
InstanceConfig instanceConfig = instanceConfigRepository.findOne(1L);
71+
List<Release> parentNamespaceReleases = releaseService.findActiveReleases(testApp, testCluster,
72+
testPrivateNamespace,
73+
new PageRequest(0, 10));
74+
List<Release> childNamespaceReleases = releaseService.findActiveReleases(testApp, testChildCluster,
75+
testPrivateNamespace,
76+
new PageRequest(0, 10));
77+
Page<ReleaseHistory> releaseHistories =
78+
releaseHistoryService
79+
.findReleaseHistoriesByNamespace(testApp, testCluster, testPrivateNamespace, new PageRequest(0, 10));
80+
81+
assertEquals(0, items.size());
82+
assertEquals(0, commits.size());
83+
assertNotNull(appNamespace);
84+
assertEquals(0, childClusters.size());
85+
assertEquals(0, parentNamespaceReleases.size());
86+
assertEquals(0, childNamespaceReleases.size());
87+
assertTrue(!releaseHistories.hasContent());
88+
assertNull(instanceConfig);
89+
}
90+
91+
}

0 commit comments

Comments
 (0)