diff options
63 files changed, 2140 insertions, 248 deletions
diff --git a/workflow/README.md b/workflow/README.md index 40b4bbb2..2b6bcbce 100644 --- a/workflow/README.md +++ b/workflow/README.md @@ -2,13 +2,25 @@ ## 1. Initialize Workflow Database -`docker run -d -e CS_HOST={HOST} -e CS_PORT={PORT} -e CS_USER={USER} -e CS_PASSWORD={PASSWORD} {INIT_IMAGE}` +`docker run -d -e CS_AUTHENTICATE={CS_AUTHENTICATE} -e CS_HOST={HOST} -e CS_PORT={PORT} -e CS_USER={USER} +-e CS_PASSWORD={PASSWORD} {INIT_IMAGE}` This is done only once to initialize the DB schema. **Example** -`docker run -d -e CS_HOST=10.247.41.19 -e CS_USER=test -e CS_PASSWORD=secret -e CS_PORT=9160 onap/workflow-init:latest` +running docker with secured Cassandra DB + +`docker run -d -e CS_HOST=10.247.41.19 -e CS_AUTHENTICATE=true -e CS_USER=test -e CS_PASSWORD=secret -e CS_PORT=9160 +onap/workflow-init:latest` + +running docker with unsecured Cassandra DB + +`docker run -d -e CS_HOST=10.247.41.19 -e CS_AUTHENTICATE=false -e CS_PORT=9160 onap/workflow-init:latest` + +or + +`docker run -d -e CS_HOST=10.247.41.19 -e CS_PORT=9160 onap/workflow-init:latest` ## 2. Start Backend diff --git a/workflow/workflow-bdd/features/Version_State.feature b/workflow/workflow-bdd/features/VersionState.feature index 8c1e13fd..c869d146 100644 --- a/workflow/workflow-bdd/features/Version_State.feature +++ b/workflow/workflow-bdd/features/VersionState.feature @@ -1,3 +1,17 @@ +# Copyright © 2018 European Support Limited +# +# 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. + Feature: Workflow Version State Background: Create workflow and first version diff --git a/workflow/workflow-bdd/features/Version_Create_Update.feature b/workflow/workflow-bdd/features/Version_Create_Update.feature index 2cb05804..d2a9ec9d 100644 --- a/workflow/workflow-bdd/features/Version_Create_Update.feature +++ b/workflow/workflow-bdd/features/Version_Create_Update.feature @@ -1,28 +1,43 @@ +# Copyright © 2018 European Support Limited +# +# 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. + + Feature: Workflow Versions Background: Init Given I want to create a Workflow - Scenario: Create and get version + Scenario: Create first empty version When I want to create input data - Then I want to update the input property "description" with value "workflow version description" - Then I want to create for path "/workflows/{item.id}/versions" with the input data from the context - Then I want to copy to property "versionId" from response data path "id" - Then I want to get path "/workflows/{item.id}/versions/{versionId}" - Then I want to check that property "id" in the response equals to value of saved property "versionId" - - When I want to get path "/workflows/{item.id}/versions" - Then I want to check that element in the response list with "id" equals to value of saved property "versionId" exists + And I want to update the input property "description" with value "first empty version" + And I want to create for path "/workflows/{item.id}/versions" with the input data from the context + And I want to copy to property "item.versionId" from response data path "id" + Then I want to get path "/workflows/{item.id}/versions/{item.versionId}" + And I want to check that property "id" in the response equals to value of saved property "item.versionId" + And I want to get path "/workflows/{item.id}/versions" + And I want to check that element in the response list with "id" equals to value of saved property "item.versionId" exists Scenario: Update version - When I want to create input data - Then I want to update the input property "description" with value "workflow version description" - Then I want to create for path "/workflows/{item.id}/versions" with the input data from the context - Then I want to copy to property "versionId" from response data path "id" - - Then I want to update the input property "description" with value "workflow version description updated" - Then I want to set property "desc" to value "workflow version description updated" - Then I want to update for path "/workflows/{item.id}/versions/{versionId}" with the input data from the context - Then I want to get path "/workflows/{item.id}/versions/{versionId}" - Then I want to check that property "description" in the response equals to value of saved property "desc"
\ No newline at end of file + And I want to create input data + And I want to update the input property "description" with value "workflow version description" + And I want to create for path "/workflows/{item.id}/versions" with the input data from the context + And I want to copy to property "item.versionId" from response data path "id" + + When I want to set property "updatedDesc" to value "workflow version description updated" + And I want to update the input property "description" with value of property "updatedDesc" + And I want to update for path "/workflows/{item.id}/versions/{item.versionId}" with the input data from the context + + Then I want to get path "/workflows/{item.id}/versions/{item.versionId}" + And I want to check that property "description" in the response equals to value of saved property "updatedDesc"
\ No newline at end of file diff --git a/workflow/workflow-bdd/features/Workflow.feature b/workflow/workflow-bdd/features/Workflow.feature new file mode 100644 index 00000000..b234fdb7 --- /dev/null +++ b/workflow/workflow-bdd/features/Workflow.feature @@ -0,0 +1,25 @@ +# Copyright © 2018 European Support Limited +# +# 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. + +Feature: Workflow + + Scenario: Create valid + When I want to create a Workflow + + Scenario: Update and Get workflow + When I want to create a Workflow + Then I want to update the input property "description" with value "workflow desc updated" + Then I want to update for path "/workflows/{item.id}" with the input data from the context + Then I want to get path "/workflows/{item.id}" + Then I want to check that property "description" in the response equals to value of saved property "inputData.description" diff --git a/workflow/workflow-bdd/features/WorkflowList.feature b/workflow/workflow-bdd/features/WorkflowList.feature new file mode 100644 index 00000000..85261f5c --- /dev/null +++ b/workflow/workflow-bdd/features/WorkflowList.feature @@ -0,0 +1,79 @@ +# Copyright © 2018 European Support Limited +# +# 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. + + +Feature: List Workflows + + Background: Init - create various workflows in order to test list filter + Given I want to create a Workflow + And I want to copy to property "noVersionsWorkflowId" from response data path "id" + + Given I want to create a Workflow + And I want to copy to property "draftVersionWorkflowId" from response data path "id" + And I want to update the input property "description" with value "first version" + And I want to create for path "/workflows/{item.id}/versions" with the input data from the context + + Given I want to create a Workflow + And I want to copy to property "certifiedVersionWorkflowId" from response data path "id" + And I want to update the input property "description" with value "first version" + And I want to create for path "/workflows/{item.id}/versions" with the input data from the context + And I want to update the input property "name" with value "CERTIFIED" + And I want to create for path "/workflows/{item.id}/versions/{responseData.id}/state" with the input data from the context + + Given I want to create a Workflow + And I want to copy to property "draftAndCertifiedVersionWorkflowId" from response data path "id" + And I want to update the input property "description" with value "first version" + And I want to create for path "/workflows/{item.id}/versions" with the input data from the context + And I want to copy to property "item.versionId" from response data path "id" + And I want to update the input property "name" with value "CERTIFIED" + And I want to create for path "/workflows/{item.id}/versions/{item.versionId}/state" with the input data from the context + And I want to update the input property "description" with value "second version" + And I want to update the input property "baseVersionId" with value of property "item.versionId" + And I want to create for path "/workflows/{item.id}/versions" with the input data from the context + #And I want to print the context data + + Scenario: List all + When I want to get path "/workflows" + Then I want to check that element in the response list with "id" equals to value of saved property "noVersionsWorkflowId" exists + And I want to check that element in the response list with "id" equals to value of saved property "draftVersionWorkflowId" exists + And I want to check that element in the response list with "id" equals to value of saved property "certifiedVersionWorkflowId" exists + And I want to check that element in the response list with "id" equals to value of saved property "draftAndCertifiedVersionWorkflowId" exists + + Scenario: List ones with DRAFT version(s) + When I want to get path "/workflows?versionState=DRAFT" + Then I want to check that element in the response list with "id" equals to value of saved property "noVersionsWorkflowId" does not exist + Then I want to check that element in the response list with "id" equals to value of saved property "draftVersionWorkflowId" exists + Then I want to check that element in the response list with "id" equals to value of saved property "certifiedVersionWorkflowId" does not exist + Then I want to check that element in the response list with "id" equals to value of saved property "draftAndCertifiedVersionWorkflowId" exists + + Scenario: List ones with CERTIFIED version(s) + When I want to get path "/workflows?versionState=CERTIFIED" + Then I want to check that element in the response list with "id" equals to value of saved property "noVersionsWorkflowId" does not exist + Then I want to check that element in the response list with "id" equals to value of saved property "draftVersionWorkflowId" does not exist + Then I want to check that element in the response list with "id" equals to value of saved property "certifiedVersionWorkflowId" exists + Then I want to check that element in the response list with "id" equals to value of saved property "draftAndCertifiedVersionWorkflowId" exists + + Scenario: List ones with DRAFT/CERTIFIED version(s) + When I want to get path "/workflows?versionState=DRAFT,CERTIFIED" + Then I want to check that element in the response list with "id" equals to value of saved property "noVersionsWorkflowId" does not exist + Then I want to check that element in the response list with "id" equals to value of saved property "draftVersionWorkflowId" exists + Then I want to check that element in the response list with "id" equals to value of saved property "certifiedVersionWorkflowId" exists + Then I want to check that element in the response list with "id" equals to value of saved property "draftAndCertifiedVersionWorkflowId" exists + + Scenario: List ones with gibberish version(s) = none + When I want to get path "/workflows?versionState=gibberish" + Then I want to check that element in the response list with "id" equals to value of saved property "noVersionsWorkflowId" does not exist + Then I want to check that element in the response list with "id" equals to value of saved property "draftVersionWorkflowId" does not exist + Then I want to check that element in the response list with "id" equals to value of saved property "certifiedVersionWorkflowId" does not exist + Then I want to check that element in the response list with "id" equals to value of saved property "draftAndCertifiedVersionWorkflowId" does not exist
\ No newline at end of file diff --git a/workflow/workflow-bdd/features/Workflow_Create_Update.feature b/workflow/workflow-bdd/features/Workflow_Create_Update.feature deleted file mode 100644 index 04a64bf8..00000000 --- a/workflow/workflow-bdd/features/Workflow_Create_Update.feature +++ /dev/null @@ -1,27 +0,0 @@ -Feature: Workflow Example File - - Scenario: Create and get workflow - When I want to create input data - Then I want to update the input property "name" with a random value - Then I want to update the input property "description" with value "workflow desc" - Then I want to update the input property "category" with value "workflow category" - - Then I want to create for path "/workflows" with the input data from the context - Then I want to copy to property "workflowId" from response data path "id" - When I want to get path "/workflows" - Then I want to check that element in the response list with "id" equals to value of saved property "workflowId" exists - - - Scenario: Update workflow - When I want to create input data - Then I want to update the input property "name" with a random value - Then I want to update the input property "description" with value "workflow desc" - Then I want to update the input property "category" with value "workflow category" - Then I want to create for path "/workflows" with the input data from the context - Then I want to copy to property "workflowId" from response data path "id" - - Then I want to update the input property "description" with value "workflow desc updated" - Then I want to set property "desc" to value "workflow desc updated" - Then I want to update for path "/workflows/{workflowId}" with the input data from the context - Then I want to get path "/workflows/{workflowId}" - Then I want to check that property "description" in the response equals to value of saved property "desc" diff --git a/workflow/workflow-bdd/pom.xml b/workflow/workflow-bdd/pom.xml index 3502451c..8ad0584d 100644 --- a/workflow/workflow-bdd/pom.xml +++ b/workflow/workflow-bdd/pom.xml @@ -8,12 +8,6 @@ <name>cucumber-report</name> <version>1.2.0-SNAPSHOT</version> -<!-- <parent> - <groupId>org.onap.sdc.sdc-workflow-designer</groupId> - <artifactId>sdc-workflow-designer</artifactId> - <version>1.2.0-SNAPSHOT</version> - </parent>--> - <build> <plugins> <plugin> diff --git a/workflow/workflow-bdd/resources/json/createWorkflow.json b/workflow/workflow-bdd/resources/json/createWorkflow.json index 074899e9..cc200efb 100644 --- a/workflow/workflow-bdd/resources/json/createWorkflow.json +++ b/workflow/workflow-bdd/resources/json/createWorkflow.json @@ -1 +1,4 @@ -{"name":"RANDOM","description":"Workflow Description","category":"category"}
\ No newline at end of file +{ + "name": "RANDOM", + "description": "Workflow Description" +}
\ No newline at end of file diff --git a/workflow/workflow-bdd/stepDefinitions/General_Steps.js b/workflow/workflow-bdd/stepDefinitions/General_Steps.js index 0550e415..2e74c6ee 100644 --- a/workflow/workflow-bdd/stepDefinitions/General_Steps.js +++ b/workflow/workflow-bdd/stepDefinitions/General_Steps.js @@ -151,7 +151,7 @@ Then('I want to check property {string} does not exist', function(string) { * @module ContextData * @description Use during development to see what is on the context * @exampleFile Example_ResponseData_CheckAndManipulation.feature -* @step I want to print context data +* @step I want to print the context data **/ Then('I want to print the context data', function() { console.log('------------ context ---------------'); @@ -268,13 +268,13 @@ Then('I want to check that element in the response list with {string} equals to **/ Then('I want to check that element in the response list with {string} equals to value of saved property {string} exists', function(propertyPath, valueProperty) { const results = this.context.responseData.results; - assert.notEqual(results.find(result => this.context[valueProperty] === _.get(result, propertyPath)), undefined); + assert.notEqual(results.find(result => _.get(this.context, valueProperty) === _.get(result, propertyPath)), undefined); }); Then('I want to check that property {string} in the response equals to value of saved property {string}', function(propertyPath, valueProperty) { const results = this.context.responseData; - assert.equal(results[propertyPath],this.context[valueProperty]); + assert.equal(results[propertyPath], _.get(this.context, valueProperty)); }); /** diff --git a/workflow/workflow-bdd/stepDefinitions/InputData_steps.js b/workflow/workflow-bdd/stepDefinitions/InputData_steps.js index 73695d0e..6263bb73 100644 --- a/workflow/workflow-bdd/stepDefinitions/InputData_steps.js +++ b/workflow/workflow-bdd/stepDefinitions/InputData_steps.js @@ -64,6 +64,16 @@ Then('I want to update the input property {string} with value {string}', functio /** * @module InputData + * @description sets the property on the input data to the value of the given property + * @exampleFile WorkflowList.feature + * @step I want to update the input property {string} with value of property {string} + **/ +Then('I want to update the input property {string} with value of property {string}', function(string, string2) { + _.set(this.context.inputData, string, _.get(this.context, string2)); +}); + +/** + * @module InputData * @description removes a property from the input data object * @exampleFile Example_Rest_Calls.feature * @step I want to remove {string} from the input data diff --git a/workflow/workflow-bdd/stepDefinitions/Workflow_Steps.js b/workflow/workflow-bdd/stepDefinitions/Workflow_Steps.js index 59c95d89..aeca5ebb 100644 --- a/workflow/workflow-bdd/stepDefinitions/Workflow_Steps.js +++ b/workflow/workflow-bdd/stepDefinitions/Workflow_Steps.js @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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. + */ + /** * @module WORKFLOW * @description Creates a new WORKFLOW with a random name and saves the id and versionId on the context item object and the context vlm object<br> diff --git a/workflow/workflow-designer-be/pom.xml b/workflow/workflow-designer-be/pom.xml index 92c4c009..ac77e5f7 100644 --- a/workflow/workflow-designer-be/pom.xml +++ b/workflow/workflow-designer-be/pom.xml @@ -78,6 +78,18 @@ </dependency> <dependency> <groupId>org.openecomp.sdc</groupId> + <artifactId>openecomp-sdc-logging-api</artifactId> + <version>${onap.version}</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.openecomp.sdc</groupId> + <artifactId>openecomp-sdc-logging-core</artifactId> + <version>${onap.version}</version> + <scope>runtime</scope> + </dependency> + <dependency> + <groupId>org.openecomp.sdc</groupId> <artifactId>openecomp-sdc-versioning-core</artifactId> <version>${onap.version}</version> <scope>runtime</scope> diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/RestUtils.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/RestUtils.java new file mode 100644 index 00000000..b6259ccc --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/RestUtils.java @@ -0,0 +1,31 @@ +package org.onap.sdc.workflow; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; +import org.onap.sdc.workflow.persistence.types.WorkflowVersionState; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; + +public class RestUtils { + + private RestUtils() { + } + + private static final Logger LOGGER = LoggerFactory.getLogger(RestUtils.class); + + public static Set<WorkflowVersionState> mapVersionStateFilter(String versionStateFilter) { + Set<WorkflowVersionState> filter; + try { + filter = versionStateFilter == null ? null : + Arrays.stream(versionStateFilter.split(",")).map(WorkflowVersionState::valueOf) + .collect(Collectors.toSet()); + } catch (Exception e) { + LOGGER.info( + "version state filter value is invalid and cannot be mapped to a set of version states, therefore it is set to empty set"); + filter = Collections.emptySet(); + } + return filter; + } +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/SpringBootWebApplication.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/SpringBootWebApplication.java index b7e3b345..d14ad095 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/SpringBootWebApplication.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/SpringBootWebApplication.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow; import org.springframework.boot.SpringApplication; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/RestConstants.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/RestConstants.java index 8f02be0f..817bebe1 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/RestConstants.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/RestConstants.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.api; public class RestConstants { @@ -6,4 +22,10 @@ public class RestConstants { } public static final String USER_ID_HEADER_PARAM = "USER_ID"; + public static final String SIZE_PARAM = "size"; + public static final String PAGE_PARAM = "page"; + public static final String SORT_PARAM = "sort"; + public static final String SORT_FIELD_NAME = "name"; + public static final int SIZE_DEFAULT = 20; + public static final int PAGE_DEFAULT = 0; } diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/WorkflowController.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/WorkflowController.java index b224e84b..7027985f 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/WorkflowController.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/WorkflowController.java @@ -1,17 +1,48 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.api; +import static org.onap.sdc.workflow.RestUtils.mapVersionStateFilter; +import static org.onap.sdc.workflow.api.RestConstants.SIZE_DEFAULT; +import static org.onap.sdc.workflow.api.RestConstants.SORT_FIELD_NAME; +import static org.onap.sdc.workflow.api.RestConstants.SORT_PARAM; import static org.onap.sdc.workflow.api.RestConstants.USER_ID_HEADER_PARAM; +import com.google.common.collect.ImmutableSet; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import java.util.Arrays; +import java.util.Set; import org.onap.sdc.workflow.api.types.CollectionWrapper; import org.onap.sdc.workflow.persistence.types.Workflow; import org.onap.sdc.workflow.services.WorkflowManager; +import org.onap.sdc.workflow.services.exceptions.InvalidPaginationParameterException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.web.PageableDefault; +import org.springframework.data.web.SortDefault; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -19,6 +50,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/workflows") @@ -35,21 +67,28 @@ public class WorkflowController { @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) @ApiOperation("List workflows") - public CollectionWrapper<Workflow> list(@RequestHeader(USER_ID_HEADER_PARAM) String user) { - return new CollectionWrapper<>(workflowManager.list()); + public CollectionWrapper<Workflow> list( + @ApiParam(value = "Filter by version state", allowableValues = "DRAFT,CERTIFIED") + @RequestParam(value = "versionState", required = false) String versionStateFilter, + @PageableDefault(size = SIZE_DEFAULT) + @SortDefault.SortDefaults({@SortDefault(sort = SORT_FIELD_NAME, direction = Sort.Direction.ASC)}) + Pageable pageable, @RequestHeader(USER_ID_HEADER_PARAM) String user) { + PageRequest pageRequest = createPageRequest(pageable); + return new CollectionWrapper<>(pageRequest.getPageSize(), pageRequest.getPageNumber(), + workflowManager.list(mapVersionStateFilter(versionStateFilter), pageRequest)); } @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) @ApiOperation("Create workflow") - public ResponseEntity<Workflow> create(@RequestBody Workflow workflow, - @RequestHeader(USER_ID_HEADER_PARAM) String user) { + public ResponseEntity<Workflow> create(@Validated @RequestBody Workflow workflow, + @RequestHeader(USER_ID_HEADER_PARAM) String user) { return new ResponseEntity<>(workflowManager.create(workflow), HttpStatus.CREATED); } @GetMapping(path = "/{workflowId}") @ApiOperation("Get workflow") public Workflow get(@PathVariable("workflowId") String workflowId, - @RequestHeader(USER_ID_HEADER_PARAM) String user) { + @RequestHeader(USER_ID_HEADER_PARAM) String user) { Workflow workflow = new Workflow(); workflow.setId(workflowId); return workflowManager.get(workflow); @@ -58,9 +97,23 @@ public class WorkflowController { @PutMapping(path = "/{workflowId}", consumes = MediaType.APPLICATION_JSON_VALUE) @ApiOperation("Update workflow") public Workflow update(@RequestBody Workflow workflow, @PathVariable("workflowId") String workflowId, - @RequestHeader(USER_ID_HEADER_PARAM) String user) { + @RequestHeader(USER_ID_HEADER_PARAM) String user) { workflow.setId(workflowId); workflowManager.update(workflow); return workflow; } + + + private PageRequest createPageRequest(Pageable pageable) { + Set<String> validSortFields = ImmutableSet.of(SORT_FIELD_NAME); + Sort sort = pageable.getSort(); + for (Sort.Order order : sort) { + String sortFieldName = order.getProperty(); + if (!sortFieldName.equalsIgnoreCase(SORT_FIELD_NAME)) { + throw new InvalidPaginationParameterException(SORT_PARAM, sortFieldName, + "is not supported. Supported values are: " + Arrays.toString(validSortFields.toArray())); + } + } + return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort); + } } diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/WorkflowVersionController.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/WorkflowVersionController.java index 6ae8e34d..d5b94a1b 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/WorkflowVersionController.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/WorkflowVersionController.java @@ -1,11 +1,28 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.api; +import static org.onap.sdc.workflow.RestUtils.mapVersionStateFilter; import static org.onap.sdc.workflow.api.RestConstants.USER_ID_HEADER_PARAM; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import org.onap.sdc.workflow.api.types.CollectionWrapper; -import org.onap.sdc.workflow.api.types.VersionRequestDto; import org.onap.sdc.workflow.api.types.VersionStateDto; import org.onap.sdc.workflow.persistence.types.ArtifactEntity; import org.onap.sdc.workflow.persistence.types.WorkflowVersion; @@ -26,6 +43,7 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @@ -38,37 +56,40 @@ public class WorkflowVersionController { @Autowired public WorkflowVersionController( - @Qualifier("workflowVersionManager") WorkflowVersionManager workflowVersionManager) { + @Qualifier("workflowVersionManager") WorkflowVersionManager workflowVersionManager) { this.workflowVersionManager = workflowVersionManager; } @GetMapping @ApiOperation("List workflow versions") public CollectionWrapper<WorkflowVersion> list(@PathVariable("workflowId") String workflowId, - @RequestHeader(USER_ID_HEADER_PARAM) String user) { - return new CollectionWrapper<>(workflowVersionManager.list(workflowId)); + @ApiParam(value = "Filter by state", allowableValues = "DRAFT,CERTIFIED") + @RequestParam(value = "state", required = false) String stateFilter, + @RequestHeader(USER_ID_HEADER_PARAM) String user) { + return new CollectionWrapper<>(workflowVersionManager.list(workflowId, mapVersionStateFilter(stateFilter))); } @PostMapping @ApiOperation("Create workflow version") - public ResponseEntity<WorkflowVersion> create(@RequestBody VersionRequestDto versionRequest, - @PathVariable("workflowId") String workflowId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { - - WorkflowVersion createdVersion = workflowVersionManager.create(workflowId, versionRequest); + public ResponseEntity<WorkflowVersion> create(@RequestBody WorkflowVersion version, + @PathVariable("workflowId") String workflowId, + @RequestParam(value = "baseVersionId", required = false) String baseVersionId, + @RequestHeader(USER_ID_HEADER_PARAM) String user) { + WorkflowVersion createdVersion = workflowVersionManager.create(workflowId, baseVersionId, version); return new ResponseEntity<>(createdVersion, HttpStatus.CREATED); } @GetMapping("/{versionId}") @ApiOperation("Get workflow version") public WorkflowVersion get(@PathVariable("workflowId") String workflowId, - @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { + @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { return workflowVersionManager.get(workflowId, versionId); } @PutMapping("/{versionId}") @ApiOperation("Update workflow version") public void update(@RequestBody WorkflowVersion version, @PathVariable("workflowId") String workflowId, - @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { + @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { version.setId(versionId); workflowVersionManager.update(workflowId, version); } @@ -76,15 +97,15 @@ public class WorkflowVersionController { @GetMapping("/{versionId}/state") @ApiOperation("Get workflow version state") public VersionStateDto getState(@PathVariable("workflowId") String workflowId, - @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { + @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { return new VersionStateDto(workflowVersionManager.getState(workflowId, versionId)); } @PostMapping("/{versionId}/state") @ApiOperation("Update workflow version state") public VersionStateDto updateState(@RequestBody VersionStateDto state, - @PathVariable("workflowId") String workflowId, @PathVariable("versionId") String versionId, - @RequestHeader(USER_ID_HEADER_PARAM) String user) { + @PathVariable("workflowId") String workflowId, @PathVariable("versionId") String versionId, + @RequestHeader(USER_ID_HEADER_PARAM) String user) { workflowVersionManager.updateState(workflowId, versionId, state.getName()); return new VersionStateDto(state.getName()); } @@ -92,26 +113,26 @@ public class WorkflowVersionController { @PutMapping("/{versionId}/artifact") @ApiOperation("Create/update artifact of a version") public void uploadArtifact(@RequestBody MultipartFile fileToUpload, @PathVariable("workflowId") String workflowId, - @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { + @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { workflowVersionManager.uploadArtifact(workflowId, versionId, fileToUpload); } @GetMapping("/{versionId}/artifact") @ApiOperation("Download workflow version artifact") public ResponseEntity<Resource> getArtifact(@PathVariable("workflowId") String workflowId, - @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { + @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { ArtifactEntity artifact = workflowVersionManager.getArtifact(workflowId, versionId); return ResponseEntity.ok() - .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + artifact.getFileName()) - .contentType(MediaType.APPLICATION_OCTET_STREAM) - .body(new InputStreamResource(artifact.getArtifactData())); + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + artifact.getFileName()) + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(new InputStreamResource(artifact.getArtifactData())); } @DeleteMapping("/{versionId}/artifact") @ApiOperation("Delete workflow version artifact") public void deleteArtifact(@PathVariable("workflowId") String workflowId, - @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { + @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) { workflowVersionManager.deleteArtifact(workflowId, versionId); } } diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/exceptionshandlers/CustomizedResponseEntityExceptionHandler.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/exceptionshandlers/CustomizedResponseEntityExceptionHandler.java index 68fd41a5..c8cae361 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/exceptionshandlers/CustomizedResponseEntityExceptionHandler.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/exceptionshandlers/CustomizedResponseEntityExceptionHandler.java @@ -1,19 +1,41 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.api.exceptionshandlers; +import static org.springframework.http.HttpStatus.BAD_REQUEST; import static org.springframework.http.HttpStatus.FORBIDDEN; import static org.springframework.http.HttpStatus.NOT_FOUND; import static org.springframework.http.HttpStatus.UNPROCESSABLE_ENTITY; import org.onap.sdc.workflow.services.exceptions.EntityNotFoundException; import org.onap.sdc.workflow.services.exceptions.InvalidArtifactException; +import org.onap.sdc.workflow.services.exceptions.InvalidPaginationParameterException; import org.onap.sdc.workflow.services.exceptions.UniqueValueViolationException; import org.onap.sdc.workflow.services.exceptions.VersionCreationException; import org.onap.sdc.workflow.services.exceptions.VersionModificationException; import org.onap.sdc.workflow.services.exceptions.VersionStateModificationException; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; @ControllerAdvice @@ -32,6 +54,20 @@ public class CustomizedResponseEntityExceptionHandler extends ResponseEntityExce return new ResponseEntity<>(exception.getMessage(), NOT_FOUND); } + @ExceptionHandler({InvalidPaginationParameterException.class}) + public final ResponseEntity<String> handlePaginationException(InvalidPaginationParameterException exception) { + return new ResponseEntity<>(exception.getMessage(), BAD_REQUEST); + } + + //For missing header exceptions + @Override + public ResponseEntity<Object> handleServletRequestBindingException(ServletRequestBindingException ex, + HttpHeaders headers, HttpStatus status, + WebRequest request) { + return new ResponseEntity<>(ex.getMessage(), BAD_REQUEST); + } + + @ExceptionHandler({InvalidArtifactException.class, VersionModificationException.class, VersionStateModificationException.class}) public final ResponseEntity<String> handleInvalidArtifactException( diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/CollectionWrapper.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/CollectionWrapper.java index 653b0dcf..1e11bc90 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/CollectionWrapper.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/CollectionWrapper.java @@ -1,16 +1,41 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.api.types; import java.util.Collection; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@NoArgsConstructor public class CollectionWrapper<T> { private int total; - private int limit; - private int offset; + private int size; + private int page; private Collection<T> results; + public CollectionWrapper(int size, int page, Collection<T> results) { + this.results = results; + this.size = size; + this.page = page; + this.total = results.size(); + } + public CollectionWrapper(Collection<T> results) { this.results = results; this.total = results.size(); diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/VersionRequestDto.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/VersionRequestDto.java deleted file mode 100644 index 92ac3a73..00000000 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/VersionRequestDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.onap.sdc.workflow.api.types; - -import lombok.Data; - -@Data -public class VersionRequestDto { - - private String description; - private String baseVersionId; - -} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/VersionStateDto.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/VersionStateDto.java index 5963a2bf..a7f43cdd 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/VersionStateDto.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/api/types/VersionStateDto.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.api.types; import java.util.List; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/ArtifactRepository.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/ArtifactRepository.java index a473f166..ed9371e6 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/ArtifactRepository.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/ArtifactRepository.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/ParameterRepository.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/ParameterRepository.java new file mode 100644 index 00000000..9f7fb1ad --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/ParameterRepository.java @@ -0,0 +1,39 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence; + +import java.util.Collection; +import org.onap.sdc.workflow.persistence.types.ParameterEntity; +import org.onap.sdc.workflow.persistence.types.ParameterRole; + + +public interface ParameterRepository { + + void createStructure(String id, String versionId); + + Collection<ParameterEntity> list(String id, String versionId, ParameterRole role); + + void deleteAll(String id, String versionId, ParameterRole role); + + ParameterEntity get(String id, String versionId, String parameterId); + + void delete(String id, String versionId, String parameterId); + + ParameterEntity create(String id, String versionId , ParameterRole role, ParameterEntity parameter); + + void update(String id, String versionId, ParameterRole role, ParameterEntity parameter); +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/UniqueValueRepository.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/UniqueValueRepository.java index d374a404..cf7b0633 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/UniqueValueRepository.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/UniqueValueRepository.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence; import org.onap.sdc.workflow.persistence.types.UniqueValueEntity; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/impl/ArtifactRepositoryImpl.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/impl/ArtifactRepositoryImpl.java index 9a449f0d..3c528db1 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/impl/ArtifactRepositoryImpl.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/impl/ArtifactRepositoryImpl.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.impl; import static org.openecomp.core.zusammen.api.ZusammenUtil.buildStructuralElement; @@ -12,14 +28,13 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; -import java.util.Map; import java.util.Optional; import org.apache.commons.io.IOUtils; import org.onap.sdc.workflow.persistence.ArtifactRepository; import org.onap.sdc.workflow.persistence.types.ArtifactEntity; +import org.onap.sdc.workflow.persistence.types.WorkflowElementType; import org.openecomp.core.zusammen.api.ZusammenAdaptor; import org.openecomp.core.zusammen.api.ZusammenAdaptorFactory; -import org.openecomp.sdc.datatypes.model.ElementType; import org.springframework.stereotype.Repository; @Repository @@ -33,7 +48,7 @@ public class ArtifactRepositoryImpl implements ArtifactRepository { @Override public void update(String id, String versionId, ArtifactEntity artifactEntity) { - ZusammenElement artifactElement = buildStructuralElement(ElementType.Artifact, Action.UPDATE); + ZusammenElement artifactElement = buildStructuralElement(WorkflowElementType.ARTIFACT.name(), Action.UPDATE); artifactElement.setData(artifactEntity.getArtifactData()); artifactElement.getInfo().addProperty(FILE_NAME_PROPERTY, artifactEntity.getFileName()); @@ -50,7 +65,7 @@ public class ArtifactRepositoryImpl implements ArtifactRepository { ElementContext elementContext = new ElementContext(id, versionId); Optional<Element> elementOptional = - zusammenAdaptor.getElementByName(context, elementContext, null, ElementType.Artifact.name()); + zusammenAdaptor.getElementByName(context, elementContext, null, WorkflowElementType.ARTIFACT.name()); if (!elementOptional.isPresent() || hasEmptyData(elementOptional.get().getData())) { return Optional.empty(); @@ -69,7 +84,7 @@ public class ArtifactRepositoryImpl implements ArtifactRepository { SessionContext context = createSessionContext(); ElementContext elementContext = new ElementContext(id, versionId); - ZusammenElement artifactElement = buildStructuralElement(ElementType.Artifact, Action.CREATE); + ZusammenElement artifactElement = buildStructuralElement(WorkflowElementType.ARTIFACT.name(), Action.CREATE); artifactElement.setData(new ByteArrayInputStream(EMPTY_DATA.getBytes())); zusammenAdaptor @@ -82,12 +97,12 @@ public class ArtifactRepositoryImpl implements ArtifactRepository { SessionContext context = createSessionContext(); ElementContext elementContext = new ElementContext(id, versionId); - ZusammenElement artifactElement = buildStructuralElement(ElementType.Artifact, Action.UPDATE); + ZusammenElement artifactElement = buildStructuralElement(WorkflowElementType.ARTIFACT.name(), Action.UPDATE); artifactElement.setData(new ByteArrayInputStream(EMPTY_DATA.getBytes())); artifactElement.getInfo().getProperties().remove(FILE_NAME_PROPERTY); zusammenAdaptor - .saveElement(context, elementContext, artifactElement, "Update WorkflowVersion Artifact Element"); + .saveElement(context, elementContext, artifactElement, "Delete WorkflowVersion Artifact Data"); } diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/impl/ParameterRepositoryImpl.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/impl/ParameterRepositoryImpl.java new file mode 100644 index 00000000..468e93fe --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/impl/ParameterRepositoryImpl.java @@ -0,0 +1,180 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.impl; + +import static org.openecomp.core.zusammen.api.ZusammenUtil.buildElement; +import static org.openecomp.core.zusammen.api.ZusammenUtil.buildStructuralElement; +import static org.openecomp.core.zusammen.api.ZusammenUtil.createSessionContext; + +import com.amdocs.zusammen.adaptor.inbound.api.types.item.Element; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement; +import com.amdocs.zusammen.datatypes.Id; +import com.amdocs.zusammen.datatypes.SessionContext; +import com.amdocs.zusammen.datatypes.item.Action; +import com.amdocs.zusammen.datatypes.item.ElementContext; +import com.amdocs.zusammen.datatypes.item.Info; +import java.util.Collection; +import java.util.Optional; +import java.util.stream.Collectors; +import org.onap.sdc.workflow.persistence.ParameterRepository; +import org.onap.sdc.workflow.persistence.types.ParameterEntity; +import org.onap.sdc.workflow.persistence.types.ParameterPropertyName; +import org.onap.sdc.workflow.persistence.types.ParameterRole; +import org.onap.sdc.workflow.persistence.types.ParameterType; +import org.onap.sdc.workflow.persistence.types.WorkflowElementType; +import org.openecomp.core.zusammen.api.ZusammenAdaptor; +import org.openecomp.core.zusammen.api.ZusammenAdaptorFactory; +import org.openecomp.types.ElementPropertyName; +import org.springframework.stereotype.Repository; + +@Repository +public class ParameterRepositoryImpl implements ParameterRepository { + + private ZusammenAdaptor zusammenAdaptor = ZusammenAdaptorFactory.getInstance().createInterface(); + + @Override + public void createStructure(String id, String versionId) { + + SessionContext context = createSessionContext(); + ElementContext elementContext = new ElementContext(id, versionId); + + ZusammenElement inputsElement = buildStructuralElement(WorkflowElementType.INPUTS.name(), Action.CREATE); + ZusammenElement outputsElement = buildStructuralElement(WorkflowElementType.OUTPUTS.name(), Action.CREATE); + + zusammenAdaptor.saveElement(context, elementContext, inputsElement, "Create WorkflowVersion INPUTS Element"); + zusammenAdaptor.saveElement(context, elementContext, outputsElement, "Create WorkflowVersion OUTPUTS Element"); + } + + @Override + public Collection<ParameterEntity> list(String id, String versionId, ParameterRole role) { + + SessionContext context = createSessionContext(); + ElementContext elementContext = new ElementContext(id, versionId); + + return zusammenAdaptor.listElementsByName(context, elementContext, null, getParentElementType(role)).stream() + .map(this::mapElementInfoToParameter).collect(Collectors.toList()); + + } + + @Override + public void deleteAll(String id, String versionId, ParameterRole role) { + + SessionContext context = createSessionContext(); + ElementContext elementContext = new ElementContext(id, versionId); + + Optional<ElementInfo> optionalParentElement = + zusammenAdaptor.getElementInfoByName(context, elementContext, null, getParentElementType(role)); + + if (!optionalParentElement.isPresent()) { + return; + } + ZusammenElement parentElement = buildElement(optionalParentElement.get().getId(), Action.IGNORE); + parentElement.setSubElements(optionalParentElement.get().getSubElements().stream() + .map(parameter -> buildElement(parameter.getId(), + Action.DELETE)).collect(Collectors.toList())); + + zusammenAdaptor.saveElement(context, elementContext, parentElement, "Delete all " + role); + } + + @Override + public ParameterEntity get(String id, String versionId, String parameterId) { + + SessionContext context = createSessionContext(); + ElementContext elementContext = new ElementContext(id, versionId); + + Optional<ElementInfo> element = zusammenAdaptor.getElementInfo(context, elementContext, new Id(parameterId)); + + return element.map(this::mapElementInfoToParameter).orElse(null); + } + + @Override + public void delete(String id, String versionId, String parameterId) { + SessionContext context = createSessionContext(); + ElementContext elementContext = new ElementContext(id, versionId); + + ZusammenElement parameterElement = buildElement(new Id(parameterId), Action.DELETE); + + zusammenAdaptor.saveElement(context, elementContext, parameterElement, + String.format("Delete Parameter with id %s", parameterId)); + + } + + @Override + public ParameterEntity create(String id, String versionId, ParameterRole role, ParameterEntity parameter) { + + ZusammenElement parameterElement = parameterToZusammenElement(parameter, role, Action.CREATE); + ZusammenElement parentElement = buildStructuralElement(getParentElementType(role), Action.IGNORE); + parentElement.addSubElement(parameterElement); + + SessionContext context = createSessionContext(); + ElementContext elementContext = new ElementContext(id, versionId); + + Element savedElement = zusammenAdaptor.saveElement(context, elementContext, parentElement, + "Create WorkflowVersion Parameter Element"); + + parameter.setId(savedElement.getSubElements().iterator().next().getElementId().getValue()); + return parameter; + } + + @Override + public void update(String id, String versionId, ParameterRole role, ParameterEntity parameter) { + + SessionContext context = createSessionContext(); + ElementContext elementContext = new ElementContext(id, versionId); + + ZusammenElement parameterElement = parameterToZusammenElement(parameter, role, Action.UPDATE); + + zusammenAdaptor.saveElement(context, elementContext, parameterElement, "Update WorkflowVersion Parameter"); + } + + private ZusammenElement parameterToZusammenElement(ParameterEntity parameter, ParameterRole role, Action action) { + + ZusammenElement parameterElement = + buildElement(parameter.getId() == null ? null : new Id(parameter.getId()), action); + Info info = new Info(); + info.setName(parameter.getName()); + info.addProperty(ElementPropertyName.elementType.name(), WorkflowElementType.valueOf(role.name())); + info.addProperty(ParameterPropertyName.TYPE.name(), parameter.getType()); + info.addProperty(ParameterPropertyName.mandatory.name(), parameter.isMandatory()); + parameterElement.setInfo(info); + + return parameterElement; + } + + private ParameterEntity mapElementInfoToParameter(ElementInfo elementInfo) { + ParameterEntity parameterEntity = new ParameterEntity(); + parameterEntity.setId(elementInfo.getId().getValue()); + parameterEntity.setName(elementInfo.getInfo().getName()); + parameterEntity + .setType(ParameterType.valueOf(elementInfo.getInfo().getProperty(ParameterPropertyName.TYPE.name()))); + parameterEntity.setMandatory(elementInfo.getInfo().getProperty(ParameterPropertyName.mandatory.name())); + return parameterEntity; + } + + private static String getParentElementType(ParameterRole role) { + switch (role) { + case INPUT: + return WorkflowElementType.INPUTS.name(); + case OUTPUT: + return WorkflowElementType.OUTPUTS.name(); + default: + throw new IllegalArgumentException("Wrong Element Type"); + } + } + +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ArtifactEntity.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ArtifactEntity.java index 8f24ecc9..287acb45 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ArtifactEntity.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ArtifactEntity.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; import java.io.InputStream; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterEntity.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterEntity.java new file mode 100644 index 00000000..4b57ba71 --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterEntity.java @@ -0,0 +1,28 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; + +import lombok.Data; + +@Data +public class ParameterEntity { + + private String id; + private String name; + private ParameterType type; + private boolean mandatory; +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterPropertyName.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterPropertyName.java new file mode 100644 index 00000000..fa17bf69 --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterPropertyName.java @@ -0,0 +1,23 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; + +public enum ParameterPropertyName { + + TYPE, + mandatory +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterRole.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterRole.java new file mode 100644 index 00000000..9f5aacfe --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterRole.java @@ -0,0 +1,24 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; + +public enum ParameterRole { + + INPUT, + OUTPUT + +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterType.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterType.java new file mode 100644 index 00000000..04d09c01 --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/ParameterType.java @@ -0,0 +1,25 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; + +public enum ParameterType { + STRING, + INTEGER, + FLOAT, + BOOLEAN, + TIMESTAMP +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/UniqueValueEntity.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/UniqueValueEntity.java index 925ec5cb..ee7172b6 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/UniqueValueEntity.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/UniqueValueEntity.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; import static org.springframework.data.cassandra.core.cql.PrimaryKeyType.PARTITIONED; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/Workflow.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/Workflow.java index 8c66d820..31f949fc 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/Workflow.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/Workflow.java @@ -1,12 +1,34 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; +import java.util.Collection; +import java.util.Set; +import javax.validation.constraints.NotNull; import lombok.Data; @Data public class Workflow { private String id; + @NotNull private String name; private String description; + private Set<WorkflowVersionState> versionStates; + private Collection<WorkflowVersion> versions; } diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowElementType.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowElementType.java new file mode 100644 index 00000000..10de37e0 --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowElementType.java @@ -0,0 +1,26 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; + +public enum WorkflowElementType { + + ARTIFACT, + INPUTS, + OUTPUTS, + INPUT, + OUTPUT +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowProperty.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowProperty.java index 6c2d804d..90fb3085 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowProperty.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowProperty.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; public final class WorkflowProperty { diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowVersion.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowVersion.java index db0999b6..1c828d43 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowVersion.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowVersion.java @@ -1,5 +1,23 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; +import java.util.Collection; +import java.util.Collections; import java.util.Date; import lombok.Data; @@ -11,9 +29,11 @@ public class WorkflowVersion { private String name; private String description; private String baseId; + private WorkflowVersionState state; + private Collection<ParameterEntity> inputs = Collections.emptyList(); + private Collection<ParameterEntity> outputs = Collections.emptyList(); private Date creationTime; private Date modificationTime; - private WorkflowVersionState state; public WorkflowVersion(String id) { diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowVersionState.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowVersionState.java index 9414fa17..2be1d4da 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowVersionState.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/persistence/types/WorkflowVersionState.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.persistence.types; import java.util.Arrays; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/UniqueValueService.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/UniqueValueService.java index a9acb816..0a8b640a 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/UniqueValueService.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/UniqueValueService.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services; import java.util.Optional; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowManager.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowManager.java index 01c0b053..ca079d42 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowManager.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowManager.java @@ -1,11 +1,30 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services; import java.util.Collection; +import java.util.Set; import org.onap.sdc.workflow.persistence.types.Workflow; +import org.onap.sdc.workflow.persistence.types.WorkflowVersionState; +import org.springframework.data.domain.Pageable; public interface WorkflowManager { - Collection<Workflow> list(); + Collection<Workflow> list(Set<WorkflowVersionState> versionStatesFilter, Pageable pageable); Workflow get(Workflow workflow); diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowNameComparator.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowNameComparator.java new file mode 100644 index 00000000..1cb6cb1d --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowNameComparator.java @@ -0,0 +1,32 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services; + +import java.util.Comparator; + +import org.onap.sdc.workflow.persistence.types.Workflow; + +public class WorkflowNameComparator implements Comparator<Workflow>{ + + @Override + public int compare(Workflow workflow1, Workflow workflow2) { + String workflowName1 = workflow1.getName().toLowerCase(); + String workflowName2 = workflow2.getName().toLowerCase(); + //ascending order + return workflowName1.compareTo(workflowName2); + } +} diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowVersionManager.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowVersionManager.java index 8b4b8949..8effb647 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowVersionManager.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/WorkflowVersionManager.java @@ -1,7 +1,23 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services; import java.util.Collection; -import org.onap.sdc.workflow.api.types.VersionRequestDto; +import java.util.Set; import org.onap.sdc.workflow.persistence.types.ArtifactEntity; import org.onap.sdc.workflow.persistence.types.WorkflowVersion; import org.onap.sdc.workflow.persistence.types.WorkflowVersionState; @@ -10,11 +26,11 @@ import org.springframework.web.multipart.MultipartFile; public interface WorkflowVersionManager { - Collection<WorkflowVersion> list(String workflowId); + Collection<WorkflowVersion> list(String workflowId, Set<WorkflowVersionState> stateFilter); - WorkflowVersion create(String workflowId, VersionRequestDto versionRequest); + WorkflowVersion create(String workflowId, String baseVersionId, WorkflowVersion version); - void update(String id, WorkflowVersion version); + void update(String workflowId, WorkflowVersion version); WorkflowVersion get(String workflowId, String versionId); diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/EntityNotFoundException.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/EntityNotFoundException.java index 1ed3df5a..7fc3e81c 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/EntityNotFoundException.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/EntityNotFoundException.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.exceptions; public class EntityNotFoundException extends RuntimeException { diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/InvalidArtifactException.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/InvalidArtifactException.java index 89c5fd5f..c4584179 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/InvalidArtifactException.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/InvalidArtifactException.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.exceptions; public class InvalidArtifactException extends RuntimeException { diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/InvalidPaginationParameterException.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/InvalidPaginationParameterException.java new file mode 100644 index 00000000..a4d4a5d6 --- /dev/null +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/InvalidPaginationParameterException.java @@ -0,0 +1,24 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.exceptions; + +public class InvalidPaginationParameterException extends RuntimeException { + + public InvalidPaginationParameterException(String parameterName, String parameterValue, String message) { + super(String.format("Requested %s: %s %s", parameterName, parameterValue, message)); + } +}
\ No newline at end of file diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/UniqueValueViolationException.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/UniqueValueViolationException.java index 82c97f94..a3046a77 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/UniqueValueViolationException.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/UniqueValueViolationException.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.exceptions; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionCreationException.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionCreationException.java index af01c68f..31c88923 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionCreationException.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionCreationException.java @@ -1,12 +1,28 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.exceptions; public class VersionCreationException extends RuntimeException { private static final String MSG = "Error creating a new version for workflow with id %s"; - private static final String MSG_WITH_BASE_ID = MSG + " based on version %s"; + private static final String MSG_WITH_BASE_ID = MSG + " based on version %s: %s"; - public VersionCreationException(String workflowId, String baseVersionId) { - super(String.format(MSG_WITH_BASE_ID, workflowId, baseVersionId)); + public VersionCreationException(String workflowId, String baseVersionId, String detailedMessage) { + super(String.format(MSG_WITH_BASE_ID, workflowId, baseVersionId, detailedMessage)); } public VersionCreationException(String workflowId) { diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionModificationException.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionModificationException.java index ff1bf89b..752d6bce 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionModificationException.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionModificationException.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.exceptions; public class VersionModificationException extends RuntimeException { diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionStateModificationException.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionStateModificationException.java index 6c4606db..87027a58 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionStateModificationException.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/exceptions/VersionStateModificationException.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.exceptions; import org.onap.sdc.workflow.persistence.types.WorkflowVersionState; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/CollaborationConfiguration.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/CollaborationConfiguration.java index 2a4cd5aa..80b969cf 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/CollaborationConfiguration.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/CollaborationConfiguration.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.impl; import org.openecomp.sdc.versioning.ItemManager; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/WorkflowManagerImpl.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/WorkflowManagerImpl.java index 8ac5025a..52dd8f17 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/WorkflowManagerImpl.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/WorkflowManagerImpl.java @@ -1,18 +1,48 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.impl; +import static org.onap.sdc.workflow.api.RestConstants.SORT_FIELD_NAME; + +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; import org.onap.sdc.workflow.persistence.types.Workflow; +import org.onap.sdc.workflow.persistence.types.WorkflowVersionState; import org.onap.sdc.workflow.services.UniqueValueService; import org.onap.sdc.workflow.services.WorkflowManager; +import org.onap.sdc.workflow.services.WorkflowNameComparator; import org.onap.sdc.workflow.services.exceptions.EntityNotFoundException; +import org.onap.sdc.workflow.services.impl.mappers.VersionStateMapper; import org.onap.sdc.workflow.services.impl.mappers.WorkflowMapper; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; import org.openecomp.sdc.versioning.ItemManager; +import org.openecomp.sdc.versioning.dao.types.VersionStatus; import org.openecomp.sdc.versioning.types.Item; import org.openecomp.sdc.versioning.types.ItemStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; @Service("workflowManager") @@ -21,30 +51,46 @@ public class WorkflowManagerImpl implements WorkflowManager { public static final String WORKFLOW_TYPE = "WORKFLOW"; private static final String WORKFLOW_NOT_FOUND_ERROR_MSG = "Workflow with id '%s' does not exist"; private static final String WORKFLOW_NAME_UNIQUE_TYPE = "WORKFLOW_NAME"; - static final Predicate<Item> ITEM_PREDICATE = item -> WORKFLOW_TYPE.equals(item.getType()); + private static final Predicate<Item> WORKFLOW_ITEM_FILTER = item -> WORKFLOW_TYPE.equals(item.getType()); + private static final Logger LOGGER = LoggerFactory.getLogger(WorkflowManagerImpl.class); private final ItemManager itemManager; private final UniqueValueService uniqueValueService; private final WorkflowMapper workflowMapper; + private final VersionStateMapper versionStateMapper; @Autowired public WorkflowManagerImpl(ItemManager itemManager, - @Qualifier("uniqueValueService") UniqueValueService uniqueValueService, WorkflowMapper workflowMapper) { + @Qualifier("uniqueValueService") UniqueValueService uniqueValueService, WorkflowMapper workflowMapper, + VersionStateMapper versionStateMapper) { this.itemManager = itemManager; this.uniqueValueService = uniqueValueService; this.workflowMapper = workflowMapper; + this.versionStateMapper = versionStateMapper; } @Override - public Collection<Workflow> list() { - return itemManager.list(ITEM_PREDICATE).stream().map(workflowMapper::itemToWorkflow) - .collect(Collectors.toList()); + public Collection<Workflow> list(Set<WorkflowVersionState> versionStatesFilter, Pageable pageRequest) { + Set<VersionStatus> versionStatusesFilter = + versionStatesFilter == null ? null : + versionStatesFilter.stream().map(versionStateMapper::workflowVersionStateToVersionStatus) + .collect(Collectors.toSet()); + + + List<Workflow> workflows = itemManager.list(getFilter(versionStatusesFilter)).stream() + .map(workflowMapper::itemToWorkflow) + .sorted(pageRequest.getSort().getOrderFor(SORT_FIELD_NAME).getDirection() + == Sort.Direction.ASC ? getWorkflowsComparator() : + Collections.reverseOrder(getWorkflowsComparator())) + .collect(Collectors.toList()); + return applyLimitAndOffset(workflows, pageRequest); } @Override public Workflow get(Workflow workflow) { Item retrievedItem = itemManager.get(workflow.getId()); if (retrievedItem == null) { + LOGGER.error(String.format("Workflow with id %s was not found",workflow.getId())); throw new EntityNotFoundException(String.format(WORKFLOW_NOT_FOUND_ERROR_MSG, workflow.getId())); } return this.workflowMapper.itemToWorkflow(retrievedItem); @@ -56,15 +102,17 @@ public class WorkflowManagerImpl implements WorkflowManager { item.setStatus(ItemStatus.ACTIVE); uniqueValueService.validateUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, new String[] {workflow.getName()}); - workflow.setId(itemManager.create(item).getId()); + Item createdItem = itemManager.create(item); uniqueValueService.createUniqueValue(WORKFLOW_NAME_UNIQUE_TYPE, new String[] {workflow.getName()}); - return workflow; + + return workflowMapper.itemToWorkflow(createdItem); } @Override public void update(Workflow workflow) { Item retrievedItem = itemManager.get(workflow.getId()); if (retrievedItem == null) { + LOGGER.error(String.format("Workflow with id %s was not found",workflow.getId())); throw new EntityNotFoundException(String.format(WORKFLOW_NOT_FOUND_ERROR_MSG, workflow.getId())); } @@ -76,4 +124,36 @@ public class WorkflowManagerImpl implements WorkflowManager { item.setVersionStatusCounters(retrievedItem.getVersionStatusCounters()); itemManager.update(item); } + + private List<Workflow> applyLimitAndOffset(List<Workflow> workflowList, Pageable pageRequest) { + int limit = pageRequest.getPageSize(); + int offset = pageRequest.getPageNumber(); + int totalNumOfWorkflows = workflowList.size(); + List<Workflow> selectedWorkflows; + try { + if (limit > totalNumOfWorkflows) { + limit = totalNumOfWorkflows; + } + int startIndex = offset * limit; + int endIndex = startIndex + limit; + if (endIndex > totalNumOfWorkflows) { + endIndex = totalNumOfWorkflows; + } + selectedWorkflows = workflowList.subList(startIndex, endIndex); + } catch (IndexOutOfBoundsException | IllegalArgumentException ex) { + selectedWorkflows = new ArrayList<>(); + } + return selectedWorkflows; + } + + private Comparator<Workflow> getWorkflowsComparator() { + //More comparators can be added if required based on sort field name + return new WorkflowNameComparator(); + } + + private static Predicate<Item> getFilter(Set<VersionStatus> versionStatuses) { + return WORKFLOW_ITEM_FILTER.and(item -> versionStatuses == null + || item.getVersionStatusCounters().keySet().stream() + .anyMatch(versionStatuses::contains)); + } } diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/WorkflowVersionManagerImpl.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/WorkflowVersionManagerImpl.java index cdfddf34..484c598a 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/WorkflowVersionManagerImpl.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/WorkflowVersionManagerImpl.java @@ -1,16 +1,38 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.impl; -import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Certified; +import static org.onap.sdc.workflow.persistence.types.WorkflowVersionState.CERTIFIED; import java.io.IOException; import java.io.InputStream; import java.util.Collection; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; -import org.onap.sdc.workflow.api.types.VersionRequestDto; import org.onap.sdc.workflow.persistence.ArtifactRepository; +import org.onap.sdc.workflow.persistence.ParameterRepository; import org.onap.sdc.workflow.persistence.types.ArtifactEntity; +import org.onap.sdc.workflow.persistence.types.ParameterEntity; +import org.onap.sdc.workflow.persistence.types.ParameterRole; import org.onap.sdc.workflow.persistence.types.WorkflowVersion; import org.onap.sdc.workflow.persistence.types.WorkflowVersionState; import org.onap.sdc.workflow.services.WorkflowVersionManager; @@ -21,8 +43,11 @@ import org.onap.sdc.workflow.services.exceptions.VersionModificationException; import org.onap.sdc.workflow.services.exceptions.VersionStateModificationException; import org.onap.sdc.workflow.services.impl.mappers.VersionMapper; import org.onap.sdc.workflow.services.impl.mappers.VersionStateMapper; +import org.openecomp.sdc.logging.api.Logger; +import org.openecomp.sdc.logging.api.LoggerFactory; import org.openecomp.sdc.versioning.VersioningManager; import org.openecomp.sdc.versioning.dao.types.Version; +import org.openecomp.sdc.versioning.dao.types.VersionStatus; import org.openecomp.sdc.versioning.types.VersionCreationMethod; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -35,58 +60,76 @@ public class WorkflowVersionManagerImpl implements WorkflowVersionManager { private static final String VERSION_NOT_EXIST_MSG = "version with id '%s' does not exist for workflow with id '%s'"; private final VersioningManager versioningManager; private final ArtifactRepository artifactRepository; + private final ParameterRepository parameterRepository; private final VersionMapper versionMapper; private final VersionStateMapper versionStateMapper; - + private static final Logger LOGGER = LoggerFactory.getLogger(WorkflowVersionManagerImpl.class); @Autowired public WorkflowVersionManagerImpl(VersioningManager versioningManager, ArtifactRepository artifactRepository, - VersionMapper versionMapper, VersionStateMapper versionStateMapper) { + VersionMapper versionMapper, VersionStateMapper versionStateMapper, + ParameterRepository parameterRepository) { this.versioningManager = versioningManager; this.artifactRepository = artifactRepository; + this.parameterRepository = parameterRepository; this.versionMapper = versionMapper; this.versionStateMapper = versionStateMapper; } @Override - public Collection<WorkflowVersion> list(String workflowId) { - return versioningManager.list(workflowId).stream().map(versionMapper::versionToWorkflowVersion) - .collect(Collectors.toList()); + public Collection<WorkflowVersion> list(String workflowId, Set<WorkflowVersionState> stateFilter) { + Set<VersionStatus> versionStatusFilter = + stateFilter == null ? null : + stateFilter.stream().map(versionStateMapper::workflowVersionStateToVersionStatus) + .collect(Collectors.toSet()); + + return versioningManager.list(workflowId).stream() + .filter(version -> versionStatusFilter == null || versionStatusFilter.contains( + version.getStatus())) + .map(versionMapper::versionToWorkflowVersion) + .peek(workflowVersion -> loadAndAddParameters(workflowId, workflowVersion)) + .collect(Collectors.toList()); } @Override public WorkflowVersion get(String workflowId, String versionId) { - return versionMapper.versionToWorkflowVersion(getVersion(workflowId, versionId)); + WorkflowVersion workflowVersion = versionMapper.versionToWorkflowVersion(getVersion(workflowId, versionId)); + loadAndAddParameters(workflowId, workflowVersion); + return workflowVersion; } @Override - public WorkflowVersion create(String workflowId, VersionRequestDto versionRequest) { + public WorkflowVersion create(String workflowId, String baseVersionId, WorkflowVersion workflowVersion) { List<Version> versions = versioningManager.list(workflowId); - if (versionRequest.getBaseVersionId() != null) { - validateVersionExistAndCertified(workflowId, versions, versionRequest.getBaseVersionId()); + if (baseVersionId != null) { + if (!workflowVersion.getInputs().isEmpty() || !workflowVersion.getOutputs().isEmpty()) { + throw new VersionCreationException(workflowId, baseVersionId, "Inputs/Outputs should not be supplied"); + } + validateVersionExistAndCertified(workflowId, versions, baseVersionId); } else if (!versions.isEmpty()) { throw new VersionCreationException(workflowId); } Version version = new Version(); - version.setDescription(versionRequest.getDescription()); - version.setBaseId(versionRequest.getBaseVersionId()); + version.setDescription(workflowVersion.getDescription()); + version.setBaseId(baseVersionId); Version createdVersion = versioningManager.create(workflowId, version, VersionCreationMethod.major); if (versions.isEmpty()) { // only for first version artifactRepository.createStructure(workflowId, createdVersion.getId()); - versioningManager.publish(workflowId, createdVersion, "Add workflow structure"); + parameterRepository.createStructure(workflowId, createdVersion.getId()); + updateParameters(workflowId, createdVersion.getId(), workflowVersion.getInputs(), workflowVersion.getOutputs()); + versioningManager.publish(workflowId, createdVersion, "Add initial data"); } - return versionMapper.versionToWorkflowVersion(createdVersion); + return get(workflowId, createdVersion.getId()); } @Override public void update(String workflowId, WorkflowVersion workflowVersion) { Version retrievedVersion = getVersion(workflowId, workflowVersion.getId()); - if (WorkflowVersionState.CERTIFIED - .equals(versionStateMapper.versionStatusToWorkflowVersionState(retrievedVersion.getStatus()))) { + if (CERTIFIED.equals(versionStateMapper.versionStatusToWorkflowVersionState(retrievedVersion.getStatus()))) { throw new VersionModificationException(workflowId, workflowVersion.getId()); } @@ -94,6 +137,8 @@ public class WorkflowVersionManagerImpl implements WorkflowVersionManager { version.setName(retrievedVersion.getName()); version.setStatus(retrievedVersion.getStatus()); + updateParameters(workflowId, version.getId(), workflowVersion.getInputs(), workflowVersion.getOutputs()); + versioningManager.updateVersion(workflowId, version); versioningManager.publish(workflowId, version, "Update version"); } @@ -105,34 +150,37 @@ public class WorkflowVersionManagerImpl implements WorkflowVersionManager { @Override public void updateState(String workflowId, String versionId, WorkflowVersionState state) { - Version retrievedVersion = getVersion(workflowId, versionId); WorkflowVersionState retrievedState = - versionStateMapper.versionStatusToWorkflowVersionState(retrievedVersion.getStatus()); - if (WorkflowVersionState.CERTIFIED.equals(retrievedState) || retrievedState.equals(state)) { + versionStateMapper.versionStatusToWorkflowVersionState(getVersion(workflowId, versionId).getStatus()); + + if (state == CERTIFIED) { + try { + versioningManager.submit(workflowId, new Version(versionId), + String.format("Update version state to %s", state.name())); + } catch (Exception e) { + throw new VersionStateModificationException(workflowId, versionId, retrievedState, state); + } + } else { throw new VersionStateModificationException(workflowId, versionId, retrievedState, state); } - - retrievedVersion.setStatus(versionStateMapper.workflowVersionStateToVersionStatus(state)); - versioningManager.updateVersion(workflowId, retrievedVersion); - versioningManager.publish(workflowId, retrievedVersion, - String.format("Update version state from %s to %s", retrievedState.name(), state.name())); } @Override public void uploadArtifact(String workflowId, String versionId, MultipartFile artifact) { Version retrievedVersion = getVersion(workflowId, versionId); - if (WorkflowVersionState.CERTIFIED - .equals(versionStateMapper.versionStatusToWorkflowVersionState(retrievedVersion.getStatus()))) { + if (CERTIFIED.equals(versionStateMapper.versionStatusToWorkflowVersionState(retrievedVersion.getStatus()))) { throw new VersionModificationException(workflowId, versionId); } try (InputStream artifactData = artifact.getInputStream()) { ArtifactEntity artifactEntity = - new ArtifactEntity(StringUtils.cleanPath(artifact.getOriginalFilename()), artifactData); + new ArtifactEntity(StringUtils.cleanPath(artifact.getOriginalFilename()), artifactData); artifactRepository.update(workflowId, versionId, artifactEntity); versioningManager.publish(workflowId, new Version(versionId), "Update Artifact"); } catch (IOException e) { + LOGGER.error(String.format("Upload Artifact failed for workflow id %s and version id %s", + workflowId, versionId),e); throw new InvalidArtifactException(e.getMessage()); } } @@ -142,8 +190,10 @@ public class WorkflowVersionManagerImpl implements WorkflowVersionManager { getVersion(workflowId, versionId); Optional<ArtifactEntity> artifactOptional = artifactRepository.get(workflowId, versionId); if (!artifactOptional.isPresent()) { + LOGGER.error(String.format("Workflow Version Artifact was not found for workflow id %s and version id %s", + workflowId, versionId)); throw new EntityNotFoundException( - String.format("Artifact for workflow id %S version id %S was not found", workflowId, versionId)); + String.format("Artifact for workflow id %S version id %S was not found", workflowId, versionId)); } return artifactOptional.get(); } @@ -151,7 +201,10 @@ public class WorkflowVersionManagerImpl implements WorkflowVersionManager { @Override public void deleteArtifact(String workflowId, String versionId) { WorkflowVersion retrievedVersion = get(workflowId, versionId); - if (WorkflowVersionState.CERTIFIED.equals(retrievedVersion.getState())) { + if (CERTIFIED.equals(retrievedVersion.getState())) { + LOGGER.error(String.format( + "Workflow Version is certified and can not be edited.Workflow id %s and version id %s", workflowId, + versionId)); throw new VersionModificationException(workflowId, versionId); } @@ -161,10 +214,10 @@ public class WorkflowVersionManagerImpl implements WorkflowVersionManager { private void validateVersionExistAndCertified(String workflowId, List<Version> versions, String versionId) { Version baseVersion = findVersion(versions, versionId).orElseThrow( - () -> new EntityNotFoundException(String.format(VERSION_NOT_EXIST_MSG, versionId, workflowId))); + () -> new EntityNotFoundException(String.format(VERSION_NOT_EXIST_MSG, versionId, workflowId))); - if (!Certified.equals(baseVersion.getStatus())) { - throw new VersionCreationException(workflowId, versionId); + if (CERTIFIED != versionStateMapper.versionStatusToWorkflowVersionState(baseVersion.getStatus())) { + throw new VersionCreationException(workflowId, versionId, "base version must be CERTIFIED"); } } @@ -176,10 +229,48 @@ public class WorkflowVersionManagerImpl implements WorkflowVersionManager { } return version; } catch (Exception e) { + LOGGER.error(String.format( + "Workflow Version was not found.Workflow id %s and version id %s", workflowId, + versionId),e); throw new EntityNotFoundException(String.format(VERSION_NOT_EXIST_MSG, versionId, workflowId)); } } + private void updateParameters(String workflowId, String versionId, Collection<ParameterEntity> inputs, + Collection<ParameterEntity> outputs) { + updateVersionParameters(workflowId, versionId, ParameterRole.INPUT, inputs); + updateVersionParameters(workflowId, versionId, ParameterRole.OUTPUT, outputs); + } + + private void updateVersionParameters(String workflowId, String versionId, ParameterRole role, + Collection<ParameterEntity> parameters) { + + Collection<ParameterEntity> retrievedParams = parameterRepository.list(workflowId, versionId, role); + Map<String, ParameterEntity> retrievedParamsByName = + retrievedParams.stream().collect(Collectors.toMap(ParameterEntity::getName, Function.identity())); + + Set<String> namesOfParamsToKeep = new HashSet<>(); + for (ParameterEntity parameter : parameters) { + + ParameterEntity retrievedParam = retrievedParamsByName.get(parameter.getName()); + if (retrievedParam == null) { + parameterRepository.create(workflowId, versionId, role, parameter); + } else { + parameterRepository.update(workflowId, versionId, role, parameter); + namesOfParamsToKeep.add(parameter.getName()); + } + } + + retrievedParams.stream().filter(retrievedParam -> !namesOfParamsToKeep.contains(retrievedParam.getName())) + .forEach(retrievedParam -> parameterRepository + .delete(workflowId, versionId, retrievedParam.getId())); + } + + private void loadAndAddParameters(String workflowId, WorkflowVersion workflowVersion) { + workflowVersion.setInputs(parameterRepository.list(workflowId, workflowVersion.getId(), ParameterRole.INPUT)); + workflowVersion.setOutputs(parameterRepository.list(workflowId, workflowVersion.getId(), ParameterRole.OUTPUT)); + } + private static Optional<Version> findVersion(List<Version> versions, String versionId) { return versions.stream().filter(version -> versionId.equals(version.getId())).findFirst(); } diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/VersionMapper.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/VersionMapper.java index bcf89661..a3a1cdcc 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/VersionMapper.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/VersionMapper.java @@ -1,3 +1,19 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.impl.mappers; import org.mapstruct.InheritInverseConfiguration; diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/VersionStateMapper.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/VersionStateMapper.java index 0c2f5391..45012b57 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/VersionStateMapper.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/VersionStateMapper.java @@ -1,5 +1,24 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.impl.mappers; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; import org.mapstruct.InheritInverseConfiguration; import org.mapstruct.Mapper; import org.mapstruct.ValueMapping; @@ -18,5 +37,11 @@ public interface VersionStateMapper { @InheritInverseConfiguration VersionStatus workflowVersionStateToVersionStatus(WorkflowVersionState status); + default Set<WorkflowVersionState> versionStatusCountersToWorkflowVersionStates( + Map<VersionStatus, Integer> versionStatusCounters) { + return versionStatusCounters.keySet().stream().map(this::versionStatusToWorkflowVersionState) + .collect(Collectors.toSet()); + } + } diff --git a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/WorkflowMapper.java b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/WorkflowMapper.java index 34327ce7..5cfcd7ed 100644 --- a/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/WorkflowMapper.java +++ b/workflow/workflow-designer-be/src/main/java/org/onap/sdc/workflow/services/impl/mappers/WorkflowMapper.java @@ -1,19 +1,38 @@ +/* + * Copyright © 2018 European Support Limited + * + * 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 org.onap.sdc.workflow.services.impl.mappers; import org.mapstruct.InheritInverseConfiguration; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.Mappings; import org.onap.sdc.workflow.persistence.types.Workflow; import org.onap.sdc.workflow.services.impl.WorkflowManagerImpl; import org.openecomp.sdc.versioning.types.Item; -@Mapper(componentModel = "spring", imports = WorkflowManagerImpl.class) +@Mapper(componentModel = "spring", imports = WorkflowManagerImpl.class, uses = VersionStateMapper.class) public interface WorkflowMapper { + @Mapping(source = "versionStatusCounters", target = "versionStates") Workflow itemToWorkflow(Item item); @InheritInverseConfiguration - @Mapping(expression = "java(WorkflowManagerImpl.WORKFLOW_TYPE)", target = "type") + @Mappings({@Mapping(expression = "java(WorkflowManagerImpl.WORKFLOW_TYPE)", target = "type"), + @Mapping(target = "versionStatusCounters", ignore = true)}) Item workflowToItem(Workflow workflow); } diff --git a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/RestPath.java b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/RestPath.java index 266ca91b..7a7e715e 100644 --- a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/RestPath.java +++ b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/RestPath.java @@ -1,24 +1,66 @@ package org.onap.sdc.workflow; +import static org.onap.sdc.workflow.api.RestConstants.SIZE_PARAM; +import static org.onap.sdc.workflow.api.RestConstants.PAGE_PARAM; +import static org.onap.sdc.workflow.api.RestConstants.SORT_PARAM; + public class RestPath { + + private RestPath() { + //Hiding implicit constructor + } + private static final String WORKFLOWS_URL = "/workflows"; + public static final String WORKFLOWS_WITH_VERSION_STATE_FILTER_URL = WORKFLOWS_URL + "?versionState=%s"; private static final String WORKFLOW_URL_FORMATTER = WORKFLOWS_URL + "/%s"; private static final String VERSIONS_URL_FORMATTER = WORKFLOWS_URL + "/%s/versions"; private static final String VERSION_URL_FORMATTER = WORKFLOWS_URL + "/%s/versions/%s"; + private static final String SORT_QUERY_STRING_FORMATTER = SORT_PARAM + "=%s"; + private static final String SIZE_QUERY_STRING_FORMATTER = SIZE_PARAM + "=%s"; + private static final String OFFSET_QUERY_STRING_FORMATTER = PAGE_PARAM + "=%s"; + private static final String WORKFLOW_URL_FORMATTER_QUERY_PARAMS_ALL = + WORKFLOWS_URL + "?" + SORT_QUERY_STRING_FORMATTER+ "&" + SIZE_QUERY_STRING_FORMATTER + "&" + + OFFSET_QUERY_STRING_FORMATTER; + private static final String WORKFLOW_URL_FORMATTER_QUERY_PARAMS_NO_SORT = + WORKFLOWS_URL + "?" + SIZE_QUERY_STRING_FORMATTER + "&" + OFFSET_QUERY_STRING_FORMATTER; + private static final String WORKFLOW_URL_FORMATTER_QUERY_PARAMS_NO_SORT_AND_SIZE = + WORKFLOWS_URL + "?" + OFFSET_QUERY_STRING_FORMATTER; + private static final String WORKFLOW_URL_FORMATTER_QUERY_PARAMS_NO_SORT_AND_OFFSET = + WORKFLOWS_URL + "?" + SIZE_QUERY_STRING_FORMATTER; + + public static String getWorkflowsPathAllQueryParams(String sort, String size, String offset){ + return String.format(WORKFLOW_URL_FORMATTER_QUERY_PARAMS_ALL, sort, size, offset); + } + + public static String getWorkflowsPathNoSort(String size, String offset){ + return String.format(WORKFLOW_URL_FORMATTER_QUERY_PARAMS_NO_SORT, size, offset); + } + + public static String getWorkflowsPathNoSortAndSize(String offset){ + return String.format(WORKFLOW_URL_FORMATTER_QUERY_PARAMS_NO_SORT_AND_SIZE, offset); + } - public static String getWorkflowsPath(){ + public static String getWorkflowsPathNoSortAndOffset(String size){ + return String.format(WORKFLOW_URL_FORMATTER_QUERY_PARAMS_NO_SORT_AND_OFFSET, size); + } + + public static String getWorkflowsPath() { return WORKFLOWS_URL; } - public static String getWorkflowPath(String workflowId){ + public static String getWorkflowsWithVersionStateFilterPath(String versionState) { + return String.format(WORKFLOWS_WITH_VERSION_STATE_FILTER_URL, versionState); + } + + public static String getWorkflowPath(String workflowId) { return String.format(WORKFLOW_URL_FORMATTER, workflowId); } - public static String getWorkflowVersions(String workflowId){ + public static String getWorkflowVersions(String workflowId) { return String.format(VERSIONS_URL_FORMATTER, workflowId); } - public static String getWorkflowVersion(String workflowId, String versionId){ + public static String getWorkflowVersion(String workflowId, String versionId) { return String.format(VERSION_URL_FORMATTER, workflowId, versionId); } } diff --git a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/TestUtil.java b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/TestUtil.java index 47ce060b..e2a566aa 100644 --- a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/TestUtil.java +++ b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/TestUtil.java @@ -7,32 +7,29 @@ public class TestUtil { private static final String WORKFLOW_TYPE = "WORKFLOW"; - public static Workflow createWorkflow(int workflowPropertySuffix, boolean createId) { + public static Workflow createWorkflow(int workflowNum, boolean createId) { Workflow workflow = new Workflow(); if (createId) { - workflow.setId("workflowId" + workflowPropertySuffix); + workflow.setId(String.valueOf(workflowNum)); } - workflow.setName("workflowName" + workflowPropertySuffix); - workflow.setDescription("workflowDesc" + workflowPropertySuffix); + workflow.setName("Workflow_" + workflowNum); + workflow.setDescription("Description_" + workflowNum); return workflow; } - public static Item createItem(int itemNum,boolean setType, boolean setId){ + public static Item createItem(int itemNum, boolean setType, boolean setId) { Item item = new Item(); - if(setId) { - item.setId("workflowId" + itemNum); + if (setId) { + item.setId(String.valueOf(itemNum)); } - item.addProperty("category","category_" + itemNum); item.setName("Workflow_" + itemNum); item.setDescription("Description_" + itemNum); - if(setType) { + if (setType) { item.setType(WORKFLOW_TYPE); } - return item; } - } diff --git a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/api/WorkflowControllerTest.java b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/api/WorkflowControllerTest.java index 69b25b01..5e7df483 100644 --- a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/api/WorkflowControllerTest.java +++ b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/api/WorkflowControllerTest.java @@ -4,10 +4,14 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.onap.sdc.workflow.TestUtil.createWorkflow; +import static org.onap.sdc.workflow.api.RestConstants.PAGE_DEFAULT; +import static org.onap.sdc.workflow.api.RestConstants.SIZE_DEFAULT; +import static org.onap.sdc.workflow.api.RestConstants.SORT_FIELD_NAME; +import static org.onap.sdc.workflow.api.RestConstants.SORT_PARAM; import static org.onap.sdc.workflow.api.RestConstants.USER_ID_HEADER_PARAM; import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -16,9 +20,15 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.amdocs.zusammen.datatypes.Id; +import com.amdocs.zusammen.datatypes.item.Item; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.ImmutableSet; import com.google.gson.Gson; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Set; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -26,13 +36,14 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.onap.sdc.workflow.RestPath; +import org.onap.sdc.workflow.api.exceptionshandlers.CustomizedResponseEntityExceptionHandler; +import org.onap.sdc.workflow.api.types.CollectionWrapper; import org.onap.sdc.workflow.persistence.types.Workflow; +import org.onap.sdc.workflow.persistence.types.WorkflowVersionState; import org.onap.sdc.workflow.services.WorkflowManager; -import org.openecomp.sdc.versioning.types.Item; -import org.springframework.http.MediaType; +import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import org.springframework.test.web.servlet.setup.MockMvcBuilders; @RunWith(MockitoJUnitRunner.class) @@ -42,6 +53,11 @@ public class WorkflowControllerTest { "Missing request header '%s' for method parameter of type String"; private static final String USER_ID = "userId"; private static final Gson GSON = new Gson(); + private static final String USER_ID_HEADER = "USER_ID"; + private static final String INVALID_PAGINATION_PARAMETER_FORMAT = "Requested %s: %s %s"; + private static final String PAGINATION_PARAMETER_INVALID_SORT_FIELD_SUFFIX = + "is not supported. Supported values are: "; + private static final String DEFAULT_SORT_VALUE = "name,asc"; private MockMvc mockMvc; @@ -54,7 +70,9 @@ public class WorkflowControllerTest { @Before public void setUp() { - mockMvc = MockMvcBuilders.standaloneSetup(workflowController).build(); + mockMvc = MockMvcBuilders.standaloneSetup(workflowController) + .setCustomArgumentResolvers(new PageableHandlerMethodArgumentResolver()) + .setControllerAdvice(new CustomizedResponseEntityExceptionHandler()).build(); } @Test @@ -64,17 +82,17 @@ public class WorkflowControllerTest { mockMvc.perform(get(RestPath.getWorkflowPath(workflowMock.getId())).contentType(APPLICATION_JSON)) .andDo(print()).andExpect(status().isBadRequest()).andExpect(status().is(400)).andReturn() .getResponse(); - assertEquals(String.format(MISSING_REQUEST_HEADER_ERRROR_FORMAT, "USER_ID"), response.getErrorMessage()); + assertEquals(String.format(MISSING_REQUEST_HEADER_ERRROR_FORMAT, USER_ID_HEADER), + response.getContentAsString()); } @Test public void shouldReturnWorkflowDataWhenRequestPathIsOk() throws Exception { Workflow workflowMock = createWorkflow(1, true); doReturn(workflowMock).when(workflowManagerMock).get(any(Workflow.class)); - mockMvc.perform( - get(RestPath.getWorkflowPath(workflowMock.getId())).header(USER_ID_HEADER_PARAM, USER_ID) - .contentType(APPLICATION_JSON)).andDo(print()) - .andExpect(status().isOk()).andExpect(jsonPath("$.id", is(workflowMock.getId()))) + mockMvc.perform(get(RestPath.getWorkflowPath(workflowMock.getId())).header(USER_ID_HEADER_PARAM, USER_ID) + .contentType(APPLICATION_JSON)) + .andDo(print()).andExpect(status().isOk()).andExpect(jsonPath("$.id", is(workflowMock.getId()))) .andExpect(jsonPath("$.name", is(workflowMock.getName()))); } @@ -83,29 +101,160 @@ public class WorkflowControllerTest { MockHttpServletResponse response = mockMvc.perform(get(RestPath.getWorkflowsPath()).contentType(APPLICATION_JSON)).andDo(print()) .andExpect(status().isBadRequest()).andExpect(status().is(400)).andReturn().getResponse(); - assertEquals(String.format(MISSING_REQUEST_HEADER_ERRROR_FORMAT, USER_ID_HEADER_PARAM), response.getErrorMessage()); + assertEquals(String.format(MISSING_REQUEST_HEADER_ERRROR_FORMAT, USER_ID_HEADER_PARAM), + response.getContentAsString()); } @Test public void shouldReturn5WorkflowWhen5WorkflowsExists() throws Exception { int numOfWorkflows = 5; List<Workflow> workflowMocks = createWorkflows(numOfWorkflows); - doReturn(workflowMocks).when(workflowManagerMock).list(); + doReturn(workflowMocks).when(workflowManagerMock).list(any(), any()); mockMvc.perform( get(RestPath.getWorkflowsPath()).header(USER_ID_HEADER_PARAM, USER_ID).contentType(APPLICATION_JSON)) .andDo(print()).andExpect(status().isOk()).andExpect(jsonPath("$.results", hasSize(numOfWorkflows))); } @Test + public void listWithValidVersionStateFilter() throws Exception { + int numOfWorkflows = 3; + List<Workflow> workflows = createWorkflows(numOfWorkflows); + doReturn(workflows).when(workflowManagerMock) + .list(eq(Collections.singleton(WorkflowVersionState.CERTIFIED)), any()); + mockMvc.perform( + get(RestPath.getWorkflowsWithVersionStateFilterPath("CERTIFIED")).header(USER_ID_HEADER_PARAM, USER_ID) + .contentType(APPLICATION_JSON)) + .andDo(print()).andExpect(status().isOk()).andExpect(jsonPath("$.total", is(numOfWorkflows))) + .andExpect(jsonPath("$.results", hasSize(numOfWorkflows))); + } + + @Test + public void listWithInvalidVersionStateFilter() throws Exception { + mockMvc.perform( + get(RestPath.getWorkflowsWithVersionStateFilterPath("hasdhf")).header(USER_ID_HEADER_PARAM, USER_ID) + .contentType(APPLICATION_JSON)) + .andDo(print()).andExpect(status().isOk()).andExpect(jsonPath("$.total", is(0))); + } + + @Test + public void shouldReturnSortedSizeOffsetAppliedWorkflows() throws Exception { + List<Workflow> workflowMocks = createSize2AndOffset1For5WorkflowList(); + doReturn(workflowMocks).when(workflowManagerMock).list(any(), any()); + mockMvc.perform(get(RestPath.getWorkflowsPathAllQueryParams(DEFAULT_SORT_VALUE, "2", "1")) + .header(RestConstants.USER_ID_HEADER_PARAM, USER_ID).contentType(APPLICATION_JSON)) + .andDo(print()).andExpect(status().isOk()).andExpect(jsonPath("$.results", hasSize(2))); + } + + @Test + public void shouldReturnResultsWithDefaultWhenSizeIsNegative() throws Exception { + List<Workflow> workflowMocks = createSize2AndOffset1For5WorkflowList(); + doReturn(workflowMocks).when(workflowManagerMock).list(any(), any()); + MockHttpServletResponse response = mockMvc.perform( + get(RestPath.getWorkflowsPathAllQueryParams(DEFAULT_SORT_VALUE, "-2", "1")) + .header(RestConstants.USER_ID_HEADER_PARAM, USER_ID).contentType(APPLICATION_JSON)) + .andDo(print()).andExpect(status().isOk()).andExpect(status().is(200)) + .andReturn().getResponse(); + CollectionWrapper workflowListResponse = + new ObjectMapper().readValue(response.getContentAsString(), CollectionWrapper.class); + assertEquals(SIZE_DEFAULT, workflowListResponse.getSize()); + assertEquals(1, workflowListResponse.getPage()); + assertEquals(2, workflowListResponse.getTotal()); + } + + @Test + public void shouldFallbackOnDefaultOffsetWhenOffsetIsNegative() throws Exception { + MockHttpServletResponse response = mockMvc.perform( + get(RestPath.getWorkflowsPathAllQueryParams(DEFAULT_SORT_VALUE, "2", "-1")) + .header(RestConstants.USER_ID_HEADER_PARAM, USER_ID).contentType(APPLICATION_JSON)) + .andDo(print()).andExpect(status().isOk()).andExpect(status().is(200)) + .andReturn().getResponse(); + CollectionWrapper workflowListResponse = + new ObjectMapper().readValue(response.getContentAsString(), CollectionWrapper.class); + assertEquals(2, workflowListResponse.getSize()); + assertEquals(PAGE_DEFAULT, workflowListResponse.getPage()); + assertEquals(0, workflowListResponse.getTotal()); + } + + @Test + public void shouldFallbackOnDefaultSizeWhenSizeIsNotAnInteger() throws Exception { + MockHttpServletResponse response = mockMvc.perform( + get(RestPath.getWorkflowsPathAllQueryParams(DEFAULT_SORT_VALUE, "abc", "0")) + .header(RestConstants.USER_ID_HEADER_PARAM, USER_ID).contentType(APPLICATION_JSON)) + .andDo(print()).andExpect(status().isOk()).andExpect(status().is(200)) + .andReturn().getResponse(); + CollectionWrapper workflowListResponse = + new ObjectMapper().readValue(response.getContentAsString(), CollectionWrapper.class); + assertEquals(SIZE_DEFAULT, workflowListResponse.getSize()); + assertEquals(0, workflowListResponse.getPage()); + assertEquals(0, workflowListResponse.getTotal()); + } + + @Test + public void shouldFallbackOnDefaultOffsetWhenOffsetIsNotAnInteger() throws Exception { + MockHttpServletResponse response = mockMvc.perform( + get(RestPath.getWorkflowsPathAllQueryParams(DEFAULT_SORT_VALUE, "2", "abc")) + .header(RestConstants.USER_ID_HEADER_PARAM, USER_ID).contentType(APPLICATION_JSON)) + .andDo(print()).andExpect(status().isOk()).andExpect(status().is(200)) + .andReturn().getResponse(); + CollectionWrapper workflowListResponse = + new ObjectMapper().readValue(response.getContentAsString(), CollectionWrapper.class); + assertEquals(2, workflowListResponse.getSize()); + assertEquals(PAGE_DEFAULT, workflowListResponse.getPage()); + assertEquals(0, workflowListResponse.getTotal()); + } + + @Test + public void shouldThrowExceptionWhenSortFieldIsInvalid() throws Exception { + MockHttpServletResponse response = mockMvc.perform( + get(RestPath.getWorkflowsPathAllQueryParams("invalidSortField,asc", "2", "1")) + .header(RestConstants.USER_ID_HEADER_PARAM, USER_ID).contentType(APPLICATION_JSON)) + .andDo(print()).andExpect(status().isBadRequest()) + .andExpect(status().is(400)).andReturn().getResponse(); + assertEquals(String.format(INVALID_PAGINATION_PARAMETER_FORMAT, SORT_PARAM, "invalidSortField", + PAGINATION_PARAMETER_INVALID_SORT_FIELD_SUFFIX + getSupportedSortFields()), + response.getContentAsString()); + } + + @Test + public void shouldReturnAscSortedSizeOffsetAppliedWorkflowsWhenSortIsNotSpecified() throws Exception { + List<Workflow> workflowMocks = createSize2AndOffset1For5WorkflowList(); + doReturn(workflowMocks).when(workflowManagerMock).list(any(), any()); + mockMvc.perform( + get(RestPath.getWorkflowsPathNoSort("2", "1")).header(RestConstants.USER_ID_HEADER_PARAM, USER_ID) + .contentType(APPLICATION_JSON)).andDo(print()) + .andExpect(status().isOk()).andExpect(jsonPath("$.results", hasSize(2))); + } + + @Test + public void shouldReturnDefaultSizeOffsetAppliedWorkflowsWhenSizeIsNotSpecified() throws Exception { + List<Workflow> workflowMocks = createSize2AndOffset1For5WorkflowList(); + doReturn(workflowMocks).when(workflowManagerMock).list(any(), any()); + mockMvc.perform( + get(RestPath.getWorkflowsPathNoSortAndSize("1")).header(RestConstants.USER_ID_HEADER_PARAM, USER_ID) + .contentType(APPLICATION_JSON)).andDo(print()) + .andExpect(status().isOk()).andExpect(jsonPath("$.results", hasSize(2))); + } + + @Test + public void shouldReturnDefaultOffsetAppliedWorkflowsWhenOffsetIsNotSpecified() throws Exception { + List<Workflow> workflowMocks = createSize1WorkflowList(); + doReturn(workflowMocks).when(workflowManagerMock).list(any(), any()); + mockMvc.perform( + get(RestPath.getWorkflowsPathNoSortAndOffset("1")).header(RestConstants.USER_ID_HEADER_PARAM, USER_ID) + .contentType(APPLICATION_JSON)).andDo(print()) + .andExpect(status().isOk()).andExpect(jsonPath("$.results", hasSize(1))); + } + + @Test public void shouldCreateWorkflowWhenCallingPostRESTRequest() throws Exception { Item item = new Item(); - item.setId("abc"); + item.setId(new Id("abc")); Workflow reqWorkflow = createWorkflow(1, false); mockMvc.perform( post(RestPath.getWorkflowsPath()).header(USER_ID_HEADER_PARAM, USER_ID).contentType(APPLICATION_JSON) - .content(GSON.toJson(reqWorkflow))).andDo(print()).andExpect(status().isCreated()) - .andExpect(MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)); - verify(workflowManagerMock, times(1)).create(reqWorkflow); + .content(GSON.toJson(reqWorkflow))).andDo(print()) + .andExpect(status().isCreated()); + verify(workflowManagerMock).create(reqWorkflow); } private List<Workflow> createWorkflows(int numOfWorkflows) { @@ -117,5 +266,22 @@ public class WorkflowControllerTest { return workflowList; } + private List<Workflow> createSize2AndOffset1For5WorkflowList() { + List<Workflow> workflowList = new ArrayList<>(); + workflowList.add(createWorkflow(2, true)); + workflowList.add(createWorkflow(3, true)); + return workflowList; + } + + private List<Workflow> createSize1WorkflowList() { + List<Workflow> workflowList = new ArrayList<>(); + workflowList.add(createWorkflow(0, true)); + return workflowList; + } + + + private Set<String> getSupportedSortFields() { + return ImmutableSet.of(SORT_FIELD_NAME); + } }
\ No newline at end of file diff --git a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/api/WorkflowVersionControllerTest.java b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/api/WorkflowVersionControllerTest.java index 75b132ad..ee9a56c8 100644 --- a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/api/WorkflowVersionControllerTest.java +++ b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/api/WorkflowVersionControllerTest.java @@ -25,7 +25,6 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.onap.sdc.workflow.RestPath; -import org.onap.sdc.workflow.api.types.VersionRequestDto; import org.onap.sdc.workflow.persistence.types.WorkflowVersion; import org.onap.sdc.workflow.services.WorkflowVersionManager; import org.openecomp.sdc.versioning.dao.types.Version; @@ -62,28 +61,28 @@ public class WorkflowVersionControllerTest { @Test public void shouldReturnWorkflowVersionListWhenCallingVersionGetREST() throws Exception { - doReturn(versionList).when(workflowVersionManagerMock).list(ITEM1_ID); + doReturn(versionList).when(workflowVersionManagerMock).list(ITEM1_ID, null); mockMvc.perform(get(RestPath.getWorkflowVersions(ITEM1_ID)).header(RestConstants.USER_ID_HEADER_PARAM, USER_ID) .contentType(APPLICATION_JSON)).andExpect(status().isOk()) .andExpect(jsonPath("$.results", hasSize(2))) .andExpect(jsonPath("$.results[0].id", equalTo(VERSION1_ID))) .andExpect(jsonPath("$.results[1].id", equalTo(VERSION2_ID))); - verify(workflowVersionManagerMock, times(1)).list(ITEM1_ID); + verify(workflowVersionManagerMock, times(1)).list(ITEM1_ID, null); } @Test public void shouldCreateWorkflowVersionWhenCallingVersionsPostREST() throws Exception { - VersionRequestDto version = new VersionRequestDto(); + WorkflowVersion version = new WorkflowVersion(); version.setDescription("VersionDescription"); mockMvc.perform(post(RestPath.getWorkflowVersions(ITEM1_ID)).header(RestConstants.USER_ID_HEADER_PARAM, USER_ID) .contentType(APPLICATION_JSON) .content(GSON.toJson(version))) .andExpect(status().isCreated()); - verify(workflowVersionManagerMock, times(1)).create(ITEM1_ID, version); + verify(workflowVersionManagerMock, times(1)).create(ITEM1_ID, null, version); } diff --git a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/persistence/impl/ArtifactRepositoryTest.java b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/persistence/impl/ArtifactRepositoryTest.java index 4bec8b97..b86b14b9 100644 --- a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/persistence/impl/ArtifactRepositoryTest.java +++ b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/persistence/impl/ArtifactRepositoryTest.java @@ -1,15 +1,40 @@ package org.onap.sdc.workflow.persistence.impl; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.isNull; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.verify; +import static org.openecomp.core.zusammen.api.ZusammenUtil.buildStructuralElement; + +import com.amdocs.zusammen.adaptor.inbound.api.types.item.Element; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement; +import com.amdocs.zusammen.datatypes.Id; +import com.amdocs.zusammen.datatypes.SessionContext; +import com.amdocs.zusammen.datatypes.item.Action; +import com.amdocs.zusammen.datatypes.item.ElementContext; import java.io.IOException; +import java.io.InputStream; +import java.util.Optional; +import org.apache.commons.io.IOUtils; +import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; +import org.onap.sdc.workflow.persistence.types.ArtifactEntity; +import org.onap.sdc.workflow.persistence.types.WorkflowElementType; import org.openecomp.core.zusammen.api.ZusammenAdaptor; +import org.openecomp.sdc.common.session.SessionContextProviderFactory; +@RunWith(MockitoJUnitRunner.class) public class ArtifactRepositoryTest { private static final String FILE_NAME_PROPERTY = "fileName"; - private static final String EMPTY_DATA = "{}"; + private static final String FILE_NAME = "fileName.txt"; private static final String ITEM1_ID = "item_id_1"; private static final String VERSION1_ID = "version_id_1"; @@ -20,10 +45,55 @@ public class ArtifactRepositoryTest { @InjectMocks private ArtifactRepositoryImpl artifactRepository; + @Before + public void setUp() { + SessionContextProviderFactory.getInstance().createInterface().create("test_user", "workflow"); + } + @Test public void shouldUpdateArtifact() throws IOException { + InputStream inputStreamMock = IOUtils.toInputStream("some test data for my input stream", "UTF-8"); + ArtifactEntity artifactMock = new ArtifactEntity(FILE_NAME, inputStreamMock); + + artifactRepository.update(ITEM1_ID, VERSION1_ID, artifactMock); + verify(zusammenAdaptorMock) + .saveElement(any(SessionContext.class), any(ElementContext.class), any(ZusammenElement.class), + eq("Update WorkflowVersion Artifact Element")); } + @Test + public void shouldGetArtifactWhenExist() throws IOException { + + ZusammenElement artifactElement = buildStructuralElement(WorkflowElementType.ARTIFACT.name(), Action.UPDATE); + artifactElement.setData(IOUtils.toInputStream("some test data for my input stream", "UTF-8")); + artifactElement.getInfo().addProperty(FILE_NAME_PROPERTY, FILE_NAME); + Optional<Element> elementOptional = Optional.of(artifactElement); + + doReturn(elementOptional).when(zusammenAdaptorMock) + .getElementByName(any(SessionContext.class), any(ElementContext.class), isNull(Id.class), + eq(WorkflowElementType.ARTIFACT.name())); + + Optional<ArtifactEntity> result = artifactRepository.get(ITEM1_ID, VERSION1_ID); + assertTrue(result.isPresent()); + assertEquals(FILE_NAME,result.get().getFileName()); + verify(zusammenAdaptorMock).getElementByName(any(SessionContext.class), any(ElementContext.class), isNull(Id.class), + eq(WorkflowElementType.ARTIFACT.name())); + } + + @Test + public void shouldCreateArtifactStructure() { + artifactRepository.createStructure(ITEM1_ID, VERSION1_ID); + verify(zusammenAdaptorMock) + .saveElement(any(SessionContext.class), any(ElementContext.class), any(ZusammenElement.class), + eq("Create WorkflowVersion Artifact Element")); + } + + @Test + public void shouldDeleteArtifact(){ + artifactRepository.delete(ITEM1_ID,VERSION1_ID); + verify(zusammenAdaptorMock).saveElement(any(SessionContext.class), any(ElementContext.class), any(ZusammenElement.class), + eq("Delete WorkflowVersion Artifact Data")); + } } diff --git a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/persistence/impl/ParameterRepositoryTest.java b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/persistence/impl/ParameterRepositoryTest.java new file mode 100644 index 00000000..07a42658 --- /dev/null +++ b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/persistence/impl/ParameterRepositoryTest.java @@ -0,0 +1,166 @@ +package org.onap.sdc.workflow.persistence.impl; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.verify; + +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement; +import com.amdocs.zusammen.datatypes.Id; +import com.amdocs.zusammen.datatypes.SessionContext; +import com.amdocs.zusammen.datatypes.item.ElementContext; +import com.amdocs.zusammen.datatypes.item.Info; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mapstruct.ap.internal.util.Collections; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnitRunner; +import org.onap.sdc.workflow.persistence.types.ParameterEntity; +import org.onap.sdc.workflow.persistence.types.ParameterPropertyName; +import org.onap.sdc.workflow.persistence.types.ParameterRole; +import org.onap.sdc.workflow.persistence.types.ParameterType; +import org.onap.sdc.workflow.persistence.types.WorkflowElementType; +import org.openecomp.core.zusammen.api.ZusammenAdaptor; +import org.openecomp.sdc.common.session.SessionContextProviderFactory; + +@RunWith(MockitoJUnitRunner.class) +public class ParameterRepositoryTest { + + private static final String ITEM1_ID = "item_id_1"; + private static final String VERSION1_ID = "version_id_1"; + private static final String PARAMETER1_ID = "parameter_id_1"; + private static final String PARAMETER2_ID = "parameter_id_2"; + private static final String PARAMETERS_PARENT_ID = "parameters_id"; + + + @Mock + private ZusammenAdaptor zusammenAdaptorMock; + @Spy + @InjectMocks + private ParameterRepositoryImpl parameterRepository; + + @Before + public void setUp() { + SessionContextProviderFactory.getInstance().createInterface().create("test_user", "workflow"); + } + + @Test + public void shouldGetParameterById() { + + ElementInfo element = new ElementInfo(); + element.setId(new Id(PARAMETER1_ID)); + Info info = new Info(); + info.setName("testInput"); + info.addProperty(ParameterPropertyName.TYPE.name(), ParameterType.FLOAT.name()); + info.addProperty(ParameterPropertyName.mandatory.name(), true); + element.setInfo(info); + doReturn(Optional.of(element)).when(zusammenAdaptorMock) + .getElementInfo(any(SessionContext.class), any(ElementContext.class), + eq(new Id(PARAMETER1_ID))); + ParameterEntity result = parameterRepository.get(ITEM1_ID, VERSION1_ID, PARAMETER1_ID); + verify(zusammenAdaptorMock) + .getElementInfo(any(SessionContext.class), any(ElementContext.class), eq(new Id(PARAMETER1_ID))); + assertEquals("testInput", result.getName()); + + } + + + @Test + public void shouldUpdateParameter() { + ParameterEntity parameterEntityToUpdate = new ParameterEntity(); + parameterEntityToUpdate.setId(PARAMETER1_ID); + parameterEntityToUpdate.setName("Input1"); + parameterEntityToUpdate.setMandatory(true); + parameterEntityToUpdate.setType(ParameterType.STRING); + + parameterRepository.update(ITEM1_ID, VERSION1_ID, ParameterRole.INPUT, parameterEntityToUpdate); + verify(zusammenAdaptorMock) + .saveElement(any(SessionContext.class), any(ElementContext.class), any(ZusammenElement.class), + eq("Update WorkflowVersion Parameter")); + + } + + @Test + public void shouldCreateParameterStructure() { + parameterRepository.createStructure(ITEM1_ID, VERSION1_ID); + verify(zusammenAdaptorMock) + .saveElement(any(SessionContext.class), any(ElementContext.class), any(ZusammenElement.class), + eq("Create WorkflowVersion INPUTS Element")); + verify(zusammenAdaptorMock) + .saveElement(any(SessionContext.class), any(ElementContext.class), any(ZusammenElement.class), + eq("Create WorkflowVersion OUTPUTS Element")); + } + + @Test + public void shouldDeleteParameter() { + parameterRepository.delete(ITEM1_ID, VERSION1_ID, PARAMETER1_ID); + verify(zusammenAdaptorMock) + .saveElement(any(SessionContext.class), any(ElementContext.class), any(ZusammenElement.class), + eq("Delete Parameter with id parameter_id_1")); + } + + + @Test + public void shouldListParametersByType() { + + ElementInfo parameter1 = new ElementInfo(); + parameter1.setId(new Id(PARAMETER1_ID)); + Info info1 = new Info(); + info1.setName("input1"); + info1.addProperty(ParameterPropertyName.TYPE.name(), "INTEGER"); + info1.addProperty(ParameterPropertyName.mandatory.name(), true); + parameter1.setInfo(info1); + ElementInfo parameter2 = new ElementInfo(); + parameter2.setId(new Id(PARAMETER2_ID)); + Info info2 = new Info(); + info2.setName("input2"); + info2.addProperty(ParameterPropertyName.TYPE.name(), "STRING"); + info2.addProperty(ParameterPropertyName.mandatory.name(), false); + parameter2.setInfo(info2); + Collection<ElementInfo> parameters = Collections.asSet(parameter1, parameter2); + doReturn(parameters).when(zusammenAdaptorMock) + .listElementsByName(any(SessionContext.class), any(ElementContext.class), isNull(), + eq(WorkflowElementType.INPUTS.name())); + Collection<ParameterEntity> results = parameterRepository.list(ITEM1_ID, VERSION1_ID, ParameterRole.INPUT); + + verify(zusammenAdaptorMock).listElementsByName(any(SessionContext.class), any(ElementContext.class), isNull(), + eq(WorkflowElementType.INPUTS.name())); + assertTrue(results.stream().anyMatch(parameterEntity -> parameterEntity.getId().equals(PARAMETER1_ID))); + assertTrue(results.stream().anyMatch(parameterEntity -> parameterEntity.getId().equals(PARAMETER2_ID))); + } + + @Test + public void shouldDeleteAllParametersByType() { + ElementInfo parameterParentElement = new ElementInfo(); + parameterParentElement.setId(new Id(PARAMETERS_PARENT_ID)); + ElementInfo parameter1 = new ElementInfo(); + parameter1.setId(new Id(PARAMETER1_ID)); + ElementInfo parameter2 = new ElementInfo(); + parameter2.setId(new Id(PARAMETER2_ID)); + parameterParentElement.setSubElements(new ArrayList<>()); + parameterParentElement.getSubElements().add(parameter1); + parameterParentElement.getSubElements().add(parameter2); + + Optional<ElementInfo> elementOptional = Optional.of(parameterParentElement); + + doReturn(elementOptional).when(zusammenAdaptorMock) + .getElementInfoByName(any(SessionContext.class), any(ElementContext.class), isNull(), + eq(WorkflowElementType.INPUTS.name())); + + parameterRepository.deleteAll(ITEM1_ID, VERSION1_ID, ParameterRole.INPUT); + verify(zusammenAdaptorMock) + .saveElement(any(SessionContext.class), any(ElementContext.class), any(ZusammenElement.class), + eq("Delete all INPUT")); + } + +} diff --git a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/services/impl/WorkflowManagerImplTest.java b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/services/impl/WorkflowManagerImplTest.java index 17037d9b..0105fe83 100644 --- a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/services/impl/WorkflowManagerImplTest.java +++ b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/services/impl/WorkflowManagerImplTest.java @@ -1,62 +1,107 @@ package org.onap.sdc.workflow.services.impl; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.onap.sdc.workflow.TestUtil.createItem; import static org.onap.sdc.workflow.TestUtil.createWorkflow; +import static org.onap.sdc.workflow.api.RestConstants.SORT_FIELD_NAME; +import static org.openecomp.sdc.versioning.dao.types.VersionStatus.Certified; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; import java.util.List; -import org.junit.Before; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.onap.sdc.workflow.persistence.types.Workflow; +import org.onap.sdc.workflow.persistence.types.WorkflowVersionState; import org.onap.sdc.workflow.services.UniqueValueService; import org.onap.sdc.workflow.services.exceptions.EntityNotFoundException; +import org.onap.sdc.workflow.services.impl.mappers.VersionStateMapper; import org.onap.sdc.workflow.services.impl.mappers.WorkflowMapper; import org.openecomp.sdc.versioning.ItemManager; import org.openecomp.sdc.versioning.types.Item; import org.openecomp.sdc.versioning.types.ItemStatus; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) public class WorkflowManagerImplTest { - private static final String ITEM1_ID = "workflowId1"; + private static final String ITEM1_ID = "1"; private static final String WORKFLOW_TYPE = "WORKFLOW"; private static final String WORKFLOW_NAME_UNIQUE_TYPE = "WORKFLOW_NAME"; - private List<Item> itemList; - - @Mock - private WorkflowMapper workflowMapperMock; + private static final List<Item> ITEMS; + private static final List<Workflow> MAPPED_WORKFLOWS; + + static { + List<Item> items = new ArrayList<>(); + List<Workflow> mappedWorkflows = new ArrayList<>(); + for (int i = 1; i < 6; i++) { + items.add(createItem(i, true, true)); + mappedWorkflows.add(createWorkflow(i, true)); + } + ITEMS = Collections.unmodifiableList(items); + MAPPED_WORKFLOWS = Collections.unmodifiableList(mappedWorkflows); + } @Mock private ItemManager itemManagerMock; - @Mock private UniqueValueService uniqueValueServiceMock; - + @Mock + private WorkflowMapper workflowMapperMock; + @Mock + private VersionStateMapper versionStateMapperMock; @InjectMocks private WorkflowManagerImpl workflowManager; - - @Before - public void setUp() { - itemList = Arrays.asList(createItem(1, true, true), createItem(2, true, true), createItem(3, true, true)); - - } - - @Test public void shouldReturnWorkflowVersionList() { + doReturn(ITEMS).when(itemManagerMock).list(any()); + for (int i = 0; i < ITEMS.size(); i++) { + doReturn(MAPPED_WORKFLOWS.get(i)).when(workflowMapperMock).itemToWorkflow(ITEMS.get(i)); + } + Collection<Workflow> workflows = + workflowManager.list(null, createPageRequest(20, 0, Sort.Direction.ASC, SORT_FIELD_NAME)); + + Map<String, Workflow> workflowById = + workflows.stream().collect(Collectors.toMap(Workflow::getId, Function.identity())); + assertEquals(ITEMS.size(), workflows.size()); + for (int i = 1; i < ITEMS.size() + 1; i++) { + assertTrue(workflowById.containsKey(String.valueOf(i))); + } + } - doReturn(itemList).when(itemManagerMock).list(WorkflowManagerImpl.ITEM_PREDICATE); - workflowManager.list(); - verify(itemManagerMock).list(WorkflowManagerImpl.ITEM_PREDICATE); + @Test + public void listWithVersionStateFilter() { + doReturn(Certified).when(versionStateMapperMock) + .workflowVersionStateToVersionStatus(WorkflowVersionState.CERTIFIED); + doReturn(Arrays.asList(ITEMS.get(0), ITEMS.get(2))).when(itemManagerMock).list(any()); + doReturn(MAPPED_WORKFLOWS.get(0)).when(workflowMapperMock).itemToWorkflow(ITEMS.get(0)); + doReturn(MAPPED_WORKFLOWS.get(2)).when(workflowMapperMock).itemToWorkflow(ITEMS.get(2)); + + Collection<Workflow> workflows = workflowManager.list(Collections.singleton(WorkflowVersionState.CERTIFIED), + createPageRequest(20, 0, Sort.Direction.ASC, SORT_FIELD_NAME)); + + Map<String, Workflow> workflowById = + workflows.stream().collect(Collectors.toMap(Workflow::getId, Function.identity())); + assertEquals(2, workflows.size()); + assertTrue(workflowById.containsKey("1")); + assertTrue(workflowById.containsKey("3")); } @Test(expected = EntityNotFoundException.class) @@ -76,8 +121,6 @@ public class WorkflowManagerImplTest { workflowManager.get(workflow); verify(itemManagerMock).get(ITEM1_ID); verify(workflowMapperMock).itemToWorkflow(retrievedItem); - - } @Test @@ -116,4 +159,82 @@ public class WorkflowManagerImplTest { workflowManager.update(createWorkflow(1, true)); } + @Test + public void shouldListAllWorkflowsWhenLimitAndOffsetAreValid() { + PageRequest pageRequest = createPageRequest(5, 0, Sort.Direction.ASC, SORT_FIELD_NAME); + doReturn(ITEMS).when(itemManagerMock).list(any()); + for (int i = 0; i < ITEMS.size(); i++) { + doReturn(MAPPED_WORKFLOWS.get(i)).when(workflowMapperMock).itemToWorkflow(ITEMS.get(i)); + } + Assert.assertEquals(5, workflowManager.list(null, pageRequest).size()); + } + + @Test + public void shouldListLimitFilteredWorkflowsInFirstOffsetRange() { + PageRequest pageRequest = createPageRequest(3, 0, Sort.Direction.ASC, SORT_FIELD_NAME); + doReturn(ITEMS).when(itemManagerMock).list(any()); + for (int i = 0; i < ITEMS.size(); i++) { + doReturn(MAPPED_WORKFLOWS.get(i)).when(workflowMapperMock).itemToWorkflow(ITEMS.get(i)); + } + Assert.assertEquals(3, workflowManager.list(null, pageRequest).size()); + } + + @Test + public void shouldListLimitFilteredWorkflowsInSecondOffsetRange() { + PageRequest pageRequest = createPageRequest(3, 1, Sort.Direction.ASC, SORT_FIELD_NAME); + doReturn(ITEMS).when(itemManagerMock).list(any()); + for (int i = 0; i < ITEMS.size(); i++) { + doReturn(MAPPED_WORKFLOWS.get(i)).when(workflowMapperMock).itemToWorkflow(ITEMS.get(i)); + } + Assert.assertEquals(2, workflowManager.list(null, pageRequest).size()); + } + + @Test + public void shouldListAllWorkflowsWhenLimitGreaterThanTotalRecordsAndOffsetInRange() { + PageRequest pageRequest = createPageRequest(10, 0, Sort.Direction.ASC, SORT_FIELD_NAME); + doReturn(ITEMS).when(itemManagerMock).list(any()); + for (int i = 0; i < ITEMS.size(); i++) { + doReturn(MAPPED_WORKFLOWS.get(i)).when(workflowMapperMock).itemToWorkflow(ITEMS.get(i)); + } + Assert.assertEquals(5, workflowManager.list(null, pageRequest).size()); + } + + @Test + public void shouldNotListWorkflowsIfOffsetGreaterThanTotalRecords() { + PageRequest pageRequest = createPageRequest(3, 6, Sort.Direction.ASC, SORT_FIELD_NAME); + doReturn(ITEMS).when(itemManagerMock).list(any()); + for (int i = 0; i < ITEMS.size(); i++) { + doReturn(MAPPED_WORKFLOWS.get(i)).when(workflowMapperMock).itemToWorkflow(ITEMS.get(i)); + } + Assert.assertEquals(0, workflowManager.list(null, pageRequest).size()); + } + + @Test + public void shouldNotListWorkflowsBothLimitAndOffsetGreaterThanTotalRecords() { + PageRequest pageRequest = createPageRequest(10, 10, Sort.Direction.ASC, SORT_FIELD_NAME); + doReturn(ITEMS).when(itemManagerMock).list(any()); + for (int i = 0; i < ITEMS.size(); i++) { + doReturn(MAPPED_WORKFLOWS.get(i)).when(workflowMapperMock).itemToWorkflow(ITEMS.get(i)); + } + Assert.assertEquals(0, workflowManager.list(null, pageRequest).size()); + } + + @Test + public void shouldListLimitOffsetAppliedWorkflowsSortedInDescOrder() { + PageRequest pageRequest = createPageRequest(2, 1, Sort.Direction.DESC, SORT_FIELD_NAME); + doReturn(ITEMS).when(itemManagerMock).list(any()); + for (int i = 0; i < ITEMS.size(); i++) { + doReturn(MAPPED_WORKFLOWS.get(i)).when(workflowMapperMock).itemToWorkflow(ITEMS.get(i)); + } + Collection<Workflow> workflows = workflowManager.list(null, pageRequest); + Assert.assertEquals(2, workflows.size()); + Iterator<Workflow> workflowIterator = workflows.iterator(); + Assert.assertEquals("Workflow_3", workflowIterator.next().getName()); + Assert.assertEquals("Workflow_2", workflowIterator.next().getName()); + } + + private PageRequest createPageRequest(int limit, int offset, Sort.Direction sortOrder, String sortField) { + return PageRequest.of(offset, limit, sortOrder, sortField); + } + }
\ No newline at end of file diff --git a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/services/impl/WorkflowVersionManagerImplTest.java b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/services/impl/WorkflowVersionManagerImplTest.java index 144db81e..7dee5245 100644 --- a/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/services/impl/WorkflowVersionManagerImplTest.java +++ b/workflow/workflow-designer-be/src/test/java/org/onap/sdc/workflow/services/impl/WorkflowVersionManagerImplTest.java @@ -1,9 +1,10 @@ package org.onap.sdc.workflow.services.impl; import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.times; @@ -13,9 +14,9 @@ import static org.onap.sdc.workflow.persistence.types.WorkflowVersionState.DRAFT import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Optional; import org.apache.commons.io.IOUtils; @@ -25,10 +26,12 @@ import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatcher; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; -import org.onap.sdc.workflow.api.types.VersionRequestDto; import org.onap.sdc.workflow.persistence.ArtifactRepository; +import org.onap.sdc.workflow.persistence.ParameterRepository; import org.onap.sdc.workflow.persistence.types.ArtifactEntity; +import org.onap.sdc.workflow.persistence.types.ParameterRole; import org.onap.sdc.workflow.persistence.types.WorkflowVersion; import org.onap.sdc.workflow.persistence.types.WorkflowVersionState; import org.onap.sdc.workflow.services.exceptions.EntityNotFoundException; @@ -52,11 +55,14 @@ public class WorkflowVersionManagerImplTest { @Mock private VersioningManager versioningManagerMock; @Mock + private ParameterRepository parameterRepositoryMock; + @Mock private ArtifactRepository artifactRepositoryMock; @Mock private VersionMapper versionMapperMock; @Mock private VersionStateMapper versionStateMapperMock; + @Spy @InjectMocks private WorkflowVersionManagerImpl workflowVersionManager; @@ -70,29 +76,27 @@ public class WorkflowVersionManagerImplTest { @Test public void shouldReturnWorkflowVersionWhenExist() { Version version = new Version(VERSION1_ID); - doReturn(version).when(versioningManagerMock).get(ITEM1_ID, version); - workflowVersionManager.get(ITEM1_ID, VERSION1_ID); - verify(versioningManagerMock).get(ITEM1_ID, version); + WorkflowVersion workflowVersion = new WorkflowVersion(VERSION1_ID); + doReturn(workflowVersion).when(versionMapperMock).versionToWorkflowVersion(any(Version.class)); + doReturn(version).when(versioningManagerMock).get(eq(ITEM1_ID),any(Version.class)); + doReturn(new ArrayList()).when(parameterRepositoryMock).list(eq(ITEM1_ID), eq(VERSION1_ID), any(ParameterRole.class)); + workflowVersionManager.get(ITEM1_ID,VERSION1_ID); + verify(versioningManagerMock).get(ITEM1_ID,version); } @Test public void shouldReturnWorkflowVersionList() { List<Version> versionList = Arrays.asList(new Version(VERSION1_ID), new Version(VERSION2_ID)); - versionList.forEach(version -> { - version.setBaseId("baseVersionId"); - version.setDescription("Version description"); - version.setName("name"); - version.setCreationTime(new Date()); - version.setModificationTime(new Date()); - }); doReturn(versionList).when(versioningManagerMock).list(ITEM1_ID); - workflowVersionManager.list(ITEM1_ID); + doReturn(new WorkflowVersion()).when(versionMapperMock).versionToWorkflowVersion(any(Version.class)); + workflowVersionManager.list(ITEM1_ID, null); verify(versioningManagerMock).list(ITEM1_ID); verify(versionMapperMock, times(2)).versionToWorkflowVersion(any(Version.class)); } @Test public void shouldUpdateWorkflowVersion() { + String updatedDescription = "WorkflowVersion description updated"; Version retrievedVersion = new Version(VERSION1_ID); retrievedVersion.setName("1.0"); retrievedVersion.setDescription("WorkflowVersion description"); @@ -102,11 +106,13 @@ public class WorkflowVersionManagerImplTest { WorkflowVersion inputVersion = new WorkflowVersion(VERSION1_ID); inputVersion.setName("1.0"); - inputVersion.setDescription("WorkflowVersion description updated"); + inputVersion.setDescription(updatedDescription); + inputVersion.setInputs(new ArrayList<>()); + inputVersion.setOutputs(new ArrayList<>()); Version mappedInputVersion = new Version(VERSION1_ID); mappedInputVersion.setName("1.0"); - mappedInputVersion.setDescription("WorkflowVersion description updated"); + mappedInputVersion.setDescription(updatedDescription); doReturn(mappedInputVersion).when(versionMapperMock).workflowVersionToVersion(inputVersion); ArgumentCaptor<Version> versionArgCaptor = ArgumentCaptor.forClass(Version.class); @@ -115,34 +121,37 @@ public class WorkflowVersionManagerImplTest { verify(versioningManagerMock).updateVersion(eq(ITEM1_ID), versionArgCaptor.capture()); Version captorVersion = versionArgCaptor.getValue(); assertEquals("1.0", captorVersion.getName()); - assertEquals("WorkflowVersion description updated", captorVersion.getDescription()); + assertEquals(updatedDescription, captorVersion.getDescription()); assertEquals(VersionStatus.Draft, captorVersion.getStatus()); verify(versioningManagerMock).publish(ITEM1_ID, mappedInputVersion, "Update version"); } + @Test - public void shouldCreateWorkflowVersion() { + public void shouldCreateWorkflowVersion(){ Version version = new Version(VERSION1_ID); version.setDescription("version desc"); - doReturn(version).when(versioningManagerMock).create(ITEM1_ID, version, VersionCreationMethod.major); - VersionRequestDto workflowVersion = new VersionRequestDto(); - workflowVersion.setDescription("version desc"); - workflowVersionManager.create(ITEM1_ID, workflowVersion); - verify(versioningManagerMock).create(ITEM1_ID, version, VersionCreationMethod.major); - + doReturn(version).when(versioningManagerMock).create(ITEM1_ID,version, VersionCreationMethod.major); + WorkflowVersion versionRequest = new WorkflowVersion(); + versionRequest.setDescription("version desc"); + versionRequest.setInputs(new ArrayList<>()); + versionRequest.setOutputs(new ArrayList<>()); + WorkflowVersion workflowVersion = new WorkflowVersion(VERSION1_ID); + doReturn(workflowVersion).when(workflowVersionManager).get(ITEM1_ID,VERSION1_ID); + workflowVersionManager.create(ITEM1_ID, null, versionRequest); + verify(versioningManagerMock).create(ITEM1_ID,version, VersionCreationMethod.major); } @Test(expected = VersionCreationException.class) public void shouldTrowExceptionWhenDraftVersionExists() { - VersionRequestDto versionRequestDto = new VersionRequestDto(); - versionRequestDto.setBaseVersionId(VERSION2_ID); + WorkflowVersion versionRequestDto = new WorkflowVersion(); Version baseVersion = new Version(VERSION2_ID); baseVersion.setStatus(VersionStatus.Draft); List<Version> versions = Collections.singletonList(baseVersion); doReturn(versions).when(versioningManagerMock).list(ITEM1_ID); - workflowVersionManager.create(ITEM1_ID, versionRequestDto); + workflowVersionManager.create(ITEM1_ID, VERSION2_ID, versionRequestDto); } @Test(expected = EntityNotFoundException.class) @@ -184,6 +193,8 @@ public class WorkflowVersionManagerImplTest { version.setStatus(VersionStatus.Certified); doReturn(version).when(versioningManagerMock).get(eq(ITEM1_ID), eqVersion(VERSION1_ID)); doReturn(CERTIFIED).when(versionStateMapperMock).versionStatusToWorkflowVersionState(version.getStatus()); + doThrow(new RuntimeException()).when(versioningManagerMock) + .submit(eq(ITEM1_ID), eqVersion(VERSION1_ID), anyString()); workflowVersionManager.updateState(ITEM1_ID, VERSION1_ID, CERTIFIED); } @@ -194,15 +205,10 @@ public class WorkflowVersionManagerImplTest { retrievedVersion.setStatus(VersionStatus.Draft); doReturn(retrievedVersion).when(versioningManagerMock).get(eq(ITEM1_ID), eqVersion(VERSION1_ID)); doReturn(DRAFT).when(versionStateMapperMock).versionStatusToWorkflowVersionState(VersionStatus.Draft); - doReturn(VersionStatus.Certified).when(versionStateMapperMock).workflowVersionStateToVersionStatus(CERTIFIED); - ArgumentCaptor<Version> versionArgCaptor = ArgumentCaptor.forClass(Version.class); workflowVersionManager.updateState(ITEM1_ID, VERSION1_ID, CERTIFIED); - verify(versioningManagerMock).updateVersion(eq(ITEM1_ID), versionArgCaptor.capture()); - assertEquals(VersionStatus.Certified, versionArgCaptor.getValue().getStatus()); - verify(versioningManagerMock) - .publish(eq(ITEM1_ID), eqVersion(VERSION1_ID), eq("Update version state from DRAFT to CERTIFIED")); + verify(versioningManagerMock).submit(eq(ITEM1_ID), eqVersion(VERSION1_ID), anyString()); } @Test diff --git a/workflow/workflow-designer-init/src/main/docker/start.sh b/workflow/workflow-designer-init/src/main/docker/start.sh index ac89d6c0..919277fd 100644 --- a/workflow/workflow-designer-init/src/main/docker/start.sh +++ b/workflow/workflow-designer-init/src/main/docker/start.sh @@ -1,11 +1,21 @@ #!/bin/sh -if [[ -z "${CS_USER}" ]]; then +is_cs_unauthenticated=1 +FALSE=0 +if [[ -z "${CS_AUTHENTICATE}" || "${CS_AUTHENTICATE}" == "false" ]]; then + is_cs_unauthenticated=$FALSE +fi + +if [ $is_cs_unauthenticated -eq $FALSE ]; then + echo "Establishing unsecured connection to Cassandra" +fi + +if [[ $is_cs_unauthenticated -eq 1 && -z "${CS_USER}" ]]; then echo "CS_USER environment variable must be set" exit 1 fi -if [[ -z "${CS_PASSWORD}" ]]; then +if [[ $is_cs_unauthenticated -eq 1 && -z "${CS_PASSWORD}" ]]; then echo "CS_PASSWORD environment variable must be set" exit 1 fi @@ -15,4 +25,9 @@ if [[ -z "${CS_HOST}" ]]; then exit 1 fi -cqlsh -u ${CS_USER} -p ${CS_PASSWORD} -f /create_workflow_db.cql ${CS_HOST} ${CS_PORT} +if [ $is_cs_unauthenticated -eq 1 ]; then + cqlsh -u ${CS_USER} -p ${CS_PASSWORD} -f /create_workflow_db.cql ${CS_HOST} ${CS_PORT} +else + cqlsh -f /create_workflow_db.cql ${CS_HOST} ${CS_PORT} +fi + |