diff options
author | DylanB95EST <dylan.byrne@est.tech> | 2021-07-02 13:30:42 +0100 |
---|---|---|
committer | DylanB95EST <dylan.byrne@est.tech> | 2021-08-03 16:47:24 +0100 |
commit | 4f4178c7af4ca5571a0813a5c79f35b11c825d35 (patch) | |
tree | 0167aaaf7f51498499acb572c8e7995474b9ac9f /cps-ncmp-service | |
parent | 15b93e7ad7db7372d51c4c1ad45f95d463aaaffc (diff) |
Implement DMI Registration (NCMP-Side)
Implementing registration of CM-Handles to NCMP from DMI
CM Handles are Written to fragment tables
Moved NetworkCmProxyDataServiceImplSpec.groovy as it was not in the same
package as the class it was testing. Meaning it didn't cover this when
it came to code coverage
Have included Json structure validation also within open api
Deprecating old API's along with old API Methods
Issue-ID: CPS-442
Change-Id: I819b9bf65280b1d968d3b75ca5ef2f9eb5617579
Signed-off-by: DylanB95EST <dylan.byrne@est.tech>
Diffstat (limited to 'cps-ncmp-service')
-rw-r--r-- | cps-ncmp-service/pom.xml | 16 | ||||
-rw-r--r-- | cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java | 8 | ||||
-rwxr-xr-x | cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java | 59 | ||||
-rw-r--r-- | cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/CmHandle.java | 40 | ||||
-rw-r--r-- | cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/DmiPluginRegistration.java | 39 | ||||
-rw-r--r-- | cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandle.java | 70 | ||||
-rw-r--r-- | cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandlesList.java | 36 | ||||
-rw-r--r-- | cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy (renamed from cps-ncmp-service/src/test/groovy/org/onap/cps/api/impl/NetworkCmProxyDataServiceImplSpec.groovy) | 49 | ||||
-rw-r--r-- | cps-ncmp-service/src/test/resources/application.yml | 22 |
9 files changed, 314 insertions, 25 deletions
diff --git a/cps-ncmp-service/pom.xml b/cps-ncmp-service/pom.xml index 7286fee708..c6bcc0afbe 100644 --- a/cps-ncmp-service/pom.xml +++ b/cps-ncmp-service/pom.xml @@ -46,5 +46,21 @@ <artifactId>spock-core</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.spockframework</groupId> + <artifactId>spock-spring</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.junit.vintage</groupId> + <artifactId>junit-vintage-engine</artifactId> + </exclusion> + </exclusions> + </dependency> </dependencies> </project> diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java index 8cf51c961a..6038ea4553 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java @@ -24,6 +24,7 @@ package org.onap.cps.ncmp.api; import java.util.Collection; import org.checkerframework.checker.nullness.qual.NonNull; +import org.onap.cps.ncmp.api.models.DmiPluginRegistration; import org.onap.cps.spi.FetchDescendantsOption; import org.onap.cps.spi.model.DataNode; @@ -98,4 +99,11 @@ public interface NetworkCmProxyDataService { */ void replaceNodeTree(@NonNull String cmHandle, @NonNull String parentNodeXpath, @NonNull String jsonData); + /** + * Registration of New CM Handles. + * + * @param dmiPluginRegistration Dmi Plugin Registration + */ + void updateDmiPluginRegistration(DmiPluginRegistration dmiPluginRegistration); + } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java index fd85195428..f97ea029db 100755 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java @@ -22,27 +22,56 @@ package org.onap.cps.ncmp.api.impl; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import lombok.extern.slf4j.Slf4j; import org.onap.cps.api.CpsDataService; import org.onap.cps.api.CpsQueryService; import org.onap.cps.ncmp.api.NetworkCmProxyDataService; +import org.onap.cps.ncmp.api.models.CmHandle; +import org.onap.cps.ncmp.api.models.DmiPluginRegistration; +import org.onap.cps.ncmp.api.models.PersistenceCmHandle; +import org.onap.cps.ncmp.api.models.PersistenceCmHandlesList; import org.onap.cps.spi.FetchDescendantsOption; +import org.onap.cps.spi.exceptions.DataValidationException; import org.onap.cps.spi.model.DataNode; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +@Slf4j @Service public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService { private static final String NF_PROXY_DATASPACE_NAME = "NFP-Operational"; - @Autowired + private static final String NCMP_DATASPACE_NAME = "NCMP-Admin"; + + private static final String NCMP_ANCHOR_NAME = "ncmp-dmi-registry"; + + private static final String NCMP_DATA_TOP_PATH = "/dmi-registry"; + private CpsDataService cpsDataService; - @Autowired + private ObjectMapper objectMapper; + private CpsQueryService cpsQueryService; + /** + * Constructor Injection for Dependencies. + * @param cpsDataService Data Service Interface + * @param cpsQueryService Query Service Interface + * @param objectMapper Object Mapper + */ + public NetworkCmProxyDataServiceImpl(final CpsDataService cpsDataService, + final CpsQueryService cpsQueryService, final ObjectMapper objectMapper) { + this.cpsDataService = cpsDataService; + this.cpsQueryService = cpsQueryService; + this.objectMapper = objectMapper; + } + private String getDataspaceName() { return NF_PROXY_DATASPACE_NAME; } @@ -82,4 +111,28 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService public void replaceNodeTree(final String cmHandle, final String parentNodeXpath, final String jsonData) { cpsDataService.replaceNodeTree(getDataspaceName(), cmHandle, parentNodeXpath, jsonData); } + + @Override + public void updateDmiPluginRegistration(final DmiPluginRegistration dmiPluginRegistration) { + try { + final List<PersistenceCmHandle> persistenceCmHandles = + new ArrayList<>(); + for (final CmHandle cmHandle: dmiPluginRegistration.getCreatedCmHandles()) { + final PersistenceCmHandle persistenceCmHandle = new PersistenceCmHandle(); + persistenceCmHandle.setDmiServiceName(dmiPluginRegistration.getDmiPlugin()); + persistenceCmHandle.setId(cmHandle.getCmHandle()); + persistenceCmHandle.setAdditionalProperties(cmHandle.getCmHandleProperties()); + persistenceCmHandles.add(persistenceCmHandle); + } + final PersistenceCmHandlesList persistenceCmHandlesList = new PersistenceCmHandlesList(); + persistenceCmHandlesList.setCmHandles(persistenceCmHandles); + final String cmHandleJsonData = objectMapper.writeValueAsString(persistenceCmHandlesList); + cpsDataService.saveListNodeData(NCMP_DATASPACE_NAME, NCMP_ANCHOR_NAME, NCMP_DATA_TOP_PATH, + cmHandleJsonData); + } catch (final JsonProcessingException e) { + throw new DataValidationException( + "Parsing error occurred while processing DMI Plugin Registration" + dmiPluginRegistration, e + .getMessage(), e); + } + } } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/CmHandle.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/CmHandle.java new file mode 100644 index 0000000000..0d1c7693a6 --- /dev/null +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/CmHandle.java @@ -0,0 +1,40 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.ncmp.api.models; + +import java.util.Map; +import lombok.Getter; +import lombok.Setter; +import org.springframework.validation.annotation.Validated; + +/** + * CmHandle. + */ +@Validated +@Getter +@Setter +public class CmHandle { + + private String cmHandle; + + private Map<String, String> cmHandleProperties; + +} diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/DmiPluginRegistration.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/DmiPluginRegistration.java new file mode 100644 index 0000000000..4017c4a56e --- /dev/null +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/DmiPluginRegistration.java @@ -0,0 +1,39 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + + +package org.onap.cps.ncmp.api.models; + +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +/** + * DmiRegistry. + */ +@Getter +@Setter +public class DmiPluginRegistration { + + private String dmiPlugin; + + private List<CmHandle> createdCmHandles; + +} diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandle.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandle.java new file mode 100644 index 0000000000..a3f47040b3 --- /dev/null +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandle.java @@ -0,0 +1,70 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + + +package org.onap.cps.ncmp.api.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * DmiRegistry. + */ +@Getter +@Setter +@NoArgsConstructor +public class PersistenceCmHandle { + + private String id; + + @JsonProperty("dmi-service-name") + private String dmiServiceName; + + @JsonProperty("additional-properties") + private List<AdditionalProperty> additionalProperties; + + /** + * Set Additional Properties map, key and value pair. + * @param additionalPropertiesAsMap Map of Additional Properties + */ + public void setAdditionalProperties(final Map<String, String> additionalPropertiesAsMap) { + additionalProperties = new ArrayList<>(additionalPropertiesAsMap.size()); + for (final Map.Entry<String, String> entry : additionalPropertiesAsMap.entrySet()) { + additionalProperties.add(new AdditionalProperty(entry.getKey(), entry.getValue())); + } + } + + @AllArgsConstructor + private static class AdditionalProperty { + + @JsonProperty() + private final String name; + + @JsonProperty() + private final String value; + } + +} diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandlesList.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandlesList.java new file mode 100644 index 0000000000..95e8515d51 --- /dev/null +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandlesList.java @@ -0,0 +1,36 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.ncmp.api.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.ArrayList; +import java.util.List; + +public class PersistenceCmHandlesList { + + @JsonProperty("cm-handles") + private List<PersistenceCmHandle> cmHandles; + + public void setCmHandles(final List<PersistenceCmHandle> cmHandlesAsList) { + cmHandles = new ArrayList<>(cmHandlesAsList); + } + +} diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/api/impl/NetworkCmProxyDataServiceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy index ee435cc384..d3c67cd20c 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/api/impl/NetworkCmProxyDataServiceImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImplSpec.groovy @@ -18,52 +18,46 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ +package org.onap.cps.ncmp.api.impl -package org.onap.cps.api.impl - +import com.fasterxml.jackson.databind.ObjectMapper import org.onap.cps.api.CpsDataService import org.onap.cps.api.CpsQueryService -import org.onap.cps.ncmp.api.impl.NetworkCmProxyDataServiceImpl +import org.onap.cps.ncmp.api.models.CmHandle +import org.onap.cps.ncmp.api.models.DmiPluginRegistration import org.onap.cps.spi.FetchDescendantsOption import spock.lang.Specification class NetworkCmProxyDataServiceImplSpec extends Specification { - def objectUnderTest = new NetworkCmProxyDataServiceImpl() - def mockcpsDataService = Mock(CpsDataService) - def mockcpsQueryService = Mock(CpsQueryService) - def setup() { - objectUnderTest.cpsDataService = mockcpsDataService - objectUnderTest.cpsQueryService = mockcpsQueryService - } + def mockCpsDataService = Mock(CpsDataService) + def mockCpsQueryService = Mock(CpsQueryService) + def objectUnderTest = new NetworkCmProxyDataServiceImpl(mockCpsDataService, mockCpsQueryService, new ObjectMapper()) def cmHandle = 'some handle' def expectedDataspaceName = 'NFP-Operational' - def 'Query data nodes by cps path with #fetchDescendantsOption.'() { given: 'a cm Handle and a cps path' def cpsPath = '/cps-path' when: 'queryDataNodes is invoked' objectUnderTest.queryDataNodes(cmHandle, cpsPath, fetchDescendantsOption) then: 'the persistence service is called once with the correct parameters' - 1 * mockcpsQueryService.queryDataNodes(expectedDataspaceName, cmHandle, cpsPath, fetchDescendantsOption) + 1 * mockCpsQueryService.queryDataNodes(expectedDataspaceName, cmHandle, cpsPath, fetchDescendantsOption) where: 'all fetch descendants options are supported' fetchDescendantsOption << FetchDescendantsOption.values() } - def 'Create full data node: #scenario.'() { given: 'a cm handle and root xpath' def jsonData = 'some json' when: 'createDataNode is invoked' objectUnderTest.createDataNode(cmHandle, xpath, jsonData) then: 'the CPS service method is invoked once with the expected parameters' - 1 * mockcpsDataService.saveData(expectedDataspaceName, cmHandle, jsonData) + 1 * mockCpsDataService.saveData(expectedDataspaceName, cmHandle, jsonData) where: 'following parameters were used' scenario | xpath 'no xpath' | '' 'root level xpath' | '/' } - def 'Create child data node.'() { given: 'a cm handle and parent node xpath' def jsonData = 'some json' @@ -71,9 +65,8 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { when: 'createDataNode is invoked' objectUnderTest.createDataNode(cmHandle, xpath, jsonData) then: 'the CPS service method is invoked once with the expected parameters' - 1 * mockcpsDataService.saveData(expectedDataspaceName, cmHandle, xpath, jsonData) + 1 * mockCpsDataService.saveData(expectedDataspaceName, cmHandle, xpath, jsonData) } - def 'Add list-node elements.'() { given: 'a cm handle and parent node xpath' def jsonData = 'some json' @@ -81,9 +74,8 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { when: 'addListNodeElements is invoked' objectUnderTest.addListNodeElements(cmHandle, xpath, jsonData) then: 'the CPS service method is invoked once with the expected parameters' - 1 * mockcpsDataService.saveListNodeData(expectedDataspaceName, cmHandle, xpath, jsonData) + 1 * mockCpsDataService.saveListNodeData(expectedDataspaceName, cmHandle, xpath, jsonData) } - def 'Update data node leaves.'() { given: 'a cm Handle and a cps path' def xpath = '/xpath' @@ -91,9 +83,8 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { when: 'updateNodeLeaves is invoked' objectUnderTest.updateNodeLeaves(cmHandle, xpath, jsonData) then: 'the persistence service is called once with the correct parameters' - 1 * mockcpsDataService.updateNodeLeaves(expectedDataspaceName, cmHandle, xpath, jsonData) + 1 * mockCpsDataService.updateNodeLeaves(expectedDataspaceName, cmHandle, xpath, jsonData) } - def 'Replace data node tree.'() { given: 'a cm Handle and a cps path' def xpath = '/xpath' @@ -101,6 +92,20 @@ class NetworkCmProxyDataServiceImplSpec extends Specification { when: 'replaceNodeTree is invoked' objectUnderTest.replaceNodeTree(cmHandle, xpath, jsonData) then: 'the persistence service is called once with the correct parameters' - 1 * mockcpsDataService.replaceNodeTree(expectedDataspaceName, cmHandle, xpath, jsonData) + 1 * mockCpsDataService.replaceNodeTree(expectedDataspaceName, cmHandle, xpath, jsonData) + } + def 'Register CM Handle Event.'() { + given: 'a registration ' + def dmiPluginRegistration = new DmiPluginRegistration() + dmiPluginRegistration.dmiPlugin = 'my-server' + def cmHandle = new CmHandle() + cmHandle.cmHandle = '123' + cmHandle.cmHandleProperties = [ name1: 'value1', name2: 'value2'] + dmiPluginRegistration.createdCmHandles = [ cmHandle ] + def expectedJsonData = '{"cm-handles":[{"id":"123","dmi-service-name":"my-server","additional-properties":[{"name":"name1","value":"value1"},{"name":"name2","value":"value2"}]}]}' + when: 'registration is updated' + objectUnderTest.updateDmiPluginRegistration(dmiPluginRegistration) + then: 'the CPS service method is invoked once with the expected parameters' + 1 * mockCpsDataService.saveListNodeData('NCMP-Admin', 'ncmp-dmi-registry', '/dmi-registry', expectedJsonData) } } diff --git a/cps-ncmp-service/src/test/resources/application.yml b/cps-ncmp-service/src/test/resources/application.yml new file mode 100644 index 0000000000..8ffb8827f7 --- /dev/null +++ b/cps-ncmp-service/src/test/resources/application.yml @@ -0,0 +1,22 @@ +# ============LICENSE_START======================================================= +# Copyright (C) 2021 Nordix Foundation +# ================================================================================ +# 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. +# +# SPDX-License-Identifier: Apache-2.0 +# ============LICENSE_END========================================================= + +rest: + api: + ncmp-base-path: /cps-ncmp/api +spring: |