diff --git a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/pom.xml b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/pom.xml index cf10add5ab..847fc9f2f1 100644 --- a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/pom.xml +++ b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/pom.xml @@ -36,5 +36,17 @@ dolphinscheduler-api-test-core ${project.version} + + org.apache.dolphinscheduler + dolphinscheduler-dao + dev-SNAPSHOT + test + + + org.apache.dolphinscheduler + dolphinscheduler-api + dev-SNAPSHOT + test + diff --git a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases/TenantAPITest.java b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases/TenantAPITest.java index 5cf9435012..76dbd21cdc 100644 --- a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases/TenantAPITest.java +++ b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases/TenantAPITest.java @@ -54,12 +54,12 @@ public class TenantAPITest { LoginPage loginPage = new LoginPage(); HttpResponse loginHttpResponse = loginPage.login(user, password); - sessionId = JSONUtils.convertValue(loginHttpResponse.body().data(), LoginResponseData.class).sessionId(); + sessionId = JSONUtils.convertValue(loginHttpResponse.getBody().getData(), LoginResponseData.class).getSessionId(); } @AfterAll public static void cleanup() { - LOGGER.info("success cleanup"); + log.info("success cleanup"); } @Test @@ -69,7 +69,7 @@ public class TenantAPITest { HttpResponse createTenantHttpResponse = tenantPage.createTenant(sessionId, tenant, 1, ""); - Assertions.assertTrue(createTenantHttpResponse.body().success()); + Assertions.assertTrue(createTenantHttpResponse.getBody().getSuccess()); } @Test @@ -79,7 +79,7 @@ public class TenantAPITest { HttpResponse createTenantHttpResponse = tenantPage.createTenant(sessionId, tenant, 1, ""); - Assertions.assertFalse(createTenantHttpResponse.body().success()); + Assertions.assertFalse(createTenantHttpResponse.getBody().getSuccess()); } @Test @@ -90,15 +90,15 @@ public class TenantAPITest { HttpResponse createTenantHttpResponse = tenantPage.getTenantListPaging(sessionId, 1, 10, ""); boolean result = false; - for (TenantListPagingResponseTotalList tenantListPagingResponseTotalList : JSONUtils.convertValue(createTenantHttpResponse.body().data(), TenantListPagingResponseData.class).totalList()) { - if (tenantListPagingResponseTotalList.tenantCode().equals(tenant)) { + for (TenantListPagingResponseTotalList tenantListPagingResponseTotalList : JSONUtils.convertValue(createTenantHttpResponse.getBody().getData(), TenantListPagingResponseData.class).getTotalList()) { + if (tenantListPagingResponseTotalList.getTenantCode().equals(tenant)) { result = true; - existTenantId = tenantListPagingResponseTotalList.id(); + existTenantId = tenantListPagingResponseTotalList.getId(); break; } } - Assertions.assertTrue(createTenantHttpResponse.body().success()); + Assertions.assertTrue(createTenantHttpResponse.getBody().getSuccess()); Assertions.assertTrue(result); } @@ -109,6 +109,6 @@ public class TenantAPITest { HttpResponse deleteTenantHttpResponse = tenantPage.deleteTenant(sessionId, existTenantId); - Assertions.assertTrue(deleteTenantHttpResponse.body().success()); + Assertions.assertTrue(deleteTenantHttpResponse.getBody().getSuccess()); } } diff --git a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases/WorkerGroupAPITest.java b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases/WorkerGroupAPITest.java new file mode 100644 index 0000000000..903b6f4ee6 --- /dev/null +++ b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/cases/WorkerGroupAPITest.java @@ -0,0 +1,132 @@ +/* + * Licensed to Apache Software Foundation (ASF) under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Apache Software Foundation (ASF) licenses this file to you 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 org.apache.dolphinscheduler.api.test.cases; + +import org.apache.dolphinscheduler.api.test.core.DolphinScheduler; +import org.apache.dolphinscheduler.api.test.entity.HttpResponse; +import org.apache.dolphinscheduler.api.test.entity.LoginResponseData; +import org.apache.dolphinscheduler.api.test.pages.LoginPage;; +import org.apache.dolphinscheduler.api.test.pages.security.WorkerGroupPage; +import org.apache.dolphinscheduler.api.test.utils.JSONUtils; +import org.apache.dolphinscheduler.common.enums.UserType; +import org.apache.dolphinscheduler.dao.entity.User; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; + +import lombok.extern.slf4j.Slf4j; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.fasterxml.jackson.databind.ObjectMapper; + +@DolphinScheduler(composeFiles = "docker/basic/docker-compose.yaml") +@Slf4j +public class WorkerGroupAPITest { + + private static final String username = "admin"; + + private static final String password = "dolphinscheduler123"; + + private static String sessionId; + + private static User loginUser; + + private static WorkerGroupPage workerGroupPage; + + @BeforeAll + public static void setup() { + LoginPage loginPage = new LoginPage(); + HttpResponse loginHttpResponse = loginPage.login(username, password); + sessionId = JSONUtils.convertValue(loginHttpResponse.getBody().getData(), LoginResponseData.class).getSessionId(); + workerGroupPage = new WorkerGroupPage(sessionId); + loginUser = new User(); + loginUser.setId(123); + loginUser.setUserType(UserType.GENERAL_USER); + } + + @AfterAll + public static void cleanup() { + log.info("success cleanup"); + } + + @Test + @Order(1) + public void testSaveWorkerGroup() { + HttpResponse saveWorkerGroupHttpResponse = workerGroupPage + .saveWorkerGroup(loginUser, 1, "test_worker_group", "10.5.0.5:1234", "test", null); + Assertions.assertTrue(saveWorkerGroupHttpResponse.getBody().getSuccess()); + + HttpResponse queryAllWorkerGroupsResponse = workerGroupPage.queryAllWorkerGroups(loginUser); + List workerGroupsList = (List) queryAllWorkerGroupsResponse.getBody().getData(); + Set workerGroupsActual = new HashSet<>(workerGroupsList); + Set workerGroupsExpected = new HashSet<>(Arrays.asList("test_worker_group", "default")); + Assertions.assertEquals(workerGroupsExpected, workerGroupsActual); + } + + @Test + @Order(2) + public void testQueryAllWorkerGroupsPaging() { + HttpResponse queryAllWorkerGroupsPagingResponse = workerGroupPage.queryAllWorkerGroupsPaging(loginUser, 1, 2, null); + Assertions.assertTrue(queryAllWorkerGroupsPagingResponse.getBody().getSuccess()); + String workerGroupPageInfoData = queryAllWorkerGroupsPagingResponse.getBody().getData().toString(); + Assertions.assertTrue(workerGroupPageInfoData.contains("test_worker_group")); + } + + @Test + @Order(3) + public void testQueryAllWorkerGroups() { + HttpResponse queryAllWorkerGroupsResponse = workerGroupPage.queryAllWorkerGroups(loginUser); + Assertions.assertTrue(queryAllWorkerGroupsResponse.getBody().getSuccess()); + + String workerGroupPageInfoData = queryAllWorkerGroupsResponse.getBody().getData().toString(); + Assertions.assertTrue(workerGroupPageInfoData.contains("test_worker_group")); + } + + @Test + @Order(4) + public void queryWorkerAddressList() { + HttpResponse queryWorkerAddressListResponse = workerGroupPage.queryWorkerAddressList(loginUser); + Assertions.assertTrue(queryWorkerAddressListResponse.getBody().getSuccess()); + Assertions.assertTrue(queryWorkerAddressListResponse.getBody().getData().toString().contains("10.5.0.5:1234")); + } + + @Test + @Order(5) + public void testDeleteWorkerGroupById() { + HttpResponse queryAllWorkerGroupsResponse = workerGroupPage.queryAllWorkerGroups(loginUser); + String workerGroupsBeforeDelete = queryAllWorkerGroupsResponse.getBody().getData().toString(); + Assertions.assertTrue(queryAllWorkerGroupsResponse.getBody().getSuccess()); + Assertions.assertTrue(workerGroupsBeforeDelete.contains("test_worker_group")); + + HttpResponse deleteWorkerGroupResponse = workerGroupPage.deleteWorkerGroupById(loginUser, 1); + Assertions.assertTrue(deleteWorkerGroupResponse.getBody().getSuccess()); + + queryAllWorkerGroupsResponse = workerGroupPage.queryAllWorkerGroups(loginUser); + String workerGroupsAfterDelete = queryAllWorkerGroupsResponse.getBody().getData().toString(); + Assertions.assertTrue(!workerGroupsAfterDelete.contains("test_worker_group")); + } +} diff --git a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/pages/security/WorkerGroupPage.java b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/pages/security/WorkerGroupPage.java new file mode 100644 index 0000000000..9d6185fd9a --- /dev/null +++ b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/pages/security/WorkerGroupPage.java @@ -0,0 +1,100 @@ +/* + * Licensed to Apache Software Foundation (ASF) under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Apache Software Foundation (ASF) licenses this file to you 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 org.apache.dolphinscheduler.api.test.pages.security; + +import lombok.AllArgsConstructor; + +import org.apache.dolphinscheduler.api.test.core.Constants; +import org.apache.dolphinscheduler.api.test.entity.HttpResponse; +import org.apache.dolphinscheduler.api.test.utils.RequestClient; +import org.apache.dolphinscheduler.dao.entity.User; + +import java.util.HashMap; +import java.util.Map; + + +@AllArgsConstructor +public class WorkerGroupPage { + + private String sessionId; + + public HttpResponse saveWorkerGroup(User loginUser, int id, String name, String addrList, String description, String otherParamsJson) { + Map params = new HashMap<>(); + params.put("loginUser", loginUser); + params.put("id", id); + params.put("name", name); + params.put("addrList", addrList); + params.put("description", description); + params.put("otherParamsJson", otherParamsJson); + + Map headers = new HashMap<>(); + headers.put(Constants.SESSION_ID_KEY, sessionId); + + RequestClient requestClient = new RequestClient(); + + return requestClient.post("/worker-groups", headers, params); + } + + public HttpResponse queryAllWorkerGroups(User loginUser) { + Map params = new HashMap<>(); + params.put("loginUser", loginUser); + Map headers = new HashMap<>(); + headers.put(Constants.SESSION_ID_KEY, sessionId); + + RequestClient requestClient = new RequestClient(); + return requestClient.get("/worker-groups/all", headers, params); + } + + public HttpResponse queryAllWorkerGroupsPaging(User loginUser, Integer pageNo, Integer pageSize, String searchVal) { + Map params = new HashMap<>(); + params.put("loginUser", loginUser); + params.put("pageNo", pageNo); + params.put("pageSize", pageSize); + params.put("searchVal", searchVal); + Map headers = new HashMap<>(); + headers.put(Constants.SESSION_ID_KEY, sessionId); + + RequestClient requestClient = new RequestClient(); + return requestClient.get("/worker-groups", headers, params); + } + + public HttpResponse deleteWorkerGroupById(User loginUser, Integer id) { + Map params = new HashMap<>(); + params.put("loginUser", loginUser); + params.put("id", id); + Map headers = new HashMap<>(); + headers.put(Constants.SESSION_ID_KEY, sessionId); + RequestClient requestClient = new RequestClient(); + final String url = String.format("/worker-groups/%s", id); + return requestClient.delete(url, headers, params); + } + + public HttpResponse queryWorkerAddressList(User loginUser) { + Map params = new HashMap<>(); + params.put("loginUser", loginUser); + Map headers = new HashMap<>(); + headers.put(Constants.SESSION_ID_KEY, sessionId); + + RequestClient requestClient = new RequestClient(); + return requestClient.get("/worker-groups/worker-address-list", headers, params); + } + + +} diff --git a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/utils/RequestClient.java b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/utils/RequestClient.java index 12c23c7b0a..faaab102ae 100644 --- a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/utils/RequestClient.java +++ b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/java/org/apache/dolphinscheduler/api.test/utils/RequestClient.java @@ -56,7 +56,7 @@ public class RequestClient { headersBuilder = Headers.of(headers); } - LOGGER.info("GET request to {}, Headers: {}", requestUrl, headersBuilder); + log.info("GET request to {}, Headers: {}", requestUrl, headersBuilder); Request request = new Request.Builder() .url(requestUrl) .headers(headersBuilder) @@ -74,7 +74,7 @@ public class RequestClient { HttpResponse httpResponse = new HttpResponse(responseCode, responseData); - LOGGER.info("GET response: {}", httpResponse); + log.info("GET response: {}", httpResponse); return httpResponse; } @@ -111,7 +111,7 @@ public class RequestClient { RequestBody requestBody = FormBody.create(MediaType.parse(Constants.REQUEST_CONTENT_TYPE), getParams(params)); - LOGGER.info("POST request to {}, Headers: {}, Params: {}", requestUrl, headersBuilder, params); + log.info("POST request to {}, Headers: {}, Params: {}", requestUrl, headersBuilder, params); Request request = new Request.Builder() .headers(headersBuilder) .url(requestUrl) @@ -129,7 +129,7 @@ public class RequestClient { HttpResponse httpResponse = new HttpResponse(responseCode, responseData); - LOGGER.info("POST response: {}", httpResponse); + log.info("POST response: {}", httpResponse); return httpResponse; } @@ -146,7 +146,7 @@ public class RequestClient { Headers headersBuilder = Headers.of(headers); - LOGGER.info("DELETE request to {}, Headers: {}, Params: {}", requestUrl, headersBuilder, params); + log.info("DELETE request to {}, Headers: {}, Params: {}", requestUrl, headersBuilder, params); Request request = new Request.Builder() .headers(headersBuilder) .url(requestUrl) @@ -164,7 +164,7 @@ public class RequestClient { HttpResponse httpResponse = new HttpResponse(responseCode, responseData); - LOGGER.info("DELETE response: {}", httpResponse); + log.info("DELETE response: {}", httpResponse); return httpResponse; } diff --git a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/basic/docker-compose.yaml b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/basic/docker-compose.yaml index 26e7ebda25..f1a1cf1fbb 100644 --- a/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/basic/docker-compose.yaml +++ b/dolphinscheduler-api-test/dolphinscheduler-api-test-case/src/test/resources/docker/basic/docker-compose.yaml @@ -26,7 +26,8 @@ services: ports: - "12345:12345" networks: - - api-test + network: + ipv4_address: 10.5.0.5 healthcheck: test: [ "CMD", "curl", "http://localhost:12345/actuator/health" ] interval: 5s @@ -34,4 +35,9 @@ services: retries: 120 networks: - api-test: + network: + driver: bridge + ipam: + config: + - subnet: 10.5.0.0/16 + gateway: 10.5.0.1 diff --git a/dolphinscheduler-api-test/dolphinscheduler-api-test-core/src/main/java/org/apache/dolphinscheduler/api/test/core/DolphinSchedulerExtension.java b/dolphinscheduler-api-test/dolphinscheduler-api-test-core/src/main/java/org/apache/dolphinscheduler/api/test/core/DolphinSchedulerExtension.java index cc202e9baf..9a6d029cb9 100644 --- a/dolphinscheduler-api-test/dolphinscheduler-api-test-core/src/main/java/org/apache/dolphinscheduler/api/test/core/DolphinSchedulerExtension.java +++ b/dolphinscheduler-api-test/dolphinscheduler-api-test-core/src/main/java/org/apache/dolphinscheduler/api/test/core/DolphinSchedulerExtension.java @@ -71,7 +71,7 @@ final class DolphinSchedulerExtension implements BeforeAllCallback, AfterAllCall compose = new DockerComposeContainer<>(files) .withPull(true) .withTailChildContainers(true) - .withLogConsumer(serviceName, outputFrame -> LOGGER.info(outputFrame.getUtf8String())) + .withLogConsumer(serviceName, outputFrame -> log.info(outputFrame.getUtf8String())) .waitingFor(serviceName, Wait.forHealthcheck().withStartupTimeout(Duration.ofSeconds(Constants.DOCKER_COMPOSE_DEFAULT_TIMEOUT))); return compose; diff --git a/dolphinscheduler-api-test/lombok.config b/dolphinscheduler-api-test/lombok.config deleted file mode 100644 index 15f8d6f2ae..0000000000 --- a/dolphinscheduler-api-test/lombok.config +++ /dev/null @@ -1,21 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You 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. -# - -lombok.accessors.fluent=true -lombok.log.fieldname=LOGGER -lombok.accessors.fluent=true -lombok.anyConstructor.addConstructorProperties=true \ No newline at end of file