From 3d608faef802ec6f4d83b4d103899927512cce23 Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Fri, 11 Aug 2023 20:14:55 +0800 Subject: [PATCH 01/15] feat(openapi): create app --- .../apollo/openapi/api/AppOpenApiService.java | 9 +++ .../openapi/client/ApolloOpenApiClient.java | 8 +++ .../client/service/AppOpenApiService.java | 38 ++++++++++ .../client/ApolloOpenApiClientTest.java | 70 +++++++++++++++++-- 4 files changed, 121 insertions(+), 4 deletions(-) diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java index 2b4d1c9d..0acd1d2b 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java @@ -18,6 +18,7 @@ import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; import com.ctrip.framework.apollo.openapi.dto.OpenEnvClusterDTO; +import java.util.Collections; import java.util.List; /** @@ -25,6 +26,14 @@ */ public interface AppOpenApiService { + default void createApp(OpenAppDTO openAppDTO) { + throw new UnsupportedOperationException(); + } + + default void createApp(String env, OpenAppDTO openAppDTO) { + throw new UnsupportedOperationException(); + } + List getEnvClusterInfo(String appId); List getAllApps(); diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java index a0688238..b4b51c01 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java @@ -65,6 +65,14 @@ private ApolloOpenApiClient(String portalUrl, String token, RequestConfig reques releaseService = new ReleaseOpenApiService(client, baseUrl, GSON); } + public void createApp(OpenAppDTO openAppDTO) { + appService.createApp(openAppDTO); + } + + public void createApp(String env, OpenAppDTO openAppDTO) { + appService.createApp(env, openAppDTO); + } + /** * Get the environment and cluster information */ diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java index 4fe38911..4c96bf8d 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java @@ -39,6 +39,44 @@ public AppOpenApiService(CloseableHttpClient client, String baseUrl, Gson gson) super(client, baseUrl, gson); } + @Override + public void createApp(OpenAppDTO openAppDTO) { + checkNotEmpty(openAppDTO.getAppId(), "App id"); + checkNotEmpty(openAppDTO.getName(), "App name"); + OpenApiPathBuilder pathBuilder = OpenApiPathBuilder.newBuilder() + .customResource("apps/create"); + + try (CloseableHttpResponse response = post(pathBuilder, openAppDTO)) { + gson.fromJson(EntityUtils.toString(response.getEntity()), void.class); + } catch (Throwable ex) { + throw new RuntimeException( + String.format("Create app: %s for appId: %s failed", openAppDTO.getName(), + openAppDTO.getAppId()), ex); + } + } + + @Override + public void createApp(String env, OpenAppDTO openAppDTO) { + checkNotEmpty(env, "Env"); + checkNotEmpty(openAppDTO.getAppId(), "App id"); + checkNotEmpty(openAppDTO.getName(), "App name"); + OpenApiPathBuilder pathBuilder = OpenApiPathBuilder.newBuilder() + .envPathVal(env) + .customResource("apps/create") + ; + + try (CloseableHttpResponse response = post(pathBuilder, openAppDTO)) { + gson.fromJson(EntityUtils.toString(response.getEntity()), void.class); + } catch (Throwable ex) { + throw new RuntimeException(String.format( + "Create app: %s for appId: %s in env: %s failed", + openAppDTO.getName(), + openAppDTO.getAppId(), + env + ), ex); + } + } + @Override public List getEnvClusterInfo(String appId) { checkNotEmpty(appId, "App id"); diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java index 60773540..8ab53cc9 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java @@ -16,8 +16,14 @@ */ package com.ctrip.framework.apollo.openapi.client; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; public class ApolloOpenApiClientTest { @@ -32,11 +38,67 @@ public void testCreate() { assertEquals(someToken, client.getToken()); } - @Test(expected = IllegalArgumentException.class) + @Test public void testCreateWithInvalidUrl() { String someInvalidUrl = "someInvalidUrl"; String someToken = "someToken"; - ApolloOpenApiClient.newBuilder().withPortalUrl(someInvalidUrl).withToken(someToken).build(); + assertThrows( + IllegalArgumentException.class, + () -> ApolloOpenApiClient.newBuilder().withPortalUrl(someInvalidUrl).withToken(someToken).build() + ); + } + + @Test + @Disabled("only for integration test") + public void testCreateApp() { + String someUrl = "http://localhost:8070"; +// String someToken = "0627b87948c30517157e8b2a9565e473b5a97323a50128f584838ed10559d3fd"; + String someToken = "9d0a241e9cb2300f302a875b1195340b2b6f56373cf5ca5d006a3f4e1a46b3ef"; + + ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder() + .withPortalUrl(someUrl) + .withToken(someToken) + .withReadTimeout(200 * 1000) + .withConnectTimeout(200 * 1000) + .build(); + + final String appId = "openapi-create-app"; + OpenAppDTO openAppDTO = new OpenAppDTO(); + openAppDTO.setName("openapi create app 测试名字"); + openAppDTO.setAppId(appId); + openAppDTO.setOwnerName("user-test-xxx1"); + openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); + openAppDTO.setOrgId("orgId1"); + openAppDTO.setOrgName("orgName1"); +// client.createApp(openAppDTO); + + List list = client.getAppsByIds(Collections.singletonList(appId)); + } + + @Test + @Disabled("only for integration test") + public void testCreateAppWithEnv() { + String someUrl = "http://localhost:8070"; + String someToken = "9d0a241e9cb2300f302a875b1195340b2b6f56373cf5ca5d006a3f4e1a46b3ef"; + + ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder() + .withPortalUrl(someUrl) + .withToken(someToken) + .withReadTimeout(200 * 1000) + .withConnectTimeout(200 * 1000) + .build(); + + final String appId = "openapi-create-app-in-dev"; + OpenAppDTO openAppDTO = new OpenAppDTO(); + openAppDTO.setName("openapi create app 测试名字"); + openAppDTO.setAppId(appId); + openAppDTO.setOwnerName("user-test-xxx1"); + openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); + openAppDTO.setOrgId("orgId1"); + openAppDTO.setOrgName("orgName1"); + client.createApp("dev", openAppDTO); + + List list = client.getAppsByIds(Collections.singletonList(appId)); } } From 7b41ecd7e2e8b384c9e5f5982a29ff804b9dbe65 Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Fri, 11 Aug 2023 20:14:55 +0800 Subject: [PATCH 02/15] feat(openapi): create app --- .../apollo/openapi/api/AppOpenApiService.java | 9 +++ .../openapi/client/ApolloOpenApiClient.java | 8 +++ .../client/service/AppOpenApiService.java | 38 ++++++++++ .../client/ApolloOpenApiClientTest.java | 70 +++++++++++++++++-- 4 files changed, 121 insertions(+), 4 deletions(-) diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java index 2b4d1c9d..0acd1d2b 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java @@ -18,6 +18,7 @@ import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; import com.ctrip.framework.apollo.openapi.dto.OpenEnvClusterDTO; +import java.util.Collections; import java.util.List; /** @@ -25,6 +26,14 @@ */ public interface AppOpenApiService { + default void createApp(OpenAppDTO openAppDTO) { + throw new UnsupportedOperationException(); + } + + default void createApp(String env, OpenAppDTO openAppDTO) { + throw new UnsupportedOperationException(); + } + List getEnvClusterInfo(String appId); List getAllApps(); diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java index a0688238..b4b51c01 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java @@ -65,6 +65,14 @@ private ApolloOpenApiClient(String portalUrl, String token, RequestConfig reques releaseService = new ReleaseOpenApiService(client, baseUrl, GSON); } + public void createApp(OpenAppDTO openAppDTO) { + appService.createApp(openAppDTO); + } + + public void createApp(String env, OpenAppDTO openAppDTO) { + appService.createApp(env, openAppDTO); + } + /** * Get the environment and cluster information */ diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java index 4fe38911..4c96bf8d 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java @@ -39,6 +39,44 @@ public AppOpenApiService(CloseableHttpClient client, String baseUrl, Gson gson) super(client, baseUrl, gson); } + @Override + public void createApp(OpenAppDTO openAppDTO) { + checkNotEmpty(openAppDTO.getAppId(), "App id"); + checkNotEmpty(openAppDTO.getName(), "App name"); + OpenApiPathBuilder pathBuilder = OpenApiPathBuilder.newBuilder() + .customResource("apps/create"); + + try (CloseableHttpResponse response = post(pathBuilder, openAppDTO)) { + gson.fromJson(EntityUtils.toString(response.getEntity()), void.class); + } catch (Throwable ex) { + throw new RuntimeException( + String.format("Create app: %s for appId: %s failed", openAppDTO.getName(), + openAppDTO.getAppId()), ex); + } + } + + @Override + public void createApp(String env, OpenAppDTO openAppDTO) { + checkNotEmpty(env, "Env"); + checkNotEmpty(openAppDTO.getAppId(), "App id"); + checkNotEmpty(openAppDTO.getName(), "App name"); + OpenApiPathBuilder pathBuilder = OpenApiPathBuilder.newBuilder() + .envPathVal(env) + .customResource("apps/create") + ; + + try (CloseableHttpResponse response = post(pathBuilder, openAppDTO)) { + gson.fromJson(EntityUtils.toString(response.getEntity()), void.class); + } catch (Throwable ex) { + throw new RuntimeException(String.format( + "Create app: %s for appId: %s in env: %s failed", + openAppDTO.getName(), + openAppDTO.getAppId(), + env + ), ex); + } + } + @Override public List getEnvClusterInfo(String appId) { checkNotEmpty(appId, "App id"); diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java index 60773540..8ab53cc9 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java @@ -16,8 +16,14 @@ */ package com.ctrip.framework.apollo.openapi.client; -import static org.junit.Assert.assertEquals; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; +import java.util.Collections; +import java.util.List; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; public class ApolloOpenApiClientTest { @@ -32,11 +38,67 @@ public void testCreate() { assertEquals(someToken, client.getToken()); } - @Test(expected = IllegalArgumentException.class) + @Test public void testCreateWithInvalidUrl() { String someInvalidUrl = "someInvalidUrl"; String someToken = "someToken"; - ApolloOpenApiClient.newBuilder().withPortalUrl(someInvalidUrl).withToken(someToken).build(); + assertThrows( + IllegalArgumentException.class, + () -> ApolloOpenApiClient.newBuilder().withPortalUrl(someInvalidUrl).withToken(someToken).build() + ); + } + + @Test + @Disabled("only for integration test") + public void testCreateApp() { + String someUrl = "http://localhost:8070"; +// String someToken = "0627b87948c30517157e8b2a9565e473b5a97323a50128f584838ed10559d3fd"; + String someToken = "9d0a241e9cb2300f302a875b1195340b2b6f56373cf5ca5d006a3f4e1a46b3ef"; + + ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder() + .withPortalUrl(someUrl) + .withToken(someToken) + .withReadTimeout(200 * 1000) + .withConnectTimeout(200 * 1000) + .build(); + + final String appId = "openapi-create-app"; + OpenAppDTO openAppDTO = new OpenAppDTO(); + openAppDTO.setName("openapi create app 测试名字"); + openAppDTO.setAppId(appId); + openAppDTO.setOwnerName("user-test-xxx1"); + openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); + openAppDTO.setOrgId("orgId1"); + openAppDTO.setOrgName("orgName1"); +// client.createApp(openAppDTO); + + List list = client.getAppsByIds(Collections.singletonList(appId)); + } + + @Test + @Disabled("only for integration test") + public void testCreateAppWithEnv() { + String someUrl = "http://localhost:8070"; + String someToken = "9d0a241e9cb2300f302a875b1195340b2b6f56373cf5ca5d006a3f4e1a46b3ef"; + + ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder() + .withPortalUrl(someUrl) + .withToken(someToken) + .withReadTimeout(200 * 1000) + .withConnectTimeout(200 * 1000) + .build(); + + final String appId = "openapi-create-app-in-dev"; + OpenAppDTO openAppDTO = new OpenAppDTO(); + openAppDTO.setName("openapi create app 测试名字"); + openAppDTO.setAppId(appId); + openAppDTO.setOwnerName("user-test-xxx1"); + openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); + openAppDTO.setOrgId("orgId1"); + openAppDTO.setOrgName("orgName1"); + client.createApp("dev", openAppDTO); + + List list = client.getAppsByIds(Collections.singletonList(appId)); } } From 704ec66b609f9d6a908d6a9000d54173e989c9f7 Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Tue, 15 Aug 2023 22:28:55 +0800 Subject: [PATCH 03/15] fix: remove create app by env --- .../apollo/openapi/api/AppOpenApiService.java | 5 -- .../openapi/client/ApolloOpenApiClient.java | 4 -- .../client/service/AppOpenApiService.java | 22 -------- .../client/ApolloOpenApiClientTest.java | 50 +++++++------------ 4 files changed, 17 insertions(+), 64 deletions(-) diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java index 0acd1d2b..ad307071 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java @@ -18,7 +18,6 @@ import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; import com.ctrip.framework.apollo.openapi.dto.OpenEnvClusterDTO; -import java.util.Collections; import java.util.List; /** @@ -30,10 +29,6 @@ default void createApp(OpenAppDTO openAppDTO) { throw new UnsupportedOperationException(); } - default void createApp(String env, OpenAppDTO openAppDTO) { - throw new UnsupportedOperationException(); - } - List getEnvClusterInfo(String appId); List getAllApps(); diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java index b4b51c01..55b2210d 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java @@ -69,10 +69,6 @@ public void createApp(OpenAppDTO openAppDTO) { appService.createApp(openAppDTO); } - public void createApp(String env, OpenAppDTO openAppDTO) { - appService.createApp(env, openAppDTO); - } - /** * Get the environment and cluster information */ diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java index 4c96bf8d..c483246a 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java @@ -55,28 +55,6 @@ public void createApp(OpenAppDTO openAppDTO) { } } - @Override - public void createApp(String env, OpenAppDTO openAppDTO) { - checkNotEmpty(env, "Env"); - checkNotEmpty(openAppDTO.getAppId(), "App id"); - checkNotEmpty(openAppDTO.getName(), "App name"); - OpenApiPathBuilder pathBuilder = OpenApiPathBuilder.newBuilder() - .envPathVal(env) - .customResource("apps/create") - ; - - try (CloseableHttpResponse response = post(pathBuilder, openAppDTO)) { - gson.fromJson(EntityUtils.toString(response.getEntity()), void.class); - } catch (Throwable ex) { - throw new RuntimeException(String.format( - "Create app: %s for appId: %s in env: %s failed", - openAppDTO.getName(), - openAppDTO.getAppId(), - env - ), ex); - } - } - @Override public List getEnvClusterInfo(String appId) { checkNotEmpty(appId, "App id"); diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java index 8ab53cc9..1b683e5c 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java @@ -24,9 +24,13 @@ import java.util.List; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ApolloOpenApiClientTest { + private final Logger log = LoggerFactory.getLogger(this.getClass()); + @Test public void testCreate() { String someUrl = "http://someUrl"; @@ -64,41 +68,21 @@ public void testCreateApp() { .build(); final String appId = "openapi-create-app"; - OpenAppDTO openAppDTO = new OpenAppDTO(); - openAppDTO.setName("openapi create app 测试名字"); - openAppDTO.setAppId(appId); - openAppDTO.setOwnerName("user-test-xxx1"); - openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); - openAppDTO.setOrgId("orgId1"); - openAppDTO.setOrgName("orgName1"); -// client.createApp(openAppDTO); - - List list = client.getAppsByIds(Collections.singletonList(appId)); - } - - @Test - @Disabled("only for integration test") - public void testCreateAppWithEnv() { - String someUrl = "http://localhost:8070"; - String someToken = "9d0a241e9cb2300f302a875b1195340b2b6f56373cf5ca5d006a3f4e1a46b3ef"; - - ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder() - .withPortalUrl(someUrl) - .withToken(someToken) - .withReadTimeout(200 * 1000) - .withConnectTimeout(200 * 1000) - .build(); + { + OpenAppDTO openAppDTO = new OpenAppDTO(); + openAppDTO.setName("openapi create app 测试名字"); + openAppDTO.setAppId(appId); + openAppDTO.setOwnerName("user-test-xxx1"); + openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); + openAppDTO.setOrgId("orgId1"); + openAppDTO.setOrgName("orgName1"); + client.createApp(openAppDTO); + } - final String appId = "openapi-create-app-in-dev"; - OpenAppDTO openAppDTO = new OpenAppDTO(); - openAppDTO.setName("openapi create app 测试名字"); - openAppDTO.setAppId(appId); - openAppDTO.setOwnerName("user-test-xxx1"); - openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); - openAppDTO.setOrgId("orgId1"); - openAppDTO.setOrgName("orgName1"); - client.createApp("dev", openAppDTO); List list = client.getAppsByIds(Collections.singletonList(appId)); + for (OpenAppDTO openAppDTO : list) { + log.info("{}", openAppDTO); + } } } From 7d95865fe85d5ab55460cd6a76d5344bf006c877 Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Wed, 16 Aug 2023 22:26:01 +0800 Subject: [PATCH 04/15] feat: support init admins when create app --- .../framework/apollo/openapi/dto/OpenAppDTO.java | 13 +++++++++++++ .../openapi/client/ApolloOpenApiClientTest.java | 7 ++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenAppDTO.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenAppDTO.java index 45c98ab0..1683ab21 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenAppDTO.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenAppDTO.java @@ -16,6 +16,8 @@ */ package com.ctrip.framework.apollo.openapi.dto; +import java.util.Set; + public class OpenAppDTO extends BaseDTO { private String name; @@ -30,6 +32,8 @@ public class OpenAppDTO extends BaseDTO { private String ownerEmail; + private Set admins; + public String getAppId() { return appId; } @@ -54,6 +58,10 @@ public String getOwnerName() { return ownerName; } + public Set getAdmins() { + return admins; + } + public void setAppId(String appId) { this.appId = appId; } @@ -78,6 +86,10 @@ public void setOwnerName(String ownerName) { this.ownerName = ownerName; } + public void setAdmins(Set admins) { + this.admins = admins; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("OpenAppDTO{"); @@ -87,6 +99,7 @@ public String toString() { sb.append(", orgName='").append(orgName).append('\''); sb.append(", ownerName='").append(ownerName).append('\''); sb.append(", ownerEmail='").append(ownerEmail).append('\''); + sb.append(", admins='").append(admins).append('\''); sb.append(", dataChangeCreatedBy='").append(dataChangeCreatedBy).append('\''); sb.append(", dataChangeLastModifiedBy='").append(dataChangeLastModifiedBy).append('\''); sb.append(", dataChangeCreatedTime=").append(dataChangeCreatedTime); diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java index fea438c0..99507bca 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java @@ -20,7 +20,9 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; +import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.List; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -67,7 +69,7 @@ public void testCreateApp() { .withConnectTimeout(200 * 1000) .build(); - final String appId = "openapi-create-app"; + final String appId = "openapi-create-app1"; { OpenAppDTO openAppDTO = new OpenAppDTO(); @@ -77,6 +79,9 @@ public void testCreateApp() { openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); openAppDTO.setOrgId("orgId1"); openAppDTO.setOrgName("orgName1"); + openAppDTO.setAdmins(new HashSet<>(Arrays.asList( + "user-test-xxx2", "user3" + ))); client.createApp(openAppDTO); } From e7b8a70b4b2e7a02dfa18d9591c5def02ca5b8ad Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Fri, 18 Aug 2023 21:35:51 +0800 Subject: [PATCH 05/15] refactor: path "apps/create" -> "apps" --- .../apollo/openapi/client/service/AppOpenApiService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java index c483246a..6c0ae7f0 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java @@ -44,7 +44,7 @@ public void createApp(OpenAppDTO openAppDTO) { checkNotEmpty(openAppDTO.getAppId(), "App id"); checkNotEmpty(openAppDTO.getName(), "App name"); OpenApiPathBuilder pathBuilder = OpenApiPathBuilder.newBuilder() - .customResource("apps/create"); + .customResource("apps"); try (CloseableHttpResponse response = post(pathBuilder, openAppDTO)) { gson.fromJson(EntityUtils.toString(response.getEntity()), void.class); From 0924e0257e6f7f452e2580875d4204890f3a0b7a Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Fri, 18 Aug 2023 21:36:12 +0800 Subject: [PATCH 06/15] test: move to IntegrationTest --- .../ApolloOpenApiClientIntegrationTest.java | 75 +++++++++++++++++++ .../client/ApolloOpenApiClientTest.java | 60 +-------------- 2 files changed, 79 insertions(+), 56 deletions(-) create mode 100644 apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java new file mode 100644 index 00000000..cc3034b4 --- /dev/null +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java @@ -0,0 +1,75 @@ +/* + * Copyright 2022 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.openapi.client; + +import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Do not run in 'mvn clean test', + * left code here for develop test, + * you can run the method by ide. + */ +class ApolloOpenApiClientIntegrationTest { + + private final Logger log = LoggerFactory.getLogger(this.getClass()); + + + @Test + @Disabled("only for integration test") + public void testCreateApp() { + String someUrl = "http://localhost:8070"; +// String someToken = "0627b87948c30517157e8b2a9565e473b5a97323a50128f584838ed10559d3fd"; + String someToken = "9d0a241e9cb2300f302a875b1195340b2b6f56373cf5ca5d006a3f4e1a46b3ef"; + + ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder() + .withPortalUrl(someUrl) + .withToken(someToken) + .withReadTimeout(200 * 1000) + .withConnectTimeout(200 * 1000) + .build(); + + final String appId = "openapi-create-app1"; + + { + OpenAppDTO openAppDTO = new OpenAppDTO(); + openAppDTO.setName("openapi create app 测试名字"); + openAppDTO.setAppId(appId); + openAppDTO.setOwnerName("user-test-xxx1"); + openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); + openAppDTO.setOrgId("orgId1"); + openAppDTO.setOrgName("orgName1"); + openAppDTO.setAdmins(new HashSet<>(Arrays.asList( + "user-test-xxx2", "user3" + ))); + client.createApp(openAppDTO); + } + + List list = client.getAppsByIds(Collections.singletonList(appId)); + for (OpenAppDTO openAppDTO : list) { + log.info("{}", openAppDTO); + } + } + +} diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java index 99507bca..60773540 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientTest.java @@ -16,23 +16,11 @@ */ package com.ctrip.framework.apollo.openapi.client; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static org.junit.Assert.assertEquals; +import org.junit.Test; public class ApolloOpenApiClientTest { - private final Logger log = LoggerFactory.getLogger(this.getClass()); - @Test public void testCreate() { String someUrl = "http://someUrl"; @@ -44,51 +32,11 @@ public void testCreate() { assertEquals(someToken, client.getToken()); } - @Test + @Test(expected = IllegalArgumentException.class) public void testCreateWithInvalidUrl() { String someInvalidUrl = "someInvalidUrl"; String someToken = "someToken"; - assertThrows( - IllegalArgumentException.class, - () -> ApolloOpenApiClient.newBuilder().withPortalUrl(someInvalidUrl).withToken(someToken).build() - ); + ApolloOpenApiClient.newBuilder().withPortalUrl(someInvalidUrl).withToken(someToken).build(); } - - @Test - @Disabled("only for integration test") - public void testCreateApp() { - String someUrl = "http://localhost:8070"; -// String someToken = "0627b87948c30517157e8b2a9565e473b5a97323a50128f584838ed10559d3fd"; - String someToken = "9d0a241e9cb2300f302a875b1195340b2b6f56373cf5ca5d006a3f4e1a46b3ef"; - - ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder() - .withPortalUrl(someUrl) - .withToken(someToken) - .withReadTimeout(200 * 1000) - .withConnectTimeout(200 * 1000) - .build(); - - final String appId = "openapi-create-app1"; - - { - OpenAppDTO openAppDTO = new OpenAppDTO(); - openAppDTO.setName("openapi create app 测试名字"); - openAppDTO.setAppId(appId); - openAppDTO.setOwnerName("user-test-xxx1"); - openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); - openAppDTO.setOrgId("orgId1"); - openAppDTO.setOrgName("orgName1"); - openAppDTO.setAdmins(new HashSet<>(Arrays.asList( - "user-test-xxx2", "user3" - ))); - client.createApp(openAppDTO); - } - - List list = client.getAppsByIds(Collections.singletonList(appId)); - for (OpenAppDTO openAppDTO : list) { - log.info("{}", openAppDTO); - } - } - } From 8889d074b1bbeb1a919f1c4f732cae1fe18ac34c Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Fri, 18 Aug 2023 22:18:03 +0800 Subject: [PATCH 07/15] Update AppOpenApiServiceTest.java --- .../client/service/AppOpenApiServiceTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java index ef3e9b7e..25391215 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java @@ -17,11 +17,18 @@ package com.ctrip.framework.apollo.openapi.client.service; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; +import java.io.ByteArrayInputStream; +import java.util.Arrays; +import java.util.HashSet; import org.apache.http.client.methods.HttpGet; +import org.apache.http.entity.BasicHttpEntity; import org.apache.http.entity.StringEntity; import org.junit.Before; import org.junit.Test; @@ -65,4 +72,60 @@ public void testGetEnvClusterInfoWithError() throws Exception { appOpenApiService.getEnvClusterInfo(someAppId); } + + @Test(expected = RuntimeException.class) + public void testCreateAppEmptyAppId() throws Exception { + OpenAppDTO openAppDTO = new OpenAppDTO(); + appOpenApiService.createApp(openAppDTO); + } + + @Test(expected = RuntimeException.class) + public void testCreateAppEmptyAppName() throws Exception { + OpenAppDTO openAppDTO = new OpenAppDTO(); + openAppDTO.setAppId("appId1"); + appOpenApiService.createApp(openAppDTO); + } + + @Test(expected = RuntimeException.class) + public void testCreateAppFail() throws Exception { + OpenAppDTO openAppDTO = new OpenAppDTO(); + openAppDTO.setAppId("appId1"); + openAppDTO.setName("name1"); + openAppDTO.setAdmins(new HashSet<>(Arrays.asList("user1", "user2"))); + + when(statusLine.getStatusCode()).thenReturn(400); + + appOpenApiService.createApp(openAppDTO); + } + + + @Test + public void testCreateAppSuccess() throws Exception { + OpenAppDTO openAppDTO = new OpenAppDTO(); + openAppDTO.setAppId("appId1"); + openAppDTO.setName("name1"); + openAppDTO.setAdmins(new HashSet<>(Arrays.asList("user1", "user2"))); + + when(statusLine.getStatusCode()).thenReturn(200); + { + BasicHttpEntity httpEntity = new BasicHttpEntity(); + httpEntity.setContentLength(0L); + httpEntity.setContent(new ByteArrayInputStream(new byte[0])); + when(someHttpResponse.getEntity()).thenReturn(httpEntity); + } + + appOpenApiService.createApp(openAppDTO); + + verify(someHttpResponse, atLeastOnce()).getEntity(); + verify(httpClient, atLeastOnce()).execute(argThat(request -> { + if (!"POST".equals(request.getMethod())) { + return false; + } + if (!request.getURI().toString().endsWith("apps")) { + return false; + } + return true; + })); + + } } From 172d435f96ef2ccb702526c018825ca4ffa41334 Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Sun, 27 Aug 2023 14:11:59 +0800 Subject: [PATCH 08/15] refactor: use OpenCreateAppDTO instead of OpenAppDTO --- .../apollo/openapi/api/AppOpenApiService.java | 3 +- .../openapi/client/ApolloOpenApiClient.java | 4 +- .../client/service/AppOpenApiService.java | 13 +++-- .../apollo/openapi/dto/OpenAppDTO.java | 13 ----- .../apollo/openapi/dto/OpenCreateAppDTO.java | 55 +++++++++++++++++++ .../ApolloOpenApiClientIntegrationTest.java | 19 ++++--- .../client/service/AppOpenApiServiceTest.java | 31 ++++++----- 7 files changed, 92 insertions(+), 46 deletions(-) create mode 100644 apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java index ad307071..81365264 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/api/AppOpenApiService.java @@ -17,6 +17,7 @@ package com.ctrip.framework.apollo.openapi.api; import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; +import com.ctrip.framework.apollo.openapi.dto.OpenCreateAppDTO; import com.ctrip.framework.apollo.openapi.dto.OpenEnvClusterDTO; import java.util.List; @@ -25,7 +26,7 @@ */ public interface AppOpenApiService { - default void createApp(OpenAppDTO openAppDTO) { + default void createApp(OpenCreateAppDTO req) { throw new UnsupportedOperationException(); } diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java index 55b2210d..6981397e 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClient.java @@ -65,8 +65,8 @@ private ApolloOpenApiClient(String portalUrl, String token, RequestConfig reques releaseService = new ReleaseOpenApiService(client, baseUrl, GSON); } - public void createApp(OpenAppDTO openAppDTO) { - appService.createApp(openAppDTO); + public void createApp(OpenCreateAppDTO req) { + appService.createApp(req); } /** diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java index 6c0ae7f0..4ebf8095 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java @@ -18,6 +18,7 @@ import com.ctrip.framework.apollo.openapi.client.url.OpenApiPathBuilder; import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; +import com.ctrip.framework.apollo.openapi.dto.OpenCreateAppDTO; import com.ctrip.framework.apollo.openapi.dto.OpenEnvClusterDTO; import com.google.common.base.Joiner; import com.google.gson.Gson; @@ -40,18 +41,18 @@ public AppOpenApiService(CloseableHttpClient client, String baseUrl, Gson gson) } @Override - public void createApp(OpenAppDTO openAppDTO) { - checkNotEmpty(openAppDTO.getAppId(), "App id"); - checkNotEmpty(openAppDTO.getName(), "App name"); + public void createApp(OpenCreateAppDTO req) { + checkNotEmpty(req.getAppId(), "App id"); + checkNotEmpty(req.getName(), "App name"); OpenApiPathBuilder pathBuilder = OpenApiPathBuilder.newBuilder() .customResource("apps"); - try (CloseableHttpResponse response = post(pathBuilder, openAppDTO)) { + try (CloseableHttpResponse response = post(pathBuilder, req)) { gson.fromJson(EntityUtils.toString(response.getEntity()), void.class); } catch (Throwable ex) { throw new RuntimeException( - String.format("Create app: %s for appId: %s failed", openAppDTO.getName(), - openAppDTO.getAppId()), ex); + String.format("Create app: %s for appId: %s failed", req.getName(), + req.getAppId()), ex); } } diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenAppDTO.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenAppDTO.java index 1683ab21..45c98ab0 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenAppDTO.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenAppDTO.java @@ -16,8 +16,6 @@ */ package com.ctrip.framework.apollo.openapi.dto; -import java.util.Set; - public class OpenAppDTO extends BaseDTO { private String name; @@ -32,8 +30,6 @@ public class OpenAppDTO extends BaseDTO { private String ownerEmail; - private Set admins; - public String getAppId() { return appId; } @@ -58,10 +54,6 @@ public String getOwnerName() { return ownerName; } - public Set getAdmins() { - return admins; - } - public void setAppId(String appId) { this.appId = appId; } @@ -86,10 +78,6 @@ public void setOwnerName(String ownerName) { this.ownerName = ownerName; } - public void setAdmins(Set admins) { - this.admins = admins; - } - @Override public String toString() { final StringBuilder sb = new StringBuilder("OpenAppDTO{"); @@ -99,7 +87,6 @@ public String toString() { sb.append(", orgName='").append(orgName).append('\''); sb.append(", ownerName='").append(ownerName).append('\''); sb.append(", ownerEmail='").append(ownerEmail).append('\''); - sb.append(", admins='").append(admins).append('\''); sb.append(", dataChangeCreatedBy='").append(dataChangeCreatedBy).append('\''); sb.append(", dataChangeLastModifiedBy='").append(dataChangeLastModifiedBy).append('\''); sb.append(", dataChangeCreatedTime=").append(dataChangeCreatedTime); diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java new file mode 100644 index 00000000..4446922b --- /dev/null +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java @@ -0,0 +1,55 @@ +/* + * Copyright 2022 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.openapi.dto; + +import java.util.Set; + +public class OpenCreateAppDTO extends OpenAppDTO { + + /** + * The application owner has project administrator permission by default. + *

+ * Administrators can create namespace, cluster, and assign user permissions + */ + private Set admins; + + public Set getAdmins() { + return admins; + } + + public void setAdmins(Set admins) { + this.admins = admins; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("OpenCreateAppDTO{"); + sb.append("name='").append(getName()).append('\''); + sb.append(", appId='").append(getAppId()).append('\''); + sb.append(", orgId='").append(getOrgId()).append('\''); + sb.append(", orgName='").append(getOrgName()).append('\''); + sb.append(", ownerName='").append(getOwnerName()).append('\''); + sb.append(", ownerEmail='").append(getOwnerEmail()).append('\''); + sb.append(", admins='").append(admins).append('\''); + sb.append(", dataChangeCreatedBy='").append(dataChangeCreatedBy).append('\''); + sb.append(", dataChangeLastModifiedBy='").append(dataChangeLastModifiedBy).append('\''); + sb.append(", dataChangeCreatedTime=").append(dataChangeCreatedTime); + sb.append(", dataChangeLastModifiedTime=").append(dataChangeLastModifiedTime); + sb.append('}'); + return sb.toString(); + } +} diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java index cc3034b4..80f8af41 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java @@ -17,6 +17,7 @@ package com.ctrip.framework.apollo.openapi.client; import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; +import com.ctrip.framework.apollo.openapi.dto.OpenCreateAppDTO; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -53,17 +54,17 @@ public void testCreateApp() { final String appId = "openapi-create-app1"; { - OpenAppDTO openAppDTO = new OpenAppDTO(); - openAppDTO.setName("openapi create app 测试名字"); - openAppDTO.setAppId(appId); - openAppDTO.setOwnerName("user-test-xxx1"); - openAppDTO.setOwnerEmail("user-test-xxx1@xxx.com"); - openAppDTO.setOrgId("orgId1"); - openAppDTO.setOrgName("orgName1"); - openAppDTO.setAdmins(new HashSet<>(Arrays.asList( + OpenCreateAppDTO req = new OpenCreateAppDTO(); + req.setName("openapi create app 测试名字"); + req.setAppId(appId); + req.setOwnerName("user-test-xxx1"); + req.setOwnerEmail("user-test-xxx1@xxx.com"); + req.setOrgId("orgId1"); + req.setOrgName("orgName1"); + req.setAdmins(new HashSet<>(Arrays.asList( "user-test-xxx2", "user3" ))); - client.createApp(openAppDTO); + client.createApp(req); } List list = client.getAppsByIds(Collections.singletonList(appId)); diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java index 25391215..9aa0d54b 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.when; import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; +import com.ctrip.framework.apollo.openapi.dto.OpenCreateAppDTO; import java.io.ByteArrayInputStream; import java.util.Arrays; import java.util.HashSet; @@ -75,36 +76,36 @@ public void testGetEnvClusterInfoWithError() throws Exception { @Test(expected = RuntimeException.class) public void testCreateAppEmptyAppId() throws Exception { - OpenAppDTO openAppDTO = new OpenAppDTO(); - appOpenApiService.createApp(openAppDTO); + OpenCreateAppDTO req = new OpenCreateAppDTO(); + appOpenApiService.createApp(req); } @Test(expected = RuntimeException.class) public void testCreateAppEmptyAppName() throws Exception { - OpenAppDTO openAppDTO = new OpenAppDTO(); - openAppDTO.setAppId("appId1"); - appOpenApiService.createApp(openAppDTO); + OpenCreateAppDTO req = new OpenCreateAppDTO(); + req.setAppId("appId1"); + appOpenApiService.createApp(req); } @Test(expected = RuntimeException.class) public void testCreateAppFail() throws Exception { - OpenAppDTO openAppDTO = new OpenAppDTO(); - openAppDTO.setAppId("appId1"); - openAppDTO.setName("name1"); - openAppDTO.setAdmins(new HashSet<>(Arrays.asList("user1", "user2"))); + OpenCreateAppDTO req = new OpenCreateAppDTO(); + req.setAppId("appId1"); + req.setName("name1"); + req.setAdmins(new HashSet<>(Arrays.asList("user1", "user2"))); when(statusLine.getStatusCode()).thenReturn(400); - appOpenApiService.createApp(openAppDTO); + appOpenApiService.createApp(req); } @Test public void testCreateAppSuccess() throws Exception { - OpenAppDTO openAppDTO = new OpenAppDTO(); - openAppDTO.setAppId("appId1"); - openAppDTO.setName("name1"); - openAppDTO.setAdmins(new HashSet<>(Arrays.asList("user1", "user2"))); + OpenCreateAppDTO req = new OpenCreateAppDTO(); + req.setAppId("appId1"); + req.setName("name1"); + req.setAdmins(new HashSet<>(Arrays.asList("user1", "user2"))); when(statusLine.getStatusCode()).thenReturn(200); { @@ -114,7 +115,7 @@ public void testCreateAppSuccess() throws Exception { when(someHttpResponse.getEntity()).thenReturn(httpEntity); } - appOpenApiService.createApp(openAppDTO); + appOpenApiService.createApp(req); verify(someHttpResponse, atLeastOnce()).getEntity(); verify(httpClient, atLeastOnce()).execute(argThat(request -> { From adda27aba058dcb87a591e282cb03b6fbcd101a7 Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Sun, 27 Aug 2023 15:02:58 +0800 Subject: [PATCH 09/15] test: testCreateAppThenCreateNamespaceThenRelease --- .../ApolloOpenApiClientIntegrationTest.java | 127 +++++++++++++++--- 1 file changed, 110 insertions(+), 17 deletions(-) diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java index 80f8af41..ce791779 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java @@ -16,12 +16,22 @@ */ package com.ctrip.framework.apollo.openapi.client; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.ctrip.framework.apollo.openapi.dto.NamespaceReleaseDTO; import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; +import com.ctrip.framework.apollo.openapi.dto.OpenAppNamespaceDTO; import com.ctrip.framework.apollo.openapi.dto.OpenCreateAppDTO; +import com.ctrip.framework.apollo.openapi.dto.OpenItemDTO; +import com.ctrip.framework.apollo.openapi.dto.OpenNamespaceDTO; +import com.ctrip.framework.apollo.openapi.dto.OpenReleaseDTO; +import java.time.LocalDateTime; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.slf4j.Logger; @@ -36,41 +46,124 @@ class ApolloOpenApiClientIntegrationTest { private final Logger log = LoggerFactory.getLogger(this.getClass()); + private final ApolloOpenApiClient client = newClient(); - @Test - @Disabled("only for integration test") - public void testCreateApp() { + private final String env = "DEV"; + private final String clusterName = "default"; + + ApolloOpenApiClient newClient() { String someUrl = "http://localhost:8070"; // String someToken = "0627b87948c30517157e8b2a9565e473b5a97323a50128f584838ed10559d3fd"; String someToken = "9d0a241e9cb2300f302a875b1195340b2b6f56373cf5ca5d006a3f4e1a46b3ef"; - ApolloOpenApiClient client = ApolloOpenApiClient.newBuilder() + return ApolloOpenApiClient.newBuilder() .withPortalUrl(someUrl) .withToken(someToken) - .withReadTimeout(200 * 1000) - .withConnectTimeout(200 * 1000) + .withReadTimeout(2000 * 1000) + .withConnectTimeout(2000 * 1000) .build(); + } - final String appId = "openapi-create-app1"; - + void createApp(String appId, String ownerName, String ... admins) { { OpenCreateAppDTO req = new OpenCreateAppDTO(); - req.setName("openapi create app 测试名字"); + req.setName("openapi create app 测试名字 " + appId); req.setAppId(appId); - req.setOwnerName("user-test-xxx1"); - req.setOwnerEmail("user-test-xxx1@xxx.com"); - req.setOrgId("orgId1"); - req.setOrgName("orgName1"); - req.setAdmins(new HashSet<>(Arrays.asList( - "user-test-xxx2", "user3" - ))); + req.setOwnerName(ownerName); + req.setOwnerEmail(ownerName + "@apollo.apollo"); + req.setOrgId("orgIdFromOpenapi"); + req.setOrgName("orgNameFromOpenapi"); + req.setAdmins(new HashSet<>(Arrays.asList(admins))); client.createApp(req); } + } + + @Test + @Disabled("only for integration test") + public void testCreateApp() { + final String appId = "openapi-create-app1"; + final String ownerName = "user-test-xxx1"; + createApp(appId, ownerName, "user-test-xxx2", "user3"); List list = client.getAppsByIds(Collections.singletonList(appId)); - for (OpenAppDTO openAppDTO : list) { + assertEquals(1, list.size()); + OpenAppDTO openAppDTO = list.get(0); + log.info("{}", openAppDTO); + assertEquals(appId, openAppDTO.getAppId()); + assertEquals(ownerName, openAppDTO.getOwnerName()); + } + + @Test + @Disabled("only for integration test") + public void testCreateAppThenCreateNamespaceThenRelease() { + // create app + final String appId = "openapi-create-app1"; + final String ownerName = "test-create-release1"; + createApp(appId, ownerName, "user-test-xxx1", "user-test-xxx2"); + + { + List list = client.getAppsByIds(Collections.singletonList(appId)); + assertEquals(1, list.size()); + OpenAppDTO openAppDTO = list.get(0); log.info("{}", openAppDTO); + assertEquals(appId, openAppDTO.getAppId()); + assertEquals(ownerName, openAppDTO.getOwnerName()); + } + + // create namespace + final String namespaceName = "openapi-create-namespace"; + { + OpenAppNamespaceDTO dto = new OpenAppNamespaceDTO(); + dto.setName(namespaceName); + dto.setAppId(appId); + dto.setComment("create from openapi"); + dto.setDataChangeCreatedBy(ownerName); + client.createAppNamespace(dto); + } + + // modify + // k1=v1 + { + OpenItemDTO itemDTO = new OpenItemDTO(); + itemDTO.setKey("k1"); + itemDTO.setValue("v1"); + client.createOrUpdateItem( + appId, env, clusterName, namespaceName, itemDTO + ); } + // k2=v2 + { + OpenItemDTO itemDTO = new OpenItemDTO(); + itemDTO.setKey("k2"); + itemDTO.setValue("v2"); + client.createOrUpdateItem( + appId, env, clusterName, namespaceName, itemDTO + ); + } + + // release namespace + { + NamespaceReleaseDTO dto = new NamespaceReleaseDTO(); + dto.setReleaseTitle("openapi-release"); + dto.setReleasedBy(ownerName); + dto.setReleaseComment("test openapi release in " + LocalDateTime.now()); + client.publishNamespace(appId, env, clusterName, namespaceName, dto); + } + + // read then namespace + { + OpenNamespaceDTO namespaceDTO + = client.getNamespace(appId, env, clusterName, namespaceName); + List items = namespaceDTO.getItems(); + Map map = new HashMap<>(16); + for (OpenItemDTO item : items) { + map.put(item.getKey(), item.getValue()); + } + assertEquals(2, map.size()); + assertEquals("v1", map.get("k1")); + assertEquals("v2", map.get("k2")); + } + } } From ac001bdaa5256f1db989a3cc851eec4ccf17eaca Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Sun, 27 Aug 2023 15:09:33 +0800 Subject: [PATCH 10/15] Update CHANGES.md --- CHANGES.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 4344deb4..5742c0a2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,9 +5,11 @@ Release Notes. Apollo Java 2.2.0 ------------------ -[refactor(apollo-client): Optimize the exception message when failing to retrieve configuration information.](https://github.com/apolloconfig/apollo-java/pull/22) -[Add JUnit5 extension support for apollo mock server.](https://github.com/apolloconfig/apollo-java/pull/25) -[Support concurrent loading of Config for different namespaces.](https://github.com/apolloconfig/apollo-java/pull/31) -[Fix snakeyaml 2.x compatibility issues](https://github.com/apolloconfig/apollo-java/pull/35) +* [refactor(apollo-client): Optimize the exception message when failing to retrieve configuration information.](https://github.com/apolloconfig/apollo-java/pull/22) +* [Add JUnit5 extension support for apollo mock server.](https://github.com/apolloconfig/apollo-java/pull/25) +* [Support concurrent loading of Config for different namespaces.](https://github.com/apolloconfig/apollo-java/pull/31) +* [Fix snakeyaml 2.x compatibility issues](https://github.com/apolloconfig/apollo-java/pull/35) +* [feat(openapi): create app](https://github.com/apolloconfig/apollo-java/pull/32) + ------------------ All issues and pull requests are [here](https://github.com/apolloconfig/apollo-java/milestone/2?closed=1) \ No newline at end of file From e9f568cb6632f0e93078ea2b56ddd8a4510ba948 Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Mon, 28 Aug 2023 22:17:34 +0800 Subject: [PATCH 11/15] add assignAppRoleToSelf to mark role permission --- .../apollo/openapi/dto/OpenCreateAppDTO.java | 15 +++++++++++++++ .../ApolloOpenApiClientIntegrationTest.java | 17 +++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java index 4446922b..9d49f827 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java @@ -27,6 +27,12 @@ public class OpenCreateAppDTO extends OpenAppDTO { */ private Set admins; + /** + * when {@code assignAppRoleToSelf} is true, + * you can do anything with the app by current token! + */ + private boolean assignAppRoleToSelf; + public Set getAdmins() { return admins; } @@ -35,6 +41,14 @@ public void setAdmins(Set admins) { this.admins = admins; } + public boolean isAssignAppRoleToSelf() { + return assignAppRoleToSelf; + } + + public void setAssignAppRoleToSelf(boolean assignAppRoleToSelf) { + this.assignAppRoleToSelf = assignAppRoleToSelf; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("OpenCreateAppDTO{"); @@ -45,6 +59,7 @@ public String toString() { sb.append(", ownerName='").append(getOwnerName()).append('\''); sb.append(", ownerEmail='").append(getOwnerEmail()).append('\''); sb.append(", admins='").append(admins).append('\''); + sb.append(", assignAppRoleToSelf='").append(assignAppRoleToSelf).append('\''); sb.append(", dataChangeCreatedBy='").append(dataChangeCreatedBy).append('\''); sb.append(", dataChangeLastModifiedBy='").append(dataChangeLastModifiedBy).append('\''); sb.append(", dataChangeCreatedTime=").append(dataChangeCreatedTime); diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java index ce791779..0a9918e2 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java @@ -26,6 +26,7 @@ import com.ctrip.framework.apollo.openapi.dto.OpenNamespaceDTO; import com.ctrip.framework.apollo.openapi.dto.OpenReleaseDTO; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -64,7 +65,7 @@ ApolloOpenApiClient newClient() { .build(); } - void createApp(String appId, String ownerName, String ... admins) { + void createApp(String appId, String ownerName, boolean assignAppRoleToSelf, String ... admins) { { OpenCreateAppDTO req = new OpenCreateAppDTO(); req.setName("openapi create app 测试名字 " + appId); @@ -74,6 +75,7 @@ void createApp(String appId, String ownerName, String ... admins) { req.setOrgId("orgIdFromOpenapi"); req.setOrgName("orgNameFromOpenapi"); req.setAdmins(new HashSet<>(Arrays.asList(admins))); + req.setAssignAppRoleToSelf(assignAppRoleToSelf); client.createApp(req); } } @@ -83,7 +85,7 @@ void createApp(String appId, String ownerName, String ... admins) { public void testCreateApp() { final String appId = "openapi-create-app1"; final String ownerName = "user-test-xxx1"; - createApp(appId, ownerName, "user-test-xxx2", "user3"); + createApp(appId, ownerName, false, "user-test-xxx2", "user3"); List list = client.getAppsByIds(Collections.singletonList(appId)); assertEquals(1, list.size()); @@ -97,9 +99,12 @@ public void testCreateApp() { @Disabled("only for integration test") public void testCreateAppThenCreateNamespaceThenRelease() { // create app - final String appId = "openapi-create-app1"; + final String appIdSuffix = LocalDateTime.now().format( + DateTimeFormatter.ofPattern("yyyyMMdd-HH-mm-ss") + ); + final String appId = "openapi-create-app-" + appIdSuffix; final String ownerName = "test-create-release1"; - createApp(appId, ownerName, "user-test-xxx1", "user-test-xxx2"); + createApp(appId, ownerName, true, "user-test-xxx1", "user-test-xxx2"); { List list = client.getAppsByIds(Collections.singletonList(appId)); @@ -127,6 +132,7 @@ public void testCreateAppThenCreateNamespaceThenRelease() { OpenItemDTO itemDTO = new OpenItemDTO(); itemDTO.setKey("k1"); itemDTO.setValue("v1"); + itemDTO.setDataChangeCreatedBy(ownerName); client.createOrUpdateItem( appId, env, clusterName, namespaceName, itemDTO ); @@ -136,6 +142,7 @@ public void testCreateAppThenCreateNamespaceThenRelease() { OpenItemDTO itemDTO = new OpenItemDTO(); itemDTO.setKey("k2"); itemDTO.setValue("v2"); + itemDTO.setDataChangeCreatedBy(ownerName); client.createOrUpdateItem( appId, env, clusterName, namespaceName, itemDTO ); @@ -162,8 +169,10 @@ public void testCreateAppThenCreateNamespaceThenRelease() { assertEquals(2, map.size()); assertEquals("v1", map.get("k1")); assertEquals("v2", map.get("k2")); + log.info("create app {} namespace {} and release {} success", appId, namespaceName, map); } + } } From af53e3b9a6133ad4eee3d3bc663d7917409e0ec6 Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Mon, 28 Aug 2023 22:32:51 +0800 Subject: [PATCH 12/15] testCreateAppButHaveNoAppRole --- .../ApolloOpenApiClientIntegrationTest.java | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java index 0a9918e2..df856da6 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java @@ -17,6 +17,7 @@ package com.ctrip.framework.apollo.openapi.client; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import com.ctrip.framework.apollo.openapi.dto.NamespaceReleaseDTO; import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; @@ -76,6 +77,7 @@ void createApp(String appId, String ownerName, boolean assignAppRoleToSelf, Stri req.setOrgName("orgNameFromOpenapi"); req.setAdmins(new HashSet<>(Arrays.asList(admins))); req.setAssignAppRoleToSelf(assignAppRoleToSelf); + log.info("create app {}, ownerName {} assignAppRoleToSelf {}", appId, ownerName, assignAppRoleToSelf); client.createApp(req); } } @@ -95,6 +97,40 @@ public void testCreateApp() { assertEquals(ownerName, openAppDTO.getOwnerName()); } + + @Test + @Disabled("only for integration test") + public void testCreateAppButHaveNoAppRole() { + // create app + final String appIdSuffix = LocalDateTime.now().format( + DateTimeFormatter.ofPattern("yyyyMMdd-HH-mm-ss") + ); + final String appId = "openapi-create-app-" + appIdSuffix; + final String ownerName = "test-create-release1"; + createApp(appId, ownerName, false, "user-test-xxx1", "user-test-xxx2"); + + { + List list = client.getAppsByIds(Collections.singletonList(appId)); + assertEquals(1, list.size()); + OpenAppDTO openAppDTO = list.get(0); + log.info("{}", openAppDTO); + assertEquals(appId, openAppDTO.getAppId()); + assertEquals(ownerName, openAppDTO.getOwnerName()); + } + + // create namespace + final String namespaceName = "openapi-create-namespace"; + { + OpenAppNamespaceDTO dto = new OpenAppNamespaceDTO(); + dto.setName(namespaceName); + dto.setAppId(appId); + dto.setComment("create from openapi"); + dto.setDataChangeCreatedBy(ownerName); + log.info("create namespace {} should fail because have no app role", namespaceName); + assertThrows(RuntimeException.class, () -> client.createAppNamespace(dto)); + } + } + @Test @Disabled("only for integration test") public void testCreateAppThenCreateNamespaceThenRelease() { @@ -123,6 +159,7 @@ public void testCreateAppThenCreateNamespaceThenRelease() { dto.setAppId(appId); dto.setComment("create from openapi"); dto.setDataChangeCreatedBy(ownerName); + log.info("create namespace {}", namespaceName); client.createAppNamespace(dto); } @@ -154,6 +191,7 @@ public void testCreateAppThenCreateNamespaceThenRelease() { dto.setReleaseTitle("openapi-release"); dto.setReleasedBy(ownerName); dto.setReleaseComment("test openapi release in " + LocalDateTime.now()); + log.info("release namespace {}", namespaceName); client.publishNamespace(appId, env, clusterName, namespaceName, dto); } @@ -171,8 +209,6 @@ public void testCreateAppThenCreateNamespaceThenRelease() { assertEquals("v2", map.get("k2")); log.info("create app {} namespace {} and release {} success", appId, namespaceName, map); } - - } } From 9558c8451c603659f2faa0e9d455805bcabffe04 Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Tue, 29 Aug 2023 22:56:04 +0800 Subject: [PATCH 13/15] refactor: use composite instead of extend OpenAppDTO --- .../service/AbstractOpenApiService.java | 4 +++ .../client/service/AppOpenApiService.java | 10 ++++--- .../apollo/openapi/dto/OpenCreateAppDTO.java | 25 +++++++++--------- .../ApolloOpenApiClientIntegrationTest.java | 15 ++++++----- .../client/service/AppOpenApiServiceTest.java | 26 +++++++++++++++---- 5 files changed, 52 insertions(+), 28 deletions(-) diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AbstractOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AbstractOpenApiService.java index 811ee890..464bb1f9 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AbstractOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AbstractOpenApiService.java @@ -97,6 +97,10 @@ private void checkHttpResponseStatus(HttpResponse response) { throw new ApolloOpenApiException(status.getStatusCode(), status.getReasonPhrase(), message); } + protected void checkNotNull(Object value, String name) { + Preconditions.checkArgument(null != value, name + " should not be null"); + } + protected void checkNotEmpty(String value, String name) { Preconditions.checkArgument(!Strings.isNullOrEmpty(value), name + " should not be null or empty"); } diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java index 4ebf8095..856217d1 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiService.java @@ -42,8 +42,10 @@ public AppOpenApiService(CloseableHttpClient client, String baseUrl, Gson gson) @Override public void createApp(OpenCreateAppDTO req) { - checkNotEmpty(req.getAppId(), "App id"); - checkNotEmpty(req.getName(), "App name"); + OpenAppDTO app = req.getApp(); + checkNotNull(app, "App"); + checkNotEmpty(app.getAppId(), "App id"); + checkNotEmpty(app.getName(), "App name"); OpenApiPathBuilder pathBuilder = OpenApiPathBuilder.newBuilder() .customResource("apps"); @@ -51,8 +53,8 @@ public void createApp(OpenCreateAppDTO req) { gson.fromJson(EntityUtils.toString(response.getEntity()), void.class); } catch (Throwable ex) { throw new RuntimeException( - String.format("Create app: %s for appId: %s failed", req.getName(), - req.getAppId()), ex); + String.format("Create app: %s for appId: %s failed", app.getName(), + app.getAppId()), ex); } } diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java index 9d49f827..931084c4 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java @@ -18,7 +18,7 @@ import java.util.Set; -public class OpenCreateAppDTO extends OpenAppDTO { +public class OpenCreateAppDTO { /** * The application owner has project administrator permission by default. @@ -33,6 +33,8 @@ public class OpenCreateAppDTO extends OpenAppDTO { */ private boolean assignAppRoleToSelf; + private OpenAppDTO app; + public Set getAdmins() { return admins; } @@ -49,21 +51,20 @@ public void setAssignAppRoleToSelf(boolean assignAppRoleToSelf) { this.assignAppRoleToSelf = assignAppRoleToSelf; } + public OpenAppDTO getApp() { + return app; + } + + public void setApp(OpenAppDTO app) { + this.app = app; + } + @Override public String toString() { final StringBuilder sb = new StringBuilder("OpenCreateAppDTO{"); - sb.append("name='").append(getName()).append('\''); - sb.append(", appId='").append(getAppId()).append('\''); - sb.append(", orgId='").append(getOrgId()).append('\''); - sb.append(", orgName='").append(getOrgName()).append('\''); - sb.append(", ownerName='").append(getOwnerName()).append('\''); - sb.append(", ownerEmail='").append(getOwnerEmail()).append('\''); + sb.append("assignAppRoleToSelf='").append(assignAppRoleToSelf).append('\''); sb.append(", admins='").append(admins).append('\''); - sb.append(", assignAppRoleToSelf='").append(assignAppRoleToSelf).append('\''); - sb.append(", dataChangeCreatedBy='").append(dataChangeCreatedBy).append('\''); - sb.append(", dataChangeLastModifiedBy='").append(dataChangeLastModifiedBy).append('\''); - sb.append(", dataChangeCreatedTime=").append(dataChangeCreatedTime); - sb.append(", dataChangeLastModifiedTime=").append(dataChangeLastModifiedTime); + sb.append(", app=").append(app); sb.append('}'); return sb.toString(); } diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java index df856da6..6af95301 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java @@ -25,7 +25,6 @@ import com.ctrip.framework.apollo.openapi.dto.OpenCreateAppDTO; import com.ctrip.framework.apollo.openapi.dto.OpenItemDTO; import com.ctrip.framework.apollo.openapi.dto.OpenNamespaceDTO; -import com.ctrip.framework.apollo.openapi.dto.OpenReleaseDTO; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; @@ -68,13 +67,15 @@ ApolloOpenApiClient newClient() { void createApp(String appId, String ownerName, boolean assignAppRoleToSelf, String ... admins) { { + OpenAppDTO app = new OpenAppDTO(); + app.setName("openapi create app 测试名字 " + appId); + app.setAppId(appId); + app.setOwnerName(ownerName); + app.setOwnerEmail(ownerName + "@apollo.apollo"); + app.setOrgId("orgIdFromOpenapi"); + app.setOrgName("orgNameFromOpenapi"); OpenCreateAppDTO req = new OpenCreateAppDTO(); - req.setName("openapi create app 测试名字 " + appId); - req.setAppId(appId); - req.setOwnerName(ownerName); - req.setOwnerEmail(ownerName + "@apollo.apollo"); - req.setOrgId("orgIdFromOpenapi"); - req.setOrgName("orgNameFromOpenapi"); + req.setApp(app); req.setAdmins(new HashSet<>(Arrays.asList(admins))); req.setAssignAppRoleToSelf(assignAppRoleToSelf); log.info("create app {}, ownerName {} assignAppRoleToSelf {}", appId, ownerName, assignAppRoleToSelf); diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java index 9aa0d54b..428b377e 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/service/AppOpenApiServiceTest.java @@ -74,24 +74,37 @@ public void testGetEnvClusterInfoWithError() throws Exception { appOpenApiService.getEnvClusterInfo(someAppId); } + @Test(expected = RuntimeException.class) + public void testCreateAppNullApp() throws Exception { + OpenCreateAppDTO req = new OpenCreateAppDTO(); + appOpenApiService.createApp(req); + } + @Test(expected = RuntimeException.class) public void testCreateAppEmptyAppId() throws Exception { OpenCreateAppDTO req = new OpenCreateAppDTO(); + req.setApp(new OpenAppDTO()); appOpenApiService.createApp(req); } @Test(expected = RuntimeException.class) public void testCreateAppEmptyAppName() throws Exception { + OpenAppDTO app = new OpenAppDTO(); + app.setAppId("appId1"); + OpenCreateAppDTO req = new OpenCreateAppDTO(); - req.setAppId("appId1"); + req.setApp(app); appOpenApiService.createApp(req); } @Test(expected = RuntimeException.class) public void testCreateAppFail() throws Exception { + OpenAppDTO app = new OpenAppDTO(); + app.setAppId("appId1"); + app.setName("name1"); + OpenCreateAppDTO req = new OpenCreateAppDTO(); - req.setAppId("appId1"); - req.setName("name1"); + req.setApp(app); req.setAdmins(new HashSet<>(Arrays.asList("user1", "user2"))); when(statusLine.getStatusCode()).thenReturn(400); @@ -102,9 +115,12 @@ public void testCreateAppFail() throws Exception { @Test public void testCreateAppSuccess() throws Exception { + OpenAppDTO app = new OpenAppDTO(); + app.setAppId("appId1"); + app.setName("name1"); + OpenCreateAppDTO req = new OpenCreateAppDTO(); - req.setAppId("appId1"); - req.setName("name1"); + req.setApp(app); req.setAdmins(new HashSet<>(Arrays.asList("user1", "user2"))); when(statusLine.getStatusCode()).thenReturn(200); From 26e16991f14669d3f0bdf5d3643a7640aafc8b34 Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Tue, 29 Aug 2023 22:58:57 +0800 Subject: [PATCH 14/15] Update OpenCreateAppDTO.java --- .../apollo/openapi/dto/OpenCreateAppDTO.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java index 931084c4..5b09a711 100644 --- a/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java +++ b/apollo-openapi/src/main/java/com/ctrip/framework/apollo/openapi/dto/OpenCreateAppDTO.java @@ -20,6 +20,12 @@ public class OpenCreateAppDTO { + /** + * when {@code assignAppRoleToSelf} is true, + * you can do anything with the app by current token! + */ + private boolean assignAppRoleToSelf; + /** * The application owner has project administrator permission by default. *

@@ -27,22 +33,8 @@ public class OpenCreateAppDTO { */ private Set admins; - /** - * when {@code assignAppRoleToSelf} is true, - * you can do anything with the app by current token! - */ - private boolean assignAppRoleToSelf; - private OpenAppDTO app; - public Set getAdmins() { - return admins; - } - - public void setAdmins(Set admins) { - this.admins = admins; - } - public boolean isAssignAppRoleToSelf() { return assignAppRoleToSelf; } @@ -51,6 +43,14 @@ public void setAssignAppRoleToSelf(boolean assignAppRoleToSelf) { this.assignAppRoleToSelf = assignAppRoleToSelf; } + public Set getAdmins() { + return admins; + } + + public void setAdmins(Set admins) { + this.admins = admins; + } + public OpenAppDTO getApp() { return app; } From 0999d8129d7b82089e97caeb86b54866238a662e Mon Sep 17 00:00:00 2001 From: wxq <15523186+Anilople@users.noreply.github.com> Date: Tue, 29 Aug 2023 23:05:15 +0800 Subject: [PATCH 15/15] test: make test more complex. create the cluster too --- .../client/ApolloOpenApiClientIntegrationTest.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java index 6af95301..9d931ba2 100644 --- a/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java +++ b/apollo-openapi/src/test/java/com/ctrip/framework/apollo/openapi/client/ApolloOpenApiClientIntegrationTest.java @@ -22,6 +22,7 @@ import com.ctrip.framework.apollo.openapi.dto.NamespaceReleaseDTO; import com.ctrip.framework.apollo.openapi.dto.OpenAppDTO; import com.ctrip.framework.apollo.openapi.dto.OpenAppNamespaceDTO; +import com.ctrip.framework.apollo.openapi.dto.OpenClusterDTO; import com.ctrip.framework.apollo.openapi.dto.OpenCreateAppDTO; import com.ctrip.framework.apollo.openapi.dto.OpenItemDTO; import com.ctrip.framework.apollo.openapi.dto.OpenNamespaceDTO; @@ -134,7 +135,7 @@ public void testCreateAppButHaveNoAppRole() { @Test @Disabled("only for integration test") - public void testCreateAppThenCreateNamespaceThenRelease() { + public void testCreateAppThenCreateClusterCreateNamespaceThenRelease() { // create app final String appIdSuffix = LocalDateTime.now().format( DateTimeFormatter.ofPattern("yyyyMMdd-HH-mm-ss") @@ -152,6 +153,17 @@ public void testCreateAppThenCreateNamespaceThenRelease() { assertEquals(ownerName, openAppDTO.getOwnerName()); } + // create cluster + final String clusterName = "cluster-openapi"; + { + OpenClusterDTO dto = new OpenClusterDTO(); + dto.setAppId(appId); + dto.setName(clusterName); + dto.setDataChangeCreatedBy(ownerName); + log.info("create cluster {}", clusterName); + client.createCluster(env, dto); + } + // create namespace final String namespaceName = "openapi-create-namespace"; {