Skip to content

Commit 352ab72

Browse files
feat: modification of App and Instance
1 parent 3086b57 commit 352ab72

24 files changed

+857
-234
lines changed

apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/server/service/AppOpenApiService.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,21 @@
1616
*/
1717
package com.ctrip.framework.apollo.openapi.server.service;
1818

19-
import com.ctrip.framework.apollo.openapi.model.MultiResponseEntity;
2019
import com.ctrip.framework.apollo.openapi.model.OpenAppDTO;
2120
import com.ctrip.framework.apollo.openapi.model.OpenCreateAppDTO;
2221
import com.ctrip.framework.apollo.openapi.model.OpenEnvClusterDTO;
22+
import com.ctrip.framework.apollo.openapi.model.OpenEnvClusterInfo;
23+
import com.ctrip.framework.apollo.openapi.model.OpenMissEnvDTO;
2324
import org.springframework.lang.NonNull;
2425

2526
import java.util.List;
2627
import java.util.Set;
2728

2829
public interface AppOpenApiService {
2930

30-
void createApp(@NonNull OpenCreateAppDTO req);
31+
OpenAppDTO createApp(@NonNull OpenCreateAppDTO req);
3132

32-
List<OpenEnvClusterDTO> getEnvClusterInfo(String appId);
33+
List<OpenEnvClusterDTO> getEnvClusters(String appId);
3334

3435
List<OpenAppDTO> getAllApps();
3536

@@ -39,13 +40,13 @@ public interface AppOpenApiService {
3940

4041
void updateApp(OpenAppDTO openAppDTO);
4142

42-
List<OpenAppDTO> getAppsBySelf(Set<String> appIds, Integer page, Integer size);
43+
List<OpenAppDTO> getAppsWithPageAndSize(Set<String> appIds, Integer page, Integer size);
4344

44-
void createAppInEnv(String env, OpenAppDTO app, String operator);
45+
void createAppInEnv(String env, OpenAppDTO app);
4546

4647
OpenAppDTO deleteApp(String appId);
4748

48-
MultiResponseEntity findMissEnvs(String appId);
49+
List<OpenMissEnvDTO> findMissEnvs(String appId);
4950

50-
MultiResponseEntity getAppNavTree(String appId);
51+
List<OpenEnvClusterInfo> getEnvClusterInfos(String appId);
5152
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2025 Apollo Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*
16+
*/
17+
package com.ctrip.framework.apollo.openapi.server.service;
18+
19+
import com.ctrip.framework.apollo.openapi.model.OpenInstanceDTO;
20+
import com.ctrip.framework.apollo.openapi.model.OpenInstancePageDTO;
21+
22+
import java.util.List;
23+
import java.util.Set;
24+
25+
public interface InstanceOpenApiService {
26+
27+
int getInstanceCountByNamespace(String appId, String env, String clusterName,
28+
String namespaceName);
29+
30+
OpenInstancePageDTO getByRelease(String env, long releaseId, int page, int size);
31+
32+
List<OpenInstanceDTO> getByReleasesNotIn(String env, String appId, String clusterName,
33+
String namespaceName, Set<Long> releaseIds);
34+
35+
OpenInstancePageDTO getByNamespace(String env, String appId, String clusterName,
36+
String namespaceName, String instanceAppId, Integer page, Integer size);
37+
}

apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/server/service/ServerAppOpenApiService.java

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
import com.ctrip.framework.apollo.openapi.model.OpenAppDTO;
2525
import com.ctrip.framework.apollo.openapi.model.OpenCreateAppDTO;
2626
import com.ctrip.framework.apollo.openapi.model.OpenEnvClusterDTO;
27-
import com.ctrip.framework.apollo.openapi.model.MultiResponseEntity;
2827
import com.ctrip.framework.apollo.openapi.model.OpenEnvClusterInfo;
29-
import com.ctrip.framework.apollo.openapi.model.RichResponseEntity;
28+
import com.ctrip.framework.apollo.openapi.model.OpenMissEnvDTO;
3029
import com.ctrip.framework.apollo.openapi.util.OpenApiModelConverters;
3130
import com.ctrip.framework.apollo.portal.component.PortalSettings;
31+
import com.ctrip.framework.apollo.portal.component.UserIdentityContextHolder;
3232
import com.ctrip.framework.apollo.portal.entity.model.AppModel;
3333
import com.ctrip.framework.apollo.portal.environment.Env;
3434
import com.ctrip.framework.apollo.portal.listener.AppDeletionEvent;
@@ -83,17 +83,17 @@ private App convert(OpenAppDTO dto) {
8383
* @see com.ctrip.framework.apollo.portal.controller.AppController#create(AppModel)
8484
*/
8585
@Override
86-
public void createApp(OpenCreateAppDTO req) {
86+
public OpenAppDTO createApp(OpenCreateAppDTO req) {
8787
App app = convert(req.getApp());
88-
List<String> admins = req.getAdmins();
88+
Set<String> admins = req.getAdmins();
8989
if (admins == null) {
90-
admins = Collections.emptyList();
90+
admins = Collections.emptySet();
9191
}
92-
appService.createAppAndAddRolePermission(app, new HashSet<>(admins));
92+
return OpenApiModelConverters.fromApp(appService.createAppAndAddRolePermission(app, admins));
9393
}
9494

9595
@Override
96-
public List<OpenEnvClusterDTO> getEnvClusterInfo(String appId) {
96+
public List<OpenEnvClusterDTO> getEnvClusters(String appId) {
9797
List<OpenEnvClusterDTO> envClusters = new LinkedList<>();
9898

9999
List<Env> envs = portalSettings.getActiveEnvs();
@@ -134,6 +134,7 @@ public List<OpenAppDTO> getAuthorizedApps() {
134134

135135
/**
136136
* Updating Application Information - Using OpenAPI DTOs
137+
*
137138
* @param openAppDTO OpenAPI application DTO
138139
*/
139140
@Override
@@ -145,11 +146,12 @@ public void updateApp(OpenAppDTO openAppDTO) {
145146

146147
/**
147148
* Get the current user's app list (paginated)
149+
*
148150
* @param page Pagination parameter
149151
* @return App list
150152
*/
151153
@Override
152-
public List<OpenAppDTO> getAppsBySelf(Set<String> appIds, Integer page, Integer size) {
154+
public List<OpenAppDTO> getAppsWithPageAndSize(Set<String> appIds, Integer page, Integer size) {
153155
int pageIndex = page == null ? 0 : page;
154156
int pageSize = (size == null || size <= 0) ? 20 : size;
155157
Pageable pageable = Pageable.ofSize(pageSize).withPage(pageIndex);
@@ -163,12 +165,12 @@ public List<OpenAppDTO> getAppsBySelf(Set<String> appIds, Integer page, Integer
163165

164166
/**
165167
* Create an application in a specified environment
168+
*
166169
* @param env Environment
167170
* @param app Application information
168-
* @param operator Operator
169171
*/
170172
@Override
171-
public void createAppInEnv(String env, OpenAppDTO app, String operator) {
173+
public void createAppInEnv(String env, OpenAppDTO app) {
172174
if (env == null) {
173175
throw BadRequestException.invalidEnvFormat("null");
174176
}
@@ -179,14 +181,16 @@ public void createAppInEnv(String env, OpenAppDTO app, String operator) {
179181
throw BadRequestException.invalidEnvFormat(env);
180182
}
181183
App appEntity = convert(app);
182-
appService.createAppInRemote(envEnum, appEntity);
184+
appService.createAppInRemoteNew(envEnum, appEntity);
183185

184186
roleInitializationService.initNamespaceSpecificEnvRoles(appEntity.getAppId(),
185-
ConfigConsts.NAMESPACE_APPLICATION, env, operator);
187+
ConfigConsts.NAMESPACE_APPLICATION, env,
188+
UserIdentityContextHolder.getOperator().getUserId());
186189
}
187190

188191
/**
189192
* Delete an application
193+
*
190194
* @param appId application ID
191195
* @return the deleted application
192196
*/
@@ -199,56 +203,57 @@ public OpenAppDTO deleteApp(String appId) {
199203

200204
/**
201205
* Find missing environments
206+
*
202207
* @param appId application ID
203208
* @return list of missing environments
204209
*/
205-
public MultiResponseEntity findMissEnvs(String appId) {
206-
List<RichResponseEntity> entities = new ArrayList<>();
207-
MultiResponseEntity response = new MultiResponseEntity(HttpStatus.OK.value(), entities);
210+
public List<OpenMissEnvDTO> findMissEnvs(String appId) {
211+
List<OpenMissEnvDTO> missEnvs = new ArrayList<>();
212+
208213
for (Env env : portalSettings.getActiveEnvs()) {
209214
try {
210215
appService.load(env, appId);
211216
} catch (Exception e) {
212-
RichResponseEntity entity;
217+
OpenMissEnvDTO missEnv = new OpenMissEnvDTO();
213218
if (e instanceof HttpClientErrorException
214219
&& ((HttpClientErrorException) e).getStatusCode() == HttpStatus.NOT_FOUND) {
215-
entity = new RichResponseEntity(HttpStatus.OK.value(), HttpStatus.OK.getReasonPhrase());
216-
entity.setBody(env.toString());
220+
missEnv.setCode(HttpStatus.OK.value());
221+
missEnv.setMessage(env.toString());
217222
} else {
218-
entity = new RichResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(),
219-
"load env:" + env.getName() + " cluster error." + e.getMessage());
223+
missEnv.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
224+
missEnv.setMessage(
225+
String.format("load appId:%s from env %s error.", appId, env) + e.getMessage());
220226
}
221-
response.addEntitiesItem(entity);
227+
missEnvs.add(missEnv);
222228
}
223229
}
224-
return response;
230+
return missEnvs;
225231
}
226232

227233
/**
228234
* Find AppNavTree
235+
*
229236
* @param appId
230237
* @return list of EnvClusterInfos
231238
*/
232239
@Override
233-
public MultiResponseEntity getAppNavTree(String appId) {
234-
List<RichResponseEntity> entities = new ArrayList<>();
235-
MultiResponseEntity response = new MultiResponseEntity(HttpStatus.OK.value(), entities);
240+
public List<OpenEnvClusterInfo> getEnvClusterInfos(String appId) {
241+
List<OpenEnvClusterInfo> envClusterInfos = new ArrayList<>();
236242
List<Env> envs = portalSettings.getActiveEnvs();
237243
for (Env env : envs) {
238244
try {
239245
OpenEnvClusterInfo openEnvClusterInfo =
240246
OpenApiModelConverters.fromEnvClusterInfo(appService.createEnvNavNode(env, appId));
241-
RichResponseEntity entity =
242-
new RichResponseEntity(HttpStatus.OK.value(), HttpStatus.OK.getReasonPhrase());
243-
entity.setBody(openEnvClusterInfo);
244-
response.addEntitiesItem(entity);
247+
openEnvClusterInfo.setCode(HttpStatus.OK.value());
248+
envClusterInfos.add(openEnvClusterInfo);
245249
} catch (Exception e) {
246-
logger.warn("Failed to load env {} navigation for app {}", env, appId, e);
247-
RichResponseEntity entity = new RichResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(),
248-
"load env:" + env.getName() + " cluster error." + e.getMessage());
249-
response.addEntitiesItem(entity);
250+
OpenEnvClusterInfo envClusterInfo = new OpenEnvClusterInfo();
251+
envClusterInfo.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
252+
envClusterInfo.setEnv(env.getName());
253+
envClusterInfo.setMessage("load env:" + env.getName() + " cluster error." + e.getMessage());
254+
envClusterInfos.add(envClusterInfo);
250255
}
251256
}
252-
return response;
257+
return envClusterInfos;
253258
}
254259
}

apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/server/service/ServerInstanceOpenApiService.java

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,22 @@
1616
*/
1717
package com.ctrip.framework.apollo.openapi.server.service;
1818

19-
import com.ctrip.framework.apollo.openapi.api.InstanceOpenApiService;
19+
import com.ctrip.framework.apollo.common.dto.InstanceConfigDTO;
20+
import com.ctrip.framework.apollo.common.dto.InstanceDTO;
21+
import com.ctrip.framework.apollo.common.dto.PageDTO;
22+
import com.ctrip.framework.apollo.openapi.model.OpenInstanceDTO;
23+
import com.ctrip.framework.apollo.openapi.model.OpenInstancePageDTO;
24+
import com.ctrip.framework.apollo.openapi.util.OpenApiModelConverters;
2025
import com.ctrip.framework.apollo.portal.environment.Env;
2126
import com.ctrip.framework.apollo.portal.service.InstanceService;
27+
import java.util.Collections;
28+
import java.util.Date;
29+
import org.springframework.data.domain.PageRequest;
2230
import org.springframework.stereotype.Service;
2331

32+
import java.util.List;
33+
import java.util.Set;
34+
2435
@Service
2536
public class ServerInstanceOpenApiService implements InstanceOpenApiService {
2637

@@ -36,4 +47,67 @@ public int getInstanceCountByNamespace(String appId, String env, String clusterN
3647
return instanceService.getInstanceCountByNamespace(appId, Env.valueOf(env), clusterName,
3748
namespaceName);
3849
}
50+
51+
/**
52+
* Query instances by release version (supports pagination) - returns OpenAPI DTO
53+
*/
54+
@Override
55+
public OpenInstancePageDTO getByRelease(String env, long releaseId, int page, int size) {
56+
PageDTO<InstanceDTO> portalPageDTO =
57+
instanceService.getByRelease(Env.valueOf(env), releaseId, page, size);
58+
// PageDTO<InstanceDTO> portalPageDTO = mockPortalPageDTO(page, size);
59+
60+
return transformToOpenPageDTO(portalPageDTO);
61+
}
62+
63+
/**
64+
* Query instances not in a specified release - returns an OpenAPI DTO
65+
*/
66+
@Override
67+
public List<OpenInstanceDTO> getByReleasesNotIn(String env, String appId, String clusterName,
68+
String namespaceName, Set<Long> releaseIds) {
69+
List<InstanceDTO> portalInstances = instanceService.getByReleasesNotIn(Env.valueOf(env), appId,
70+
clusterName, namespaceName, releaseIds);
71+
return OpenApiModelConverters.fromInstanceDTOs(portalInstances);
72+
}
73+
74+
@Override
75+
public OpenInstancePageDTO getByNamespace(String env, String appId, String clusterName,
76+
String namespaceName, String instanceAppId, Integer page, Integer size) {
77+
// return transformToOpenPageDTO((mockPortalPageDTO(page,size)));
78+
return transformToOpenPageDTO(instanceService.getByNamespace(Env.valueOf(env), appId,
79+
clusterName, namespaceName, instanceAppId, page, size));
80+
}
81+
82+
/**
83+
* Convert PageDTO<InstanceDTO> to OpenPageDTOOpenInstanceDTO
84+
*/
85+
private OpenInstancePageDTO transformToOpenPageDTO(PageDTO<InstanceDTO> pageDTO) {
86+
List<OpenInstanceDTO> instances = OpenApiModelConverters.fromInstanceDTOs(pageDTO.getContent());
87+
OpenInstancePageDTO openInstancePageDTO = new OpenInstancePageDTO();
88+
openInstancePageDTO.setPage(pageDTO.getPage());
89+
openInstancePageDTO.setSize(pageDTO.getSize());
90+
openInstancePageDTO.setTotal(pageDTO.getTotal());
91+
openInstancePageDTO.setInstances(instances);
92+
93+
return openInstancePageDTO;
94+
}
95+
96+
private PageDTO<InstanceDTO> mockPortalPageDTO(int page, int size) {
97+
InstanceConfigDTO config = new InstanceConfigDTO();
98+
config.setReleaseDeliveryTime(new Date());
99+
config.setDataChangeLastModifiedTime(new Date());
100+
101+
InstanceDTO instance = new InstanceDTO();
102+
instance.setId(1L);
103+
instance.setAppId("mock-app");
104+
instance.setClusterName("default");
105+
instance.setDataCenter("SHA");
106+
instance.setIp("10.0.0.1");
107+
instance.setConfigs(Collections.singletonList(config));
108+
109+
return new PageDTO<>(Collections.singletonList(instance), PageRequest.of(page, size), 1 // mock
110+
// 总数
111+
);
112+
}
39113
}

apollo-portal/src/main/java/com/ctrip/framework/apollo/openapi/util/OpenApiModelConverters.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import com.ctrip.framework.apollo.portal.entity.vo.ItemDiffs;
5757
import com.ctrip.framework.apollo.portal.entity.vo.NamespaceIdentifier;
5858
import com.ctrip.framework.apollo.portal.entity.vo.Organization;
59+
import com.ctrip.framework.apollo.portal.environment.Env;
5960
import com.google.common.base.Preconditions;
6061
import com.google.common.reflect.TypeToken;
6162
import com.google.gson.Gson;
@@ -72,8 +73,8 @@
7273
import java.util.stream.Collectors;
7374

7475
/**
75-
* Non-invasive converters for OpenAPI generated model classes.
76-
* This class mirrors/OpenApiBeanUtils functions but targets com.ctrip.framework.apollo.openapi.model.* types.
76+
* Non-invasive converters for OpenAPI generated model classes. This class mirrors/OpenApiBeanUtils
77+
* functions but targets com.ctrip.framework.apollo.openapi.model.* types.
7778
*/
7879
public final class OpenApiModelConverters {
7980

@@ -397,7 +398,17 @@ public static List<OpenInstanceDTO> fromInstanceDTOs(final List<InstanceDTO> ins
397398
// newly added
398399
public static OpenEnvClusterInfo fromEnvClusterInfo(final EnvClusterInfo envClusterInfo) {
399400
Preconditions.checkArgument(envClusterInfo != null);
400-
return BeanUtils.transform(OpenEnvClusterInfo.class, envClusterInfo);
401+
OpenEnvClusterInfo openEnvClusterInfo = new OpenEnvClusterInfo();
402+
Env env = envClusterInfo.getEnv();
403+
if (env != null) {
404+
openEnvClusterInfo.setEnv(env.toString());
405+
}
406+
List<ClusterDTO> clusters = envClusterInfo.getClusters();
407+
if (!CollectionUtils.isEmpty(clusters)) {
408+
openEnvClusterInfo.setClusters(clusters.stream().map(OpenApiModelConverters::fromClusterDTO)
409+
.collect(Collectors.toList()));
410+
}
411+
return openEnvClusterInfo;
401412
}
402413

403414
// newly added

0 commit comments

Comments
 (0)