You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by of...@apache.org on 2020/01/02 14:09:56 UTC
[incubator-dlab] branch feature-integration-tests updated:
[DLAB-1419] Implemented project features
This is an automated email from the ASF dual-hosted git repository.
ofuks pushed a commit to branch feature-integration-tests
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git
The following commit(s) were added to refs/heads/feature-integration-tests by this push:
new 80ccfa2 [DLAB-1419] Implemented project features
80ccfa2 is described below
commit 80ccfa20018e415ac284fc98ba8f7e9867cda821
Author: Oleh Fuks <ol...@gmail.com>
AuthorDate: Thu Jan 2 16:09:35 2020 +0200
[DLAB-1419] Implemented project features
---
.../java/org/apache/dlab/dto/CreateProjectDTO.java | 6 +-
.../main/java/org/apache/dlab/dto/ProjectDTO.java | 16 +++
...CreateProjectDTO.java => UpdateProjectDTO.java} | 10 +-
.../java/org/apache/dlab/util/PropertyHelper.java | 5 +-
.../src/test/java/dlab/project/ProjectSteps.java | 151 ++++++++++++++++++---
.../src/test/resources/dlab/project.feature | 143 +++++++------------
6 files changed, 203 insertions(+), 128 deletions(-)
diff --git a/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/CreateProjectDTO.java b/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/CreateProjectDTO.java
index 9d22144..2f38d08 100644
--- a/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/CreateProjectDTO.java
+++ b/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/CreateProjectDTO.java
@@ -1,19 +1,19 @@
package org.apache.dlab.dto;
+import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
-import lombok.NoArgsConstructor;
import java.util.Set;
@Data
@AllArgsConstructor
-@NoArgsConstructor
public class CreateProjectDTO {
private String name;
private Set<String> groups;
private Set<String> endpoints;
private String key;
private String tag;
+ @JsonProperty("shared_image_enabled")
+ private boolean sharedImageEnabled;
}
-
diff --git a/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/ProjectDTO.java b/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/ProjectDTO.java
new file mode 100644
index 0000000..18dd0b9
--- /dev/null
+++ b/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/ProjectDTO.java
@@ -0,0 +1,16 @@
+package org.apache.dlab.dto;
+
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.Data;
+
+import java.util.Set;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class ProjectDTO {
+ private String name;
+ private Set<String> groups;
+ private Set<EndpointStatusDTO> endpoints;
+ private boolean sharedImageEnabled;
+}
diff --git a/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/CreateProjectDTO.java b/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/UpdateProjectDTO.java
similarity index 57%
copy from integration-tests-cucumber/src/main/java/org/apache/dlab/dto/CreateProjectDTO.java
copy to integration-tests-cucumber/src/main/java/org/apache/dlab/dto/UpdateProjectDTO.java
index 9d22144..cbe7cff 100644
--- a/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/CreateProjectDTO.java
+++ b/integration-tests-cucumber/src/main/java/org/apache/dlab/dto/UpdateProjectDTO.java
@@ -1,19 +1,17 @@
package org.apache.dlab.dto;
+import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
-import lombok.NoArgsConstructor;
import java.util.Set;
@Data
@AllArgsConstructor
-@NoArgsConstructor
-public class CreateProjectDTO {
+public class UpdateProjectDTO {
private String name;
private Set<String> groups;
private Set<String> endpoints;
- private String key;
- private String tag;
+ @JsonProperty("shared_image_enabled")
+ private boolean sharedImageEnabled;
}
-
diff --git a/integration-tests-cucumber/src/main/java/org/apache/dlab/util/PropertyHelper.java b/integration-tests-cucumber/src/main/java/org/apache/dlab/util/PropertyHelper.java
index 6b4a60a..d575ff0 100644
--- a/integration-tests-cucumber/src/main/java/org/apache/dlab/util/PropertyHelper.java
+++ b/integration-tests-cucumber/src/main/java/org/apache/dlab/util/PropertyHelper.java
@@ -1,10 +1,12 @@
package org.apache.dlab.util;
+import lombok.extern.slf4j.Slf4j;
+
import java.io.FileInputStream;
import java.io.InputStream;
-import java.util.Optional;
import java.util.Properties;
+@Slf4j
public class PropertyHelper {
private final static Properties PROPERTIES;
@@ -14,6 +16,7 @@ public class PropertyHelper {
try (InputStream inputStream = new FileInputStream(System.getProperty("config.file"))) {
PROPERTIES.load(inputStream);
+ log.info("Configs: {}", PROPERTIES);
} catch (Exception e) {
e.printStackTrace();
}
diff --git a/integration-tests-cucumber/src/test/java/dlab/project/ProjectSteps.java b/integration-tests-cucumber/src/test/java/dlab/project/ProjectSteps.java
index f24c4da..2caefb7 100644
--- a/integration-tests-cucumber/src/test/java/dlab/project/ProjectSteps.java
+++ b/integration-tests-cucumber/src/test/java/dlab/project/ProjectSteps.java
@@ -13,36 +13,51 @@ import dlab.util.KeycloakUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.dlab.dto.CreateProjectDTO;
import org.apache.dlab.dto.EndpointStatusDTO;
+import org.apache.dlab.dto.ProjectDTO;
import org.apache.dlab.dto.ProjectKeyDTO;
import org.apache.dlab.dto.ProjectStatusDTO;
+import org.apache.dlab.dto.UpdateProjectDTO;
import org.apache.dlab.util.JacksonMapper;
import org.apache.http.HttpStatus;
import java.net.URI;
import java.net.URISyntaxException;
import java.time.LocalDateTime;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
import static com.jayway.restassured.RestAssured.given;
-import static dlab.Constants.*;
+import static dlab.Constants.API_URI;
+import static dlab.Constants.CONNECTION_TIMEOUT;
+import static dlab.Constants.CONNECTION_TIMEOUT_LABEL;
+import static dlab.Constants.LOCAL_ENDPOINT;
+import static dlab.Constants.SOCKET_TIMEOUT;
+import static dlab.Constants.SOCKET_TIMEOUT_LABEL;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
@Slf4j
public class ProjectSteps {
- private RequestSpecification createProjectRequest;
+ private RequestSpecification request;
private Response response;
private String projectName;
private String publicKey;
private Set<String> endpoints;
private Set<String> groups;
+ private Set<String> projects;
+ private boolean sharedImageEnabled;
+ private ProjectDTO project;
@Given("There is no project with name {string} in DLab")
@@ -53,6 +68,19 @@ public class ProjectSteps {
.statusCode(HttpStatus.SC_NOT_FOUND);
}
+ @Given("There are the following projects")
+ public void thereAreTheFollowingProjects(List<String> projects) {
+ this.projects = new HashSet<>(projects);
+ }
+
+ @Given("There is a project with name {string} in DLab")
+ public void thereIsAProjectWithNameInDLab(String projectName) {
+ this.projectName = projectName;
+ this.project = authenticatedRequest()
+ .get(API_URI + "project/{project}", projectName)
+ .as(ProjectDTO.class);
+ }
+
@And("There are the following endpoints")
public void thereAreTheFollowingEndpoints(List<String> endpoints) {
this.endpoints = new HashSet<>(endpoints);
@@ -63,40 +91,122 @@ public class ProjectSteps {
this.groups = new HashSet<>(groups);
}
- @And("User generate new publicKey")
- public void userTryToGenerateNewPublicKey() {
- this.publicKey = authenticatedRequest().contentType(ContentType.JSON)
+ @And("User generates new publicKey")
+ public void userGeneratesNewPublicKey() {
+ this.publicKey = authenticatedRequest()
+ .contentType(ContentType.JSON)
.post(API_URI + "project/keys")
.getBody().as(ProjectKeyDTO.class)
.getPublicKey();
}
- @When("User send create new project request")
- public void userSendCreateNewProjectRequest() {
- response = createProjectRequest.post(API_URI + "project");
+ @And("User tries to create new project with name {string}, endpoints, groups, publicKey and use shared image enable {string}")
+ public void userTriesToCreateNewProjectWithNameEndpointsGroupsAndKey(String projectName, String sharedImageEnabled) {
+ this.projectName = projectName;
+ boolean sharedImage = Boolean.parseBoolean(sharedImageEnabled);
+ request = authenticatedRequest()
+ .body(JacksonMapper.marshall(new CreateProjectDTO(projectName, groups, endpoints, publicKey, projectName, sharedImage)))
+ .contentType(ContentType.JSON);
}
- @And("User try to create new project with name {string}, endpoints, groups and publicKey")
- public void userTryToCreateNewProjectWithNameEndpointsGroupsAndKey(String projectName) {
+ @And("User tries to get information about project with name {string}")
+ public void userTriesToGetInformationAboutProjectWithName(String projectName) {
this.projectName = projectName;
- createProjectRequest = given()
- .body(JacksonMapper.marshall(new CreateProjectDTO(projectName, groups, endpoints, publicKey, projectName)))
- .auth()
- .oauth2(KeycloakUtil.getToken())
+ request = authenticatedRequest();
+ }
+
+ @And("Use shared image enable {string}")
+ public void useSharedImageEnable(String sharedImageEnabled) {
+ this.sharedImageEnabled = Boolean.parseBoolean(sharedImageEnabled);
+ }
+
+ @And("User tries to edit project with shared image enable opposite to existing")
+ public void userTriesToEditProjectWithSharedImageEnableOppositeToExisting() {
+ sharedImageEnabled = !project.isSharedImageEnabled();
+ UpdateProjectDTO updateProjectDTO = new UpdateProjectDTO(project.getName(), project.getGroups(),
+ project.getEndpoints().stream().map(EndpointStatusDTO::getName).collect(Collectors.toSet()), sharedImageEnabled);
+
+ request = authenticatedRequest()
+ .body(JacksonMapper.marshall(updateProjectDTO))
.contentType(ContentType.JSON);
}
+ @And("User tries to terminate the project with name {string}")
+ public void userTriesToTerminateTheProjectWithName(String projectName) {
+ this.projectName = projectName;
+ request = authenticatedRequest()
+ .contentType(ContentType.JSON);
+ }
+
+ @When("User sends create new project request")
+ public void userSendsCreateNewProjectRequest() {
+ response = request.post(API_URI + "project");
+ }
+
+ @When("User sends request to get information about project")
+ public void userSendsRequestToGetInformationAboutProject() {
+ response = request.get(API_URI + "project/{project}", projectName);
+ }
+
+ @When("User sends edit request")
+ public void userSendsEditRequest() {
+ response = request.put(API_URI + "project");
+ }
+
+ @When("User sends termination request")
+ public void userSendsTerminationRequest() {
+ response = request.delete(API_URI + "project/{project}", projectName);
+ }
+
@Then("Status code is {int}")
public void statusCodeIs(int code) {
assertThat(response.getStatusCode(), equalTo(code));
}
- @Then("User wait maximum {int} minutes while project is creating")
+ @Then("User waits maximum {int} minutes while project is creating")
public void userWaitMaximumMinutesWhileProjectIsCreating(int timeout) throws URISyntaxException, InterruptedException {
- boolean isRunning = false;
+ boolean isRunning = waitForStatus(timeout, EndpointStatusDTO.Status.RUNNING);
+
+ assertTrue("Timeout for project status check reached!", isRunning);
+ log.info("Project {} successfully created", projectName);
+ }
+
+ @Then("User waits maximum {int} minutes while project is terminated")
+ public void userWaitsMaximumTimeoutMinutesWhileProjectIsTerminated(int timeout) throws URISyntaxException, InterruptedException {
+ boolean isTerminated = waitForStatus(timeout, EndpointStatusDTO.Status.TERMINATED);
+
+ assertTrue("Timeout for project status check reached!", isTerminated);
+ log.info("Project {} successfully terminated", projectName);
+ }
+
+ @And("Project information is successfully returned with name {string}, endpoints, groups")
+ public void projectInformationIsSuccessfullyReturnedWithNameEndpointsGroups(String expectedProjectName) {
+ ProjectDTO project = response.getBody().as(ProjectDTO.class);
+ Set<String> endpoints = project.getEndpoints().stream().map(EndpointStatusDTO::getName).collect(Collectors.toSet());
+ Set<String> groups = project.getGroups();
+
+ assertEquals(project.getName(), expectedProjectName);
+ assertFalse(Collections.disjoint(endpoints, this.endpoints));
+ assertFalse(Collections.disjoint(groups, this.groups));
+ }
+
+ @And("Project information is successfully updated with shared image enable")
+ public void projectInformationIsSuccessfullyUpdatedWithSharedImageEnable() {
+ boolean sharedImageEnabled = authenticatedRequest()
+ .get(API_URI + "project/{project}", projectName)
+ .as(ProjectDTO.class)
+ .isSharedImageEnabled();
+
+ assertSame(this.sharedImageEnabled, sharedImageEnabled);
+ log.info("Project {} successfully edited", projectName);
+ }
+
+ private boolean waitForStatus(int timeout, EndpointStatusDTO.Status status) throws URISyntaxException, InterruptedException {
+ boolean correctStatus = false;
LocalDateTime withTimeout = LocalDateTime.now().plusMinutes(timeout);
- log.info("User wait till {}", withTimeout);
- while (!isRunning && LocalDateTime.now().isBefore(withTimeout)) {
+ log.info("User wait till {} for project {} to be {}", withTimeout, projectName, status);
+
+ while (!correctStatus && LocalDateTime.now().isBefore(withTimeout)) {
ProjectStatusDTO projectDTO = authenticatedRequest()
.get(new URI(API_URI + "project/" + projectName))
.getBody().as(ProjectStatusDTO.class);
@@ -111,12 +221,11 @@ public class ProjectSteps {
assertTrue("local endpoint does not exist!", localEndpoint.isPresent());
assertNotSame("Endpoint with status FAILED", EndpointStatusDTO.Status.FAILED, localEndpoint.get().getStatus());
- isRunning = EndpointStatusDTO.Status.RUNNING == localEndpoint.get().getStatus();
+ correctStatus = status == localEndpoint.get().getStatus();
TimeUnit.MINUTES.sleep(1);
}
- assertTrue("Timeout for project status check reached!", isRunning);
- log.info("Project {} successfully created", projectName);
+ return correctStatus;
}
private RequestSpecification authenticatedRequest() {
diff --git a/integration-tests-cucumber/src/test/resources/dlab/project.feature b/integration-tests-cucumber/src/test/resources/dlab/project.feature
index 6828b91..5aa0051 100644
--- a/integration-tests-cucumber/src/test/resources/dlab/project.feature
+++ b/integration-tests-cucumber/src/test/resources/dlab/project.feature
@@ -1,3 +1,4 @@
+@project
Feature: Project management in DLab
Such feature allowed to manage projects inside DLab
@@ -9,8 +10,8 @@ Feature: Project management in DLab
And There are the following groups
| $anyuser |
And User generates new publicKey
- When User tries to create new project with name "<name>", endpoints, groups, publicKey and use shared image enable "<true>"
- And User sends create new project request
+ And User tries to create new project with name "<name>", endpoints, groups, publicKey and use shared image enable "true"
+ When User sends create new project request
Then User waits maximum <timeout> minutes while project is creating
Then Status code is 200
Examples:
@@ -27,15 +28,15 @@ Feature: Project management in DLab
And There are the following groups
| $anyuser |
And User generates new publicKey
- When User tries to create new project with name "<name>", endpoints, groups, publicKey and use shared image enable "<true>"
- And User sends create new project request
- Then Response status code is 409
+ And User tries to create new project with name "<name>", endpoints, groups, publicKey and use shared image enable "true"
+ When User sends create new project request
+ Then Status code is 409
Examples:
| name |
| prj1 |
- Scenario Outline: Get information about projects that exits
+ Scenario Outline: Get information about project that exits
Given There are the following projects
| prj1 |
@@ -43,100 +44,48 @@ Feature: Project management in DLab
| local |
And There are the following groups
| $anyuser |
- When User tries to get information about project with name "<name>"
- Then Response status code is 200
+ And User tries to get information about project with name "<name>"
+ When User sends request to get information about project
+ Then Status code is 200
And Project information is successfully returned with name "<name>", endpoints, groups
Examples:
- | name | endpoint | group |
- | prj1 | local | $anyuser |
+ | name |
+ | prj1 |
Scenario: Get information about a project that does not exists
- Given There is no project with name "test1"
- When User tries to get information about the project with name "test1"
- Then Respone status code is 404
-
-
-
-
- Scenario: Edit (change use shared image and add a group) a project that is available
-
- Given There are the following projects
- | prj1 |
- And There are the following endpoints
- | local |
- And There are the following groups
- | $anyuser |
- And Use shared image enable "<true>"
- When User tries to create a new group with name "admin"
- And User adds new group with name "admin"
- And User changes use shared image to "false"
- And User sends request for updating
- Then Response status code is 200
- And Project information is successfully updated with groups, use shared image
-
-
- Scenario: Edit (remove endpoint) a project that is available
-
- Given There are the following projects
- | prj1 |
- And There are the following endpoints
- | local |
- And There are the following groups
- | $anyuser |
- And Use shared image enable "<true>"
- When User tries to remove endpoint with name "local"
- And User sends request for updating
- Then Response status code is 403
-
- Scenario: Edit (add group that does not exit) a project that is available
-
- Given There are the following projects
- | prj1 |
- And There are the following endpoints
- | local |
- And There are the following groups
- | $anyuser |
- And Use shared image enable "<true>"
- And There is no group with name "global"
- When User tries to add group with name "global"
- And User sends request for updating
- Then Response status code is 400
-
- Scenario: Edit (add endpoint that does not exit) a project that is available
-
- Given There are the following projects
- | prj1 |
- And There are the following endpoints
- | local |
- And There are the following groups
- | $anyuser |
- And Use shared image enable "<true>"
- And There is no endpoint with name "exploring"
- When User tries to add endpoint with name "exploring"
- And User sends request for updating
- Then Response status code is 400
-
- Scenario Outline: Terminate a project/edge node that exits
-
- Given There are the following projects
- | prj1 |
- And There are the following endpoints
- | local |
- And There are the following groups
- | $anyuser |
- When User tries to terminate the project with name "<name>"
- And User sends request for termination
- Then User waits maximum <timeout> minutes while project is terminated
- Then Response status code is 200
- Examples:
- | name | timeout |
- | prj1 | 20 |
-
-
- Scenario: Terminate a project/edge node that does not exists
-
- Given There is no project with name "test1"
- When User tries to terminate the project with name "test1"
- Then Respone status code is 404
+ Given There is no project with name "test1" in DLab
+ And User tries to get information about project with name "test1"
+ When User sends request to get information about project
+ Then Status code is 404
+
+
+ Scenario: Edit (change use shared image) a project that is available
+
+ Given There is a project with name "prj1" in DLab
+ And User tries to edit project with shared image enable opposite to existing
+ When User sends edit request
+ Then Status code is 200
+ And Project information is successfully updated with shared image enable
+
+ @terminate
+ Scenario Outline: Terminate a project/edge node that exits
+
+ Given There is a project with name "<name>" in DLab
+ And User tries to terminate the project with name "<name>"
+ When User sends termination request
+ Then User waits maximum <timeout> minutes while project is terminated
+ Then Status code is 200
+ Examples:
+ | name | timeout |
+ | prj1 | 20 |
+
+
+ @terminate
+ Scenario: Terminate a project/edge node that does not exists
+
+ Given There is no project with name "test1" in DLab
+ And User tries to terminate the project with name "test1"
+ When User sends termination request
+ Then Status code is 404
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org