}
}
+ @Override
+ public Anchor getAnchor(final String dataspaceName, final String anchorName) {
+ final AnchorEntity anchorEntity = getAnchorEntity(dataspaceName, anchorName);
+ return toAnchor(anchorEntity);
+ }
+
@Override
public Collection<Anchor> getAnchors(final String dataspaceName) {
final var dataspaceEntity = dataspaceRepository.getByName(dataspaceName);
}
@Override
- public Collection<Anchor> getAnchors(final String dataspaceName, final String schemaSetName) {
+ public Collection<Anchor> getAnchors(final String dataspaceName, final Collection<String> anchorNames) {
+ final DataspaceEntity dataspaceEntity = dataspaceRepository.getByName(dataspaceName);
+ return anchorRepository.findAllByDataspaceAndNameIn(dataspaceEntity, anchorNames)
+ .stream().map(CpsAdminPersistenceServiceImpl::toAnchor).collect(Collectors.toSet());
+ }
+
+ @Override
+ public Collection<Anchor> getAnchorsBySchemaSetName(final String dataspaceName, final String schemaSetName) {
final DataspaceEntity dataspaceEntity = dataspaceRepository.getByName(dataspaceName);
final SchemaSetEntity schemaSetEntity = schemaSetRepository.getByDataspaceAndName(
dataspaceEntity, schemaSetName);
}
@Override
- public Collection<Anchor> getAnchors(final String dataspaceName, final Collection<String> schemaSetNames) {
+ public Collection<Anchor> getAnchorsBySchemaSetNames(final String dataspaceName,
+ final Collection<String> schemaSetNames) {
final DataspaceEntity dataspaceEntity = dataspaceRepository.getByName(dataspaceName);
return anchorRepository.findAllByDataspaceAndSchemaSetNameIn(dataspaceEntity, schemaSetNames)
.stream().map(CpsAdminPersistenceServiceImpl::toAnchor).collect(Collectors.toSet());
inputModuleNames.size());
}
- @Override
- public Anchor getAnchor(final String dataspaceName, final String anchorName) {
- return toAnchor(getAnchorEntity(dataspaceName, anchorName));
- }
-
@Transactional
@Override
public void deleteAnchor(final String dataspaceName, final String anchorName) {
/*
* ============LICENSE_START=======================================================
- * Copyright (C) 2023 Nordix Foundation
+ * Copyright (C) 2023-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.
*/
void createAnchor(String dataspaceName, String schemaSetName, String anchorName);
+ /**
+ * Get an anchor in the given dataspace using the anchor name.
+ *
+ * @param dataspaceName dataspace name
+ * @param anchorName anchor name
+ * @return an anchor
+ */
+ Anchor getAnchor(String dataspaceName, String anchorName);
+
/**
* Read all anchors in the given dataspace.
*
*/
Collection<Anchor> getAnchors(String dataspaceName);
+ /**
+ * Read all anchors in the given dataspace with the anchor names.
+ *
+ * @param dataspaceName dataspace name
+ * @param anchorNames anchor names
+ * @return a collection of anchors
+ */
+ Collection<Anchor> getAnchors(String dataspaceName, Collection<String> anchorNames);
+
/**
* Read all anchors associated with the given schema-set in the given dataspace.
*
* @param schemaSetName schema-set name
* @return a collection of anchors
*/
- Collection<Anchor> getAnchors(String dataspaceName, String schemaSetName);
+ Collection<Anchor> getAnchorsBySchemaSetName(String dataspaceName, String schemaSetName);
/**
* Read all anchors associated with the given schema-sets in the given dataspace.
* @param schemaSetNames schema-set names
* @return a collection of anchors
*/
- Collection<Anchor> getAnchors(String dataspaceName, Collection<String> schemaSetNames);
-
- /**
- * Get an anchor in the given dataspace using the anchor name.
- *
- * @param dataspaceName dataspace name
- * @param anchorName anchor name
- * @return an anchor
- */
- Anchor getAnchor(String dataspaceName, String anchorName);
+ Collection<Anchor> getAnchorsBySchemaSetNames(String dataspaceName, Collection<String> schemaSetNames);
/**
* Delete anchor by name in given dataspace.
/*
* ============LICENSE_START=======================================================
- * Copyright (C) 2023 Nordix Foundation
+ * Copyright (C) 2023-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.
cpsAdminPersistenceService.createAnchor(dataspaceName, schemaSetName, anchorName);
}
+ @Override
+ public Anchor getAnchor(final String dataspaceName, final String anchorName) {
+ cpsValidator.validateNameCharacters(dataspaceName, anchorName);
+ return cpsAdminPersistenceService.getAnchor(dataspaceName, anchorName);
+ }
+
@Override
public Collection<Anchor> getAnchors(final String dataspaceName) {
cpsValidator.validateNameCharacters(dataspaceName);
}
@Override
- public Collection<Anchor> getAnchors(final String dataspaceName, final String schemaSetName) {
- cpsValidator.validateNameCharacters(dataspaceName, schemaSetName);
- return cpsAdminPersistenceService.getAnchors(dataspaceName, schemaSetName);
+ public Collection<Anchor> getAnchors(final String dataspaceName, final Collection<String> anchorNames) {
+ cpsValidator.validateNameCharacters(dataspaceName);
+ cpsValidator.validateNameCharacters(anchorNames);
+ return cpsAdminPersistenceService.getAnchors(dataspaceName, anchorNames);
}
@Override
- public Collection<Anchor> getAnchors(final String dataspaceName, final Collection<String> schemaSetNames) {
- cpsValidator.validateNameCharacters(dataspaceName);
- cpsValidator.validateNameCharacters(schemaSetNames);
- return cpsAdminPersistenceService.getAnchors(dataspaceName, schemaSetNames);
+ public Collection<Anchor> getAnchorsBySchemaSetName(final String dataspaceName, final String schemaSetName) {
+ cpsValidator.validateNameCharacters(dataspaceName, schemaSetName);
+ return cpsAdminPersistenceService.getAnchorsBySchemaSetName(dataspaceName, schemaSetName);
}
@Override
- public Anchor getAnchor(final String dataspaceName, final String anchorName) {
- cpsValidator.validateNameCharacters(dataspaceName, anchorName);
- return cpsAdminPersistenceService.getAnchor(dataspaceName, anchorName);
+ public Collection<Anchor> getAnchorsBySchemaSetNames(final String dataspaceName,
+ final Collection<String> schemaSetNames) {
+ cpsValidator.validateNameCharacters(dataspaceName);
+ cpsValidator.validateNameCharacters(schemaSetNames);
+ return cpsAdminPersistenceService.getAnchorsBySchemaSetNames(dataspaceName, schemaSetNames);
}
@Override
public void deleteSchemaSet(final String dataspaceName, final String schemaSetName,
final CascadeDeleteAllowed cascadeDeleteAllowed) {
cpsValidator.validateNameCharacters(dataspaceName, schemaSetName);
- final Collection<Anchor> anchors = cpsAnchorService.getAnchors(dataspaceName, schemaSetName);
+ final Collection<Anchor> anchors = cpsAnchorService.getAnchorsBySchemaSetName(dataspaceName, schemaSetName);
if (!anchors.isEmpty() && isCascadeDeleteProhibited(cascadeDeleteAllowed)) {
throw new SchemaSetInUseException(dataspaceName, schemaSetName);
}
public void deleteSchemaSetsWithCascade(final String dataspaceName, final Collection<String> schemaSetNames) {
cpsValidator.validateNameCharacters(dataspaceName);
cpsValidator.validateNameCharacters(schemaSetNames);
- final Collection<String> anchorNames = cpsAnchorService.getAnchors(dataspaceName, schemaSetNames)
- .stream().map(Anchor::getName).collect(Collectors.toSet());
+ final Collection<String> anchorNames =
+ cpsAnchorService.getAnchorsBySchemaSetNames(dataspaceName, schemaSetNames)
+ .stream().map(Anchor::getName).collect(Collectors.toSet());
cpsAnchorService.deleteAnchors(dataspaceName, anchorNames);
cpsModulePersistenceService.deleteSchemaSets(dataspaceName, schemaSetNames);
cpsModulePersistenceService.deleteUnusedYangResourceModules();
/*
* ============LICENSE_START=======================================================
- * Copyright (C) 2020-2022 Nordix Foundation.
+ * Copyright (C) 2020-2024 Nordix Foundation.
* Modifications Copyright (C) 2020-2022 Bell Canada.
* Modifications Copyright (C) 2021 Pantheon.tech
* Modifications Copyright (C) 2022 TechMahindra Ltd.
void createAnchor(String dataspaceName, String schemaSetName, String anchorName);
/**
- * Read all anchors associated with the given schema-set in the given dataspace.
+ * Get an anchor in the given dataspace using the anchor name.
+ *
+ * @param dataspaceName dataspace name
+ * @param anchorName anchor name
+ * @return an anchor
+ */
+ Anchor getAnchor(String dataspaceName, String anchorName);
+
+ /**
+ * Read all anchors in the given a dataspace.
*
* @param dataspaceName dataspace name
- * @param schemaSetName schema-set name
* @return a collection of anchors
*/
- Collection<Anchor> getAnchors(String dataspaceName, String schemaSetName);
+ Collection<Anchor> getAnchors(String dataspaceName);
/**
- * Read all anchors associated with multiple schema-sets in the given dataspace.
+ * Read all anchors in the given dataspace with the anchor names.
*
- * @param dataspaceName dataspace name
- * @param schemaSetNames schema-set names
+ * @param dataspaceName dataspace name
+ * @param anchorNames anchor names
* @return a collection of anchors
*/
- Collection<Anchor> getAnchors(String dataspaceName, Collection<String> schemaSetNames);
+ Collection<Anchor> getAnchors(String dataspaceName, Collection<String> anchorNames);
/**
- * Read all anchors in the given a dataspace.
+ * Read all anchors associated with the given schema-set in the given dataspace.
*
* @param dataspaceName dataspace name
+ * @param schemaSetName schema-set name
* @return a collection of anchors
*/
- Collection<Anchor> getAnchors(String dataspaceName);
+ Collection<Anchor> getAnchorsBySchemaSetName(String dataspaceName, String schemaSetName);
+
+ /**
+ * Read all anchors associated with multiple schema-sets in the given dataspace.
+ *
+ * @param dataspaceName dataspace name
+ * @param schemaSetNames schema-set names
+ * @return a collection of anchors
+ */
+ Collection<Anchor> getAnchorsBySchemaSetNames(String dataspaceName, Collection<String> schemaSetNames);
/**
* Query anchor names for the given module names in the provided dataspace.
*/
Collection<String> queryAnchorNames(String dataspaceName, Collection<String> moduleNames);
- /**
- * Get an anchor in the given dataspace using the anchor name.
- *
- * @param dataspaceName dataspace name
- * @param anchorName anchor name
- * @return an anchor
- */
- Anchor getAnchor(String dataspaceName, String anchorName);
-
/**
* Delete anchor by name in given dataspace.
*
/*
* ============LICENSE_START=======================================================
- * Copyright (C) 2023 Nordix Foundation
+ * Copyright (C) 2023-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.
def 'Retrieve all anchors for schema-set.'() {
given: 'that anchor is associated with the dataspace and schemaset'
def anchors = [new Anchor()]
- mockCpsAdminPersistenceService.getAnchors('someDataspace', 'someSchemaSet') >> anchors
+ mockCpsAdminPersistenceService.getAnchorsBySchemaSetName('someDataspace', 'someSchemaSet') >> anchors
when: 'get anchors is called for a dataspace name and schema set name'
- def result = objectUnderTest.getAnchors('someDataspace', 'someSchemaSet')
+ def result = objectUnderTest.getAnchorsBySchemaSetName('someDataspace', 'someSchemaSet')
then: 'the collection provided by persistence service is returned as result'
result == anchors
and: 'the CpsValidator is called on the dataspaceName, schemaSetName'
def 'Retrieve all anchors for multiple schema-sets.'() {
given: 'that anchor is associated with the dataspace and schemasets'
def anchors = [new Anchor(), new Anchor()]
- mockCpsAdminPersistenceService.getAnchors('someDataspace', _ as Collection<String>) >> anchors
+ mockCpsAdminPersistenceService.getAnchorsBySchemaSetNames('someDataspace', _ as Collection<String>) >> anchors
when: 'get anchors is called for a dataspace name and schema set names'
- def result = objectUnderTest.getAnchors('someDataspace', ['schemaSet1', 'schemaSet2'])
+ def result = objectUnderTest.getAnchorsBySchemaSetNames('someDataspace', ['schemaSet1', 'schemaSet2'])
then: 'the collection provided by persistence service is returned as result'
result == anchors
and: 'the CpsValidator is called on the dataspace name and schema-set names'
1 * mockCpsValidator.validateNameCharacters('someDataspace', 'someAnchor')
}
+ def 'Retrieve multiple anchors for dataspace and provided anchor names.'() {
+ given: 'multiple anchors names to get'
+ def anchorNames = ['anchor1', 'anchor2']
+ and: 'that anchors are associated with the dataspace and anchor names'
+ def anchors = [new Anchor(), new Anchor()]
+ mockCpsAdminPersistenceService.getAnchors('someDataspace', anchorNames) >> anchors
+ when: 'get anchors is called for a dataspace name and anchor names'
+ def result = objectUnderTest.getAnchors('someDataspace', anchorNames)
+ then: 'the collection provided by persistence service is returned as result'
+ result == anchors
+ and: 'the CpsValidator is called on the dataspace name and anchor names'
+ 1 * mockCpsValidator.validateNameCharacters('someDataspace')
+ 1 * mockCpsValidator.validateNameCharacters(anchorNames)
+ }
+
def 'Delete anchor.'() {
when: 'delete anchor is invoked'
objectUnderTest.deleteAnchor('someDataspace','someAnchor')
}
def 'Delete multiple anchors.'() {
+ given: 'multiple anchors to delete'
+ def anchorNames = ['anchor1', 'anchor2']
when: 'delete anchors is invoked'
- objectUnderTest.deleteAnchors('someDataspace', ['anchor1', 'anchor2'])
+ objectUnderTest.deleteAnchors('someDataspace', anchorNames)
then: 'delete data nodes is invoked on the data service with expected parameters'
- 1 * mockCpsDataPersistenceService.deleteDataNodes('someDataspace', _ as Collection<String>)
+ 1 * mockCpsDataPersistenceService.deleteDataNodes('someDataspace', anchorNames)
and: 'the persistence service method is invoked with same parameters to delete anchor'
- 1 * mockCpsAdminPersistenceService.deleteAnchors('someDataspace',_ as Collection<String>)
+ 1 * mockCpsAdminPersistenceService.deleteAnchors('someDataspace', anchorNames)
and: 'the CpsValidator is called on the dataspace name and anchor names'
1 * mockCpsValidator.validateNameCharacters('someDataspace')
- 1 * mockCpsValidator.validateNameCharacters(_)
+ 1 * mockCpsValidator.validateNameCharacters(anchorNames)
}
def 'Query all anchor identifiers for a dataspace and module names.'() {
import spock.lang.Specification
import java.time.OffsetDateTime
+import static org.onap.cps.events.model.Data.Operation.DELETE
+
class CpsDataServiceImplSpec extends Specification {
def mockCpsDataPersistenceService = Mock(CpsDataPersistenceService)
def mockCpsAnchorService = Mock(CpsAnchorService)
def 'Delete all data nodes for given dataspace and multiple anchors.'() {
given: 'schema set for given anchors and dataspace references test tree model'
setupSchemaSetMocks('test-tree.yang')
- mockCpsAnchorService.getAnchors(dataspaceName, ['anchor1', 'anchor2']) >>
- [new Anchor(name: 'anchor1', dataspaceName: dataspaceName),
- new Anchor(name: 'anchor2', dataspaceName: dataspaceName)]
+ def anchor1 = new Anchor(name: 'anchor1', dataspaceName: dataspaceName)
+ def anchor2 = new Anchor(name: 'anchor2', dataspaceName: dataspaceName)
+ mockCpsAnchorService.getAnchors(dataspaceName, ['anchor1', 'anchor2']) >> [anchor1, anchor2]
when: 'delete data node method is invoked with correct parameters'
objectUnderTest.deleteDataNodes(dataspaceName, ['anchor1', 'anchor2'], observedTimestamp)
then: 'the CpsValidator is called on the dataspace name and the anchor names'
- 2 * mockCpsValidator.validateNameCharacters(_)
+ 1 * mockCpsValidator.validateNameCharacters(dataspaceName)
+ 1 * mockCpsValidator.validateNameCharacters(['anchor1', 'anchor2'])
and: 'the persistence service method is invoked with the correct parameters'
1 * mockCpsDataPersistenceService.deleteDataNodes(dataspaceName, _ as Collection<String>)
+ and: 'a data update event is sent for each anchor'
+ 1 * mockDataUpdateEventsService.publishCpsDataUpdateEvent(anchor1, '/', DELETE, observedTimestamp)
+ 1 * mockDataUpdateEventsService.publishCpsDataUpdateEvent(anchor2, '/', DELETE, observedTimestamp)
}
def 'Start session.'() {
def 'Delete schema-set when cascade is allowed.'() {
given: '#numberOfAnchors anchors are associated with schemaset'
def associatedAnchors = createAnchors(numberOfAnchors)
- mockCpsAnchorService.getAnchors('my-dataspace', 'my-schemaset') >> associatedAnchors
+ mockCpsAnchorService.getAnchorsBySchemaSetName('my-dataspace', 'my-schemaset') >> associatedAnchors
when: 'schema set deletion is requested with cascade allowed'
objectUnderTest.deleteSchemaSet('my-dataspace', 'my-schemaset', CASCADE_DELETE_ALLOWED)
then: 'anchor deletion is called #numberOfAnchors times'
def 'Delete schema-set when cascade is prohibited.'() {
given: 'no anchors are associated with schemaset'
- mockCpsAnchorService.getAnchors('my-dataspace', 'my-schemaset') >> Collections.emptyList()
+ mockCpsAnchorService.getAnchorsBySchemaSetName('my-dataspace', 'my-schemaset') >> Collections.emptyList()
when: 'schema set deletion is requested with cascade allowed'
objectUnderTest.deleteSchemaSet('my-dataspace', 'my-schemaset', CASCADE_DELETE_PROHIBITED)
then: 'no anchors are deleted'
def 'Delete schema-set when cascade is prohibited and schema-set has anchors.'() {
given: '2 anchors are associated with schemaset'
- mockCpsAnchorService.getAnchors('my-dataspace', 'my-schemaset') >> createAnchors(2)
+ mockCpsAnchorService.getAnchorsBySchemaSetName('my-dataspace', 'my-schemaset') >> createAnchors(2)
when: 'schema set deletion is requested with cascade allowed'
objectUnderTest.deleteSchemaSet('my-dataspace', 'my-schemaset', CASCADE_DELETE_PROHIBITED)
then: 'Schema-Set in Use exception is thrown'
def 'Delete multiple schema-sets when cascade is allowed.'() {
given: '#numberOfAnchors anchors are associated with each schemaset'
- mockCpsAnchorService.getAnchors('my-dataspace', ['my-schemaset1', 'my-schemaset2']) >> createAnchors(numberOfAnchors * 2)
+ mockCpsAnchorService.getAnchorsBySchemaSetNames('my-dataspace', ['my-schemaset1', 'my-schemaset2']) >> createAnchors(numberOfAnchors * 2)
when: 'schema set deletion is requested with cascade allowed'
objectUnderTest.deleteSchemaSetsWithCascade('my-dataspace', ['my-schemaset1', 'my-schemaset2'])
then: 'anchor deletion is called #numberOfAnchors times'
then: 'there are 3 anchors in the general test database'
assert objectUnderTest.getAnchors(GENERAL_TEST_DATASPACE).size() == 3
and: 'there are 2 anchors associated with bookstore schema set'
- assert objectUnderTest.getAnchors(GENERAL_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET).size() == 2
+ assert objectUnderTest.getAnchorsBySchemaSetName(GENERAL_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET).size() == 2
and: 'there is 1 anchor associated with other schema set'
- assert objectUnderTest.getAnchors(GENERAL_TEST_DATASPACE, 'otherSchemaSet').size() == 1
+ assert objectUnderTest.getAnchorsBySchemaSetName(GENERAL_TEST_DATASPACE, 'otherSchemaSet').size() == 1
}
def 'Querying anchor(name)s (depends on previous test!).'() {
/*
* ============LICENSE_START=======================================================
- * Copyright (C) 2023 Nordix Foundation
+ * Copyright (C) 2023-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.
given: 'more than 32,766 schema set names'
def schemaSetNames = (0..40_000).collect { "size-of-this-name-does-not-matter-for-limit-" + it }
when: 'single get is executed to get all the anchors'
- objectUnderTest.getAnchors(CPS_PERFORMANCE_TEST_DATASPACE, schemaSetNames)
+ objectUnderTest.getAnchorsBySchemaSetNames(CPS_PERFORMANCE_TEST_DATASPACE, schemaSetNames)
then: 'a database exception is not thrown'
noExceptionThrown()
}