summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cps-ncmp-rest/docs/openapi/components.yaml2
-rwxr-xr-xcps-ncmp-rest/docs/openapi/ncmp.yml2
-rw-r--r--cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyRestExceptionHandler.java5
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NcmpResponseStatus.java4
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/exceptions/CmHandleNotFoundException.java38
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java6
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java4
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistence.java6
-rw-r--r--cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImpl.java8
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServicePropertyHandlerSpec.groovy6
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy8
-rw-r--r--cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy7
-rw-r--r--cps-ncmp-service/src/test/resources/dataOperationResponseEvent.json2
-rw-r--r--cps-rest/docs/openapi/cpsQueryV2.yml10
-rw-r--r--cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java28
-rw-r--r--cps-rest/src/test/groovy/org/onap/cps/rest/controller/QueryRestControllerSpec.groovy55
-rw-r--r--cps-service/src/main/java/org/onap/cps/utils/XmlFileUtils.java46
-rw-r--r--cps-service/src/test/groovy/org/onap/cps/utils/XmlFileUtilsSpec.groovy34
-rw-r--r--docs/api/swagger/cps/openapi.yaml18
-rw-r--r--docs/api/swagger/ncmp/openapi-inventory.yaml6
-rw-r--r--docs/api/swagger/ncmp/openapi.yaml12
-rw-r--r--docs/ncmp-cmhandle-querying.rst17
-rw-r--r--docs/ncmp-data-operation.rst4
23 files changed, 227 insertions, 101 deletions
diff --git a/cps-ncmp-rest/docs/openapi/components.yaml b/cps-ncmp-rest/docs/openapi/components.yaml
index e564c6b0cf..637a1386f4 100644
--- a/cps-ncmp-rest/docs/openapi/components.yaml
+++ b/cps-ncmp-rest/docs/openapi/components.yaml
@@ -516,7 +516,7 @@ components:
outputAlternateIdOptionInQuery:
name: outputAlternateId
in: query
- description: Boolean parameter to determine if returned value(s) will be cm handle Ids or alternate Ids for a given query
+ description: Boolean parameter to determine if returned value(s) will be cm handle ids or alternate ids for a given query
required: false
schema:
type: boolean
diff --git a/cps-ncmp-rest/docs/openapi/ncmp.yml b/cps-ncmp-rest/docs/openapi/ncmp.yml
index 4624bc1060..15b8b37231 100755
--- a/cps-ncmp-rest/docs/openapi/ncmp.yml
+++ b/cps-ncmp-rest/docs/openapi/ncmp.yml
@@ -417,7 +417,7 @@ getCmHandleStateById:
searchCmHandleIds:
post:
- description: Execute cm handle query search and return a list of cm handle references. Any number of conditions can be applied. To be included in the result a cm-handle must fulfill ALL the conditions. An empty collection will be returned in the case that the cm handle does not match a condition. For more on cm handle query search please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/ncmp-cmhandle-querying.html">cm handle query search Read the Docs</a>.<br/>By supplying a CPS Path it is possible to query on any data related to the cm handle. For more on CPS Path please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html">CPS Path Read the Docs</a>. The cm handle ancestor is automatically returned for this query.
+ description: Execute cm handle query search and return a list of cm handle references. Any number of conditions can be applied. To be included in the result a cm handle must fulfill ALL the conditions. An empty collection will be returned in the case that the cm handle does not match a condition. For more on cm handle query search please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/ncmp-cmhandle-querying.html">cm handle query search Read the Docs</a>.<br/>By supplying a CPS Path it is possible to query on any data related to the cm handle. For more on CPS Path please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html">CPS Path Read the Docs</a>. The cm handle ancestor is automatically returned for this query.
tags:
- network-cm-proxy
summary: Execute cm handle query upon a given set of query parameters
diff --git a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyRestExceptionHandler.java b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyRestExceptionHandler.java
index 6910003c54..7255743c67 100644
--- a/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyRestExceptionHandler.java
+++ b/cps-ncmp-rest/src/main/java/org/onap/cps/ncmp/rest/controller/NetworkCmProxyRestExceptionHandler.java
@@ -26,6 +26,7 @@ import lombok.extern.slf4j.Slf4j;
import org.onap.cps.ncmp.api.data.exceptions.InvalidDatastoreException;
import org.onap.cps.ncmp.api.data.exceptions.InvalidOperationException;
import org.onap.cps.ncmp.api.data.exceptions.OperationNotSupportedException;
+import org.onap.cps.ncmp.api.exceptions.CmHandleNotFoundException;
import org.onap.cps.ncmp.api.exceptions.DmiClientRequestException;
import org.onap.cps.ncmp.api.exceptions.DmiRequestException;
import org.onap.cps.ncmp.api.exceptions.InvalidTopicException;
@@ -90,8 +91,8 @@ public class NetworkCmProxyRestExceptionHandler {
return buildErrorResponse(HttpStatus.CONFLICT, exception);
}
- @ExceptionHandler({DataNodeNotFoundException.class})
- public static ResponseEntity<Object> handleNotFoundExceptions(final Exception exception) {
+ @ExceptionHandler({CmHandleNotFoundException.class, DataNodeNotFoundException.class})
+ public static ResponseEntity<Object> cmHandleNotFoundExceptions(final Exception exception) {
return buildErrorResponse(HttpStatus.NOT_FOUND, exception);
}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NcmpResponseStatus.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NcmpResponseStatus.java
index 8cfad7dbf6..be22752882 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NcmpResponseStatus.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NcmpResponseStatus.java
@@ -27,14 +27,14 @@ public enum NcmpResponseStatus {
SUCCESS("0", "Successfully applied changes"),
CM_DATA_SUBSCRIPTION_ACCEPTED("1", "ACCEPTED"),
- CM_HANDLES_NOT_FOUND("100", "cm handle id(s) not found"),
+ CM_HANDLES_NOT_FOUND("100", "cm handle reference(s) not found"),
CM_HANDLES_NOT_READY("101", "cm handle(s) not ready"),
DMI_SERVICE_NOT_RESPONDING("102", "dmi plugin service is not responding"),
UNABLE_TO_READ_RESOURCE_DATA("103", "dmi plugin service is not able to read resource data"),
CM_DATA_SUBSCRIPTION_REJECTED("104", "REJECTED"),
UNKNOWN_ERROR("108", "Unknown error"),
CM_HANDLE_ALREADY_EXIST("109", "cm-handle already exists"),
- CM_HANDLE_INVALID_ID("110", "cm-handle has an invalid character(s) in id"),
+ CM_HANDLE_INVALID_ID("110", "cm handle reference has an invalid character(s) in id"),
ALTERNATE_ID_ALREADY_ASSOCIATED("111", "alternate id already associated"),
MESSAGE_TOO_LARGE("112", "message too large");
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/exceptions/CmHandleNotFoundException.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/exceptions/CmHandleNotFoundException.java
new file mode 100644
index 0000000000..715e1a00db
--- /dev/null
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/exceptions/CmHandleNotFoundException.java
@@ -0,0 +1,38 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2024 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.exceptions;
+
+public class CmHandleNotFoundException extends NcmpException {
+
+ private static final String CM_HANDLE_NOT_FOUND_DETAILS_FORMAT =
+ "No cm handles found with reference %s";
+
+ /**
+ * Constructor.
+ *
+ * @param cmHandleReference cm handle reference either cm handle id or alternate id
+ */
+ public CmHandleNotFoundException(final String cmHandleReference) {
+ super("Cm handle not found", String.format(CM_HANDLE_NOT_FOUND_DETAILS_FORMAT,
+ cmHandleReference));
+ }
+
+}
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java
index a8996874ff..f0547d3d24 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/inventory/NetworkCmProxyInventoryFacade.java
@@ -78,7 +78,7 @@ public class NetworkCmProxyInventoryFacade {
* Get all cm handle references by DMI plugin identifier.
*
* @param dmiPluginIdentifier DMI plugin identifier
- * @param outputAlternateId Boolean for cm handle reference type either
+ * @param outputAlternateId boolean for cm handle reference type either
* cm handle id (false) or alternate id (true)
* @return collection of cm handle references
*/
@@ -91,7 +91,7 @@ public class NetworkCmProxyInventoryFacade {
* Get all cm handle IDs by various properties.
*
* @param cmHandleQueryServiceParameters cm handle query parameters
- * @param outputAlternateId Boolean for cm handle reference type either
+ * @param outputAlternateId boolean for cm handle reference type either
* cm handle id (false) or alternate id (true)
* @return collection of cm handle references
*/
@@ -162,7 +162,7 @@ public class NetworkCmProxyInventoryFacade {
* Retrieve cm handle ids for the given query parameters.
*
* @param cmHandleQueryApiParameters cm handle query parameters
- * @param outputAlternateId Boolean for cm handle reference type either cmHandleId (false) or AlternateId (true)
+ * @param outputAlternateId boolean for cm handle reference type either cmHandleId (false) or AlternateId (true)
* @return cm handle ids
*/
public Collection<String> executeCmHandleIdSearch(final CmHandleQueryApiParameters cmHandleQueryApiParameters,
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java
index 74c04928ed..415153ddf7 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/CmHandleQueryService.java
@@ -103,8 +103,8 @@ public interface CmHandleQueryService {
* Get collection of all cm handles references by DMI plugin identifier and alternate id output option.
*
* @param dmiPluginIdentifier DMI plugin identifier
- * @param outputAlternateId Boolean for cm handle reference type either cmHandleId (false) or AlternateId (true)
- * @return collection of cm handle ids
+ * @param outputAlternateId boolean for cm handle reference type either cmHandleId (false) or AlternateId (true)
+ * @return collection of cm handle references
*/
Collection<String> getCmHandleReferencesByDmiPluginIdentifier(String dmiPluginIdentifier,
boolean outputAlternateId);
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistence.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistence.java
index 61d7df923e..562cb6e0de 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistence.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistence.java
@@ -157,12 +157,12 @@ public interface InventoryPersistence extends NcmpPersistence {
* get CM handles that has given module names.
*
* @param moduleNamesForQuery module names
- * @param outputAlternateIds Boolean for cm handle reference type either
+ * @param outputAlternateId boolean for cm handle reference type either
* cm handle id (false or null) or alternate id (true)
- * @return Collection of CM handle Ids
+ * @return Collection of CM handle references
*/
Collection<String> getCmHandleReferencesWithGivenModules(Collection<String> moduleNamesForQuery,
- boolean outputAlternateIds);
+ boolean outputAlternateId);
/**
* Check database if cm handle id exists if not return false.
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImpl.java
index c4765ff53d..e468ed100a 100644
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImpl.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImpl.java
@@ -40,6 +40,7 @@ import org.onap.cps.api.CpsAnchorService;
import org.onap.cps.api.CpsDataService;
import org.onap.cps.api.CpsModuleService;
import org.onap.cps.impl.utils.CpsValidator;
+import org.onap.cps.ncmp.api.exceptions.CmHandleNotFoundException;
import org.onap.cps.ncmp.api.inventory.models.CompositeState;
import org.onap.cps.ncmp.api.inventory.models.CompositeStateBuilder;
import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle;
@@ -193,8 +194,7 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv
final Collection<DataNode> dataNodes = cmHandleQueryService
.queryNcmpRegistryByCpsPath(cpsPathForCmHandleByAlternateId, OMIT_DESCENDANTS);
if (dataNodes.isEmpty()) {
- throw new DataNodeNotFoundException(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR,
- cpsPathForCmHandleByAlternateId);
+ throw new CmHandleNotFoundException(alternateId);
}
return dataNodes.iterator().next();
}
@@ -218,8 +218,8 @@ public class InventoryPersistenceImpl extends NcmpPersistenceImpl implements Inv
@Override
public Collection<String> getCmHandleReferencesWithGivenModules(final Collection<String> moduleNamesForQuery,
- final boolean outputAlternateIds) {
- if (outputAlternateIds) {
+ final boolean outputAlternateId) {
+ if (outputAlternateId) {
final Collection<String> cmHandleIds =
cpsAnchorService.queryAnchorNames(NFP_OPERATIONAL_DATASTORE_DATASPACE_NAME, moduleNamesForQuery);
return getAlternateIdsFromDataNodes(getCmHandleDataNodes(cmHandleIds));
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServicePropertyHandlerSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServicePropertyHandlerSpec.groovy
index 1beab20def..6213258303 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServicePropertyHandlerSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServicePropertyHandlerSpec.groovy
@@ -162,9 +162,9 @@ class CmHandleRegistrationServicePropertyHandlerSpec extends Specification {
}
where:
scenario | cmHandleId | exception || expectedError | expectedErrorText
- 'Cm Handle does not exist' | 'cmHandleId' | new DataNodeNotFoundException(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR) || CM_HANDLES_NOT_FOUND | 'cm handle id(s) not found'
+ 'Cm Handle does not exist' | 'cmHandleId' | new DataNodeNotFoundException(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR) || CM_HANDLES_NOT_FOUND | 'cm handle reference(s) not found'
'Unknown' | 'cmHandleId' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed'
- 'Invalid cm handle id' | 'cmHandleId with spaces' | new DataValidationException('Name Validation Error.', cmHandleId + 'contains an invalid character') || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id'
+ 'Invalid cm handle id' | 'cmHandleId with spaces' | new DataValidationException('Name Validation Error.', cmHandleId + 'contains an invalid character') || CM_HANDLE_INVALID_ID | 'cm handle reference has an invalid character(s) in id'
}
def 'Multiple update operations in a single request'() {
@@ -193,7 +193,7 @@ class CmHandleRegistrationServicePropertyHandlerSpec extends Specification {
assert it.status == Status.FAILURE
assert it.cmHandle == cmHandleId
assert it.ncmpResponseStatus == CM_HANDLES_NOT_FOUND
- assert it.errorText == 'cm handle id(s) not found'
+ assert it.errorText == 'cm handle reference(s) not found'
}
then: 'the replace list method is called twice'
2 * mockInventoryPersistence.replaceListContent(cmHandleXpath, _)
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy
index 70e26d993c..a69721b6aa 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/CmHandleRegistrationServiceSpec.groovy
@@ -399,10 +399,10 @@ class CmHandleRegistrationServiceSpec extends Specification {
and: 'the cm handle state is not updated to "DELETED"'
0 * mockLcmEventsCmHandleStateHandler.updateCmHandleStateBatch(_, CmHandleState.DELETED)
where:
- scenario | cmHandleId | deleteListElementException || expectedError | expectedErrorText
- 'cm-handle does not exist' | 'cmhandle' | new DataNodeNotFoundException('', '', '') || CM_HANDLES_NOT_FOUND | 'cm handle id(s) not found'
- 'cm-handle has invalid name' | 'cm handle with space' | new DataValidationException('', '') || CM_HANDLE_INVALID_ID | 'cm-handle has an invalid character(s) in id'
- 'an unexpected exception' | 'cmhandle' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed'
+ scenario | deleteListElementException || expectedError | expectedErrorText
+ 'cm-handle does not exist' | new DataNodeNotFoundException('', '', '') || CM_HANDLES_NOT_FOUND | 'cm handle reference(s) not found'
+ 'cm-handle has invalid name' | new DataValidationException('', '') || CM_HANDLE_INVALID_ID | 'cm handle reference has an invalid character(s) in id'
+ 'an unexpected exception' | new RuntimeException('Failed') || UNKNOWN_ERROR | 'Failed'
}
def 'Set Cm Handle Data Sync Enabled Flag where data sync flag is #scenario'() {
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy
index 00f092ff75..ce4a449b21 100644
--- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy
+++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy
@@ -28,11 +28,11 @@ import org.onap.cps.api.CpsDataService
import org.onap.cps.api.CpsModuleService
import org.onap.cps.impl.utils.CpsValidator
import org.onap.cps.ncmp.api.inventory.models.CompositeState
+import org.onap.cps.ncmp.api.exceptions.CmHandleNotFoundException
import org.onap.cps.ncmp.impl.inventory.models.CmHandleState
import org.onap.cps.ncmp.impl.inventory.models.YangModelCmHandle
import org.onap.cps.spi.CascadeDeleteAllowed
import org.onap.cps.spi.FetchDescendantsOption
-import org.onap.cps.spi.exceptions.DataNodeNotFoundException
import org.onap.cps.spi.model.DataNode
import org.onap.cps.spi.model.ModuleDefinition
import org.onap.cps.spi.model.ModuleReference
@@ -327,8 +327,9 @@ class InventoryPersistenceImplSpec extends Specification {
when: 'getting the cm handle data node'
objectUnderTest.getCmHandleDataNodeByAlternateId('alternate id')
then: 'no data found exception thrown'
- def thrownException = thrown(DataNodeNotFoundException)
- assert thrownException.getMessage().contains('DataNode not found')
+ def thrownException = thrown(CmHandleNotFoundException)
+ assert thrownException.getMessage().contains('Cm handle not found')
+ assert thrownException.getDetails().contains('No cm handles found with reference alternate id')
}
def 'Get multiple cm handle data nodes by alternate ids, passing empty collection'() {
diff --git a/cps-ncmp-service/src/test/resources/dataOperationResponseEvent.json b/cps-ncmp-service/src/test/resources/dataOperationResponseEvent.json
index 611d47d1a3..827250f5fd 100644
--- a/cps-ncmp-service/src/test/resources/dataOperationResponseEvent.json
+++ b/cps-ncmp-service/src/test/resources/dataOperationResponseEvent.json
@@ -1 +1 @@
-[{"operationId":"operational-14","ids":["unknown-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"100","statusMessage":"cm handle id(s) not found"},{"operationId":"operational-14","ids":["non-ready-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"101","statusMessage":"cm handle(s) not ready"},{"operationId":"running-12","ids":["non-ready-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"101","statusMessage":"cm handle(s) not ready"}] \ No newline at end of file
+[{"operationId":"operational-14","ids":["unknown-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"100","statusMessage":"cm handle reference(s) not found"},{"operationId":"operational-14","ids":["non-ready-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"101","statusMessage":"cm handle(s) not ready"},{"operationId":"running-12","ids":["non-ready-cm-handle"],"resourceIdentifier":"some resource identifier","options":"some option","statusCode":"101","statusMessage":"cm handle(s) not ready"}] \ No newline at end of file
diff --git a/cps-rest/docs/openapi/cpsQueryV2.yml b/cps-rest/docs/openapi/cpsQueryV2.yml
index 7f0ceff768..9aaa4193c3 100644
--- a/cps-rest/docs/openapi/cpsQueryV2.yml
+++ b/cps-rest/docs/openapi/cpsQueryV2.yml
@@ -1,5 +1,6 @@
# ============LICENSE_START=======================================================
# Copyright (C) 2023 TechMahindra Ltd.
+# Modifications Copyright (C) 2023-2024 TechMahindra Ltd.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -28,6 +29,7 @@ nodesByDataspaceAndAnchorAndCpsPath:
- $ref: 'components.yml#/components/parameters/anchorNameInPath'
- $ref: 'components.yml#/components/parameters/cpsPathInQuery'
- $ref: 'components.yml#/components/parameters/descendantsInQuery'
+ - $ref: 'components.yml#/components/parameters/contentTypeInHeader'
responses:
'200':
description: OK
@@ -38,6 +40,14 @@ nodesByDataspaceAndAnchorAndCpsPath:
examples:
dataSample:
$ref: 'components.yml#/components/examples/dataSample'
+ application/xml:
+ schema:
+ type: object
+ xml:
+ name: stores
+ examples:
+ dataSample:
+ $ref: 'components.yml#/components/examples/dataSampleXml'
'400':
$ref: 'components.yml#/components/responses/BadRequest'
'403':
diff --git a/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java b/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java
index 547be669ae..6823f6b03e 100644
--- a/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java
+++ b/cps-rest/src/main/java/org/onap/cps/rest/controller/QueryRestController.java
@@ -2,7 +2,7 @@
* ============LICENSE_START=======================================================
* Copyright (C) 2021-2024 Nordix Foundation
* Modifications Copyright (C) 2022 Bell Canada.
- * Modifications Copyright (C) 2022-2023 TechMahindra Ltd.
+ * Modifications Copyright (C) 2022-2024 TechMahindra Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,9 +36,11 @@ import org.onap.cps.spi.FetchDescendantsOption;
import org.onap.cps.spi.PaginationOption;
import org.onap.cps.spi.model.Anchor;
import org.onap.cps.spi.model.DataNode;
+import org.onap.cps.utils.ContentType;
import org.onap.cps.utils.DataMapUtils;
import org.onap.cps.utils.JsonObjectMapper;
import org.onap.cps.utils.PrefixResolver;
+import org.onap.cps.utils.XmlFileUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -62,18 +64,20 @@ public class QueryRestController implements CpsQueryApi {
final FetchDescendantsOption fetchDescendantsOption = Boolean.TRUE.equals(includeDescendants)
? FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS : FetchDescendantsOption.OMIT_DESCENDANTS;
return executeNodesByDataspaceQueryAndCreateResponse(dataspaceName, anchorName, cpsPath,
- fetchDescendantsOption);
+ fetchDescendantsOption, ContentType.JSON);
}
@Override
@Timed(value = "cps.data.controller.datanode.query.v2",
description = "Time taken to query data nodes")
public ResponseEntity<Object> getNodesByDataspaceAndAnchorAndCpsPathV2(final String dataspaceName,
- final String anchorName, final String cpsPath, final String fetchDescendantsOptionAsString) {
+ final String anchorName, final String contentTypeInHeader, final String cpsPath,
+ final String fetchDescendantsOptionAsString) {
+ final ContentType contentType = ContentType.fromString(contentTypeInHeader);
final FetchDescendantsOption fetchDescendantsOption =
FetchDescendantsOption.getFetchDescendantsOption(fetchDescendantsOptionAsString);
return executeNodesByDataspaceQueryAndCreateResponse(dataspaceName, anchorName, cpsPath,
- fetchDescendantsOption);
+ fetchDescendantsOption, contentType);
}
@Override
@@ -130,7 +134,8 @@ public class QueryRestController implements CpsQueryApi {
}
private ResponseEntity<Object> executeNodesByDataspaceQueryAndCreateResponse(final String dataspaceName,
- final String anchorName, final String cpsPath, final FetchDescendantsOption fetchDescendantsOption) {
+ final String anchorName, final String cpsPath, final FetchDescendantsOption fetchDescendantsOption,
+ final ContentType contentType) {
final Collection<DataNode> dataNodes =
cpsQueryService.queryDataNodes(dataspaceName, anchorName, cpsPath, fetchDescendantsOption);
final List<Map<String, Object>> dataNodesAsListOfMaps = new ArrayList<>(dataNodes.size());
@@ -143,6 +148,17 @@ public class QueryRestController implements CpsQueryApi {
final Map<String, Object> dataMap = DataMapUtils.toDataMapWithIdentifier(dataNode, prefix);
dataNodesAsListOfMaps.add(dataMap);
}
- return new ResponseEntity<>(jsonObjectMapper.asJsonString(dataNodesAsListOfMaps), HttpStatus.OK);
+ return buildResponseEntity(dataNodesAsListOfMaps, contentType);
+ }
+
+ private ResponseEntity<Object> buildResponseEntity(final List<Map<String, Object>> dataNodesAsListOfMaps,
+ final ContentType contentType) {
+ final String responseData;
+ if (contentType == ContentType.XML) {
+ responseData = XmlFileUtils.convertDataMapsToXml(dataNodesAsListOfMaps);
+ } else {
+ responseData = jsonObjectMapper.asJsonString(dataNodesAsListOfMaps);
+ }
+ return new ResponseEntity<>(responseData, HttpStatus.OK);
}
}
diff --git a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/QueryRestControllerSpec.groovy b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/QueryRestControllerSpec.groovy
index 80b287cda8..076ab32454 100644
--- a/cps-rest/src/test/groovy/org/onap/cps/rest/controller/QueryRestControllerSpec.groovy
+++ b/cps-rest/src/test/groovy/org/onap/cps/rest/controller/QueryRestControllerSpec.groovy
@@ -3,7 +3,7 @@
* Copyright (C) 2021-2024 Nordix Foundation
* Modifications Copyright (C) 2021-2022 Bell Canada.
* Modifications Copyright (C) 2021 Pantheon.tech
- * Modifications Copyright (C) 2022-2023 TechMahindra Ltd.
+ * Modifications Copyright (C) 2022-2024 TechMahindra Ltd.
* ================================================================================
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,6 +35,7 @@ import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest
import org.springframework.http.HttpStatus
+import org.springframework.http.MediaType
import org.springframework.test.web.servlet.MockMvc
import spock.lang.Specification
@@ -97,26 +98,52 @@ class QueryRestControllerSpec extends Specification {
'descendants' | 'true' || INCLUDE_ALL_DESCENDANTS
}
- def 'Query data node v2 api by cps path for the given dataspace and anchor with #scenario.'() {
+ def 'Query data node v2 API by cps path for the given dataspace and anchor with #scenario and media type JSON'() {
given: 'service method returns a list containing a data node'
- def dataNode1 = new DataNodeBuilder().withXpath('/xpath')
+ def dataNode = new DataNodeBuilder().withXpath('/xpath')
.withLeaves([leaf: 'value', leafList: ['leaveListElement1', 'leaveListElement2']]).build()
- mockCpsQueryService.queryDataNodes(dataspaceName, anchorName, cpsPath, { descendantsOption -> {
- assert descendantsOption.depth == expectedDepth}}) >> [dataNode1, dataNode1]
+ mockCpsQueryService.queryDataNodes(dataspaceName, anchorName, cpsPath, { descendantsOption ->
+ assert descendantsOption.depth == expectedDepth
+ }) >> [dataNode, dataNode]
when: 'query data nodes API is invoked'
def response =
mvc.perform(
- get(dataNodeEndpointV2)
- .param('cps-path', cpsPath)
- .param('descendants', includeDescendantsOptionString))
- .andReturn().response
- then: 'the response contains the the datanode in json format'
+ get(dataNodeEndpointV2)
+ .contentType(MediaType.APPLICATION_JSON)
+ .param('cps-path', cpsPath)
+ .param('descendants', includeDescendantsOptionString))
+ .andReturn().response
+ then: 'the response contains the datanode in the expected JSON format'
assert response.status == HttpStatus.OK.value()
assert response.getContentAsString().contains('{"xpath":{"leaf":"value","leafList":["leaveListElement1","leaveListElement2"]}}')
- where: 'the following options for include descendants are provided in the request'
- scenario | includeDescendantsOptionString || expectedDepth
- 'direct children' | 'direct' || 1
- 'descendants' | '2' || 2
+ where: 'the following options for include descendants are provided in the request'
+ scenario | includeDescendantsOptionString || expectedDepth
+ 'direct children' | 'direct' || 1
+ 'descendants' | '2' || 2
+ }
+
+ def 'Query data node v2 API by cps path for the given dataspace and anchor with #scenario and media type XML'() {
+ given: 'service method returns a list containing a data node'
+ def dataNode = new DataNodeBuilder().withXpath('/xpath')
+ .withLeaves([leaf: 'value', leafList: ['leaveListElement1', 'leaveListElement2']]).build()
+ mockCpsQueryService.queryDataNodes(dataspaceName, anchorName, cpsPath, { descendantsOption ->
+ assert descendantsOption.depth == expectedDepth
+ }) >> [dataNode, dataNode]
+ when: 'query data nodes API is invoked'
+ def response =
+ mvc.perform(
+ get(dataNodeEndpointV2)
+ .contentType(MediaType.APPLICATION_XML)
+ .param('cps-path', cpsPath)
+ .param('descendants', includeDescendantsOptionString))
+ .andReturn().response
+ then: 'the response contains the datanode in the expected XML format'
+ assert response.status == HttpStatus.OK.value()
+ assert response.getContentAsString().contains('<xpath><leaf>value</leaf><leafList>leaveListElement1</leafList><leafList>leaveListElement2</leafList></xpath>')
+ where: 'the following options for include descendants are provided in the request'
+ scenario | includeDescendantsOptionString || expectedDepth
+ 'direct children' | 'direct' || 1
+ 'descendants' | '2' || 2
}
def 'Query data node by cps path for the given dataspace across all anchors with #scenario.'() {
diff --git a/cps-service/src/main/java/org/onap/cps/utils/XmlFileUtils.java b/cps-service/src/main/java/org/onap/cps/utils/XmlFileUtils.java
index 94b97bd88f..bbfb7f4d2e 100644
--- a/cps-service/src/main/java/org/onap/cps/utils/XmlFileUtils.java
+++ b/cps-service/src/main/java/org/onap/cps/utils/XmlFileUtils.java
@@ -189,30 +189,32 @@ public class XmlFileUtils {
private static void createXmlElements(final Document document, final Node parentNode,
final Map<String, Object> dataMap) {
- for (final Map.Entry<String, Object> mapEntry : dataMap.entrySet()) {
- if (mapEntry.getValue() instanceof List) {
- appendList(document, parentNode, mapEntry);
- } else if (mapEntry.getValue() instanceof Map) {
- appendMap(document, parentNode, mapEntry);
+ for (final Map.Entry<String, Object> dataNodeMapEntry : dataMap.entrySet()) {
+ if (dataNodeMapEntry.getValue() instanceof List) {
+ appendList(document, parentNode, dataNodeMapEntry);
+ } else if (dataNodeMapEntry.getValue() instanceof Map) {
+ appendMap(document, parentNode, dataNodeMapEntry);
} else {
- appendObject(document, parentNode, mapEntry);
+ appendObject(document, parentNode, dataNodeMapEntry);
}
}
}
private static void appendList(final Document document, final Node parentNode,
- final Map.Entry<String, Object> mapEntry) {
- final List<Object> list = (List<Object>) mapEntry.getValue();
- if (list.isEmpty()) {
- final Element listElement = document.createElement(mapEntry.getKey());
+ final Map.Entry<String, Object> dataNodeMapEntry) {
+ final List<Object> dataNodeMaps = (List<Object>) dataNodeMapEntry.getValue();
+ if (dataNodeMaps.isEmpty()) {
+ final Element listElement = document.createElement(dataNodeMapEntry.getKey());
parentNode.appendChild(listElement);
} else {
- for (final Object element : list) {
- final Element listElement = document.createElement(mapEntry.getKey());
- if (element instanceof Map) {
- createXmlElements(document, listElement, (Map<String, Object>) element);
+ for (final Object dataNodeMap : dataNodeMaps) {
+ final Element listElement = document.createElement(dataNodeMapEntry.getKey());
+ if (dataNodeMap == null) {
+ parentNode.appendChild(listElement);
+ } else if (dataNodeMap instanceof Map) {
+ createXmlElements(document, listElement, (Map<String, Object>) dataNodeMap);
} else {
- listElement.appendChild(document.createTextNode(element.toString()));
+ listElement.appendChild(document.createTextNode(dataNodeMap.toString()));
}
parentNode.appendChild(listElement);
}
@@ -220,16 +222,18 @@ public class XmlFileUtils {
}
private static void appendMap(final Document document, final Node parentNode,
- final Map.Entry<String, Object> mapEntry) {
- final Element childElement = document.createElement(mapEntry.getKey());
- createXmlElements(document, childElement, (Map<String, Object>) mapEntry.getValue());
+ final Map.Entry<String, Object> dataNodeMapEntry) {
+ final Element childElement = document.createElement(dataNodeMapEntry.getKey());
+ createXmlElements(document, childElement, (Map<String, Object>) dataNodeMapEntry.getValue());
parentNode.appendChild(childElement);
}
private static void appendObject(final Document document, final Node parentNode,
- final Map.Entry<String, Object> mapEntry) {
- final Element element = document.createElement(mapEntry.getKey());
- element.appendChild(document.createTextNode(mapEntry.getValue().toString()));
+ final Map.Entry<String, Object> dataNodeMapEntry) {
+ final Element element = document.createElement(dataNodeMapEntry.getKey());
+ if (dataNodeMapEntry.getValue() != null) {
+ element.appendChild(document.createTextNode(dataNodeMapEntry.getValue().toString()));
+ }
parentNode.appendChild(element);
}
diff --git a/cps-service/src/test/groovy/org/onap/cps/utils/XmlFileUtilsSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/utils/XmlFileUtilsSpec.groovy
index 3b21145293..9a932c9279 100644
--- a/cps-service/src/test/groovy/org/onap/cps/utils/XmlFileUtilsSpec.groovy
+++ b/cps-service/src/test/groovy/org/onap/cps/utils/XmlFileUtilsSpec.groovy
@@ -32,7 +32,7 @@ import static org.onap.cps.utils.XmlFileUtils.convertDataMapsToXml
class XmlFileUtilsSpec extends Specification {
- def 'Parse a valid xml content #scenario'(){
+ def 'Parse a valid xml content #scenario'() {
given: 'YANG model schema context'
def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('bookstore.yang')
def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent).getSchemaContext()
@@ -41,13 +41,13 @@ class XmlFileUtilsSpec extends Specification {
then: 'the result xml is wrapped by root node defined in YANG schema'
assert parsedXmlContent == expectedOutput
where:
- scenario | xmlData || expectedOutput
- 'without root data node' | '<?xml version="1.0" encoding="UTF-8"?><class> </class>' || '<?xml version="1.0" encoding="UTF-8"?><stores xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><class> </class></stores>'
- 'with root data node' | '<?xml version="1.0" encoding="UTF-8"?><stores><class> </class></stores>' || '<?xml version="1.0" encoding="UTF-8"?><stores><class> </class></stores>'
- 'no xml header' | '<stores><class> </class></stores>' || '<stores><class> </class></stores>'
+ scenario | xmlData || expectedOutput
+ 'without root data node' | '<?xml version="1.0" encoding="UTF-8"?><class> </class>' || '<?xml version="1.0" encoding="UTF-8"?><stores xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"><class> </class></stores>'
+ 'with root data node' | '<?xml version="1.0" encoding="UTF-8"?><stores><class> </class></stores>' || '<?xml version="1.0" encoding="UTF-8"?><stores><class> </class></stores>'
+ 'no xml header' | '<stores><class> </class></stores>' || '<stores><class> </class></stores>'
}
- def 'Parse a invalid xml content'(){
+ def 'Parse a invalid xml content'() {
given: 'YANG model schema context'
def yangResourceNameToContent = TestUtils.getYangResourcesAsMap('bookstore.yang')
def schemaContext = YangTextSchemaSourceSetBuilder.of(yangResourceNameToContent).getSchemaContext()
@@ -84,9 +84,6 @@ class XmlFileUtilsSpec extends Specification {
'nested XML branch' | [['test-tree': [branch: [name: 'Left', nest: [name: 'Small', birds: 'Sparrow']]]]] || '<test-tree><branch><name>Left</name><nest><name>Small</name><birds>Sparrow</birds></nest></branch></test-tree>'
'list of branch within a test tree' | [['test-tree': [branch: [[name: 'Left', nest: [name: 'Small', birds: 'Sparrow']], [name: 'Right', nest: [name: 'Big', birds: 'Owl']]]]]] || '<test-tree><branch><name>Left</name><nest><name>Small</name><birds>Sparrow</birds></nest></branch><branch><name>Right</name><nest><name>Big</name><birds>Owl</birds></nest></branch></test-tree>'
'list of birds under a nest' | [['nest': ['name': 'Small', 'birds': ['Sparrow']]]] || '<nest><name>Small</name><birds>Sparrow</birds></nest>'
- 'XML Content map with null key/value' | [['test-tree': [branch: [name: 'Left', nest: []]]]] || '<test-tree><branch><name>Left</name><nest/></branch></test-tree>'
- 'XML Content list is empty' | [['nest': ['name': 'Small', 'birds': []]]] || '<nest><name>Small</name><birds/></nest>'
- 'XML with mixed content in list' | [['branch': ['name': 'Left', 'nest': ['name': 'Small', 'birds': ['', 'Sparrow']]]]] || '<branch><name>Left</name><nest><name>Small</name><birds/><birds>Sparrow</birds></nest></branch>'
}
def 'Convert data maps to XML with null or empty maps and lists'() {
@@ -95,11 +92,14 @@ class XmlFileUtilsSpec extends Specification {
then: 'the result contains the expected XML or handles nulls correctly'
assert result == expectedXmlOutput
where:
- scenario | dataMaps || expectedXmlOutput
- 'null entry in map' | [['branch': []]] || '<branch/>'
- 'list with null object' | [['branch': [name: 'Left', nest: [name: 'Small', birds: []]]]] || '<branch><name>Left</name><nest><name>Small</name><birds/></nest></branch>'
- 'list containing null list' | [['test-tree': [branch: '']]] || '<test-tree><branch/></test-tree>'
- 'nested map with null values' | [['test-tree': [branch: [name: 'Left', nest: '']]]] || '<test-tree><branch><name>Left</name><nest/></branch></test-tree>'
+ scenario | dataMaps || expectedXmlOutput
+ 'null entry in map' | [['branch': []]] || '<branch/>'
+ 'XML Content list is empty' | [['nest': ['name': 'Small', 'birds': [null]]]] || '<nest><name>Small</name><birds/></nest>'
+ 'XML with mixed content in list' | [['branch': ['name': 'Left', 'nest': ['name': 'Small', 'birds': [null, 'Sparrow']]]]] || '<branch><name>Left</name><nest><name>Small</name><birds/><birds>Sparrow</birds></nest></branch>'
+ 'list with null object' | [['branch': [name: 'Left', nest: [name: 'Small', birds: [null]]]]] || '<branch><name>Left</name><nest><name>Small</name><birds/></nest></branch>'
+ 'list containing null values' | [['branch': [null, null, null]]] || '<branch/><branch/><branch/>'
+ 'nested map with null values' | [['test-tree': [branch: [name: 'Left', nest: null]]]] || '<test-tree><branch><name>Left</name><nest/></branch></test-tree>'
+ 'mixed list with null values' | [['branch': ['name': 'Left', 'nest': ['name': 'Small', 'birds': [null, 'Sparrow', null]]]]] || '<branch><name>Left</name><nest><name>Small</name><birds/><birds>Sparrow</birds><birds/></nest></branch>'
}
def 'Converting data maps to xml with no data'() {
@@ -109,7 +109,7 @@ class XmlFileUtilsSpec extends Specification {
convertDataMapsToXml(dataMapWithNull)
then: 'a validation exception is thrown'
def exception = thrown(DataValidationException)
- and:'the cause is a null pointer exception'
+ and: 'the cause is a null pointer exception'
assert exception.cause instanceof NullPointerException
}
@@ -120,9 +120,9 @@ class XmlFileUtilsSpec extends Specification {
convertDataMapsToXml(dataMap)
then: 'a validation exception is thrown'
def exception = thrown(DataValidationException)
- and:'the cause is a document object model exception'
+ and: 'the cause is a document object model exception'
assert exception.cause instanceof DOMException
}
-}
+} \ No newline at end of file
diff --git a/docs/api/swagger/cps/openapi.yaml b/docs/api/swagger/cps/openapi.yaml
index 3f889c1e6c..3b6bd43d6c 100644
--- a/docs/api/swagger/cps/openapi.yaml
+++ b/docs/api/swagger/cps/openapi.yaml
@@ -2283,6 +2283,15 @@ paths:
default: none
example: "3"
type: string
+ - description: Content type in header
+ in: header
+ name: Content-Type
+ required: true
+ schema:
+ enum:
+ - application/json
+ - application/xml
+ type: string
responses:
"200":
content:
@@ -2293,6 +2302,15 @@ paths:
value: null
schema:
type: object
+ application/xml:
+ examples:
+ dataSample:
+ $ref: '#/components/examples/dataSampleXml'
+ value: null
+ schema:
+ type: object
+ xml:
+ name: stores
description: OK
"400":
content:
diff --git a/docs/api/swagger/ncmp/openapi-inventory.yaml b/docs/api/swagger/ncmp/openapi-inventory.yaml
index d358719a4b..ab83ed2ae6 100644
--- a/docs/api/swagger/ncmp/openapi-inventory.yaml
+++ b/docs/api/swagger/ncmp/openapi-inventory.yaml
@@ -97,7 +97,7 @@ paths:
example: my-dmi-plugin
type: string
- description: Boolean parameter to determine if returned value(s) will be cm
- handle Ids or alternate Ids for a given query
+ handle ids or alternate ids for a given query
in: query
name: outputAlternateId
required: false
@@ -145,7 +145,7 @@ paths:
operationId: searchCmHandleIds
parameters:
- description: Boolean parameter to determine if returned value(s) will be cm
- handle Ids or alternate Ids for a given query
+ handle ids or alternate ids for a given query
in: query
name: outputAlternateId
required: false
@@ -202,7 +202,7 @@ components:
type: string
outputAlternateIdOptionInQuery:
description: Boolean parameter to determine if returned value(s) will be cm
- handle Ids or alternate Ids for a given query
+ handle ids or alternate ids for a given query
in: query
name: outputAlternateId
required: false
diff --git a/docs/api/swagger/ncmp/openapi.yaml b/docs/api/swagger/ncmp/openapi.yaml
index aa84e432e9..e7256c0836 100644
--- a/docs/api/swagger/ncmp/openapi.yaml
+++ b/docs/api/swagger/ncmp/openapi.yaml
@@ -1130,10 +1130,10 @@ paths:
/v1/ch/id-searches:
post:
description: Execute cm handle query search and return a list of cm handle references.
- Any number of conditions can be applied. To be included in the result a cm-handle
- must fulfill ALL the conditions. An empty collection will be returned in the
- case that the cm handle does not match a condition. For more on cm handle
- query search please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/ncmp-cmhandle-querying.html">cm
+ Any number of conditions can be applied. To be included in the result a cm
+ handle must fulfill ALL the conditions. An empty collection will be returned
+ in the case that the cm handle does not match a condition. For more on cm
+ handle query search please refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/ncmp-cmhandle-querying.html">cm
handle query search Read the Docs</a>.<br/>By supplying a CPS Path it is possible
to query on any data related to the cm handle. For more on CPS Path please
refer to <a href="https://docs.onap.org/projects/onap-cps/en/latest/cps-path.html">CPS
@@ -1142,7 +1142,7 @@ paths:
operationId: searchCmHandleIds
parameters:
- description: Boolean parameter to determine if returned value(s) will be cm
- handle Ids or alternate Ids for a given query
+ handle ids or alternate ids for a given query
in: query
name: outputAlternateId
required: false
@@ -1619,7 +1619,7 @@ components:
type: string
outputAlternateIdOptionInQuery:
description: Boolean parameter to determine if returned value(s) will be cm
- handle Ids or alternate Ids for a given query
+ handle ids or alternate ids for a given query
in: query
name: outputAlternateId
required: false
diff --git a/docs/ncmp-cmhandle-querying.rst b/docs/ncmp-cmhandle-querying.rst
index 529297daa7..2e534d87ff 100644
--- a/docs/ncmp-cmhandle-querying.rst
+++ b/docs/ncmp-cmhandle-querying.rst
@@ -1,6 +1,6 @@
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
-.. Copyright (C) 2022-2023 Nordix Foundation
+.. Copyright (C) 2022-2024 Nordix Foundation
.. DO NOT CHANGE THIS LABEL FOR RELEASE NOTES - EVEN THOUGH IT GIVES A WARNING
.. _cmhandlequerying:
@@ -19,9 +19,20 @@ For querying CM Handles we have two Post endpoints:
- ncmp/v1/ch/searches Returns all CM Handles which match the query properties provided. Gives a JSON payload of the **details** of all matching CM Handles.
-- ncmp/v1/ch/id-searches Returns all CM Handles IDs which match the query properties provided. Gives a JSON payload of the **ids** of all matching CM Handles.
+- ncmp/v1/ch/id-searches Returns all CM Handles IDs or Alternate IDs which match the query properties provided. Gives a JSON payload of the **ids** of all matching CM Handles.
-/searches returns whole CM Handle object (data) whereas /id-searches returns only CM Handle IDs. Otherwise these endpoints are intended to be functionally identical so both can be queried with the same request body. If no matching CM Handles are found an empty array is returned.
+/searches returns whole CM Handle object (data) whereas /id-searches returns only CM Handle IDs or Alternate IDs. Otherwise these endpoints are intended to be functionally identical so both can be queried with the same request body. If no matching CM Handles are found an empty array is returned.
+
+Parameters
+==========
+
+/id-searches can return either CM Handle IDs or Alternate IDs. This is controlled with an optional parameter outputAlternateId.
+
+- *outputAlternateId=true* returns Alternate IDs
+
+- *outputAlternateId=false* returns CM Handle IDs
+
+Note: Null values will default to false so /id-searches & /id-searches?outputAlternateId will both return CM Handle IDs
Request Body
============
diff --git a/docs/ncmp-data-operation.rst b/docs/ncmp-data-operation.rst
index 94d5ee9c0a..3352e03cf0 100644
--- a/docs/ncmp-data-operation.rst
+++ b/docs/ncmp-data-operation.rst
@@ -1,6 +1,6 @@
.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
-.. Copyright (C) 2023 Nordix Foundation
+.. Copyright (C) 2023-2024 Nordix Foundation
.. DO NOT CHANGE THIS LABEL FOR RELEASE NOTES - EVEN THOUGH IT GIVES A WARNING
.. _cmHandleDataOperation:
@@ -43,7 +43,7 @@ This endpoint executes data operation for given array of operations:
| | | implementation. For ONAP DMI Plugin it will be RESTConf paths but it can|
| | | really be anything. |
+--------------------------+-------------+-------------------------------------------------------------------------+
- | targetIds | Yes | List of cm handle ids. |
+ | targetIds | Yes | List of cm handle references |
+--------------------------+-------------+-------------------------------------------------------------------------+
The status codes used in the events resulting from these operations are defined here: