Skip to content

Commit cff5d8c

Browse files
committed
add admin page to delete app, cluster and app namespace
1 parent e9459a2 commit cff5d8c

File tree

10 files changed

+478
-6
lines changed

10 files changed

+478
-6
lines changed

apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/ClusterController.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,14 @@ public ClusterDTO createCluster(@PathVariable String appId, @PathVariable String
5252
@RequestMapping(value = "apps/{appId}/envs/{env}/clusters/{clusterName:.+}", method = RequestMethod.DELETE)
5353
public ResponseEntity<Void> deleteCluster(@PathVariable String appId, @PathVariable String env,
5454
@PathVariable String clusterName){
55-
clusterService.deleteCluster(Env.valueOf(env), appId, clusterName);
55+
clusterService.deleteCluster(Env.fromString(env), appId, clusterName);
5656
return ResponseEntity.ok().build();
5757
}
5858

59+
@RequestMapping(value = "apps/{appId}/envs/{env}/clusters/{clusterName:.+}", method = RequestMethod.GET)
60+
public ClusterDTO loadCluster(@PathVariable("appId") String appId, @PathVariable String env, @PathVariable("clusterName") String clusterName) {
61+
62+
return clusterService.loadCluster(appId, Env.fromString(env), clusterName);
63+
}
5964

6065
}

apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/NamespaceController.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.ctrip.framework.apollo.portal.controller;
22

3+
import com.ctrip.framework.apollo.common.dto.AppNamespaceDTO;
4+
import com.ctrip.framework.apollo.common.utils.BeanUtils;
35
import com.ctrip.framework.apollo.portal.listener.AppNamespaceDeletionEvent;
46
import com.google.common.collect.Sets;
57

@@ -144,6 +146,18 @@ public ResponseEntity<Void> deleteAppNamespace(@PathVariable String appId, @Path
144146
return ResponseEntity.ok().build();
145147
}
146148

