9e51d80d9e5cc8e6328ab54e4cff6c3e9050de1b
[cps.git] /
1 /*
2  *  ============LICENSE_START=======================================================
3  *  Copyright (C) 2023-2024 Nordix Foundation
4  *  ================================================================================
5  *  Licensed under the Apache License, Version 2.0 (the 'License');
6  *  you may not use this file except in compliance with the License.
7  *  You may obtain a copy of the License at
8  *
9  *        http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an 'AS IS' BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  *  SPDX-License-Identifier: Apache-2.0
18  *  ============LICENSE_END=========================================================
19  */
20
21 package org.onap.cps.integration.functional.cps
22
23 import org.onap.cps.api.CpsModuleService
24 import org.onap.cps.integration.base.FunctionalSpecBase
25 import org.onap.cps.spi.CascadeDeleteAllowed
26 import org.onap.cps.spi.exceptions.AlreadyDefinedException
27 import org.onap.cps.spi.exceptions.DataspaceNotFoundException
28 import org.onap.cps.spi.exceptions.ModelValidationException
29 import org.onap.cps.spi.exceptions.SchemaSetInUseException
30 import org.onap.cps.spi.exceptions.SchemaSetNotFoundException
31 import org.onap.cps.spi.model.ModuleDefinition
32 import org.onap.cps.spi.model.ModuleReference
33
34 class ModuleServiceIntegrationSpec extends FunctionalSpecBase {
35
36     CpsModuleService objectUnderTest
37
38     private static def originalNumberOfModuleReferences = 2 // bookstore has two modules
39     private static def bookStoreModuleReference = new ModuleReference('stores','2024-02-08')
40     private static def bookStoreModuleReferenceWithNamespace = new ModuleReference('stores','2024-02-08', 'org:onap:cps:sample')
41     private static def bookStoreTypesModuleReference = new ModuleReference('bookstore-types','2024-01-30')
42     private static def bookStoreTypesModuleReferenceWithNamespace = new ModuleReference('bookstore-types','2024-01-30', 'org:onap:cps:types:sample')
43     static def NEW_RESOURCE_REVISION = '2023-05-10'
44     static def NEW_RESOURCE_CONTENT = 'module test_module {\n' +
45         '    yang-version 1.1;\n' +
46         '    namespace "org:onap:ccsdk:sample";\n' +
47         '\n' +
48         '    prefix book-store;\n' +
49         '\n' +
50         '    revision "2023-05-10" {\n' +
51         '        description\n' +
52         '        "Sample Model";\n' +
53         '    }' +
54         '}'
55
56     def newYangResourcesNameToContentMap = [:]
57     def moduleReferences = []
58     def noNewModules = [:]
59     def bookstoreModelFileContent = readResourceDataFile('bookstore/bookstore.yang')
60     def bookstoreTypesFileContent = readResourceDataFile('bookstore/bookstore-types.yang')
61
62     def setup() {
63         objectUnderTest = cpsModuleService
64     }
65
66     /*
67         C R E A T E   S C H E M A   S E T   U S E - C A S E S
68      */
69
70     def 'Create new schema set from yang resources with #scenario'() {
71         given: 'a new schema set with #numberOfModules modules'
72             populateNewYangResourcesNameToContentMapAndAllModuleReferences(numberOfNewModules)
73         when: 'the new schema set is created'
74             objectUnderTest.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'newSchemaSet', newYangResourcesNameToContentMap)
75         then: 'the number of module references has increased by #numberOfNewModules'
76             def yangResourceModuleReferences = objectUnderTest.getYangResourceModuleReferences(FUNCTIONAL_TEST_DATASPACE_1)
77             originalNumberOfModuleReferences + numberOfNewModules == yangResourceModuleReferences.size()
78         cleanup:
79             objectUnderTest.deleteSchemaSetsWithCascade(FUNCTIONAL_TEST_DATASPACE_1, [ 'newSchemaSet' ])
80         where: 'the following parameters are use'
81             scenario                       | numberOfNewModules
82             'two valid new modules'        | 2
83             'empty schema set'             | 0
84             'over max batch size #modules' | 101
85     }
86
87     def 'Create new schema set with recommended filename format but invalid yang'() {
88         given: 'a filename using RFC6020 recommended format (for coverage only)'
89             def fileName = 'test@2023-05-11.yang'
90         when: 'attempt to create a schema set with invalid Yang'
91             objectUnderTest.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'newSchemaSet', [(fileName) :'invalid yang'])
92         then: 'a model validation exception'
93             thrown(ModelValidationException)
94     }
95
96     def 'Create new schema set from modules with #scenario'() {
97         given: 'a new schema set with #numberOfNewModules modules'
98             populateNewYangResourcesNameToContentMapAndAllModuleReferences(numberOfNewModules)
99         and: 'add existing module references (optional)'
100             moduleReferences.addAll(existingModuleReferences)
101         when: 'the new schema set is created'
102             def schemaSetName = "NewSchemaWith${numberOfNewModules}Modules"
103             objectUnderTest.createSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, schemaSetName, newYangResourcesNameToContentMap, moduleReferences)
104         and: 'associated with a new anchor'
105             cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, schemaSetName, 'newAnchor')
106         then: 'the new anchor has the correct number of modules'
107             def yangResourceModuleReferences = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'newAnchor')
108             assert expectedNumberOfModulesForAnchor == yangResourceModuleReferences.size()
109         cleanup:
110             objectUnderTest.deleteSchemaSetsWithCascade(FUNCTIONAL_TEST_DATASPACE_1, [ schemaSetName.toString() ])
111         where: 'the following module references are provided'
112             scenario                        | numberOfNewModules | existingModuleReferences                          || expectedNumberOfModulesForAnchor
113             'empty schema set'              | 0                  | [ ]                                               || 0
114             'one existing module'           | 0                  | [bookStoreModuleReference ]                       || 1
115             'two new modules'               | 2                  | [ ]                                               || 2
116             'two new modules, one existing' | 2                  | [bookStoreModuleReference ]                       || 3
117             'over max batch size #modules'  | 101                | [ ]                                               || 101
118             'two valid, one invalid module' | 2                  | [ new ModuleReference('NOT EXIST','IRRELEVANT') ] || 2
119     }
120
121     def 'Duplicate schema content.'() {
122         given: 'a map of yang resources'
123             populateNewYangResourcesNameToContentMapAndAllModuleReferences(1)
124         when: 'a new schema set is created'
125             objectUnderTest.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'newSchema1', newYangResourcesNameToContentMap)
126         then: 'the dataspace has one new module (reference)'
127             def numberOfModuleReferencesAfterFirstSchemaSetHasBeenAdded = objectUnderTest.getYangResourceModuleReferences(FUNCTIONAL_TEST_DATASPACE_1).size()
128             assert numberOfModuleReferencesAfterFirstSchemaSetHasBeenAdded == originalNumberOfModuleReferences + 1
129         when: 'a second new schema set is created'
130             objectUnderTest.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'newSchema2', newYangResourcesNameToContentMap)
131         then: 'the dataspace has no additional module (reference)'
132             assert numberOfModuleReferencesAfterFirstSchemaSetHasBeenAdded  == objectUnderTest.getYangResourceModuleReferences(FUNCTIONAL_TEST_DATASPACE_1).size()
133         cleanup:
134             objectUnderTest.deleteSchemaSetsWithCascade(FUNCTIONAL_TEST_DATASPACE_1, [ 'newSchema1', 'newSchema2'])
135     }
136
137     def 'Attempt to create schema set, error scenario: #scenario.'() {
138         when: 'attempt to store schema set #schemaSetName in dataspace #dataspaceName'
139             populateNewYangResourcesNameToContentMapAndAllModuleReferences(0)
140             objectUnderTest.createSchemaSet(dataspaceName, schemaSetName, newYangResourcesNameToContentMap)
141         then: 'an #expectedException is thrown'
142             thrown(expectedException)
143         where: 'the following data is used'
144             scenario                    | dataspaceName               | schemaSetName        || expectedException
145             'dataspace does not exist'  | 'unknown'                   | 'not-relevant'       || DataspaceNotFoundException
146             'schema set already exists' | FUNCTIONAL_TEST_DATASPACE_1 | BOOKSTORE_SCHEMA_SET || AlreadyDefinedException
147     }
148
149     def 'Attempt to create duplicate schema set from modules.'() {
150         when: 'attempt to store duplicate schema set from modules'
151             objectUnderTest.createSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_SCHEMA_SET, newYangResourcesNameToContentMap, [])
152         then: 'an Already Defined Exception is thrown'
153             thrown(AlreadyDefinedException)
154     }
155
156
157     /*
158         R E A D   S C H E M A   S E T   I N F O   U S E - C A S E S
159      */
160
161     def 'Retrieving module definitions by anchor.'() {
162         when: 'the module definitions for an anchor are retrieved'
163             def result = objectUnderTest.getModuleDefinitionsByAnchorName(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_ANCHOR_1)
164         then: 'the correct module definitions are returned'
165             assert result.size() == 2
166             assert result.contains(new ModuleDefinition('stores','2024-02-08',bookstoreModelFileContent))
167             assert result.contains(new ModuleDefinition('bookstore-types','2024-01-30', bookstoreTypesFileContent))
168     }
169
170     def 'Retrieving module definitions: #scenarios'() {
171         when: 'module definitions for module name are retrieved'
172             def result = objectUnderTest.getModuleDefinitionsByAnchorAndModule(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_ANCHOR_1, moduleName, moduleRevision)
173         then: 'the correct module definitions are returned'
174             if (expectedNumberOfDefinitions > 0) {
175                 assert result.size() == expectedNumberOfDefinitions
176                 def expectedModuleDefinition = new ModuleDefinition('stores', '2024-02-08', bookstoreModelFileContent)
177                 assert result[0] == expectedModuleDefinition
178             }
179         where: 'following parameters are used'
180             scenarios                          | moduleName | moduleRevision || expectedNumberOfDefinitions
181             'correct module name and revision' | 'stores'   | '2024-02-08'   || 1
182             'correct module name'              | 'stores'   | null           || 1
183             'incorrect module name'            | 'other'    | null           || 0
184             'incorrect revision'               | 'stores'   | '2025-11-22'   || 0
185     }
186
187     def 'Retrieving yang resource module references by anchor.'() {
188         when: 'the yang resource module references for an anchor are retrieved'
189             def result = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_ANCHOR_1)
190         then: 'the correct module references are returned'
191             assert result.size() == 2
192             assert result.containsAll(bookStoreModuleReference, bookStoreTypesModuleReference)
193     }
194
195     def 'Identifying new module references with #scenario'() {
196         when: 'identifyNewModuleReferences is called'
197             def result = objectUnderTest.identifyNewModuleReferences(moduleReferences)
198         then: 'the correct module references are returned'
199             assert result.size() == expectedResult.size()
200             assert result.containsAll(expectedResult)
201         where: 'the following data is used'
202             scenario                                | moduleReferences                                                       || expectedResult
203             'just new module references'            | [new ModuleReference('new1', 'r1'), new ModuleReference('new2', 'r1')] || [new ModuleReference('new1', 'r1'), new ModuleReference('new2', 'r1')]
204             'one new module,one existing reference' | [new ModuleReference('new1', 'r1'), bookStoreModuleReference]          || [new ModuleReference('new1', 'r1')]
205             'no new module references'              | [bookStoreModuleReference]                                             || []
206             'no module references'                  | []                                                                     || []
207             'module references collection is null'  | null                                                                   || []
208     }
209
210     def 'Retrieve schema set.'() {
211         when: 'a specific schema set is retrieved'
212             def result = objectUnderTest.getSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, BOOKSTORE_SCHEMA_SET)
213         then: 'the result has the correct name and module(s)'
214             assert result.name == 'bookstoreSchemaSet'
215             assert result.moduleReferences.size() == 2
216             assert result.moduleReferences.containsAll(bookStoreModuleReferenceWithNamespace, bookStoreTypesModuleReferenceWithNamespace)
217     }
218
219     def 'Retrieve all schema sets.'() {
220         given: 'an extra schema set is stored'
221             populateNewYangResourcesNameToContentMapAndAllModuleReferences(1)
222             objectUnderTest.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'newSchema1', newYangResourcesNameToContentMap)
223         when: 'all schema sets are retrieved'
224             def result = objectUnderTest.getSchemaSets(FUNCTIONAL_TEST_DATASPACE_1)
225         then: 'the result contains all expected schema sets'
226             assert result.name.size() == 2
227             assert result.name.containsAll('bookstoreSchemaSet', 'newSchema1')
228         cleanup:
229             objectUnderTest.deleteSchemaSetsWithCascade(FUNCTIONAL_TEST_DATASPACE_1, ['newSchema1'])
230     }
231
232     /*
233         D E L E T E   S C H E M A   S E T   U S E - C A S E S
234      */
235
236     def 'Delete schema sets with(out) cascade.'() {
237         given: 'a schema set'
238             populateNewYangResourcesNameToContentMapAndAllModuleReferences(1)
239             objectUnderTest.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'newSchemaSet', newYangResourcesNameToContentMap)
240         and: 'optionally create anchor for the schema set'
241             if (associateWithAnchor) {
242                 cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'newSchemaSet', 'newAnchor')
243             }
244         when: 'attempt to delete the schema set'
245             try {
246                 objectUnderTest.deleteSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'newSchemaSet', cascadeDeleteAllowedOption)
247             }
248             catch (Exception e) {  // only accept correct exception when schema set cannot be deleted
249                 assert e instanceof SchemaSetInUseException && expectSchemaSetStillPresent
250             }
251         then: 'check if the dataspace still contains the new schema set or not'
252             def remainingSchemaSetNames = objectUnderTest.getSchemaSets(FUNCTIONAL_TEST_DATASPACE_1).name
253             assert remainingSchemaSetNames.contains('newSchemaSet') == expectSchemaSetStillPresent
254         cleanup:
255             objectUnderTest.deleteSchemaSetsWithCascade(FUNCTIONAL_TEST_DATASPACE_1, ['newSchemaSet'])
256         where: 'the following options are used'
257             associateWithAnchor | cascadeDeleteAllowedOption                     || expectSchemaSetStillPresent
258             false               | CascadeDeleteAllowed.CASCADE_DELETE_ALLOWED    || false
259             false               | CascadeDeleteAllowed.CASCADE_DELETE_PROHIBITED || false
260             true                | CascadeDeleteAllowed.CASCADE_DELETE_ALLOWED    || false
261             true                | CascadeDeleteAllowed.CASCADE_DELETE_PROHIBITED || true
262     }
263
264     def 'Delete schema sets with shared resources.'() {
265         given: 'a new schema set'
266             populateNewYangResourcesNameToContentMapAndAllModuleReferences(1)
267             objectUnderTest.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'newSchemaSet1', newYangResourcesNameToContentMap)
268         and: 'another schema set which shares one yang resource (module)'
269             populateNewYangResourcesNameToContentMapAndAllModuleReferences(2)
270             objectUnderTest.createSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'newSchemaSet2', newYangResourcesNameToContentMap)
271         when: 'all schema sets are retrieved'
272             def moduleRevisions = objectUnderTest.getYangResourceModuleReferences(FUNCTIONAL_TEST_DATASPACE_1).revision
273         then: 'both modules (revisions) are present'
274             assert moduleRevisions.containsAll(['2000-01-01', '2000-01-01'])
275         when: 'delete the second schema set that has two resources  one of which is a shared resource'
276             objectUnderTest.deleteSchemaSetsWithCascade(FUNCTIONAL_TEST_DATASPACE_1, ['newSchemaSet2'])
277         then: 'only the second schema set is deleted'
278             def remainingSchemaSetNames = objectUnderTest.getSchemaSets(FUNCTIONAL_TEST_DATASPACE_1).name
279             assert remainingSchemaSetNames.contains('newSchemaSet1')
280             assert !remainingSchemaSetNames.contains('newSchemaSet2')
281         and: 'only the shared module (revision) remains'
282             def remainingModuleRevisions = objectUnderTest.getYangResourceModuleReferences(FUNCTIONAL_TEST_DATASPACE_1).revision
283             assert remainingModuleRevisions.contains('2000-01-01')
284             assert !remainingModuleRevisions.contains('2001-01-01')
285         cleanup:
286             objectUnderTest.deleteSchemaSetsWithCascade(FUNCTIONAL_TEST_DATASPACE_1, ['newSchemaSet1'])
287     }
288
289     def 'Delete schema set error scenario: #scenario.'() {
290         when: 'attempt to delete a schema set where #scenario'
291             objectUnderTest.deleteSchemaSet(dataspaceName, schemaSetName, CascadeDeleteAllowed.CASCADE_DELETE_PROHIBITED)
292         then: 'an #expectedException is thrown'
293             thrown(expectedException)
294         where: 'the following data is used'
295             scenario                     | dataspaceName               | schemaSetName   || expectedException
296             'dataspace does not exist'   | 'unknown'                   | 'not-relevant'  || DataspaceNotFoundException
297             'schema set does not exists' | FUNCTIONAL_TEST_DATASPACE_1 | 'unknown'       || SchemaSetNotFoundException
298     }
299
300     /*
301         U P G R A D E
302      */
303
304     def 'Upgrade schema set (with existing and new modules, no matching module set tag in NCMP)'() {
305         given: 'an anchor and schema set with 2 modules (to be upgraded)'
306             populateNewYangResourcesNameToContentMapAndAllModuleReferences('original', 2)
307             objectUnderTest.createSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', newYangResourcesNameToContentMap, [])
308             cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', 'targetAnchor')
309             def yangResourceModuleReferencesBeforeUpgrade = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'targetAnchor')
310             assert yangResourceModuleReferencesBeforeUpgrade.size() == 2
311             assert yangResourceModuleReferencesBeforeUpgrade.containsAll([new ModuleReference('original_0','2000-01-01'),new ModuleReference('original_1','2001-01-01')])
312         and: 'two new 2 modules (from node)'
313             populateNewYangResourcesNameToContentMapAndAllModuleReferences('new', 2)
314             def newModuleReferences = [new ModuleReference('new_0','2000-01-01'),new ModuleReference('new_1','2001-01-01')]
315         and: 'a list of all module references (normally retrieved from node)'
316             def allModuleReferences = []
317             allModuleReferences.add(bookStoreModuleReference)
318             allModuleReferences.addAll(newModuleReferences)
319         when: 'the schema set is upgraded'
320             objectUnderTest.upgradeSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', newYangResourcesNameToContentMap, allModuleReferences)
321         then: 'the new anchor has the correct new and existing modules'
322             def yangResourceModuleReferencesAfterUpgrade = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'targetAnchor')
323             assert yangResourceModuleReferencesAfterUpgrade.size() == 3
324             assert yangResourceModuleReferencesAfterUpgrade.contains(bookStoreModuleReference)
325             assert yangResourceModuleReferencesAfterUpgrade.containsAll(newModuleReferences);
326         cleanup:
327             objectUnderTest.deleteSchemaSetsWithCascade(FUNCTIONAL_TEST_DATASPACE_1, ['targetSchema'])
328     }
329
330     def 'Upgrade existing schema set from another anchor (used in NCMP for matching module set tag)'() {
331         given: 'an anchor and schema set with 1 module (target)'
332             populateNewYangResourcesNameToContentMapAndAllModuleReferences('target', 1)
333             objectUnderTest.createSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', newYangResourcesNameToContentMap, [])
334             cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', 'targetAnchor')
335             def moduleReferencesBeforeUpgrade = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'targetAnchor')
336             assert moduleReferencesBeforeUpgrade.size() == 1
337         and: 'another anchor and schema set with 2 other modules (source for upgrade)'
338             populateNewYangResourcesNameToContentMapAndAllModuleReferences('source', 2)
339             objectUnderTest.createSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, 'sourceSchema', newYangResourcesNameToContentMap, [])
340             cpsAnchorService.createAnchor(FUNCTIONAL_TEST_DATASPACE_1, 'sourceSchema', 'sourceAnchor')
341             assert objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'sourceAnchor').size() == 2
342         when: 'the target schema is upgraded using the module references from the source anchor'
343             def moduleReferencesFromSourceAnchor = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'sourceAnchor')
344             objectUnderTest.upgradeSchemaSetFromModules(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema', noNewModules, moduleReferencesFromSourceAnchor)
345         then: 'the target schema now refers to the source modules (with namespace) modules'
346             def schemaSetModuleReferencesAfterUpgrade = getObjectUnderTest().getSchemaSet(FUNCTIONAL_TEST_DATASPACE_1, 'targetSchema').moduleReferences
347             assert schemaSetModuleReferencesAfterUpgrade.containsAll([new ModuleReference('source_0','2000-01-01','org:onap:ccsdk:sample'),new ModuleReference('source_1','2001-01-01','org:onap:ccsdk:sample')]);
348         and: 'the associated target anchor has the same module references (without namespace but that is a legacy issue)'
349             def anchorModuleReferencesAfterUpgrade = objectUnderTest.getYangResourcesModuleReferences(FUNCTIONAL_TEST_DATASPACE_1, 'targetAnchor')
350             assert anchorModuleReferencesAfterUpgrade.containsAll([new ModuleReference('source_0','2000-01-01'),new ModuleReference('source_1','2001-01-01')]);
351         cleanup:
352             objectUnderTest.deleteSchemaSetsWithCascade(FUNCTIONAL_TEST_DATASPACE_1, ['sourceSchema', 'targetSchema'])
353     }
354
355     /*
356         H E L P E R   M E T H O D S
357      */
358
359     def populateNewYangResourcesNameToContentMapAndAllModuleReferences(numberOfModules) {
360         populateNewYangResourcesNameToContentMapAndAllModuleReferences('name', numberOfModules)
361     }
362
363     def populateNewYangResourcesNameToContentMapAndAllModuleReferences(namePrefix, numberOfModules) {
364         numberOfModules.times {
365             def uniqueName = namePrefix + '_' + it
366             def uniqueRevision = String.valueOf(2000 + it) + '-01-01'
367             moduleReferences.add(new ModuleReference(uniqueName, uniqueRevision))
368             def uniqueContent = NEW_RESOURCE_CONTENT.replace(NEW_RESOURCE_REVISION, uniqueRevision).replace('module test_module', 'module '+uniqueName)
369             newYangResourcesNameToContentMap.put(uniqueRevision, uniqueContent)
370         }
371     }
372
373 }