149+
@RequestMapping(value = "/apps/{appId}/appnamespaces/{namespaceName:.+}", method = RequestMethod.GET)
150+
public AppNamespaceDTO findAppNamespace(@PathVariable String appId, @PathVariable String namespaceName) {
151+
AppNamespace appNamespace = appNamespaceService.findByAppIdAndName(appId, namespaceName);
152+
153+
if (appNamespace == null) {
154+
throw new BadRequestException(
155+
String.format("AppNamespace not exists. AppId = %s, NamespaceName = %s", appId, namespaceName));
156+
}
157+
158+
return BeanUtils.transfrom(AppNamespaceDTO.class, appNamespace);
159+
}
160+
147161
@PreAuthorize(value = "@permissionValidator.hasCreateAppNamespacePermission(#appId, #appNamespace)")
148162
@RequestMapping(value = "/apps/{appId}/appnamespaces", method = RequestMethod.POST)
149163
public AppNamespace createAppNamespace(@PathVariable String appId, @RequestBody AppNamespace appNamespace) {
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
<!doctype html>
2+
<html ng-app="delete_app_cluster_namespace">
3+
<head>
4+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5+
<link rel="icon" href="../img/config.png">
6+
<!-- styles -->
7+
<link rel="stylesheet" type="text/css" href="../vendor/bootstrap/css/bootstrap.min.css">
8+
<link rel="stylesheet" type="text/css" href="../vendor/angular/angular-toastr-1.4.1.min.css">
9+
<link rel="stylesheet" type="text/css" media='all' href="../vendor/angular/loading-bar.min.css">
10+
<link rel="stylesheet" type="text/css" href="../styles/common-style.css">
11+
<link rel="stylesheet" type="text/css" href="../vendor/select2/select2.min.css">
12+
<title>删除应用、集群、AppNamespace</title>
13+
</head>
14+
15+
<body>
16+
17+
<apollonav></apollonav>
18+
19+
20+
<div class="container-fluid" ng-controller="DeleteAppClusterNamespaceController">
21+
<div class="col-md-10 col-md-offset-1 panel">
22+
23+
<section class="panel-body" ng-show="isRootUser">
24+
<!-- delete app -->
25+
<section class="row">
26+
<h5>删除应用
27+
<small>
28+
(由于删除应用影响面较大,所以现在暂时只允许系统管理员删除,请确保没有客户端读取该应用的配置后再做删除动作)
29+
</small>
30+
</h5>
31+
<hr>
32+
<form class="form-horizontal">
33+
<div class="form-group" valdr-form-group>
34+
<label class="col-sm-2 control-label">
35+
<apollorequiredfield></apollorequiredfield>
36+
应用AppId</label>
37+
<div class="col-sm-5">
38+
<input type="text" class="form-control" ng-model="app.appId">
39+
<small>(删除前请先查询应用信息)</small>
40+
</div>
41+
<div class="col-sm-1">
42+
<button class="btn btn-info" ng-click="getAppInfo()">查询</button>
43+
</div>
44+
</div>
45+
<div class="form-group" valdr-form-group>
46+
<label class="col-sm-2 control-label">
47+
应用信息</label>
48+
<div class="col-sm-5">
49+
<h5 ng-show="app.info" ng-bind="app.info"></h5>
50+
</div>
51+
</div>
52+
53+
<div class="form-group">
54+
<div class="col-sm-offset-2 col-sm-9">
55+
<button type="submit" class="btn btn-primary"
56+
ng-disabled="deleteAppBtnDisabled"
57+
ng-click="deleteApp()">
58+
删除应用
59+
</button>
60+
</div>
61+
</div>
62+
</form>
63+
</section>
64+
65+
<!-- delete cluster -->
66+
<section class="row">
67+
<h5>删除集群
68+
<small>
69+
(由于删除集群影响面较大,所以现在暂时只允许系统管理员删除,请确保没有客户端读取该集群的配置后再做删除动作)
70+
</small>
71+
</h5>
72+
<hr>
73+
<form class="form-horizontal">
74+
<div class="form-group" valdr-form-group>
75+
<label class="col-sm-2 control-label">
76+
<apollorequiredfield></apollorequiredfield>
77+
应用AppId</label>
78+
<div class="col-sm-5">
79+
<input type="text" class="form-control" ng-model="cluster.appId">
80+
</div>
81+
</div>
82+
<div class="form-group" valdr-form-group>
83+
<label class="col-sm-2 control-label">
84+
<apollorequiredfield></apollorequiredfield>
85+
环境名称</label>
86+
<div class="col-sm-5">
87+
<input type="text" class="form-control" ng-model="cluster.env">
88+
</div>
89+
</div>
90+
<div class="form-group" valdr-form-group>
91+
<label class="col-sm-2 control-label">
92+
<apollorequiredfield></apollorequiredfield>
93+
集群名称</label>
94+
<div class="col-sm-5">
95+
<input type="text" class="form-control" ng-model="cluster.name">
96+
<small>(删除前请先查询应用集群信息)</small>
97+
</div>
98+
<div class="col-sm-1">
99+
<button class="btn btn-info" ng-click="getClusterInfo()">查询</button>
100+
</div>
101+
</div>
102+
<div class="form-group" viv clform-group>
103+
<label class="col-sm-2 control-label">
104+
集群信息</label>
105+
<div class="col-sm-5">
106+
<h5 ng-show="cluster.info" ng-bind="cluster.info"></h5>
107+
</div>
108+
</div>
109+
110+
<div class="form-group">
111+
<div class="col-sm-offset-2 col-sm-9">
112+
<button type="submit" class="btn btn-primary"
113+
ng-disabled="deleteClusterBtnDisabled"
114+
ng-click="deleteCluster()">
115+
删除集群
116+
</button>
117+
</div>
118+
</div>
119+
</form>
120+
</section>
121+
122+
<!-- delete app namespace -->
123+
<section class="row">
124+
<h5>删除AppNamespace
125+
<small>(注意,所有环境的Namespace和AppNamespace都会被删除!如果只是要删除某个环境的Namespace,让用户到项目页面中自行删除!)</small>
126+
</h5>
127+
<small>
128+
目前用户可以自行删除关联的Namespace和私有的Namespace,不过无法删除AppNamespace元信息,因为删除AppNamespace影响面较大,所以现在暂时只允许系统管理员删除,对于公共Namespace需要确保没有应用关联了该AppNamespace。
129+
</small>
130+
<hr>
131+
<form class="form-horizontal">
132+
<div class="form-group" valdr-form-group>
133+
<label class="col-sm-2 control-label">
134+
<apollorequiredfield></apollorequiredfield>
135+
应用AppId</label>
136+
<div class="col-sm-5">
137+
<input type="text" class="form-control" ng-model="appNamespace.appId">
138+
</div>
139+
</div>
140+
<div class="form-group" valdr-form-group>
141+
<label class="col-sm-2 control-label">
142+
<apollorequiredfield></apollorequiredfield>
143+
AppNamespace名称</label>
144+
<div class="col-sm-5">
145+
<input type="text" class="form-control" ng-model="appNamespace.name">
146+
<small>(非properties类型的namespace请加上类型后缀,例如apollo.xml)</small>
147+
</div>
148+
<div class="col-sm-1">
149+
<button class="btn btn-info" ng-click="getAppNamespaceInfo()">查询</button>
150+
</div>
151+
</div>
152+
<div class="form-group" viv clform-group>
153+
<label class="col-sm-2 control-label">
154+
集群信息</label>
155+
<div class="col-sm-5">
156+
<h5 ng-show="appNamespace.info" ng-bind="appNamespace.info"></h5>
157+
</div>
158+
</div>
159+
160+
<div class="form-group">
161+
<div class="col-sm-offset-2 col-sm-9">
162+
<button type="submit" class="btn btn-primary"
163+
ng-disabled="deleteAppNamespaceBtnDisabled"
164+
ng-click="deleteAppNamespace()">
165+
删除AppNamespace
166+
</button>
167+
</div>
168+
</div>
169+
</form>
170+
</section>
171+
</section>
172+
173+
<section class="panel-body text-center" ng-if="!isRootUser">
174+
<h4>当前页面只对Apollo管理员开放</h4>
175+
</section>
176+
177+
</div>
178+
</div>
179+
180+
<div ng-include="'../views/common/footer.html'"></div>
181+
182+
<!-- jquery.js -->
183+
<script src="../vendor/jquery.min.js" type="text/javascript"></script>
184+
185+
<!--angular-->
186+
<script src="../vendor/angular/angular.min.js"></script>
187+
<script src="../vendor/angular/angular-route.min.js"></script>
188+
<script src="../vendor/angular/angular-resource.min.js"></script>
189+
<script src="../vendor/angular/angular-toastr-1.4.1.tpls.min.js"></script>
190+
<script src="../vendor/angular/loading-bar.min.js"></script>
191+
192+
<!--valdr-->
193+
<script src="../vendor/valdr/valdr.min.js" type="text/javascript"></script>
194+
<script src="../vendor/valdr/valdr-message.min.js" type="text/javascript"></script>
195+
196+
<!-- bootstrap.js -->
197+
<script src="../vendor/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
198+
199+
<!--nicescroll-->
200+
<script src="../vendor/jquery.nicescroll.min.js"></script>
201+
<script src="../vendor/lodash.min.js"></script>
202+
203+
<script src="../vendor/select2/select2.min.js" type="text/javascript"></script>
204+
<!--biz-->
205+
<!--must import-->
206+
<script type="application/javascript" src="../scripts/app.js"></script>
207+
<script type="application/javascript" src="../scripts/services/AppService.js"></script>
208+
<script type="application/javascript" src="../scripts/services/EnvService.js"></script>
209+
<script type="application/javascript" src="../scripts/services/UserService.js"></script>
210+
<script type="application/javascript" src="../scripts/services/CommonService.js"></script>
211+
<script type="application/javascript" src="../scripts/services/PermissionService.js"></script>
212+
<script type="application/javascript" src="../scripts/services/ClusterService.js"></script>
213+
<script type="application/javascript" src="../scripts/services/NamespaceService.js"></script>
214+
215+
<script type="application/javascript" src="../scripts/AppUtils.js"></script>
216+
217+
<script type="application/javascript" src="../scripts/PageCommon.js"></script>
218+
<script type="application/javascript" src="../scripts/directive/directive.js"></script>
219+
<script type="application/javascript" src="../scripts/valdr.js"></script>
220+
221+
<script type="application/javascript" src="../scripts/controller/DeleteAppClusterNamespaceController.js"></script>
222+
</body>
223+
</html>

apollo-portal/src/main/resources/static/scripts/app.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,5 @@ var open_manage_module = angular.module('open_manage', ['app.service', 'apollo.d
3434
var user_module = angular.module('user', ['apollo.directive', 'toastr', 'app.service', 'app.util', 'angular-loading-bar', 'valdr']);
3535
//login
3636
var login_module = angular.module('login', ['toastr', 'app.util']);
37-
38-
39-
37+
//delete app cluster namespace
38+
var delete_app_cluster_namespace_module = angular.module('delete_app_cluster_namespace', ['app.service', 'apollo.directive', 'app.util', 'toastr', 'angular-loading-bar']);

0 commit comments

Comments
 (0)