diff options
author | 2018-03-21 18:40:41 +0000 | |
---|---|---|
committer | 2018-03-28 13:50:51 +0100 | |
commit | 66b3afa06776e9944ad515206d281d67747c9770 (patch) | |
tree | 427098937879fe09ae4fc3af4ae004359a60212a /src/test | |
parent | 161f5a7d9b900ae34a4886d7f7fb01ea496f71eb (diff) |
Incorporate the ECOMP SDC Artefact Generator code
Remove the Maven dependency on openecomp-sdc-artifact-generator-core,
because this is not maintained in the ONAP source code repositories.
The functionality provided by the SDC Artifact Generator is replaced
with equivalent code that depends on the SDC-TOSCA parsing library,
without introducing any backwards-compatibility breaks.
The intention is to make this Maven project more maintainable by
depending only the common ONAP libraries.
Change-Id: I01d78575d3b7c70a11e4c7989a021de3c0913a06
Issue-ID: AAI-943
Signed-off-by: mark.j.leonard <mark.j.leonard@gmail.com>
Diffstat (limited to 'src/test')
34 files changed, 3662 insertions, 274 deletions
diff --git a/src/test/java/org/onap/aai/babel/MicroServiceAuthTest.java b/src/test/java/org/onap/aai/babel/MicroServiceAuthTest.java index f24cbf1..6912d90 100644 --- a/src/test/java/org/onap/aai/babel/MicroServiceAuthTest.java +++ b/src/test/java/org/onap/aai/babel/MicroServiceAuthTest.java @@ -2,8 +2,8 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017 European Software Marketing Ltd. + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.aai.babel; @@ -49,14 +47,13 @@ public class MicroServiceAuthTest { private static final String authPolicyFile = "auth_policy.json"; static { - System.setProperty("CONFIG_HOME", - System.getProperty("user.dir") + File.separator + "src/test/resources"); + System.setProperty("CONFIG_HOME", System.getProperty("user.dir") + File.separator + "src/test/resources"); } /** * Temporarily invalidate the default policy file and then try to initialise the authorisation class using the name * of a policy file that does not exist. - * + * * @throws AAIAuthException * @throws IOException */ @@ -65,9 +62,9 @@ public class MicroServiceAuthTest { String defaultFile = AAIMicroServiceAuthCore.getDefaultAuthFileName(); try { AAIMicroServiceAuthCore.setDefaultAuthFileName("invalid.default.file"); - BabelAuthConfig gapServiceAuthConfig = new BabelAuthConfig(); - gapServiceAuthConfig.setAuthPolicyFile("invalid.file.name"); - new AAIMicroServiceAuth(gapServiceAuthConfig); + BabelAuthConfig babelServiceAuthConfig = new BabelAuthConfig(); + babelServiceAuthConfig.setAuthPolicyFile("invalid.file.name"); + new AAIMicroServiceAuth(babelServiceAuthConfig); } finally { AAIMicroServiceAuthCore.setDefaultAuthFileName(defaultFile); } @@ -75,7 +72,7 @@ public class MicroServiceAuthTest { /** * Test loading of a temporary file created with the specified roles - * + * * @throws AAIAuthException * @throws IOException * @throws JSONException @@ -90,21 +87,21 @@ public class MicroServiceAuthTest { /** * Test that the default policy file is loaded when a non-existent file is passed to the authorisation clas. - * + * * @throws AAIAuthException */ @Test public void createAuthFromDefaultFile() throws AAIAuthException { - BabelAuthConfig gapServiceAuthConfig = new BabelAuthConfig(); - gapServiceAuthConfig.setAuthPolicyFile("non-existent-file"); - AAIMicroServiceAuth auth = new AAIMicroServiceAuth(gapServiceAuthConfig); + BabelAuthConfig babelServiceAuthConfig = new BabelAuthConfig(); + babelServiceAuthConfig.setAuthPolicyFile("non-existent-file"); + AAIMicroServiceAuth auth = new AAIMicroServiceAuth(babelServiceAuthConfig); // The default policy will have been loaded assertAdminUserAuthorisation(auth, VALID_ADMIN_USER); } /** * Test loading of the policy file relative to CONFIG_HOME - * + * * @throws AAIAuthException */ @Test @@ -125,13 +122,13 @@ public class MicroServiceAuthTest { @Test public void testValidateRequest() throws AAIAuthException { AAIMicroServiceAuth auth = createStandardAuth(); - assertThat(auth.validateRequest(null, new MockHttpServletRequest(), null, "app/v1/gap"), is(false)); + assertThat(auth.validateRequest(null, new MockHttpServletRequest(), null, "app/v1/babel"), is(false)); } private AAIMicroServiceAuth createStandardAuth() throws AAIAuthException { - BabelAuthConfig gapServiceAuthConfig = new BabelAuthConfig(); - gapServiceAuthConfig.setAuthPolicyFile(authPolicyFile); - return new AAIMicroServiceAuth(gapServiceAuthConfig); + BabelAuthConfig babelServiceAuthConfig = new BabelAuthConfig(); + babelServiceAuthConfig.setAuthPolicyFile(authPolicyFile); + return new AAIMicroServiceAuth(babelServiceAuthConfig); } /** @@ -155,7 +152,7 @@ public class MicroServiceAuthTest { /** * Assert authorisation results for an admin user based on the test policy file - * + * * @param auth * @param adminUser * @throws AAIAuthException diff --git a/src/test/java/org/onap/aai/babel/csar/extractor/YamlExtractorTest.java b/src/test/java/org/onap/aai/babel/csar/extractor/YamlExtractorTest.java index 54f4c65..9024efa 100644 --- a/src/test/java/org/onap/aai/babel/csar/extractor/YamlExtractorTest.java +++ b/src/test/java/org/onap/aai/babel/csar/extractor/YamlExtractorTest.java @@ -2,8 +2,8 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017 European Software Marketing Ltd. + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.aai.babel.csar.extractor; @@ -32,7 +30,7 @@ import java.util.List; import org.apache.commons.io.IOUtils; import org.junit.Test; import org.onap.aai.babel.util.ArtifactTestUtils; -import org.openecomp.sdc.generator.data.Artifact; +import org.onap.aai.babel.xml.generator.data.Artifact; /** * Tests @see YamlExtractor @@ -124,7 +122,7 @@ public class YamlExtractorTest { } @Test - public void extract_archiveContainsThreeRelevantYmlFilesFromSdWanService() + public void extract_archiveContainsOnlyTheExpectedYmlFilesFromSdWanService() throws IOException, InvalidArchiveException { List<Artifact> ymlFiles = YamlExtractor.extract(loadResource("compressedArtifacts/service-SdWanServiceTest-csar.csar"), @@ -134,6 +132,8 @@ public class YamlExtractorTest { payloads.add("ymlFiles/resource-SdWanTestVsp-template.yml"); payloads.add("ymlFiles/resource-TunnelXconntest-template.yml"); payloads.add("ymlFiles/service-SdWanServiceTest-template.yml"); + payloads.add("ymlFiles/artifacts.yml"); + payloads.add("ymlFiles/data.yml"); new ArtifactTestUtils().performYmlAsserts(ymlFiles, payloads); } diff --git a/src/test/java/org/onap/aai/babel/csar/fixture/ArtifactInfoBuilder.java b/src/test/java/org/onap/aai/babel/csar/fixture/ArtifactInfoBuilder.java index 0ff8fa1..20c8254 100644 --- a/src/test/java/org/onap/aai/babel/csar/fixture/ArtifactInfoBuilder.java +++ b/src/test/java/org/onap/aai/babel/csar/fixture/ArtifactInfoBuilder.java @@ -2,8 +2,8 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017 European Software Marketing Ltd. + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.aai.babel.csar.fixture; diff --git a/src/test/java/org/onap/aai/babel/csar/fixture/TestArtifactInfoImpl.java b/src/test/java/org/onap/aai/babel/csar/fixture/TestArtifactInfoImpl.java index bbf4a43..dfca951 100644 --- a/src/test/java/org/onap/aai/babel/csar/fixture/TestArtifactInfoImpl.java +++ b/src/test/java/org/onap/aai/babel/csar/fixture/TestArtifactInfoImpl.java @@ -2,8 +2,8 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017 European Software Marketing Ltd. + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,11 +17,11 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.aai.babel.csar.fixture; +import java.util.Objects; +import org.apache.commons.lang3.builder.EqualsBuilder; import org.openecomp.sdc.api.notification.IArtifactInfo; /** @@ -101,35 +101,24 @@ public class TestArtifactInfoImpl implements IArtifactInfo { } @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - TestArtifactInfoImpl that = (TestArtifactInfoImpl) o; - - if (artifactName != null ? !artifactName.equals(that.artifactName) : that.artifactName != null) { - return false; - } - if (artifactType != null ? !artifactType.equals(that.artifactType) : that.artifactType != null) { - return false; - } - if (artifactDescription != null ? !artifactDescription.equals(that.artifactDescription) - : that.artifactDescription != null) { + public boolean equals(Object obj) { + if (!(obj instanceof TestArtifactInfoImpl)) { return false; + } else if (obj == this) { + return true; } - return artifactVersion != null ? artifactVersion.equals(that.artifactVersion) : that.artifactVersion == null; + TestArtifactInfoImpl rhs = (TestArtifactInfoImpl) obj; + // @formatter:off + return new EqualsBuilder() + .append(artifactType, rhs.artifactType) + .append(artifactDescription, rhs.artifactDescription) + .append(artifactVersion, rhs.artifactVersion) + .isEquals(); + // @formatter:on } @Override public int hashCode() { - int result = artifactName != null ? artifactName.hashCode() : 0; - result = 31 * result + (artifactType != null ? artifactType.hashCode() : 0); - result = 31 * result + (artifactDescription != null ? artifactDescription.hashCode() : 0); - result = 31 * result + (artifactVersion != null ? artifactVersion.hashCode() : 0); - return result; + return Objects.hash(this.artifactType, this.artifactDescription, this.artifactVersion); } } diff --git a/src/test/java/org/onap/aai/babel/logging/LogReader.java b/src/test/java/org/onap/aai/babel/logging/LogReader.java new file mode 100644 index 0000000..c2a8e64 --- /dev/null +++ b/src/test/java/org/onap/aai/babel/logging/LogReader.java @@ -0,0 +1,102 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ +package org.onap.aai.babel.logging; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import org.apache.commons.lang.time.StopWatch; +import org.junit.Assert; + +public class LogReader { + + private Map<String, Path> cachedLogMap = new HashMap<>(); + private Map<String, BufferedReader> readersMap = new HashMap<>(); + private BufferedReader cachedReader; + + public LogReader(String logDirectory, String logFilePrefix) throws IOException { + cachedReader = getReader(logDirectory, logFilePrefix); + } + + private BufferedReader getReader(String logDirectory, String logFilePrefix) throws IOException { + BufferedReader reader = readersMap.get(logFilePrefix); + if (reader == null) { + reader = new BufferedReader(new FileReader(getLogFile(logDirectory, logFilePrefix))); + while (reader.readLine() != null) { + // Consume all lines + } + readersMap.put(logFilePrefix, reader); + } + return reader; + } + + /** + * @param logDirectory + * @return the most recently created log file. + * @throws IOException + */ + public File getLogFile(String logDirectory, String filenamePrefix) throws IOException { + Path cachedLog = cachedLogMap.get(filenamePrefix); + + if (cachedLog == null) { + Optional<Path> latestFilePath = Files.list(Paths.get(logDirectory)) + .filter(f -> Files.isDirectory(f) == false && f.getFileName().toString().startsWith(filenamePrefix)) + .max((f1, f2) -> (int) (f1.toFile().lastModified() - f2.toFile().lastModified())); + if (latestFilePath.isPresent()) { + cachedLog = latestFilePath.get(); + } else { + throw new IOException("No validation log files were found!"); + } + } + return cachedLog.toFile(); + } + + /** + * @return new lines appended to the log file + * @throws IOException + */ + public String getNewLines() throws IOException { + StopWatch stopwatch = new StopWatch(); + stopwatch.start(); + + while (!cachedReader.ready()) { + if (stopwatch.getTime() > TimeUnit.SECONDS.toMillis(30)) { + Assert.fail("Test took too long"); + } + // else keep waiting + } + + StringBuilder lines = new StringBuilder(); + String line; + while ((line = cachedReader.readLine()) != null) { + lines.append(line).append(System.lineSeparator()); + } + return lines.toString(); + } +} diff --git a/src/test/java/org/onap/aai/babel/logging/TestApplicationLogger.java b/src/test/java/org/onap/aai/babel/logging/TestApplicationLogger.java new file mode 100644 index 0000000..8a038b2 --- /dev/null +++ b/src/test/java/org/onap/aai/babel/logging/TestApplicationLogger.java @@ -0,0 +1,235 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ +package org.onap.aai.babel.logging; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import java.io.IOException; +import java.util.Arrays; +import javax.ws.rs.core.HttpHeaders; +import org.apache.commons.lang.time.StopWatch; +import org.junit.BeforeClass; +import org.junit.Test; +import org.mockito.Mockito; +import org.onap.aai.babel.logging.LogHelper.TriConsumer; +import org.onap.aai.cl.api.LogFields; +import org.onap.aai.cl.api.Logger; +import org.onap.aai.cl.mdc.MdcOverride; + +/** + * Simple test to log each of the validation messages in turn. + * + * This version tests only the error logger at INFO level. + * + */ +public class TestApplicationLogger { + + @BeforeClass + public static void setupClass() { + System.setProperty("AJSC_HOME", "."); + } + + /** + * Check that each message can be logged and that (by implication of successful logging) there is a corresponding + * resource (message format). + * + * @throws IOException + */ + @Test + public void logAllMessages() throws IOException { + Logger logger = LogHelper.INSTANCE; + LogReader errorReader = new LogReader(LogHelper.getLogDirectory(), "error"); + LogReader debugReader = new LogReader(LogHelper.getLogDirectory(), "debug"); + String[] args = {"1", "2", "3", "4"}; + for (ApplicationMsgs msg : Arrays.asList(ApplicationMsgs.values())) { + if (msg.name().endsWith("ERROR")) { + logger.error(msg, args); + validateLoggedMessage(msg, errorReader, "ERROR"); + + logger.error(msg, new RuntimeException("fred"), args); + validateLoggedMessage(msg, errorReader, "fred"); + } else { + logger.info(msg, args); + validateLoggedMessage(msg, errorReader, "INFO"); + + logger.warn(msg, args); + validateLoggedMessage(msg, errorReader, "WARN"); + } + + logger.debug(msg, args); + validateLoggedMessage(msg, debugReader, "DEBUG"); + + // The trace level is not enabled + logger.trace(msg, args); + } + } + + /** + * Check that each message can be logged and that (by implication of successful logging) there is a corresponding + * resource (message format). + * + * @throws IOException + */ + @Test + public void logDebugMessages() throws IOException { + LogReader reader = new LogReader(LogHelper.getLogDirectory(), "debug"); + LogHelper.INSTANCE.debug("a message"); + String s = reader.getNewLines(); + assertThat(s, is(notNullValue())); + } + + /** + * Check logAudit with HTTP headers + * + * @throws IOException + */ + @Test + public void logAuditMessage() throws IOException { + LogHelper logger = LogHelper.INSTANCE; + LogReader reader = new LogReader(LogHelper.getLogDirectory(), "audit"); + + HttpHeaders headers = Mockito.mock(HttpHeaders.class); + Mockito.when(headers.getHeaderString("X-ECOMP-RequestID")).thenReturn("ecomp-request-id"); + Mockito.when(headers.getHeaderString("X-FromAppId")).thenReturn("app-id"); + + // Call logAudit without first calling startAudit + logger.logAuditSuccess("first call: bob"); + String s = reader.getNewLines(); + assertThat(s, is(notNullValue())); + assertThat("audit message log level", s, containsString("INFO")); + assertThat("audit message content", s, containsString("bob")); + + // This time call the start method + logger.startAudit(headers, null); + logger.logAuditSuccess("second call: foo"); + s = reader.getNewLines(); + assertThat(s, is(notNullValue())); + assertThat("audit message log level", s, containsString("INFO")); + assertThat("audit message content", s, containsString("foo")); + assertThat("audit message content", s, containsString("ecomp-request-id")); + assertThat("audit message content", s, containsString("app-id")); + } + + /** + * Check logAudit with no HTTP headers + * + * @throws IOException + */ + @Test + public void logAuditMessageWithoutHeaders() throws IOException { + LogHelper logger = LogHelper.INSTANCE; + LogReader reader = new LogReader(LogHelper.getLogDirectory(), "audit"); + logger.startAudit(null, null); + logger.logAuditSuccess("foo"); + String s = reader.getNewLines(); + assertThat(s, is(notNullValue())); + assertThat("audit message log level", s, containsString("INFO")); + assertThat("audit message content", s, containsString("foo")); + } + + /** + * Check logMetrics + * + * @throws IOException + */ + @Test + public void logMetricsMessage() throws IOException { + LogReader reader = new LogReader(LogHelper.getLogDirectory(), "metrics"); + LogHelper logger = LogHelper.INSTANCE; + logger.logMetrics("metrics: fred"); + String s = reader.getNewLines(); + assertThat(s, is(notNullValue())); + assertThat("metrics message log level", s, containsString("INFO")); + assertThat("metrics message content", s, containsString("fred")); + } + + @Test + public void logMetricsMessageWithStopwatch() throws IOException { + LogReader reader = new LogReader(LogHelper.getLogDirectory(), "metrics"); + LogHelper logger = LogHelper.INSTANCE; + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + logger.logMetrics(stopWatch, "joe", "bloggs"); + String logLine = reader.getNewLines(); + assertThat(logLine, is(notNullValue())); + assertThat("metrics message log level", logLine, containsString("INFO")); + assertThat("metrics message content", logLine, containsString("joe")); + } + + @Test + public void callUnsupportedMethods() throws IOException { + LogHelper logger = LogHelper.INSTANCE; + ApplicationMsgs dummyMsg = ApplicationMsgs.LOAD_PROPERTIES; + callUnsupportedOperationMethod(logger::error, dummyMsg); + callUnsupportedOperationMethod(logger::info, dummyMsg); + callUnsupportedOperationMethod(logger::warn, dummyMsg); + callUnsupportedOperationMethod(logger::debug, dummyMsg); + callUnsupportedOperationMethod(logger::trace, dummyMsg); + try { + logger.error(dummyMsg, new LogFields(), new RuntimeException("test"), ""); + } catch (UnsupportedOperationException e) { + // Expected to reach here + } + try { + logger.info(dummyMsg, new LogFields(), new MdcOverride(), ""); + } catch (UnsupportedOperationException e) { + // Expected to reach here + } + try { + logger.formatMsg(dummyMsg, ""); + } catch (UnsupportedOperationException e) { + // Expected to reach here + } + } + + /** + * Call a logger method which is expected to throw an UnsupportedOperationException + * + * @param logMethod + * @param dummyMsg + */ + private void callUnsupportedOperationMethod(TriConsumer<Enum<?>, LogFields, String[]> logMethod, + ApplicationMsgs dummyMsg) { + try { + logMethod.accept(dummyMsg, new LogFields(), new String[] {""}); + org.junit.Assert.fail("method should have thrown execption"); // NOSONAR as code not reached + } catch (UnsupportedOperationException e) { + // Expected to reach here + } + } + + /** + * Assert that a log message was logged to the expected log file at the expected severity + * + * @param msg + * @param reader + * @param severity + * @throws IOException + */ + private void validateLoggedMessage(ApplicationMsgs msg, LogReader reader, String severity) throws IOException { + String s = reader.getNewLines(); + assertThat(s, is(notNullValue())); + assertThat(msg.toString() + " log level", s, containsString(severity)); + } +} diff --git a/src/test/java/org/onap/aai/babel/parser/TestToscaParser.java b/src/test/java/org/onap/aai/babel/parser/TestToscaParser.java new file mode 100644 index 0000000..b1f2c01 --- /dev/null +++ b/src/test/java/org/onap/aai/babel/parser/TestToscaParser.java @@ -0,0 +1,88 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ +package org.onap.aai.babel.parser; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import org.apache.commons.io.IOUtils; +import org.junit.Before; +import org.junit.Test; +import org.onap.aai.babel.csar.extractor.InvalidArchiveException; +import org.onap.aai.babel.csar.extractor.YamlExtractor; +import org.onap.aai.babel.xml.generator.api.AaiArtifactGenerator; +import org.onap.aai.babel.xml.generator.data.AdditionalParams; +import org.onap.aai.babel.xml.generator.data.Artifact; +import org.onap.aai.babel.xml.generator.data.GenerationData; +import org.onap.aai.babel.xml.generator.data.GeneratorConstants; +import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil; + +/** + * Direct tests of the Model so as to improve code coverage + */ +public class TestToscaParser { + + static { + if (System.getProperty("AJSC_HOME") == null) { + System.setProperty("AJSC_HOME", "."); + } + } + + @Before + public void setup() throws FileNotFoundException, IOException { + URL url = TestToscaParser.class.getClassLoader().getResource("artifact-generator.properties"); + System.setProperty(GeneratorConstants.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE, url.getPath()); + + InputStream in = TestToscaParser.class.getClassLoader().getResourceAsStream("artifact-generator.properties"); + Properties properties = new Properties(); + properties.load(in); + in.close(); + WidgetConfigurationUtil.setConfig(properties); + } + + @Test + public void testParserWithCsarFile() throws IOException, InvalidArchiveException { + byte[] csar = loadResource("compressedArtifacts/catalog_csar.csar"); + List<Artifact> ymlFiles = YamlExtractor.extract(csar, "catalog_csar.csar", "1.0"); + + Map<String, String> additionalParams = new HashMap<>(); + additionalParams.put(AdditionalParams.SERVICE_VERSION.getName(), "1.0"); + + AaiArtifactGenerator generator = new AaiArtifactGenerator(); + GenerationData data = generator.generateArtifact(csar, ymlFiles, additionalParams); + + assertThat(data.getErrorData().size(), is(equalTo(0))); + assertThat(data.getResultData().size(), is(equalTo(2))); + } + + private byte[] loadResource(String resourceName) throws IOException { + return IOUtils.toByteArray(TestToscaParser.class.getClassLoader().getResource(resourceName)); + } +} diff --git a/src/test/java/org/onap/aai/babel/service/CsarToXmlConverterTest.java b/src/test/java/org/onap/aai/babel/service/CsarToXmlConverterTest.java index 5c1e213..c8080e9 100644 --- a/src/test/java/org/onap/aai/babel/service/CsarToXmlConverterTest.java +++ b/src/test/java/org/onap/aai/babel/service/CsarToXmlConverterTest.java @@ -2,8 +2,8 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017 European Software Marketing Ltd. + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,58 +17,61 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.aai.babel.service; -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; +import static org.junit.Assert.assertThat; + +import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.util.Base64; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; -import org.custommonkey.xmlunit.XMLTestCase; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.hamcrest.Matcher; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; import org.onap.aai.babel.csar.CsarConverterException; import org.onap.aai.babel.csar.CsarToXmlConverter; import org.onap.aai.babel.service.data.BabelArtifact; import org.onap.aai.babel.util.ArtifactTestUtils; -import org.onap.aai.babel.xml.generator.ModelGenerator; import org.onap.aai.babel.xml.generator.XmlArtifactGenerationException; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.xml.sax.SAXException; +import org.onap.aai.babel.xml.generator.data.GeneratorConstants; /** * Tests {@link CsarToXmlConverter} */ -@RunWith(PowerMockRunner.class) -@PrepareForTest(ModelGenerator.class) -public class CsarToXmlConverterTest extends XMLTestCase { +public class CsarToXmlConverterTest { - private static final String NAME = "the_name_of_the_csar_file.csar"; - private static final String VERSION = "v1"; + private static final String ARTIFACT_GENERATOR_CONFIG = "artifact-generator.properties"; + private static final String CSAR_FOLDER = "compressedArtifacts"; + private static final String VALID_CSAR_FILE = "service-SdWanServiceTest-csar.csar"; + private static final String INCORRECT_CSAR_NAME = "the_name_of_the_csar_file.csar"; + private static final String SERVICE_VERSION = "1.0"; private CsarToXmlConverter converter; + static { + if (System.getProperty("AJSC_HOME") == null) { + System.setProperty("AJSC_HOME", "."); + } + } + @Rule public ExpectedException exception = ExpectedException.none(); + private ArtifactTestUtils artifactTestUtils; @Before - public void setUp() { + public void setup() { + System.setProperty(GeneratorConstants.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE, + CsarToXmlConverterTest.class.getClassLoader().getResource(ARTIFACT_GENERATOR_CONFIG).getPath()); converter = new CsarToXmlConverter(); - URL url = CsarToXmlConverterTest.class.getClassLoader().getResource("artifact-generator.properties"); - System.setProperty("artifactgenerator.config", url.getPath()); + artifactTestUtils = new ArtifactTestUtils(); } @After @@ -83,25 +86,22 @@ public class CsarToXmlConverterTest extends XMLTestCase { @Test(expected = NullPointerException.class) public void generateXmlFromCsar_missingName() throws CsarConverterException, IOException { - byte[] csarArchive = new ArtifactTestUtils().loadResource("compressedArtifacts/service-VscpaasTest-csar.csar"); - converter.generateXmlFromCsar(csarArchive, null, null); + converter.generateXmlFromCsar(getCsar(VALID_CSAR_FILE), null, null); } @Test(expected = NullPointerException.class) public void generateXmlFromCsar_missingVersion() throws CsarConverterException, IOException { - byte[] csarArchive = new ArtifactTestUtils().loadResource("compressedArtifacts/service-VscpaasTest-csar.csar"); - converter.generateXmlFromCsar(csarArchive, NAME, null); + converter.generateXmlFromCsar(getCsar(VALID_CSAR_FILE), INCORRECT_CSAR_NAME, null); } @Test(expected = CsarConverterException.class) public void generateXmlFromCsar_noPayloadExists() throws CsarConverterException { - converter.generateXmlFromCsar(new byte[0], NAME, VERSION); + converter.generateXmlFromCsar(new byte[0], INCORRECT_CSAR_NAME, SERVICE_VERSION); } @Test(expected = CsarConverterException.class) public void generateXmlFromCsar_csarFileHasNoYmlFiles() throws CsarConverterException, IOException { - byte[] csarArchive = new ArtifactTestUtils().loadResource("compressedArtifacts/noYmlFilesArchive.zip"); - converter.generateXmlFromCsar(csarArchive, "noYmlFilesArchive.zip", VERSION); + converter.generateXmlFromCsar(getCsar("noYmlFilesArchive.zip"), "noYmlFilesArchive.zip", SERVICE_VERSION); } @Test @@ -110,61 +110,55 @@ public class CsarToXmlConverterTest extends XMLTestCase { exception.expect(CsarConverterException.class); exception.expectMessage("Cannot generate artifacts. artifactgenerator.config system property not configured"); - byte[] csarArchive = - new ArtifactTestUtils().loadResource("compressedArtifacts/service-SdWanServiceTest-csar.csar"); - // Unset the required system property - System.clearProperty("artifactgenerator.config"); - converter.generateXmlFromCsar(csarArchive, VERSION, "service-SdWanServiceTest-csar.csar"); + System.clearProperty(GeneratorConstants.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE); + converter.generateXmlFromCsar(getCsar(VALID_CSAR_FILE), VALID_CSAR_FILE, SERVICE_VERSION); } @Test public void generateXmlFromCsar() throws CsarConverterException, IOException, XmlArtifactGenerationException { - byte[] csarArchive = - new ArtifactTestUtils().loadResource("compressedArtifacts/service-SdWanServiceTest-csar.csar"); - Map<String, String> expectedXmlFiles = createExpectedXmlFiles(); List<BabelArtifact> generatedArtifacts = - converter.generateXmlFromCsar(csarArchive, VERSION, "service-SdWanServiceTest-csar.csar"); - - generatedArtifacts.forEach(ga -> { - try { + converter.generateXmlFromCsar(getCsar(VALID_CSAR_FILE), VALID_CSAR_FILE, SERVICE_VERSION); - String x1 = expectedXmlFiles.get(ga.getName()); + generatedArtifacts + .forEach(ga -> assertThat("The content of " + ga.getName() + " must match the expected content", + ga.getPayload(), matches(expectedXmlFiles.get(ga.getName())))); + } - String x2 = bytesToString(ga.getPayload()); + public Matcher<String> matches(final String expected) { + return new BaseMatcher<String>() { + protected String theExpected = expected; - assertXMLEqual("The content of " + ga.getName() + " must match the expected content", x1, x2); + @Override + public boolean matches(Object o) { + return artifactTestUtils.compareXMLStrings((String) o, theExpected); + } - } catch (SAXException | IOException e) { - fail("There was an Exception parsing the XML: "+e.getMessage()); + @Override + public void describeTo(Description description) { + description.appendText(theExpected.toString()); } - }); + }; } - public String bytesToString(byte[] source) { - ByteArrayInputStream bis = new ByteArrayInputStream(Base64.getDecoder().decode(source)); - - String result = new BufferedReader(new InputStreamReader(bis)).lines().collect(Collectors.joining("\n")); - - return result; - + private byte[] getCsar(String csarFileName) throws IOException { + return artifactTestUtils.loadResource(CSAR_FOLDER + File.separator + csarFileName); } private Map<String, String> createExpectedXmlFiles() throws IOException { - Map<String, String> xml = new HashMap<>(); - - ArtifactTestUtils utils = new ArtifactTestUtils(); - - String[] filesToLoad = - {"AAI-SD-WAN-Service-Test-service-1.0.xml", "AAI-SdWanTestVsp..DUMMY..module-0-resource-2.xml", - "AAI-Tunnel_XConnTest-resource-2.0.xml", "AAI-SD-WAN-Test-VSP-resource-1.0.xml"}; + Map<String, String> xmlMap = new HashMap<>(); - for (String s : filesToLoad) { - xml.put(s, utils.loadResourceAsString("generatedXml/" + s)); + List<String> filesToLoad = new ArrayList<>(); + filesToLoad.add("AAI-SD-WAN-Service-Test-service-1.0.xml"); + filesToLoad.add("AAI-SdWanTestVsp..DUMMY..module-0-resource-2.xml"); + filesToLoad.add("AAI-Tunnel_XConnTest-resource-2.0.xml"); + filesToLoad.add("AAI-SD-WAN-Test-VSP-resource-1.0.xml"); + for (String filename : filesToLoad) { + xmlMap.put(filename, artifactTestUtils.loadResourceAsString("generatedXml" + File.separator + filename)); } - return xml; + return xmlMap; } } diff --git a/src/test/java/org/onap/aai/babel/service/TestGenerateArtifactsServiceImpl.java b/src/test/java/org/onap/aai/babel/service/TestGenerateArtifactsServiceImpl.java index 5d2309f..b1423b7 100644 --- a/src/test/java/org/onap/aai/babel/service/TestGenerateArtifactsServiceImpl.java +++ b/src/test/java/org/onap/aai/babel/service/TestGenerateArtifactsServiceImpl.java @@ -2,8 +2,8 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017 European Software Marketing Ltd. + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.aai.babel.service; @@ -26,60 +24,79 @@ import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import java.io.IOException; +import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; +import java.security.cert.X509Certificate; +import java.util.Collections; +import java.util.List; +import java.util.Map.Entry; import java.util.stream.Collectors; +import javax.inject.Inject; +import javax.security.auth.x500.X500Principal; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; import org.junit.BeforeClass; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.onap.aai.auth.AAIMicroServiceAuth; +import org.onap.aai.babel.xml.generator.data.GeneratorConstants; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; /** * Direct invocation of the generate artifacts service implementation * */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = {"classpath:/babel-beans.xml"}) public class TestGenerateArtifactsServiceImpl { - + + static { + if (System.getProperty("AJSC_HOME") == null) { + System.setProperty("AJSC_HOME", "."); + } + } + + @Inject + private AAIMicroServiceAuth auth; + @BeforeClass public static void setup() { URL url = TestGenerateArtifactsServiceImpl.class.getClassLoader().getResource("artifact-generator.properties"); - System.setProperty("artifactgenerator.config", url.getPath()); + System.setProperty(GeneratorConstants.PROPERTY_ARTIFACT_GENERATOR_CONFIG_FILE, url.getPath()); } - + @Test - public void testGenerateArtifacts() throws Exception { - String jsonRequest = readstringFromFile("jsonFiles/success_request.json"); + public void testInvalidCsarFile() throws URISyntaxException, IOException { + String jsonRequest = readstringFromFile("jsonFiles/invalid_csar_request.json"); Response response = processJsonRequest(jsonRequest); - assertThat(response.getStatus(), is(Response.Status.OK.getStatusCode())); - assertThat(response.getEntity(), is(readstringFromFile("response/response.json"))); + assertThat(response.getStatus(), is(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode())); + assertThat(response.getEntity(), is("Error converting CSAR artifact to XML model.")); } - @Test - public void testInvalidCsarFile() throws URISyntaxException, IOException{ - String jsonRequest = readstringFromFile("jsonFiles/invalid_csar_request.json"); - Response response = processJsonRequest(jsonRequest); - assertThat(response.getStatus(), is(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode())); - assertThat(response.getEntity(), is("Error converting CSAR artifact to XML model.")); - } - - @Test - public void testInvalidJsonFile() throws URISyntaxException, IOException{ - String jsonRequest = readstringFromFile("jsonFiles/invalid_json_request.json"); - Response response = processJsonRequest(jsonRequest); - assertThat(response.getStatus(), is(Response.Status.BAD_REQUEST.getStatusCode())); - assertThat(response.getEntity(), is("Malformed request.")); + public void testInvalidJsonFile() throws URISyntaxException, IOException { + String jsonRequest = readstringFromFile("jsonFiles/invalid_json_request.json"); + Response response = processJsonRequest(jsonRequest); + assertThat(response.getStatus(), is(Response.Status.BAD_REQUEST.getStatusCode())); + assertThat(response.getEntity(), is("Malformed request.")); } - + @Test public void testMissingArtifactName() throws Exception { String jsonRequest = readstringFromFile("jsonFiles/missing_artifact_name_request.json"); Response response = processJsonRequest(jsonRequest); assertThat(response.getStatus(), is(Response.Status.BAD_REQUEST.getStatusCode())); - assertThat(response.getEntity(), is("No artifact name attribute found in the request body." )); + assertThat(response.getEntity(), is("No artifact name attribute found in the request body.")); } - + @Test public void testMissingArtifactVersion() throws Exception { String jsonRequest = readstringFromFile("jsonFiles/missing_artifact_version_request.json"); @@ -87,7 +104,7 @@ public class TestGenerateArtifactsServiceImpl { assertThat(response.getStatus(), is(Response.Status.BAD_REQUEST.getStatusCode())); assertThat(response.getEntity(), is("No artifact version attribute found in the request body.")); } - + @Test public void testMissingCsarFile() throws Exception { String jsonRequest = readstringFromFile("jsonFiles/missing_csar_request.json"); @@ -95,17 +112,59 @@ public class TestGenerateArtifactsServiceImpl { assertThat(response.getStatus(), is(Response.Status.BAD_REQUEST.getStatusCode())); assertThat(response.getEntity(), is("No csar attribute found in the request body.")); } - - private Response processJsonRequest(String jsonRequest) { - GenerateArtifactsServiceImpl service = new GenerateArtifactsServiceImpl(/* No authentiction required */ null); - return service.generateArtifacts(jsonRequest); + /** + * Create a (mocked) HTTPS request and invoke the Babel generate artifacts API + * + * @param request for the Babel Service + * @return the Response from the HTTP API + * @throws URISyntaxException + */ + private Response processJsonRequest(String jsonRequest) throws URISyntaxException { + UriInfo mockUriInfo = Mockito.mock(UriInfo.class); + Mockito.when(mockUriInfo.getRequestUri()).thenReturn(new URI("/validate")); // NOSONAR (mocked) + Mockito.when(mockUriInfo.getPath(false)).thenReturn("validate"); // URI prefix is stripped by AJSC routing + Mockito.when(mockUriInfo.getPathParameters()).thenReturn(new MultivaluedHashMap<String, String>()); + + // Create mocked request headers map + MultivaluedHashMap<String, String> headersMap = new MultivaluedHashMap<>(); + headersMap.put("X-TransactionId", createSingletonList("transaction-id")); + headersMap.put("X-FromAppId", createSingletonList("app-id")); + headersMap.put("Host", createSingletonList("hostname")); + + HttpHeaders headers = Mockito.mock(HttpHeaders.class); + for (Entry<String, List<String>> entry : headersMap.entrySet()) { + Mockito.when(headers.getRequestHeader(entry.getKey())).thenReturn(entry.getValue()); + } + Mockito.when(headers.getRequestHeaders()).thenReturn(headersMap); + + MockHttpServletRequest servletRequest = new MockHttpServletRequest(); + servletRequest.setSecure(true); + servletRequest.setScheme("https"); + servletRequest.setServerPort(9501); + servletRequest.setServerName("localhost"); + servletRequest.setRequestURI("/services/validation-service/v1/app/validate"); + + X509Certificate mockCertificate = Mockito.mock(X509Certificate.class); + Mockito.when(mockCertificate.getSubjectX500Principal()) + .thenReturn(new X500Principal("CN=test, OU=qa, O=Test Ltd, L=London, ST=London, C=GB")); + + servletRequest.setAttribute("javax.servlet.request.X509Certificate", new X509Certificate[] {mockCertificate}); + servletRequest.setAttribute("javax.servlet.request.cipher_suite", ""); + + GenerateArtifactsServiceImpl service = new GenerateArtifactsServiceImpl(auth); + return service.generateArtifacts(mockUriInfo, headers, servletRequest, jsonRequest); + } + + private List<String> createSingletonList(String listItem) { + return Collections.<String>singletonList(listItem); } private String readstringFromFile(String resourceFile) throws IOException, URISyntaxException { - return Files.lines(Paths.get(ClassLoader.getSystemResource(resourceFile).toURI())) + return Files + .lines(Paths + .get(TestGenerateArtifactsServiceImpl.class.getClassLoader().getResource(resourceFile).toURI())) .collect(Collectors.joining()); } - - + } diff --git a/src/test/java/org/onap/aai/babel/service/TestInfoService.java b/src/test/java/org/onap/aai/babel/service/TestInfoService.java new file mode 100644 index 0000000..b97aa92 --- /dev/null +++ b/src/test/java/org/onap/aai/babel/service/TestInfoService.java @@ -0,0 +1,69 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ +package org.onap.aai.babel.service; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertThat; + +import java.time.Clock; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import org.junit.Test; + +public class TestInfoService { + + @Test + public void testInitialisedInfoService() { + String info = new InfoService().getInfo(""); + assertThat(info, startsWith("Status: Up\n")); + assertThat(info, containsString("Started at")); + assertThat(info, containsString("total=1")); + } + + @Test + public void testStatusReport() { + InfoService infoService = new InfoService(); + LocalDateTime now = LocalDateTime.now(); + Clock clock = buildClock(now); + + String info = infoService.statusReport(clock); + assertThat(info, containsString("Started at")); + assertThat(info, containsString("total=1")); + + // Skip ahead 1 day + clock = buildClock(now.plusDays(1)); + info = infoService.statusReport(clock); + assertThat(info, containsString("Up time 1 day ")); + assertThat(info, containsString("total=2")); + + // Skip ahead 5 days + clock = buildClock(now.plusDays(5)); + info = infoService.statusReport(clock); + assertThat(info, containsString("Up time 5 days ")); + assertThat(info, containsString("total=3")); + } + + private Clock buildClock(LocalDateTime now) { + return Clock.fixed(now.toInstant(OffsetDateTime.now().getOffset()), Clock.systemDefaultZone().getZone()); + } + +} diff --git a/src/test/java/org/onap/aai/babel/util/ArtifactTestUtils.java b/src/test/java/org/onap/aai/babel/util/ArtifactTestUtils.java index 74f0c0e..5a4224c 100644 --- a/src/test/java/org/onap/aai/babel/util/ArtifactTestUtils.java +++ b/src/test/java/org/onap/aai/babel/util/ArtifactTestUtils.java @@ -2,8 +2,8 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017 European Software Marketing Ltd. + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,26 +17,23 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.aai.babel.util; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; -import com.google.common.base.Throwables; -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; +import java.net.URL; +import java.nio.charset.Charset; import java.util.Base64; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; -import org.openecomp.sdc.generator.data.Artifact; +import org.custommonkey.xmlunit.Diff; +import org.onap.aai.babel.xml.generator.data.Artifact; +import org.xml.sax.SAXException; /** * This class provides some utilities to assist with running tests. @@ -51,50 +48,60 @@ public class ArtifactTestUtils { try { return loadResourceAsString(s); } catch (IOException e) { - throw Throwables.propagate(e); + throw new RuntimeException(e); } }).collect(Collectors.toSet()); - toscaFiles.forEach(ts -> { - boolean payloadFound = false; + compareXMLPayloads(toscaFiles, ymlPayloads); + } + + /** + * Compare 2 XML strings to see if they have the same content + * + * @param string1 + * @param string2 + * @return true if similar + */ + public boolean compareXMLStrings(String string1, String string2) { + boolean similar = false; + + try { + similar = new Diff(string1, string2).similar(); + } catch (SAXException | IOException e) { // NOSONAR + similar = true; + } + + return similar; + } + + public byte[] loadResource(String resourceName) throws IOException { + return IOUtils.toByteArray(getResource(resourceName)); + } - String s = bytesToString(ts.getPayload()); + public String loadResourceAsString(String resourceName) throws IOException { + return IOUtils.toString(getResource(resourceName)); + } + private void compareXMLPayloads(List<Artifact> toscaFiles, Set<String> ymlPayloads) { + for (Artifact artifact : toscaFiles) { + boolean payloadFound = false; for (String ymlPayload : ymlPayloads) { - String tscontent = ymlPayload; - if (s.endsWith(tscontent)) { + if (compareXMLStrings(convertToString(artifact.getPayload()), ymlPayload)) { payloadFound = true; break; } } assertThat("The content of each yml file must match the actual content of the file extracted (" - + ts.getName() + ")", payloadFound, is(true)); - }); - } - - public byte[] loadResource(String resourceName) throws IOException { - - return IOUtils.toByteArray(ArtifactTestUtils.class.getClassLoader().getResource(resourceName)); + + artifact.getName() + ")", payloadFound, is(true)); + } } - public String loadResourceAsString(String resourceName) throws IOException { - - InputStream is = ArtifactTestUtils.class.getClassLoader().getResource(resourceName).openStream(); - - String result = new BufferedReader(new InputStreamReader(is)).lines().collect(Collectors.joining("\n")); - - return result; - + private URL getResource(String resourceName) { + return ArtifactTestUtils.class.getClassLoader().getResource(resourceName); } - public String bytesToString(byte[] source) { - ByteArrayInputStream bis = new ByteArrayInputStream(Base64.getDecoder().decode(source)); - - String result = new BufferedReader(new InputStreamReader(bis)).lines().collect(Collectors.joining("\n")); - - return result; - + private String convertToString(byte[] byteArray) { + return new String(Base64.getDecoder().decode(byteArray), Charset.defaultCharset()); } - } diff --git a/src/test/java/org/onap/aai/babel/util/TestRequestValidator.java b/src/test/java/org/onap/aai/babel/util/TestRequestValidator.java index 030c24d..bffe419 100644 --- a/src/test/java/org/onap/aai/babel/util/TestRequestValidator.java +++ b/src/test/java/org/onap/aai/babel/util/TestRequestValidator.java @@ -2,8 +2,8 @@ * ============LICENSE_START======================================================= * org.onap.aai * ================================================================================ - * Copyright © 2017 AT&T Intellectual Property. All rights reserved. - * Copyright © 2017 European Software Marketing Ltd. + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,6 @@ * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. */ package org.onap.aai.babel.util; @@ -28,45 +26,45 @@ import org.junit.rules.ExpectedException; import org.onap.aai.babel.service.data.BabelRequest; public class TestRequestValidator { - + @Rule public ExpectedException exception = ExpectedException.none(); - + @Test - public void testMissingArtifactNameExceptionThrown() throws Exception{ + public void testMissingArtifactNameExceptionThrown() throws Exception { exception.expect(RequestValidationException.class); exception.expectMessage("No artifact name attribute found in the request body."); - + BabelRequest request = new BabelRequest(); request.setCsar("UEsDBBQACAgIAGsrz0oAAAAAAAAAAAAAAAAJAAAAY3Nhci5tZXRhC3Z"); request.setArtifactVersion("1.0"); request.setArtifactName(null); - RequestValidator.validateRequest(request); - } - + RequestValidator.validateRequest(request); + } + + + @Test + public void testMissingArtifactVersionExceptionThrown() throws Exception { + exception.expect(RequestValidationException.class); + exception.expectMessage("No artifact version attribute found in the request body."); - @Test - public void testMissingArtifactVersionExceptionThrown() throws Exception{ - exception.expect(RequestValidationException.class); - exception.expectMessage("No artifact version attribute found in the request body."); - BabelRequest request = new BabelRequest(); request.setCsar("UEsDBBQACAgIAGsrz0oAAAAAAAAAAAAAAAAJAAAAY3Nhci5tZXRhC3Z"); request.setArtifactVersion(null); request.setArtifactName("hello"); - RequestValidator.validateRequest(request); + RequestValidator.validateRequest(request); } - + @Test - public void testMissingCsarFile() throws Exception{ + public void testMissingCsarFile() throws Exception { exception.expect(RequestValidationException.class); exception.expectMessage("No csar attribute found in the request body."); - + BabelRequest request = new BabelRequest(); request.setCsar(null); request.setArtifactVersion("1.0"); request.setArtifactName("hello"); - RequestValidator.validateRequest(request); + RequestValidator.validateRequest(request); } } diff --git a/src/test/java/org/onap/aai/babel/xml/generator/model/TestVfModule.java b/src/test/java/org/onap/aai/babel/xml/generator/model/TestVfModule.java new file mode 100644 index 0000000..d02b817 --- /dev/null +++ b/src/test/java/org/onap/aai/babel/xml/generator/model/TestVfModule.java @@ -0,0 +1,121 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ +package org.onap.aai.babel.xml.generator.model; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import org.junit.Before; +import org.junit.Test; +import org.onap.aai.babel.xml.generator.data.WidgetConfigurationUtil; +import org.onap.aai.babel.xml.generator.model.Widget.Type; + +/** + * Direct tests of the Model class VfModule so as to improve code coverage + */ +public class TestVfModule { + + static { + if (System.getProperty("AJSC_HOME") == null) { + System.setProperty("AJSC_HOME", "."); + } + } + + @Before + public void setup() throws FileNotFoundException, IOException { + InputStream in = TestVfModule.class.getClassLoader().getResourceAsStream("artifact-generator.properties"); + Properties properties = new Properties(); + properties.load(in); + in.close(); + WidgetConfigurationUtil.setConfig(properties); + } + + @Test + public void testCreateVfModule() { + VfModule vf = new VfModule(); + Map<String, String> modelIdentInfo = new HashMap<>(); + modelIdentInfo.put("UUID", "dummy_uuid"); + vf.populateModelIdentificationInformation(modelIdentInfo); + assertThat(vf.hashCode(), is(notNullValue())); + assertThat(vf.equals(vf), is(true)); + // Tests that the overridden equals() method correctly returns false for a different type of Object + // This is necessary to achieve complete code coverage + assertThat(vf.equals("string"), is(false)); // NOSONAR + } + + @Test + public void testNonMemberWidgetToVF() { + VfModule vf = new VfModule(); + Widget widget = Widget.getWidget(Type.SERVICE); + vf.setMembers(Collections.singletonList(widget.getId())); + vf.addWidget(widget); + } + + @Test + public void testAddServiceWidgetToVF() { + VfModule vf = new VfModule(); + addWidgetToModule(vf, Type.SERVICE); + } + + @Test + public void testAddVServerWidgetToVF() { + VfModule vf = new VfModule(); + addWidgetToModule(vf, Type.VSERVER); + } + + @Test + public void testAddLIntfWidgetToVF() { + VfModule vf = new VfModule(); + addWidgetToModule(vf, Type.LINT); + addWidgetToModule(vf, Type.VSERVER); + addWidgetToModule(vf, Type.LINT); + } + + @Test + public void testAddVolumeWidgetToVF() { + VfModule vf = new VfModule(); + addWidgetToModule(vf, Type.VOLUME); + addWidgetToModule(vf, Type.VSERVER); + addWidgetToModule(vf, Type.VOLUME); + } + + @Test + public void testAddOAMNetworkWidgetToVF() { + VfModule vf = new VfModule(); + addWidgetToModule(vf, Type.OAM_NETWORK); + } + + private void addWidgetToModule(VfModule vfModule, Type widgeType) { + Widget widget = Widget.getWidget(widgeType); + String id = widget.getId(); + widget.addKey(id); + vfModule.setMembers(Collections.singletonList(id)); + vfModule.addWidget(widget); + } +} diff --git a/src/test/java/org/onap/aai/babel/xml/generator/model/TestWidget.java b/src/test/java/org/onap/aai/babel/xml/generator/model/TestWidget.java new file mode 100644 index 0000000..e33de67 --- /dev/null +++ b/src/test/java/org/onap/aai/babel/xml/generator/model/TestWidget.java @@ -0,0 +1,55 @@ +/** + * ============LICENSE_START======================================================= + * org.onap.aai + * ================================================================================ + * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Copyright © 2017-2018 European Software Marketing Ltd. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ +package org.onap.aai.babel.xml.generator.model; + +import org.junit.Test; +import org.onap.aai.babel.xml.generator.model.Widget.Type; + +/** + * Direct tests of the Model so as to improve code coverage + */ +public class TestWidget { + + static { + if (System.getProperty("AJSC_HOME") == null) { + System.setProperty("AJSC_HOME", "."); + } + } + + @Test + public void testGetWidgets() { + Widget.getWidget(Type.VFC); + Widget.getWidget(Type.FLAVOR); + Widget.getWidget(Type.TENANT); + Widget.getWidget(Type.VOLUME_GROUP); + Widget.getWidget(Type.L3_NET); + Widget.getWidget(Type.IMAGE); + Widget.getWidget(Type.TUNNEL_XCONNECT); + } + + @Test + public void testMethods() { + new ServiceWidget().addWidget(new TenantWidget()); + new VolumeGroupWidget().getWidgetType(); + } + + +} diff --git a/src/test/resources/babel-auth.properties b/src/test/resources/babel-auth.properties new file mode 100644 index 0000000..ba4e13a --- /dev/null +++ b/src/test/resources/babel-auth.properties @@ -0,0 +1,2 @@ +auth.policy.file=/auth/auth_policy.json +auth.authentication.disable=true
\ No newline at end of file diff --git a/src/test/resources/babel-beans.xml b/src/test/resources/babel-beans.xml new file mode 100644 index 0000000..f102337 --- /dev/null +++ b/src/test/resources/babel-beans.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> + + <!-- ////////////////////////////////////////////////////////////////// --> + <!-- PROPERTY AND CONFIGURATION FILES --> + <!-- ////////////////////////////////////////////////////////////////// --> + + <context:property-placeholder location="classpath:babel-auth.properties" ignore-unresolvable="true" /> + + <!-- ////////////////////////////////////////////////////////////////// --> + <!-- CONFIG BEANS --> + <!-- ////////////////////////////////////////////////////////////////// --> + + <bean id="babelAuthConfig" class="org.onap.aai.babel.config.BabelAuthConfig"> + <property name="authenticationDisable" value="${auth.authentication.disable}" /> + <property name="authPolicyFile" value="${auth.policy.file}" /> + </bean> + + <!-- ////////////////////////////////////////////////////////////////// --> + <!-- IMPLEMENTATION BEANS --> + <!-- ////////////////////////////////////////////////////////////////// --> + + <bean id="aaiMicroServiceAuth" class="org.onap.aai.auth.AAIMicroServiceAuth" > + <constructor-arg ref="babelAuthConfig" /> + </bean> + + + <bean id="generateArtifacts" class="org.onap.aai.babel.service.GenerateArtifactsServiceImpl" > + <constructor-arg ref="aaiMicroServiceAuth" /> + </bean> + +</beans> diff --git a/src/test/resources/compressedArtifacts/Duff.txt b/src/test/resources/compressedArtifacts/Duff.txt new file mode 100644 index 0000000..51faa6e --- /dev/null +++ b/src/test/resources/compressedArtifacts/Duff.txt @@ -0,0 +1 @@ +a bogus file.
\ No newline at end of file diff --git a/src/test/resources/compressedArtifacts/catalog_csar.csar b/src/test/resources/compressedArtifacts/catalog_csar.csar Binary files differnew file mode 100644 index 0000000..35b17f7 --- /dev/null +++ b/src/test/resources/compressedArtifacts/catalog_csar.csar diff --git a/src/test/resources/compressedArtifacts/noVnfConfiguration.csar b/src/test/resources/compressedArtifacts/noVnfConfiguration.csar Binary files differnew file mode 100644 index 0000000..7dd8cd2 --- /dev/null +++ b/src/test/resources/compressedArtifacts/noVnfConfiguration.csar diff --git a/src/test/resources/generatedXml/AAI-SCP-Test-VSP-resource-1.0.xml b/src/test/resources/generatedXml/AAI-SCP-Test-VSP-resource-1.0.xml new file mode 100644 index 0000000..22f3ed0 --- /dev/null +++ b/src/test/resources/generatedXml/AAI-SCP-Test-VSP-resource-1.0.xml @@ -0,0 +1,51 @@ +<model xmlns="http://org.onap.aai.inventory/v12"> + <model-invariant-id>b2b88a73-5c55-4984-99dd-a35c55935d14</model-invariant-id> + <model-type>resource</model-type> + <model-vers> + <model-ver> + <model-version-id>2e42bac2-318a-410c-b8ff-3b3a31351be7</model-version-id> + <model-name>SCP-Test-VSP</model-name> + <model-version>1.0</model-version> + <model-description>SCP Test VSP</model-description> + <model-elements> + <model-element> + <new-data-del-flag>T</new-data-del-flag> + <cardinality>unbounded</cardinality> + <model-elements> + <model-element> + <new-data-del-flag>T</new-data-del-flag> + <cardinality>unbounded</cardinality> + <model-elements/> + <relationship-list> + <relationship> + <related-to>model-ver</related-to> + <relationship-data> + <relationship-key>model-ver.model-version-id</relationship-key> + <relationship-value>06258c44-ab48-4b4b-a5db-16892f7d1e76</relationship-value> + </relationship-data> + <relationship-data> + <relationship-key>model.model-invariant-id</relationship-key> + <relationship-value>6f288081-b321-47c9-b038-6de70079a3bf</relationship-value> + </relationship-data> + </relationship> + </relationship-list> + </model-element> + </model-elements> + <relationship-list> + <relationship> + <related-to>model-ver</related-to> + <relationship-data> + <relationship-key>model-ver.model-version-id</relationship-key> + <relationship-value>93a6166f-b3d5-4f06-b4ba-aed48d009ad9</relationship-value> + </relationship-data> + <relationship-data> + <relationship-key>model.model-invariant-id</relationship-key> + <relationship-value>acc6edd8-a8d4-4b93-afaa-0994068be14c</relationship-value> + </relationship-data> + </relationship> + </relationship-list> + </model-element> + </model-elements> + </model-ver> + </model-vers> +</model>
\ No newline at end of file diff --git a/src/test/resources/generatedXml/AAI-SD-WAN-Service-Test-service-1.0.xml b/src/test/resources/generatedXml/AAI-SD-WAN-Service-Test-service-1.0.xml index 7748998..d4b0556 100644 --- a/src/test/resources/generatedXml/AAI-SD-WAN-Service-Test-service-1.0.xml +++ b/src/test/resources/generatedXml/AAI-SD-WAN-Service-Test-service-1.0.xml @@ -1,4 +1,4 @@ -<model> +<model xmlns="http://org.onap.aai.inventory/v13"> <model-invariant-id>1c111111-1111-1111-1111-111111111111</model-invariant-id> <model-type>service</model-type> <model-vers> @@ -11,44 +11,7 @@ <model-element> <new-data-del-flag>T</new-data-del-flag> <cardinality>unbounded</cardinality> - <model-elements> - <model-element> - <new-data-del-flag>T</new-data-del-flag> - <cardinality>unbounded</cardinality> - <model-elements/> - <relationship-list> - <relationship> - <related-to>model-ver</related-to> - <relationship-data> - <relationship-key>model-ver.model-version-id</relationship-key> - <relationship-value>2a111111-1111-1111-1111-111111111111</relationship-value> - </relationship-data> - <relationship-data> - <relationship-key>model.model-invariant-id</relationship-key> - <relationship-value>1a111111-1111-1111-1111-111111111111</relationship-value> - </relationship-data> - </relationship> - </relationship-list> - </model-element> - <model-element> - <new-data-del-flag>T</new-data-del-flag> - <cardinality>unbounded</cardinality> - <model-elements/> - <relationship-list> - <relationship> - <related-to>model-ver</related-to> - <relationship-data> - <relationship-key>model-ver.model-version-id</relationship-key> - <relationship-value>2b111111-1111-1111-1111-111111111111</relationship-value> - </relationship-data> - <relationship-data> - <relationship-key>model.model-invariant-id</relationship-key> - <relationship-value>1b111111-1111-1111-1111-111111111111</relationship-value> - </relationship-data> - </relationship> - </relationship-list> - </model-element> - </model-elements> + <model-elements/> <relationship-list> <relationship> <related-to>model-ver</related-to> @@ -66,4 +29,4 @@ </model-elements> </model-ver> </model-vers> -</model> +</model>
\ No newline at end of file diff --git a/src/test/resources/generatedXml/AAI-SD-WAN-Test-VSP-resource-1.0.xml b/src/test/resources/generatedXml/AAI-SD-WAN-Test-VSP-resource-1.0.xml index 1cd85e8..43e97ff 100644 --- a/src/test/resources/generatedXml/AAI-SD-WAN-Test-VSP-resource-1.0.xml +++ b/src/test/resources/generatedXml/AAI-SD-WAN-Test-VSP-resource-1.0.xml @@ -1,4 +1,4 @@ -<model> +<model xmlns="http://org.onap.aai.inventory/v12"> <model-invariant-id>1a111111-1111-1111-1111-111111111111</model-invariant-id> <model-type>resource</model-type> <model-vers> @@ -21,7 +21,7 @@ <related-to>model-ver</related-to> <relationship-data> <relationship-key>model-ver.model-version-id</relationship-key> - <relationship-value>7a111111-1111-1111-1111-111111111111</relationship-value> + <relationship-value>5c111111-1111-1111-1111-111111111111</relationship-value> </relationship-data> <relationship-data> <relationship-key>model.model-invariant-id</relationship-key> diff --git a/src/test/resources/generatedXml/AAI-ScpTestVsp..asc_heat-int2..module-0-resource-1.xml b/src/test/resources/generatedXml/AAI-ScpTestVsp..asc_heat-int2..module-0-resource-1.xml new file mode 100644 index 0000000..66b1d26 --- /dev/null +++ b/src/test/resources/generatedXml/AAI-ScpTestVsp..asc_heat-int2..module-0-resource-1.xml @@ -0,0 +1,141 @@ +<model xmlns="http://org.onap.aai.inventory/v12"> + <model-invariant-id>6f288081-b321-47c9-b038-6de70079a3bf</model-invariant-id> + <model-type>resource</model-type> + <model-vers> + <model-ver> + <model-version-id>06258c44-ab48-4b4b-a5db-16892f7d1e76</model-version-id> + <model-name>ScpTestVsp..asc_heat-int2..module-0</model-name> + <model-version>1</model-version> + <model-elements> + <model-element> + <new-data-del-flag>T</new-data-del-flag> + <cardinality>unbounded</cardinality> + <model-elements> + <model-element> + <new-data-del-flag>T</new-data-del-flag> + <cardinality>unbounded</cardinality> + <model-elements> + <model-element> + <new-data-del-flag>F</new-data-del-flag> + <cardinality>unbounded</cardinality> + <model-elements/> + <relationship-list> + <relationship> + <related-to>model-ver</related-to> + <relationship-data> + <relationship-key>model-ver.model-version-id</relationship-key> + <relationship-value>f6a038c2-820c-42ba-8c2b-375e24e8f932</relationship-value> + </relationship-data> + <relationship-data> + <relationship-key>model.model-invariant-id</relationship-key> + <relationship-value>3f4c7204-739b-4bbb-87a7-8a6856439c90</relationship-value> + </relationship-data> + </relationship> + </relationship-list> + </model-element> + <model-element> + <new-data-del-flag>F</new-data-del-flag> + <cardinality>unbounded</cardinality> + <model-elements/> + <relationship-list> + <relationship> + <related-to>model-ver</related-to> + <relationship-data> + <relationship-key>model-ver.model-version-id</relationship-key> + <relationship-value>abcc54bc-bb74-49dc-9043-7f7171707545</relationship-value> + </relationship-data> + <relationship-data> + <relationship-key>model.model-invariant-id</relationship-key> + <relationship-value>97c26c99-6870-44c1-8a07-1d900d3f4ce6</relationship-value> + </relationship-data> + </relationship> + </relationship-list> + </model-element> + <model-element> + <new-data-del-flag>F</new-data-del-flag> + <cardinality>unbounded</cardinality> + <model-elements/> + <relationship-list> + <relationship> + <related-to>model-ver</related-to> + <relationship-data> + <relationship-key>model-ver.model-version-id</relationship-key> + <relationship-value>36200fb5-f251-4f5d-a520-7c5ad5c2cd4b</relationship-value> + </relationship-data> + <relationship-data> + <relationship-key>model.model-invariant-id</relationship-key> + <relationship-value>bace8d1c-a261-4041-9e37-823117415d0f</relationship-value> + </relationship-data> + </relationship> + </relationship-list> + </model-element> + <model-element> + <new-data-del-flag>T</new-data-del-flag> + <cardinality>unbounded</cardinality> + <model-elements/> + <relationship-list> + <relationship> + <related-to>model-ver</related-to> + <relationship-data> + <relationship-key>model-ver.model-version-id</relationship-key> + <relationship-value>5761e0a7-c6df-4d8a-9ebd-b8f445054dec</relationship-value> + </relationship-data> + <relationship-data> + <relationship-key>model.model-invariant-id</relationship-key> + <relationship-value>96129eb9-f0de-4e05-8af2-73146473f766</relationship-value> + </relationship-data> + </relationship> + </relationship-list> + </model-element> + </model-elements> + <relationship-list> + <relationship> + <related-to>model-ver</related-to> + <relationship-data> + <relationship-key>model-ver.model-version-id</relationship-key> + <relationship-value>8ecb2c5d-7176-4317-a255-26274edfdd53</relationship-value> + </relationship-data> + <relationship-data> + <relationship-key>model.model-invariant-id</relationship-key> + <relationship-value>ff69d4e0-a8e8-4108-bdb0-dd63217e63c7</relationship-value> + </relationship-data> + </relationship> + </relationship-list> + </model-element> + <model-element> + <new-data-del-flag>T</new-data-del-flag> + <cardinality>unbounded</cardinality> + <model-elements/> + <relationship-list> + <relationship> + <related-to>model-ver</related-to> + <relationship-data> + <relationship-key>model-ver.model-version-id</relationship-key> + <relationship-value>9111f20f-e680-4001-b83f-19a2fc23bfc1</relationship-value> + </relationship-data> + <relationship-data> + <relationship-key>model.model-invariant-id</relationship-key> + <relationship-value>3d560d81-57d0-438b-a2a1-5334dba0651a</relationship-value> + </relationship-data> + </relationship> + </relationship-list> + </model-element> + </model-elements> + <relationship-list> + <relationship> + <related-to>model-ver</related-to> + <relationship-data> + <relationship-key>model-ver.model-version-id</relationship-key> + <relationship-value>c00563ae-812b-4e62-8330-7c4d0f47088a</relationship-value> + </relationship-data> + <relationship-data> + <relationship-key>model.model-invariant-id</relationship-key> + <relationship-value>ef86f9c5-2165-44f3-8fc3-96018b609ea5</relationship-value> + </relationship-data> + </relationship> + </relationship-list> + </model-element> + </model-elements> + </model-ver> + </model-vers> +</model>
\ No newline at end of file diff --git a/src/test/resources/generatedXml/AAI-SdWanTestVsp..DUMMY..module-0-resource-2.xml b/src/test/resources/generatedXml/AAI-SdWanTestVsp..DUMMY..module-0-resource-2.xml index 6e221ce..b9c0abf 100644 --- a/src/test/resources/generatedXml/AAI-SdWanTestVsp..DUMMY..module-0-resource-2.xml +++ b/src/test/resources/generatedXml/AAI-SdWanTestVsp..DUMMY..module-0-resource-2.xml @@ -1,11 +1,12 @@ -<model> +<model xmlns="http://org.onap.aai.inventory/v12"> <model-invariant-id>6a111111-1111-1111-1111-111111111111</model-invariant-id> <model-type>resource</model-type> <model-vers> <model-ver> - <model-version-id>7a111111-1111-1111-1111-111111111111</model-version-id> + <model-version-id>5c111111-1111-1111-1111-111111111111</model-version-id> <model-name>SdWanTestVsp..DUMMY..module-0</model-name> <model-version>2</model-version> + <model-description></model-description> <model-elements> <model-element> <new-data-del-flag>T</new-data-del-flag> diff --git a/src/test/resources/generatedXml/AAI-Tunnel_XConnTest-resource-2.0.xml b/src/test/resources/generatedXml/AAI-Tunnel_XConnTest-resource-2.0.xml index ccecc80..456ad15 100644 --- a/src/test/resources/generatedXml/AAI-Tunnel_XConnTest-resource-2.0.xml +++ b/src/test/resources/generatedXml/AAI-Tunnel_XConnTest-resource-2.0.xml @@ -1,4 +1,4 @@ -<model> +<model xmlns="http://org.onap.aai.inventory/v12"> <model-invariant-id>1b111111-1111-1111-1111-111111111111</model-invariant-id> <model-type>resource</model-type> <model-vers> diff --git a/src/test/resources/jsonFiles/invalid_csar_request.json b/src/test/resources/jsonFiles/invalid_csar_request.json index 3742f36..f7ecca1 100644 --- a/src/test/resources/jsonFiles/invalid_csar_request.json +++ b/src/test/resources/jsonFiles/invalid_csar_request.json @@ -1,3 +1,3 @@ -{"csar": "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SVBfTXV4X0RlbXV4LXVwZGF0ZWQtcmVzb3VyY2UtMS4wLnhtbFBLAQIUABQACAgIAP2uhEoPxTTMggIAAN4PAAA7AAAAAAAAAAAAAAAAADY3AABBcnRpZmFjdHMvQUFJLVR1bm5lbF9YQ29ubi1mb3ItREhWLVRlc3RpbmctcmVzb3VyY2UtMS4wLnhtbFBLAQIUABQACAgIAP2uhEott6ixQgIAAEULAAA5AAAAAAAAAAAAAAAAACE6AABBcnRpZmFjdHMvQUFJLVNlcnZpY2VfQWRtaW4tZm9yLURIVi1UZXN0LXJlc291cmNlLTEuMC54bWxQSwECFAAUAAgICAD9roRKhVs/IKwDAABhJQAAQAAAAAAAAAAAAAAAAADKPAAAQXJ0aWZhY3RzL0FBSS1WaG5mRm9yRTJlVGVzdC4uYmFzZV9URVNULi5tb2R1bGUtMC1yZXNvdXJjZS0yLnhtbFBLAQIUABQACAgIAP2uhEpIeXXPNgIAADELAAAwAAAAAAAAAAAAAAAAAORAAABBcnRpZmFjdHMvQUFJLXZITkYtZm9yLURIVi1UZXN0LXJlc291cmNlLTIuMC54bWxQSwUGAAAAAAwADACcBAAAeEMAAAAA", +{"csar": "xxxx", "artifactVersion":"1.0", "artifactName":"hello"}
\ No newline at end of file diff --git a/src/test/resources/jsonFiles/invalid_json_request.json b/src/test/resources/jsonFiles/invalid_json_request.json index 4600202..444840d 100644 --- a/src/test/resources/jsonFiles/invalid_json_request.json +++ b/src/test/resources/jsonFiles/invalid_json_request.json @@ -1,3 +1,3 @@ -{"csar": "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QUktSVBfTXV4X0RlbXV4LXVwZGF0ZWQtcmVzb3VyY2UtMS4wLnhtbFBLAQIUABQACAgIAP2uhEoPxTTMggIAAN4PAAA7AAAAAAAAAAAAAAAAADY3AABBcnRpZmFjdHMvQUFJLVR1bm5lbF9YQ29ubi1mb3ItREhWLVRlc3RpbmctcmVzb3VyY2UtMS4wLnhtbFBLAQIUABQACAgIAP2uhEott6ixQgIAAEULAAA5AAAAAAAAAAAAAAAAACE6AABBcnRpZmFjdHMvQUFJLVNlcnZpY2VfQWRtaW4tZm9yLURIVi1UZXN0LXJlc291cmNlLTEuMC54bWxQSwECFAAUAAgICAD9roRKhVs/IKwDAABhJQAAQAAAAAAAAAAAAAAAAADKPAAAQXJ0aWZhY3RzL0FBSS1WaG5mRm9yRTJlVGVzdC4uYmFzZV9URVNULi5tb2R1bGUtMC1yZXNvdXJjZS0yLnhtbFBLAQIUABQACAgIAP2uhEpIeXXPNgIAADELAAAwAAAAAAAAAAAAAAAAAORAAABBcnRpZmFjdHMvQUFJLXZITkYtZm9yLURIVi1UZXN0LXJlc291cmNlLTIuMC54bWxQSwUGAAAAAAwADACcBAAAeEMAAAAA", +{"csar": "xxxx", "artifactVersion":"1.0", "artifactName":"hello"
\ No newline at end of file diff --git a/src/test/resources/jsonFiles/missing_artifact_name_request.json b/src/test/resources/jsonFiles/missing_artifact_name_request.json index a5f4948..049f4e7 100644 --- a/src/test/resources/jsonFiles/missing_artifact_name_request.json +++ b/src/test/resources/jsonFiles/missing_artifact_name_request.json @@ -1,3 +1,3 @@ -{"csar": "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QUktSVBfTXV4X0RlbXV4LXVwZGF0ZWQtcmVzb3VyY2UtMS4wLnhtbFBLAQIUABQACAgIAP2uhEoPxTTMggIAAN4PAAA7AAAAAAAAAAAAAAAAADY3AABBcnRpZmFjdHMvQUFJLVR1bm5lbF9YQ29ubi1mb3ItREhWLVRlc3RpbmctcmVzb3VyY2UtMS4wLnhtbFBLAQIUABQACAgIAP2uhEott6ixQgIAAEULAAA5AAAAAAAAAAAAAAAAACE6AABBcnRpZmFjdHMvQUFJLVNlcnZpY2VfQWRtaW4tZm9yLURIVi1UZXN0LXJlc291cmNlLTEuMC54bWxQSwECFAAUAAgICAD9roRKhVs/IKwDAABhJQAAQAAAAAAAAAAAAAAAAADKPAAAQXJ0aWZhY3RzL0FBSS1WaG5mRm9yRTJlVGVzdC4uYmFzZV9URVNULi5tb2R1bGUtMC1yZXNvdXJjZS0yLnhtbFBLAQIUABQACAgIAP2uhEpIeXXPNgIAADELAAAwAAAAAAAAAAAAAAAAAORAAABBcnRpZmFjdHMvQUFJLXZITkYtZm9yLURIVi1UZXN0LXJlc291cmNlLTIuMC54bWxQSwUGAAAAAAwADACcBAAAeEMAAAAA", +{"csar": "xxxx", "artifactVersion":"1.0" }
\ No newline at end of file diff --git a/src/test/resources/jsonFiles/missing_artifact_version_request.json b/src/test/resources/jsonFiles/missing_artifact_version_request.json index cfde298..4eed380 100644 --- a/src/test/resources/jsonFiles/missing_artifact_version_request.json +++ b/src/test/resources/jsonFiles/missing_artifact_version_request.json @@ -1,2 +1,2 @@ -{"csar": "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QUktSVBfTXV4X0RlbXV4LXVwZGF0ZWQtcmVzb3VyY2UtMS4wLnhtbFBLAQIUABQACAgIAP2uhEoPxTTMggIAAN4PAAA7AAAAAAAAAAAAAAAAADY3AABBcnRpZmFjdHMvQUFJLVR1bm5lbF9YQ29ubi1mb3ItREhWLVRlc3RpbmctcmVzb3VyY2UtMS4wLnhtbFBLAQIUABQACAgIAP2uhEott6ixQgIAAEULAAA5AAAAAAAAAAAAAAAAACE6AABBcnRpZmFjdHMvQUFJLVNlcnZpY2VfQWRtaW4tZm9yLURIVi1UZXN0LXJlc291cmNlLTEuMC54bWxQSwECFAAUAAgICAD9roRKhVs/IKwDAABhJQAAQAAAAAAAAAAAAAAAAADKPAAAQXJ0aWZhY3RzL0FBSS1WaG5mRm9yRTJlVGVzdC4uYmFzZV9URVNULi5tb2R1bGUtMC1yZXNvdXJjZS0yLnhtbFBLAQIUABQACAgIAP2uhEpIeXXPNgIAADELAAAwAAAAAAAAAAAAAAAAAORAAABBcnRpZmFjdHMvQUFJLXZITkYtZm9yLURIVi1UZXN0LXJlc291cmNlLTIuMC54bWxQSwUGAAAAAAwADACcBAAAeEMAAAAA", +{"csar": "xxxx", "artifactName":"hello"}
\ No newline at end of file diff --git a/src/test/resources/jsonFiles/success_request.json b/src/test/resources/jsonFiles/success_request.json deleted file mode 100644 index 92fa93d..0000000 --- a/src/test/resources/jsonFiles/success_request.json +++ /dev/null @@ -1,3 +0,0 @@ -{"csar": "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QUktSVBfTXV4X0RlbXV4LXVwZGF0ZWQtcmVzb3VyY2UtMS4wLnhtbFBLAQIUABQACAgIAP2uhEoPxTTMggIAAN4PAAA7AAAAAAAAAAAAAAAAADY3AABBcnRpZmFjdHMvQUFJLVR1bm5lbF9YQ29ubi1mb3ItREhWLVRlc3RpbmctcmVzb3VyY2UtMS4wLnhtbFBLAQIUABQACAgIAP2uhEott6ixQgIAAEULAAA5AAAAAAAAAAAAAAAAACE6AABBcnRpZmFjdHMvQUFJLVNlcnZpY2VfQWRtaW4tZm9yLURIVi1UZXN0LXJlc291cmNlLTEuMC54bWxQSwECFAAUAAgICAD9roRKhVs/IKwDAABhJQAAQAAAAAAAAAAAAAAAAADKPAAAQXJ0aWZhY3RzL0FBSS1WaG5mRm9yRTJlVGVzdC4uYmFzZV9URVNULi5tb2R1bGUtMC1yZXNvdXJjZS0yLnhtbFBLAQIUABQACAgIAP2uhEpIeXXPNgIAADELAAAwAAAAAAAAAAAAAAAAAORAAABBcnRpZmFjdHMvQUFJLXZITkYtZm9yLURIVi1UZXN0LXJlc291cmNlLTIuMC54bWxQSwUGAAAAAAwADACcBAAAeEMAAAAA", - "artifactVersion":"1.0", - "artifactName":"hello"}
\ No newline at end of file diff --git a/src/test/resources/logback.xml b/src/test/resources/logback.xml new file mode 100644 index 0000000..4f51317 --- /dev/null +++ b/src/test/resources/logback.xml @@ -0,0 +1,190 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration scan="true" scanPeriod="30 seconds" debug="true"> + <property name="componentName" value="AAI-BAS" /> + <property name="logDirectory" value="${AJSC_HOME}/logs/${componentName}" /> + + <!-- default EELF log file names --> + <property name="generalLogName" value="error" /> + <property name="metricsLogName" value="metrics" /> + <property name="auditLogName" value="audit" /> + <property name="debugLogName" value="debug" /> + + <property name="errorLogPattern" + value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%mdc{RequestId}|%thread|%mdc{ServiceName}|%mdc{PartnerName}|%mdc{TargetEntity}|%mdc{TargetServiceName}|%.-5level|%logger|%mdc{ClassName}|%msg%n" /> + + <property name="auditLogPattern" + value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%mdc{BeginTimestamp}|%mdc{EndTimestamp}|%mdc{RequestId}|%mdc{ServiceInstanceId}|%thread|%mdc{ServerFQDN}|%mdc{ServiceName}|%mdc{PartnerName}|%mdc{StatusCode}|%mdc{ResponseCode}|%mdc{ResponseDescription}|%logger|%.-5level|||%mdc{ElapsedTime}|%mdc{RemoteHost}|%mdc{ClientAddress}|%mdc{ClassName}|||%msg%n" /> + + <property name="metricsLogPattern" + value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%mdc{BeginTimestamp}|%mdc{EndTimestamp}|%mdc{RequestId}|%mdc{ServiceInstanceId}|%thread|%mdc{ServerFQDN}|%mdc{ServiceName}|%mdc{PartnerName}|%mdc{TargetEntity}|%mdc{TargetServiceName}|%mdc{StatusCode}|%mdc{ResponseCode}|%mdc{ResponseDescription}|%logger|%.-5level|||%mdc{ElapsedTime}|%mdc{RemoteHost}|%mdc{ClientAddress}|%mdc{ClassName}|||%msg%n" /> + + <!-- ============================================================================ --> + <!-- EELF Appenders --> + <!-- ============================================================================ --> + + <appender name="EELF" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${generalLogName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip + </fileNamePattern> + <maxHistory>60</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${errorLogPattern}</pattern> + </encoder> + </appender> + <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender"> + <!-- deny all events with a level below INFO, that is TRACE and DEBUG --> + <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> + <level>INFO</level> + </filter> + <queueSize>256</queueSize> + <appender-ref ref="EELF" /> + </appender> + + <!-- EELF Audit Appender. This appender is used to record audit engine related logging events. The audit logger and appender + are specializations of the EELF application root logger and appender. This can be used to segregate Policy engine events + from other components, or it can be eliminated to record these events as part of the application root log. --> + + <appender name="EELFAudit" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${auditLogName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip + </fileNamePattern> + <maxHistory>60</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${auditLogPattern}</pattern> + </encoder> + </appender> + <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <appender-ref ref="EELFAudit" /> + </appender> + + <appender name="EELFMetrics" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${logDirectory}/${metricsLogName}.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip + </fileNamePattern> + <maxHistory>60</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${metricsLogPattern}</pattern> + </encoder> + </appender> + + <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender"> + <queueSize>256</queueSize> + <appender-ref ref="EELFMetrics" /> + </appender> + + <appender name="EELFDebug" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file> + ${logDirectory}/${debugLogName}.log + </file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip + </fileNamePattern> + <maxHistory>60</maxHistory> + </rollingPolicy> + <encoder> + <pattern>${errorLogPattern}</pattern> + </encoder> + </appender> + + <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender"> + <!-- allow only events with a level below INFO, that is TRACE and DEBUG --> + <filter class="ch.qos.logback.core.filter.EvaluatorFilter"> + <evaluator class="ch.qos.logback.classic.boolex.GEventEvaluator"> + <expression> + e.level.toInt() < INFO.toInt() + </expression> + </evaluator> + <OnMismatch>DENY</OnMismatch> + <OnMatch>NEUTRAL</OnMatch> + </filter> + <queueSize>256</queueSize> + <appender-ref ref="EELFDebug" /> + <includeCallerData>false</includeCallerData> + </appender> + + <!-- ============================================================================ --> + <!-- Default / root appenders --> + <!-- ============================================================================ --> + + <root level="DEBUG"> + <appender-ref ref="asyncEELF" /> + <appender-ref ref="asyncEELFDebug" /> + </root> + + <!-- ============================================================================ --> + <!-- EELF loggers --> + <!-- ============================================================================ --> + + <logger name="com.att.eelf" level="INFO" additivity="false"> + <appender-ref ref="asyncEELF" /> + </logger> + + <logger name="com.att.eelf.debug" level="DEBUG" additivity="false"> + <appender-ref ref="asyncEELFDebug" /> + </logger> + + <logger name="com.att.eelf.audit" level="INFO" additivity="false"> + <appender-ref ref="asyncEELFAudit" /> + </logger> + + <logger name="com.att.eelf.metrics" level="INFO" additivity="false"> + <appender-ref ref="asyncEELFMetrics" /> + </logger> + + <!-- ============================================================================ --> + <!-- Non-EELF loggers --> + <!-- ============================================================================ --> + + <!-- ATT packages including DMAAP message routing --> + <logger name="com.att" level="DEBUG" /> + + <!-- Spring related loggers --> + <logger name="org.springframework" level="WARN" /> + <logger name="org.springframework.beans" level="WARN" /> + <logger name="org.springframework.web" level="WARN" /> + + <!-- AJSC Services (bootstrap services) --> + <logger name="ajsc" level="WARN" /> + <logger name="ajsc.RouteMgmtService" level="WARN" /> + <logger name="ajsc.ComputeService" level="WARN" /> + <logger name="ajsc.VandelayService" level="WARN" /> + <logger name="ajsc.FilePersistenceService" level="WARN" /> + <logger name="ajsc.UserDefinedJarService" level="WARN" /> + <logger name="ajsc.UserDefinedBeansDefService" level="WARN" /> + <logger name="ajsc.LoggingConfigurationService" level="WARN" /> + + <!-- AJSC related loggers (DME2 Registration, csi logging, restlet, servlet logging) --> + <logger name="ajsc.utils" level="WARN" /> + <logger name="ajsc.utils.DME2Helper" level="WARN" /> + <logger name="ajsc.filters" level="WARN" /> + <logger name="ajsc.beans.interceptors" level="WARN" /> + <logger name="ajsc.restlet" level="WARN" /> + <logger name="ajsc.servlet" level="WARN" /> + <logger name="com.att.ajsc.csi.logging" level="WARN" /> + <logger name="com.att.ajsc.filemonitor" level="WARN" /> + + <!-- Other Loggers that may help troubleshoot --> + <logger name="org.apache" level="WARN" /> + <logger name="org.apache.commons" level="WARN" /> + + <!-- Camel Related Loggers (including restlet/servlet/jaxrs/cxf logging. May aid in troubleshooting) --> + <logger name="org.apache.camel" level="WARN" /> + <logger name="org.apache.cxf" level="WARN" /> + <logger name="org.apache.camel.processor.interceptor" level="WARN" /> + <logger name="org.apache.cxf.jaxrs.interceptor" level="WARN" /> + <logger name="org.apache.cxf.service" level="WARN" /> + <logger name="org.restlet" level="WARN" /> + <logger name="org.apache.camel.component.restlet" level="WARN" /> + + <!-- logback internals logging --> + <logger name="ch.qos.logback.classic" level="WARN" /> + <logger name="ch.qos.logback.core" level="WARN" /> + +</configuration> diff --git a/src/test/resources/response/response.json b/src/test/resources/response/response.json index 8b98d17..a5c7088 100644 --- a/src/test/resources/response/response.json +++ b/src/test/resources/response/response.json @@ -1 +1 @@ -[{"name":"AAI-SD-WAN Service for Testing-service-1.0.xml","type":"MODEL_INVENTORY_PROFILE","payload":[80,71,49,118,90,71,86,115,73,72,104,116,98,71,53,122,80,83,74,111,100,72,82,119,79,105,56,118,98,51,74,110,76,109,57,119,90,87,53,108,89,50,57,116,99,67,53,104,89,87,107,117,97,87,53,50,90,87,53,48,98,51,74,53,76,51,89,120,77,67,73,43,67,105,65,103,73,67,65,56,98,87,57,107,90,87,119,116,97,87,53,50,89,88,74,112,89,87,53,48,76,87,108,107,80,106,77,120,90,68,86,105,78,109,69,119,76,84,81,48,78,84,81,116,78,71,85,122,77,121,48,53,89,84,99,53,76,87,82,105,89,84,65,52,77,122,103,52,78,109,77,53,90,68,119,118,98,87,57,107,90,87,119,116,97,87,53,50,89,88,74,112,89,87,53,48,76,87,108,107,80,103,111,103,73,67,65,103,80,71,49,118,90,71,86,115,76,88,82,53,99,71,85,43,99,50,86,121,100,109,108,106,90,84,119,118,98,87,57,107,90,87,119,116,100,72,108,119,90,84,52,75,73,67,65,103,73,68,120,116,98,50,82,108,98,67,49,50,90,88,74,122,80,103,111,103,73,67,65,103,73,67,65,103,73,68,120,116,98,50,82,108,98,67,49,50,90,88,73,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,68,120,116,98,50,82,108,98,67,49,50,90,88,74,122,97,87,57,117,76,87,108,107,80,106,81,50,78,68,65,120,90,87,86,106,76,84,77,49,89,109,81,116,78,71,85,53,78,105,49,104,90,68,66,107,76,84,65,122,78,84,90,109,90,106,90,105,79,71,77,52,90,68,119,118,98,87,57,107,90,87,119,116,100,109,86,121,99,50,108,118,98,105,49,112,90,68,52,75,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,80,71,49,118,90,71,86,115,76,87,53,104,98,87,85,43,85,48,81,116,86,48,70,79,73,70,78,108,99,110,90,112,89,50,85,103,90,109,57,121,73,70,82,108,99,51,82,112,98,109,99,56,76,50,49,118,90,71,86,115,76,87,53,104,98,87,85,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,68,120,116,98,50,82,108,98,67,49,50,90,88,74,122,97,87,57,117,80,106,69,117,77,68,119,118,98,87,57,107,90,87,119,116,100,109,86,121,99,50,108,118,98,106,52,75,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,80,71,49,118,90,71,86,115,76,87,82,108,99,50,78,121,97,88,66,48,97,87,57,117,80,108,78,69,76,86,100,66,84,105,66,84,90,88,74,50,97,87,78,108,73,71,90,118,99,105,66,69,83,70,89,103,86,71,86,122,100,71,108,117,90,121,66,112,98,105,66,70,77,107,85,56,76,50,49,118,90,71,86,115,76,87,82,108,99,50,78,121,97,88,66,48,97,87,57,117,80,103,111,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,98,87,57,107,90,87,119,116,90,87,120,108,98,87,86,117,100,72,77,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,98,87,57,107,90,87,119,116,90,87,120,108,98,87,86,117,100,68,52,75,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,98,109,86,51,76,87,82,104,100,71,69,116,90,71,86,115,76,87,90,115,89,87,99,43,86,68,119,118,98,109,86,51,76,87,82,104,100,71,69,116,90,71,86,115,76,87,90,115,89,87,99,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,80,71,78,104,99,109,82,112,98,109,70,115,97,88,82,53,80,110,86,117,89,109,57,49,98,109,82,108,90,68,119,118,89,50,70,121,90,71,108,117,89,87,120,112,100,72,107,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,80,71,49,118,90,71,86,115,76,87,86,115,90,87,49,108,98,110,82,122,76,122,52,75,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,99,109,86,115,89,88,82,112,98,50,53,122,97,71,108,119,76,87,120,112,99,51,81,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,68,120,121,90,87,120,104,100,71,108,118,98,110,78,111,97,88,65,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,99,109,86,115,89,88,82,108,90,67,49,48,98,122,53,116,98,50,82,108,98,67,49,50,90,88,73,56,76,51,74,108,98,71,70,48,90,87,81,116,100,71,56,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,99,109,86,115,89,88,82,112,98,50,53,122,97,71,108,119,76,87,82,104,100,71,69,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,80,72,74,108,98,71,70,48,97,87,57,117,99,50,104,112,99,67,49,114,90,88,107,43,98,87,57,107,90,87,119,116,100,109,86,121,76,109,49,118,90,71,86,115,76,88,90,108,99,110,78,112,98,50,52,116,97,87,81,56,76,51,74,108,98,71,70,48,97,87,57,117,99,50,104,112,99,67,49,114,90,88,107,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,80,72,74,108,98,71,70,48,97,87,57,117,99,50,104,112,99,67,49,50,89,87,120,49,90,84,52,48,78,109,73,53,77,106,69,48,78,67,48,53,77,106,78,104,76,84,82,107,77,106,65,116,89,106,103,49,89,83,48,122,89,50,74,107,79,68,81,51,78,106,89,52,89,84,107,56,76,51,74,108,98,71,70,48,97,87,57,117,99,50,104,112,99,67,49,50,89,87,120,49,90,84,52,75,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,68,119,118,99,109,86,115,89,88,82,112,98,50,53,122,97,71,108,119,76,87,82,104,100,71,69,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,99,109,86,115,89,88,82,112,98,50,53,122,97,71,108,119,76,87,82,104,100,71,69,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,80,72,74,108,98,71,70,48,97,87,57,117,99,50,104,112,99,67,49,114,90,88,107,43,98,87,57,107,90,87,119,117,98,87,57,107,90,87,119,116,97,87,53,50,89,88,74,112,89,87,53,48,76,87,108,107,80,67,57,121,90,87,120,104,100,71,108,118,98,110,78,111,97,88,65,116,97,50,86,53,80,103,111,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,68,120,121,90,87,120,104,100,71,108,118,98,110,78,111,97,88,65,116,100,109,70,115,100,87,85,43,79,68,73,120,79,84,82,104,90,106,69,116,77,50,77,121,89,121,48,48,79,68,86,104,76,84,104,109,78,68,81,116,78,68,73,119,90,84,73,121,89,84,108,108,89,87,69,48,80,67,57,121,90,87,120,104,100,71,108,118,98,110,78,111,97,88,65,116,100,109,70,115,100,87,85,43,67,105,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,76,51,74,108,98,71,70,48,97,87,57,117,99,50,104,112,99,67,49,107,89,88,82,104,80,103,111,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,76,51,74,108,98,71,70,48,97,87,57,117,99,50,104,112,99,68,52,75,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,76,51,74,108,98,71,70,48,97,87,57,117,99,50,104,112,99,67,49,115,97,88,78,48,80,103,111,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,103,80,67,57,116,98,50,82,108,98,67,49,108,98,71,86,116,90,87,53,48,80,103,111,103,73,67,65,103,73,67,65,103,73,67,65,103,73,67,65,56,76,50,49,118,90,71,86,115,76,87,86,115,90,87,49,108,98,110,82,122,80,103,111,103,73,67,65,103,73,67,65,103,73,68,119,118,98,87,57,107,90,87,119,116,100,109,86,121,80,103,111,103,73,67,65,103,80,67,57,116,98,50,82,108,98,67,49,50,90,88,74,122,80,103,111,56,76,50,49,118,90,71,86,115,80,103,61,61]}]
\ No newline at end of file +[{"name":"AAI-29NFOD_S-service-1.0.xml","type":"MODEL","payload":"<model xmlns=\"http://org.onap.aai.inventory/v12\">\n <model-invariant-id>4da8d1e8-f59a-4370-84ea-c6de836821fc</model-invariant-id>\n <model-type>service</model-type>\n <model-vers>\n <model-ver>\n <model-version-id>a76ed81f-23d2-4e69-8972-eb1c69855e64</model-version-id>\n <model-name>29NFOD_S</model-name>\n <model-version>1.0</model-version>\n <model-description>29NFOD</model-description>\n <model-elements>\n <model-element>\n <new-data-del-flag>T</new-data-del-flag>\n <cardinality>unbounded</cardinality>\n <model-elements>\n <model-element>\n <new-data-del-flag>T</new-data-del-flag>\n <cardinality>unbounded</cardinality>\n <model-elements/>\n <relationship-list>\n <relationship>\n <related-to>model-ver</related-to>\n <relationship-data>\n <relationship-key>model-ver.model-version-id</relationship-key>\n <relationship-value>3f283439-4e0e-4a6a-9b31-da5d0cb05b52</relationship-value>\n </relationship-data>\n <relationship-data>\n <relationship-key>model.model-invariant-id</relationship-key>\n <relationship-value>bc3622d2-a645-4806-80f2-96b04a866bbf</relationship-value>\n </relationship-data>\n </relationship>\n </relationship-list>\n </model-element>\n </model-elements>\n <relationship-list>\n <relationship>\n <related-to>model-ver</related-to>\n <relationship-data>\n <relationship-key>model-ver.model-version-id</relationship-key>\n <relationship-value>46b92144-923a-4d20-b85a-3cbd847668a9</relationship-value>\n </relationship-data>\n <relationship-data>\n <relationship-key>model.model-invariant-id</relationship-key>\n <relationship-value>82194af1-3c2c-485a-8f44-420e22a9eaa4</relationship-value>\n </relationship-data>\n </relationship>\n </relationship-list>\n </model-element>\n </model-elements>\n </model-ver>\n </model-vers>\n</model>"},{"name":"AAI-29NFOD-resource-1.0.xml","type":"MODEL","payload":"<model xmlns=\"http://org.onap.aai.inventory/v12\">\n <model-invariant-id>bc3622d2-a645-4806-80f2-96b04a866bbf</model-invariant-id>\n <model-type>resource</model-type>\n <model-vers>\n <model-ver>\n <model-version-id>3f283439-4e0e-4a6a-9b31-da5d0cb05b52</model-version-id>\n <model-name>29NFOD</model-name>\n <model-version>1.0</model-version>\n <model-description>29NFOD</model-description>\n <model-elements>\n <model-element>\n <new-data-del-flag>T</new-data-del-flag>\n <cardinality>unbounded</cardinality>\n <model-elements/>\n <relationship-list>\n <relationship>\n <related-to>model-ver</related-to>\n <relationship-data>\n <relationship-key>model-ver.model-version-id</relationship-key>\n <relationship-value>93a6166f-b3d5-4f06-b4ba-aed48d009ad9</relationship-value>\n </relationship-data>\n <relationship-data>\n <relationship-key>model.model-invariant-id</relationship-key>\n <relationship-value>acc6edd8-a8d4-4b93-afaa-0994068be14c</relationship-value>\n </relationship-data>\n </relationship>\n </relationship-list>\n </model-element>\n </model-elements>\n </model-ver>\n </model-vers>\n</model>"},{"name":"vnfVendorImageConfigurations","type":"VNFCATALOG","payload":"[{\"application\":\"VM00\",\"application-vendor\":\"29NFOD\",\"application-version\":\"3.16.1\"},{\"application\":\"VM00\",\"application-vendor\":\"29NFOD\",\"application-version\":\"3.16.9\"},{\"application\":\"VM01\",\"application-vendor\":\"29NFOD\",\"application-version\":\"3.16.1\"},{\"application\":\"VM01\",\"application-vendor\":\"29NFOD\",\"application-version\":\"3.16.9\"}]"}]
\ No newline at end of file diff --git a/src/test/resources/ymlFiles/artifacts.yml b/src/test/resources/ymlFiles/artifacts.yml new file mode 100644 index 0000000..f7bed1e --- /dev/null +++ b/src/test/resources/ymlFiles/artifacts.yml @@ -0,0 +1,54 @@ +# +# 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. +# + +tosca_definitions_version: tosca_simple_yaml_1_0 + +#metadata: +# filename: tosca/artifacts.yml +# version: '1.0' + +imports: +- data.yml + +artifact_types: + tosca.artifacts.Root: + description: This is the default (root) TOSCA Artifact Type definition that all other TOSCA base Artifact Types derive from. + + tosca.artifacts.Deployment.Image: + derived_from: tosca.artifacts.Deployment + description: This artifact type represents a parent type for any "image" which is an opaque packaging of a TOSCA Node's deployment (whether real or virtual) whose contents are typically already installed and pre-configured (i.e., "stateful") and prepared to be run on a known target container. + + tosca.artifacts.Implementation.Bash: + derived_from: tosca.artifacts.Implementation + description: This artifact type represents a Bash script type that contains Bash commands that can be executed on the Unix Bash shell. + + tosca.artifacts.Deployment.Image.VM: + derived_from: tosca.artifacts.Deployment + description: This artifact represents the parent type for all Virtual Machine (VM) image and container formatted deployment artifacts. These images contain a stateful capture of a machine (e.g., server) including operating system and installed software along with any configurations and can be run on another machine using a hypervisor which virtualizes typical server (i.e., hardware) resources. + + tosca.artifacts.Implementation.Python: + derived_from: tosca.artifacts.Implementation + description: This artifact type represents a Python file that contains Python language constructs that can be executed within a Python interpreter. + + tosca.artifacts.Deployment: + derived_from: tosca.artifacts.Root + description: This artifact type represents the parent type for all deployment artifacts in TOSCA. This class of artifacts typically represents a binary packaging of an application or service that is used to install/create or deploy it as part of a node's lifecycle. + + tosca.artifacts.File: + derived_from: tosca.artifacts.Root + description: This artifact type is used when an artifact definition needs to have its associated file simply treated as a file and no special handling/handlers are invoked (i.e., it is not treated as either an implementation or deployment artifact type). + + tosca.artifacts.Implementation: + derived_from: tosca.artifacts.Root + description: This artifact type represents the parent type for all implementation artifacts in TOSCA. These artifacts are used to implement operations of TOSCA interfaces either directly (e.g., scripts) or indirectly (e.g., config. files). diff --git a/src/test/resources/ymlFiles/data.yml b/src/test/resources/ymlFiles/data.yml new file mode 100644 index 0000000..75e109b --- /dev/null +++ b/src/test/resources/ymlFiles/data.yml @@ -0,0 +1,2241 @@ +# +# 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. +# + +tosca_definitions_version: tosca_simple_yaml_1_0 + +#metadata: +# filename: openecomp-heat/data.yml +# version: '1.0' + +data_types: + + tosca.datatypes.Root: + description: The TOSCA root Data Type all other TOSCA base Data Types derive from + + integer: + derived_from: tosca.datatypes.Root + + string: + derived_from: tosca.datatypes.Root + + boolean: + derived_from: tosca.datatypes.Root + + float: + derived_from: tosca.datatypes.Root + + list: + derived_from: tosca.datatypes.Root + + map: + derived_from: tosca.datatypes.Root + + json: + derived_from: tosca.datatypes.Root + + scalar-unit: + derived_from: tosca.datatypes.Root + + scalar-unit.size: + derived_from: scalar-unit + + scalar-unit.time: + derived_from: scalar-unit + + scalar-unit.frequency: + derived_from: scalar-unit + + tosca.datatypes.Credential: + derived_from: tosca.datatypes.Root + properties: + protocol: + type: string + required: false + token_type: + type: string + default: password + token: + type: string + keys: + type: map + required: false + entry_schema: + type: string + user: + type: string + required: false + + tosca.datatypes.TimeInterval: + derived_from: tosca.datatypes.Root + properties: + start_time: + type: timestamp + required: true + end_time: + type: timestamp + required: true + + tosca.datatypes.network.NetworkInfo: + derived_from: tosca.datatypes.Root + properties: + network_name: + type: string + network_id: + type: string + addresses: + type: list + entry_schema: + type: string + + tosca.datatypes.network.PortInfo: + derived_from: tosca.datatypes.Root + properties: + port_name: + type: string + port_id: + type: string + network_id: + type: string + mac_address: + type: string + addresses: + type: list + entry_schema: + type: string + + tosca.datatypes.network.PortDef: + derived_from: integer + constraints: + - in_range: [ 1, 65535 ] + + tosca.datatypes.network.PortSpec: + derived_from: tosca.datatypes.Root + properties: + protocol: + type: string + required: true + default: tcp + constraints: + - valid_values: [ udp, tcp, igmp ] + target: + type: tosca.datatypes.network.PortDef + target_range: + type: range + constraints: + - in_range: [ 1, 65535 ] + source: + type: tosca.datatypes.network.PortDef + source_range: + type: range + constraints: + - in_range: [ 1, 65535 ] + + ###################new Data Types Onboarding Integration########################## + + org.openecomp.datatypes.heat.network.AddressPair: + derived_from: tosca.datatypes.Root + description: MAC/IP address pairs + properties: + mac_address: + type: string + description: MAC address + required: false + status: SUPPORTED + ip_address: + type: string + description: IP address + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.network.subnet.HostRoute: + derived_from: tosca.datatypes.Root + description: Host route info for the subnet + properties: + destination: + type: string + description: The destination for static route + required: false + status: SUPPORTED + nexthop: + type: string + description: The next hop for the destination + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.network.AllocationPool: + derived_from: tosca.datatypes.Root + description: The start and end addresses for the allocation pool + properties: + start: + type: string + description: Start address for the allocation pool + required: false + status: SUPPORTED + end: + type: string + description: End address for the allocation pool + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.network.neutron.Subnet: + derived_from: tosca.datatypes.Root + description: A subnet represents an IP address block that can be used for assigning IP addresses to virtual instances + properties: + tenant_id: + type: string + description: The ID of the tenant who owns the network + required: false + status: SUPPORTED + enable_dhcp: + type: boolean + description: Set to true if DHCP is enabled and false if DHCP is disabled + required: false + default: true + status: SUPPORTED + ipv6_address_mode: + type: string + description: IPv6 address mode + required: false + status: SUPPORTED + constraints: + - valid_values: + - dhcpv6-stateful + - dhcpv6-stateless + - slaac + ipv6_ra_mode: + type: string + description: IPv6 RA (Router Advertisement) mode + required: false + status: SUPPORTED + constraints: + - valid_values: + - dhcpv6-stateful + - dhcpv6-stateless + - slaac + value_specs: + type: map + description: Extra parameters to include in the request + required: false + default: { + } + status: SUPPORTED + entry_schema: + type: string + allocation_pools: + type: list + description: The start and end addresses for the allocation pools + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.network.AllocationPool + subnetpool: + type: string + description: The name or ID of the subnet pool + required: false + status: SUPPORTED + dns_nameservers: + type: list + description: A specified set of DNS name servers to be used + required: false + default: [ + ] + status: SUPPORTED + entry_schema: + type: string + host_routes: + type: list + description: The gateway IP address + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.network.subnet.HostRoute + ip_version: + type: integer + description: The gateway IP address + required: false + default: 4 + status: SUPPORTED + constraints: + - valid_values: + - '4' + - '6' + name: + type: string + description: The name of the subnet + required: false + status: SUPPORTED + prefixlen: + type: integer + description: Prefix length for subnet allocation from subnet pool + required: false + status: SUPPORTED + constraints: + - greater_or_equal: 0 + cidr: + type: string + description: The CIDR + required: false + status: SUPPORTED + gateway_ip: + type: string + description: The gateway IP address + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.novaServer.network.PortExtraProperties: + derived_from: tosca.datatypes.Root + description: Nova server network expand properties for port + properties: + port_security_enabled: + type: boolean + description: Flag to enable/disable port security on the port + required: false + status: SUPPORTED + mac_address: + type: string + description: MAC address to give to this port + required: false + status: SUPPORTED + admin_state_up: + type: boolean + description: The administrative state of this port + required: false + default: true + status: SUPPORTED + qos_policy: + type: string + description: The name or ID of QoS policy to attach to this port + required: false + status: SUPPORTED + allowed_address_pairs: + type: list + description: Additional MAC/IP address pairs allowed to pass through the port + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.network.AddressPair + binding:vnic_type: + type: string + description: The vnic type to be bound on the neutron port + required: false + status: SUPPORTED + constraints: + - valid_values: + - macvtap + - direct + - normal + value_specs: + type: map + description: Extra parameters to include in the request + required: false + default: { + } + status: SUPPORTED + entry_schema: + type: string + + org.openecomp.datatypes.heat.novaServer.network.AddressInfo: + derived_from: tosca.datatypes.network.NetworkInfo + description: Network addresses with corresponding port id + properties: + port_id: + type: string + description: Port id + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.neutron.port.FixedIps: + derived_from: tosca.datatypes.Root + description: subnet/ip_address + properties: + subnet: + type: string + description: Subnet in which to allocate the IP address for this port + required: false + status: SUPPORTED + ip_address: + type: string + description: IP address desired in the subnet for this port + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.FileInfo: + derived_from: tosca.datatypes.Root + description: Heat File Info + properties: + file: + type: string + description: The required URI string (relative or absolute) which can be used to locate the file + required: true + status: SUPPORTED + file_type: + type: string + description: The type of the file + required: true + status: SUPPORTED + constraints: + - valid_values: + - base + - env + - volume + - network + + org.openecomp.datatypes.heat.contrail.network.rule.PortPairs: + derived_from: tosca.datatypes.Root + description: source and destination port pairs + properties: + start_port: + type: string + description: Start port + required: false + status: SUPPORTED + end_port: + type: string + description: End port + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrail.network.rule.Rule: + derived_from: tosca.datatypes.Root + description: policy rule + properties: + src_ports: + type: list + description: Source ports + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrail.network.rule.PortPairs + protocol: + type: string + description: Protocol + required: false + status: SUPPORTED + dst_addresses: + type: list + description: Destination addresses + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork + apply_service: + type: string + description: Service to apply + required: false + status: SUPPORTED + dst_ports: + type: list + description: Destination ports + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrail.network.rule.PortPairs + src_addresses: + type: list + description: Source addresses + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork + direction: + type: string + description: Direction + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrail.network.rule.RuleList: + derived_from: tosca.datatypes.Root + description: list of policy rules + properties: + policy_rule: + type: list + description: Contrail network rule + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrail.network.rule.Rule + + org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork: + derived_from: tosca.datatypes.Root + description: source and destination addresses + properties: + virtual_network: + type: string + description: Virtual network + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.network.neutron.SecurityRules.Rule: + derived_from: tosca.datatypes.Root + description: Rules Pairs + properties: + remote_group_id: + type: string + description: The remote group ID to be associated with this security group rule + required: false + status: SUPPORTED + protocol: + type: string + description: The protocol that is matched by the security group rule + required: false + status: SUPPORTED + constraints: + - valid_values: + - tcp + - udp + - icmp + ethertype: + type: string + description: Ethertype of the traffic + required: false + default: IPv4 + status: SUPPORTED + constraints: + - valid_values: + - IPv4 + - IPv6 + port_range_max: + type: integer + description: 'The maximum port number in the range that is matched by the + security group rule. ' + required: false + status: SUPPORTED + constraints: + - in_range: + - 0 + - 65535 + remote_ip_prefix: + type: string + description: The remote IP prefix (CIDR) to be associated with this security group rule + required: false + status: SUPPORTED + remote_mode: + type: string + description: Whether to specify a remote group or a remote IP prefix + required: false + default: remote_ip_prefix + status: SUPPORTED + constraints: + - valid_values: + - remote_ip_prefix + - remote_group_id + direction: + type: string + description: The direction in which the security group rule is applied + required: false + default: ingress + status: SUPPORTED + constraints: + - valid_values: + - egress + - ingress + port_range_min: + type: integer + description: The minimum port number in the range that is matched by the security group rule. + required: false + status: SUPPORTED + constraints: + - in_range: + - 0 + - 65535 + + org.openecomp.datatypes.heat.substitution.SubstitutionFiltering: + derived_from: tosca.datatypes.Root + description: Substitution Filter + properties: + substitute_service_template: + type: string + description: Substitute Service Template + required: true + status: SUPPORTED + index_value: + type: integer + description: Index value of the substitution service template runtime instance + required: false + default: 0 + status: SUPPORTED + constraints: + - greater_or_equal: 0 + count: + type: string + description: Count + required: false + default: 1 + status: SUPPORTED + scaling_enabled: + type: boolean + description: Indicates whether service scaling is enabled + required: false + default: true + status: SUPPORTED + mandatory: + type: boolean + description: Mandatory + required: false + default: true + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefDataSequence: + derived_from: tosca.datatypes.Root + description: network policy refs data sequence + properties: + network_policy_refs_data_sequence_major: + type: integer + description: Network Policy ref data sequence Major + required: false + status: SUPPORTED + network_policy_refs_data_sequence_minor: + type: integer + description: Network Policy ref data sequence Minor + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefData: + derived_from: tosca.datatypes.Root + description: network policy refs data + properties: + network_policy_refs_data_sequence: + type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefDataSequence + description: Network Policy ref data sequence + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnet: + derived_from: tosca.datatypes.Root + description: Network Ipam Ref Data Subnet + properties: + network_ipam_refs_data_ipam_subnets_subnet_ip_prefix_len: + type: string + description: Network ipam refs data ipam subnets ip prefix len + required: false + status: SUPPORTED + network_ipam_refs_data_ipam_subnets_subnet_ip_prefix: + type: string + description: Network ipam refs data ipam subnets ip prefix + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnetList: + derived_from: tosca.datatypes.Root + description: Network Ipam Ref Data Subnet List + properties: + network_ipam_refs_data_ipam_subnets_subnet: + type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnet + description: Network ipam refs data ipam subnets + required: false + status: SUPPORTED + network_ipam_refs_data_ipam_subnets_addr_from_start: + type: string + description: Network ipam refs data ipam subnets addr from start + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.IpamRefData: + derived_from: tosca.datatypes.Root + description: Network Ipam Ref Data + properties: + network_ipam_refs_data_ipam_subnets: + type: list + description: Network ipam refs data ipam subnets + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnetList + + org.openecomp.datatypes.heat.contrailV2.network.rule.SrcVirtualNetwork: + derived_from: tosca.datatypes.Root + description: source addresses + properties: + network_policy_entries_policy_rule_src_addresses_virtual_network: + type: string + description: Source addresses Virtual network + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.network.rule.DstVirtualNetwork: + derived_from: tosca.datatypes.Root + description: destination addresses + properties: + network_policy_entries_policy_rule_dst_addresses_virtual_network: + type: string + description: Destination addresses Virtual network + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.network.rule.DstPortPairs: + derived_from: tosca.datatypes.Root + description: destination port pairs + properties: + network_policy_entries_policy_rule_dst_ports_start_port: + type: string + description: Start port + required: false + status: SUPPORTED + network_policy_entries_policy_rule_dst_ports_end_port: + type: string + description: End port + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.network.rule.SrcPortPairs: + derived_from: tosca.datatypes.Root + description: source port pairs + properties: + network_policy_entries_policy_rule_src_ports_start_port: + type: string + description: Start port + required: false + status: SUPPORTED + network_policy_entries_policy_rule_src_ports_end_port: + type: string + description: End port + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.network.rule.ActionList: + derived_from: tosca.datatypes.Root + description: Action List + properties: + network_policy_entries_policy_rule_action_list_simple_action: + type: string + description: Simple Action + required: false + status: SUPPORTED + network_policy_entries_policy_rule_action_list_apply_service: + type: list + description: Apply Service + required: false + status: SUPPORTED + entry_schema: + type: string + + org.openecomp.datatypes.heat.contrailV2.network.rule.Rule: + derived_from: tosca.datatypes.Root + description: policy rule + properties: + network_policy_entries_policy_rule_dst_addresses: + type: list + description: Destination addresses + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.DstVirtualNetwork + network_policy_entries_policy_rule_dst_ports: + type: list + description: Destination ports + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.DstPortPairs + network_policy_entries_policy_rule_protocol: + type: string + description: Protocol + required: false + status: SUPPORTED + network_policy_entries_policy_rule_src_addresses: + type: list + description: Source addresses + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.SrcVirtualNetwork + network_policy_entries_policy_rule_direction: + type: string + description: Direction + required: false + status: SUPPORTED + network_policy_entries_policy_rule_src_ports: + type: list + description: Source ports + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.SrcPortPairs + network_policy_entries_policy_rule_action_list: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.ActionList + description: Action list + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.network.rule.RuleList: + derived_from: tosca.datatypes.Root + description: list of policy rules + properties: + network_policy_entries_policy_rule: + type: list + description: Contrail network rule + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.Rule + + org.openecomp.datatypes.heat.network.contrail.port.StaticRoute: + derived_from: tosca.datatypes.Root + description: static route + properties: + prefix: + type: string + description: Route prefix + required: false + status: SUPPORTED + next_hop: + type: string + description: Next hop + required: false + status: SUPPORTED + next_hop_type: + type: string + description: Next hop type + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.network.contrail.AddressPair: + derived_from: tosca.datatypes.Root + description: Address Pair + properties: + address_mode: + type: string + description: Address mode active-active or active-standy + required: false + status: SUPPORTED + constraints: + - valid_values: + - active-active + - active-standby + prefix: + type: string + description: IP address prefix + required: false + status: SUPPORTED + mac_address: + type: string + description: Mac address + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.network.contrail.InterfaceData: + derived_from: tosca.datatypes.Root + description: Interface Data + properties: + static_routes: + type: list + description: An ordered list of static routes to be added to this interface + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.network.contrail.port.StaticRoute + virtual_network: + type: string + description: Virtual Network for this interface + required: true + status: SUPPORTED + allowed_address_pairs: + type: list + description: List of allowed address pair for this interface + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.network.contrail.AddressPair + ip_address: + type: string + description: IP for this interface + required: false + status: SUPPORTED + + # Duplicate type - removed after investigating with Renana and Shiri Amichai from Amdocs + # org.openecomp.datatypes.heat.contrailV2.virtual.machine.interface.Properties: + # derived_from: tosca.datatypes.Root + # description: Virtual Machine Interface Properties. + # properties: + # virtual_machine_interface_properties_service_interface_type: + # type: string + # description: Service Interface Type. + # required: false + # status: SUPPORTED + + org.openecomp.datatypes.Root: + derived_from: tosca.datatypes.Root + description: > + The ECOMP root Data Type all other Data Types derive from + properties: + supplemental_data: + type: map + entry_schema: + description: > + A placeholder for missing properties that would be included in future ecomp model versions. + fromat <key>:<value> + type: string + + org.openecomp.datatypes.AssignmentRequirements: + derived_from: org.openecomp.datatypes.Root + properties: + is_required: + description: | + "true" indicates that assignment is required + type: boolean + default: false + required: true + count: + description: number of assignments required + type: integer + required: false + + org.openecomp.datatypes.network.SubnetAssignments: + derived_from: org.openecomp.datatypes.Root + properties: + ip_network_address_plan: + type: string + required: false + description: Reference to EIPAM, VLAN or other address plan ID used to assign subnets to this network + dhcp_enabled: + type: boolean + required: false + description: \"true\" indicates the network has 1 or more policies + ip_version: + type: integer + constraints: + - valid_values: [4,6] + required: true + description: The IP version of the subnet + cidr_mask: + type: integer + required: true + description: The default subnet CIDR mask + min_subnets_count: + type: integer + default: 1 + required: true + description: Quantity of subnets that must be initially assigned + + org.openecomp.datatypes.network.IPv4SubnetAssignments: + derived_from: org.openecomp.datatypes.network.SubnetAssignments + properties: + use_ipv4: + type: boolean + required: true + description: Indicates IPv4 subnet assignments + + org.openecomp.datatypes.network.IPv6SubnetAssignments: + derived_from: org.openecomp.datatypes.network.SubnetAssignments + properties: + use_ipv6: + type: boolean + required: true + description: Indicates IPv6 subnet assignments + + org.openecomp.datatypes.network.NetworkAssignments: + derived_from: org.openecomp.datatypes.Root + properties: + ecomp_generated_network_assignment: + type: boolean + required: true + default: false + description: > + \"true\" indicates that the network assignments will be auto-generated by ECOMP + \"false\" indicates operator-supplied Network assignments file upload is required (e.g. VID will present prompt to operator to upload operator-supplied Network assignments file). + is_shared_network: + type: boolean + required: true + description: \"true\" means this network is shared by multiple Openstack tenants + is_external_network: + type: boolean + required: true + default: false + description: > + \"true\" means this Contrail external network + ipv4_subnet_default_assignment: + type: org.openecomp.datatypes.network.IPv4SubnetAssignments + required: true + description: IPv4 defualt subnet assignments + ipv6_subnet_default_assignment: + type: org.openecomp.datatypes.network.IPv6SubnetAssignments + required: true + description: IPv6 defualt subnet assignments + + org.openecomp.datatypes.network.ProviderNetwork: + derived_from: org.openecomp.datatypes.Root + properties: + is_provider_network: + type: boolean + required: true + description: \"true\" indicates that this a Neutron provider type of network + physical_network_name: + type: string + required: false + constraints: + - valid_values: ["Physnet41", "Physnet42", "Physnet43", "Physnet44", "Physnet21", "Physnet22"] + description: > + Identifies the NUMA processor cluster to which this physical network interface belongs. + NUMA instance correlates to the first digit of the Physical Network Name suffix (e.g. \"01\" = NUMA 0, \"11\" = NUMA 1) + numa: + type: string + required: false + constraints: + - valid_values: ["NUMA 0", "NUMA 1"] + description: > + PNIC instance within the NUMA processor cluster + PNIC Instance correlates to the second digit of the Physical Network Name suffix (e.g. "01" = PNIC 1, "02" = "PNIC 2) + pnic_instance: + type: integer + required: false + description: PNIC instance within the NUMA processor cluster + + org.openecomp.datatypes.network.NetworkFlows: + derived_from: org.openecomp.datatypes.Root + properties: + is_network_policy: + type: boolean + required: false + default: false + description: \"true\" indicates the network has 1 or more policies + network_policy: + type: string + required: false + description: "Identifies the specific Cloud network policy that must be applied to this network (source: from Policy Manager)." + is_bound_to_vpn: + type: boolean + required: false + default: false + description: \"true\" indicates the network has 1 or more vpn bindings + vpn_binding: + type: string + required: false + description: "Identifies the specific VPN Binding entry in A&AI that must be applied when creating this network (source: A&AI)" + + org.openecomp.datatypes.network.VlanRequirements: + derived_from: org.openecomp.datatypes.Root + properties: + vlan_range_plan: + type: string + required: true + description: reference to a vlan range plan + vlan_type: + type: string + required: true + constraints: + - valid_values: ["c-tag", "s-tag"] + description: identifies the vlan type (e.g., c-tag) + vlan_count: + type: integer + required: true + description: identifies the number of vlan tags to assign to the CP from the plan + + org.openecomp.datatypes.network.IpRequirements: + derived_from: org.openecomp.datatypes.Root + properties: + ip_version: + type: integer + required: true + constraints: + - valid_values: + - 4 + - 6 + ip_count: + description: identifies the number of ip address to assign to the CP from the plan + type: integer + required: false + floating_ip_count: + type: integer + required: false + subnet_role: + type: string + required: false + assingment_method: + type: string + required: true + constraints: + - valid_values: + - fixed + - dhcp + dhcp_enabled: + type: boolean + required: false + ip_count_required: + description: identifies the number of ip address to assign to the CP from the plan + type: org.openecomp.datatypes.AssignmentRequirements + required: false + floating_ip_count_required: + type: org.openecomp.datatypes.AssignmentRequirements + required: false + + org.openecomp.datatypes.network.MacAssignments: + derived_from: org.openecomp.datatypes.Root + properties: + mac_range_plan: + type: string + required: true + description: reference to a MAC address range plan + mac_count: + type: integer + required: true + description: identifies the number of MAC addresses to assign to the CP from the plan + + org.openecomp.datatypes.EcompHoming: + derived_from: org.openecomp.datatypes.Root + properties: + ecomp_selected_instance_node_target: + type: boolean + required: true + default: false + description: > + \"true\" indicates that the target deployment node for this instance will be auto-selected by ECOMP + \"false\" indicates operator-supplied instance target deployment node required (e.g. VID will present a prompt to operator and collect the + operator-selected target node for the deployment of this Network instance). + homing_policy: + type: string + required: false + description: Referenc to a service level homing policy that ECOMP will use for instance deployment target node + instance_node_target: + type: string + required: false + description: Instance target deployment node + + org.openecomp.datatypes.EcompNaming: + derived_from: org.openecomp.datatypes.Root + properties: + ecomp_generated_naming: + type: boolean + required: true + default: true + description: > + \"true\" indicates that the name for the instance will be auto-generated by ECOMP. + \"false\" indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name). + naming_policy: + type: string + required: false + description: Referenc to naming policy that ECOMP will use when the name is auto-generated + + org.openecomp.datatypes.network.MacRequirements: + derived_from: org.openecomp.datatypes.Root + properties: + mac_range_plan: + description: reference to a MAC address range plan + type: string + required: false + mac_count: + description: identifies the number of MAC addresses to assign to the CP from the plan + type: integer + required: false + mac_count_required: + description: identifies the number of MAC addresses to assign to the CP from the plan + type: org.openecomp.datatypes.AssignmentRequirements + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairIp: + derived_from: tosca.datatypes.Root + description: Virtual Machine Sub Interface Address Pair IP. + properties: + ip_prefix: + type: string + description: IP Prefix. + required: false + status: SUPPORTED + ip_prefix_len: + type: integer + description: IP Prefix Len. + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.MacAddress: + derived_from: tosca.datatypes.Root + description: Virtual Machine Sub Interface Mac Address. + properties: + mac_address: + type: list + description: Mac Addresses List. + required: false + status: SUPPORTED + entry_schema: + type: string + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.Properties: + derived_from: tosca.datatypes.Root + description: Virtual Machine Sub Interface VLAN Properties. + properties: + sub_interface_vlan_tag: + type: string + description: Sub Interface VLAN Tag. + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPair: + derived_from: tosca.datatypes.Root + description: Virtual Machine Sub Interface Address Pair. + properties: + address_mode: + type: string + description: Address Mode. + required: false + status: SUPPORTED + ip: + type: org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairIp + description: IP. + required: false + status: SUPPORTED + mac: + type: string + description: Mac. + required: false + status: SUPPORTED + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairs: + derived_from: tosca.datatypes.Root + description: Virtual Machine Sub Interface Address Pairs. + properties: + allowed_address_pair: + type: list + description: Addresses pair List. + required: false + status: SUPPORTED + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPair + + org.openecomp.datatypes.Naming: + derived_from: org.openecomp.datatypes.Root + properties: + ecomp_generated_naming: + description: | + "true" indicates that the name for the instance will be auto-generated by ECOMP. "false" indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name). + type: boolean + default: true + required: true + naming_policy: + description: Reference to naming policy that ECOMP will use when the name is auto-generated + type: string + required: false + instance_name: + description: indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name). + type: string + required: false + port_id: + description: The unique ID for the network port generated by the network provider. + type: string + required: false + network_id: + description: The unique ID for the network. + type: string + required: false + mac_address: + description: The unique media access control address (MAC address) assigned to the port. + type: string + required: false + addresses: + description: The list of IP address(es) assigned to the port. + type: list + entry_schema: + type: string + required: false + + tosca.datatypes.Credential: + derived_from: tosca.datatypes.Root + description: The Credential type is a complex TOSCA data Type used when describing authorization credentials used to access network accessible resources. + properties: + protocol: + description: The optional protocol name. + type: string + required: false + token_type: + description: The required token type. + type: string + default: password + token: + description: The required token used as a credential for authorization or access to a networked resource. + type: string + keys: + description: The optional list of protocol-specific keys or assertions. + type: map + entry_schema: + type: string + required: false + user: + description: The optional user (name or ID) used for non-token based credentials. + type: string + required: false + + org.openecomp.datatypes.heat.network.AddressPair: + derived_from: tosca.datatypes.Root + description: MAC/IP address pairs + properties: + mac_address: + description: MAC address + type: string + status: supported + required: false + ip_address: + description: IP address + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.novaServer.network.PortExtraProperties: + derived_from: tosca.datatypes.Root + description: Nova server network expand properties for port + properties: + port_security_enabled: + description: Flag to enable/disable port security on the port + type: boolean + status: supported + required: false + mac_address: + description: MAC address to give to this port + type: string + status: supported + required: false + admin_state_up: + description: The administrative state of this port + type: boolean + status: supported + default: true + required: false + qos_policy: + description: The name or ID of QoS policy to attach to this port + type: string + status: supported + required: false + allowed_address_pairs: + description: Additional MAC/IP address pairs allowed to pass through the port + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.network.AddressPair + required: false + binding:vnic_type: + description: The vnic type to be bound on the neutron port + type: string + status: supported + required: false + constraints: + - valid_values: + - macvtap + - direct + - normal + value_specs: + description: Extra parameters to include in the request + type: map + status: supported + entry_schema: + type: string + default: {} + required: false + + org.openecomp.datatypes.heat.contrailV2.network.rule.SrcPortPairs: + derived_from: tosca.datatypes.Root + description: source port pairs + properties: + network_policy_entries_policy_rule_src_ports_start_port: + description: Start port + type: string + status: supported + required: false + network_policy_entries_policy_rule_src_ports_end_port: + description: End port + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPair: + derived_from: tosca.datatypes.Root + description: Virtual Machine Sub Interface Address Pair. + properties: + address_mode: + description: Address Mode. + type: string + status: supported + required: false + ip: + description: IP. + type: org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairIp + status: supported + required: false + mac: + description: Mac. + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.network.rule.DstVirtualNetwork: + derived_from: tosca.datatypes.Root + description: destination addresses + properties: + network_policy_entries_policy_rule_dst_addresses_virtual_network: + description: Destination addresses Virtual network + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.network.rule.Rule: + derived_from: tosca.datatypes.Root + description: policy rule + properties: + network_policy_entries_policy_rule_dst_addresses: + description: Destination addresses + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.DstVirtualNetwork + required: false + network_policy_entries_policy_rule_dst_ports: + description: Destination ports + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.DstPortPairs + required: false + network_policy_entries_policy_rule_protocol: + description: Protocol + type: string + status: supported + required: false + network_policy_entries_policy_rule_src_addresses: + description: Source addresses + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.SrcVirtualNetwork + required: false + network_policy_entries_policy_rule_direction: + description: Direction + type: string + status: supported + required: false + network_policy_entries_policy_rule_src_ports: + description: Source ports + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.SrcPortPairs + required: false + network_policy_entries_policy_rule_action_list: + description: Action list + type: org.openecomp.datatypes.heat.contrailV2.network.rule.ActionList + status: supported + required: false + + org.openecomp.datatypes.heat.network.neutron.SecurityRules.Rule: + derived_from: tosca.datatypes.Root + description: Rules Pairs + properties: + remote_group_id: + description: The remote group ID to be associated with this security group rule + type: string + status: supported + required: false + protocol: + description: The protocol that is matched by the security group rule + type: string + status: supported + required: false + constraints: + - valid_values: + - tcp + - udp + - icmp + ethertype: + description: Ethertype of the traffic + type: string + status: supported + default: IPv4 + required: false + constraints: + - valid_values: + - IPv4 + - IPv6 + port_range_max: + description: 'The maximum port number in the range that is matched by the security group rule. ' + type: integer + status: supported + required: false + constraints: + - in_range: + - 0 + - 65535 + remote_ip_prefix: + description: The remote IP prefix (CIDR) to be associated with this security group rule + type: string + status: supported + required: false + remote_mode: + description: Whether to specify a remote group or a remote IP prefix + type: string + status: supported + default: remote_ip_prefix + required: false + constraints: + - valid_values: + - remote_ip_prefix + - remote_group_id + direction: + description: The direction in which the security group rule is applied + type: string + status: supported + default: ingress + required: false + constraints: + - valid_values: + - egress + - ingress + port_range_min: + description: The minimum port number in the range that is matched by the security group rule. + type: integer + status: supported + required: false + constraints: + - in_range: + - 0 + - 65535 + + org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnet: + derived_from: tosca.datatypes.Root + description: Network Ipam Ref Data Subnet + properties: + network_ipam_refs_data_ipam_subnets_subnet_ip_prefix_len: + description: Network ipam refs data ipam subnets ip prefix len + type: string + status: supported + required: false + network_ipam_refs_data_ipam_subnets_subnet_ip_prefix: + description: Network ipam refs data ipam subnets ip prefix + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.Properties: + derived_from: tosca.datatypes.Root + description: Virtual Machine Sub Interface VLAN Properties. + properties: + sub_interface_vlan_tag: + description: Sub Interface VLAN Tag. + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairIp: + derived_from: tosca.datatypes.Root + description: Virtual Machine Sub Interface Address Pair IP. + properties: + ip_prefix: + description: IP Prefix. + type: string + status: supported + required: false + ip_prefix_len: + description: IP Prefix Len. + type: integer + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.network.rule.SrcVirtualNetwork: + derived_from: tosca.datatypes.Root + description: source addresses + properties: + network_policy_entries_policy_rule_src_addresses_virtual_network: + description: Source addresses Virtual network + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.network.rule.ActionList: + derived_from: tosca.datatypes.Root + description: Action List + properties: + network_policy_entries_policy_rule_action_list_simple_action: + description: Simple Action + type: string + status: supported + required: false + network_policy_entries_policy_rule_action_list_apply_service: + description: Apply Service + type: list + status: supported + entry_schema: + type: string + required: false + + org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.IpamRefData: + derived_from: tosca.datatypes.Root + description: Network Ipam Ref Data + properties: + network_ipam_refs_data_ipam_subnets: + description: Network ipam refs data ipam subnets + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnetList + required: false + + org.openecomp.datatypes.heat.FileInfo: + derived_from: tosca.datatypes.Root + description: Heat File Info + properties: + file: + description: The required URI string (relative or absolute) which can be used to locate the file + type: string + status: supported + required: true + file_type: + description: The type of the file + type: string + status: supported + required: true + constraints: + - valid_values: + - base + - env + - volume + - network + + org.openecomp.datatypes.heat.network.contrail.InterfaceData: + derived_from: tosca.datatypes.Root + description: Interface Data + properties: + static_routes: + description: An ordered list of static routes to be added to this interface + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.network.contrail.port.StaticRoute + required: false + virtual_network: + description: Virtual Network for this interface + type: string + status: supported + required: true + allowed_address_pairs: + description: List of allowed address pair for this interface + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.network.contrail.AddressPair + required: false + ip_address: + description: IP for this interface + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefData: + derived_from: tosca.datatypes.Root + description: network policy refs data + properties: + network_policy_refs_data_sequence: + description: Network Policy ref data sequence + type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefDataSequence + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.network.rule.DstPortPairs: + derived_from: tosca.datatypes.Root + description: destination port pairs + properties: + network_policy_entries_policy_rule_dst_ports_start_port: + description: Start port + type: string + status: supported + required: false + network_policy_entries_policy_rule_dst_ports_end_port: + description: End port + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.network.AllocationPool: + derived_from: tosca.datatypes.Root + description: The start and end addresses for the allocation pool + properties: + start: + description: Start address for the allocation pool + type: string + status: supported + required: false + end: + description: End address for the allocation pool + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrail.network.rule.PortPairs: + derived_from: tosca.datatypes.Root + description: source and destination port pairs + properties: + start_port: + description: Start port + type: string + status: supported + required: false + end_port: + description: End port + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork: + derived_from: tosca.datatypes.Root + description: source and destination addresses + properties: + virtual_network: + description: Virtual network + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrail.network.rule.RuleList: + derived_from: tosca.datatypes.Root + description: list of policy rules + properties: + policy_rule: + description: Contrail network rule + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrail.network.rule.Rule + required: false + + org.openecomp.datatypes.heat.network.contrail.AddressPair: + derived_from: tosca.datatypes.Root + description: Address Pair + properties: + address_mode: + description: Address mode active-active or active-standy + type: string + status: supported + required: false + constraints: + - valid_values: + - active-active + - active-standby + prefix: + description: IP address prefix + type: string + status: supported + required: false + mac_address: + description: Mac address + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.MacAddress: + derived_from: tosca.datatypes.Root + description: Virtual Machine Sub Interface Mac Address. + properties: + mac_address: + description: Mac Addresses List. + type: list + status: supported + entry_schema: + type: string + required: false + + org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnetList: + derived_from: tosca.datatypes.Root + description: Network Ipam Ref Data Subnet List + properties: + network_ipam_refs_data_ipam_subnets_subnet: + description: Network ipam refs data ipam subnets + type: org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.ref.data.IpamSubnet + status: supported + required: false + network_ipam_refs_data_ipam_subnets_addr_from_start: + description: Network ipam refs data ipam subnets addr from start + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.network.rule.RuleList: + derived_from: tosca.datatypes.Root + description: list of policy rules + properties: + network_policy_entries_policy_rule: + description: Contrail network rule + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.network.rule.Rule + required: false + + org.openecomp.datatypes.heat.novaServer.network.AddressInfo: + derived_from: tosca.datatypes.network.NetworkInfo + description: Network addresses with corresponding port id + properties: + port_id: + description: Port id + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPairs: + derived_from: tosca.datatypes.Root + description: Virtual Machine Sub Interface Address Pairs. + properties: + allowed_address_pair: + description: Addresses pair List. + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrailV2.virtual.machine.subInterface.AddressPair + required: false + + org.openecomp.datatypes.heat.neutron.port.FixedIps: + derived_from: tosca.datatypes.Root + description: subnet/ip_address + properties: + subnet: + description: Subnet in which to allocate the IP address for this port + type: string + status: supported + required: false + ip_address: + description: IP address desired in the subnet for this port + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.virtual.machine.interface.Properties: + derived_from: tosca.datatypes.Root + description: Virtual Machine Interface Properties. + properties: + service_interface_type: + description: Service Interface Type. + type: string + status: SUPPORTED + required: false + + org.openecomp.datatypes.heat.network.subnet.HostRoute: + derived_from: tosca.datatypes.Root + description: Host route info for the subnet + properties: + destination: + description: The destination for static route + type: string + status: supported + required: false + nexthop: + description: The next hop for the destination + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.network.contrail.port.StaticRoute: + derived_from: tosca.datatypes.Root + description: static route + properties: + prefix: + description: Route prefix + type: string + status: supported + required: false + next_hop: + description: Next hop + type: string + status: supported + required: false + next_hop_type: + description: Next hop type + type: string + status: supported + required: false + + org.openecomp.datatypes.substitution.SubstitutionFiltering: + derived_from: tosca.datatypes.Root + description: Substitution Filter + properties: + substitute_service_template: + description: Substitute Service Template + type: string + status: supported + required: true + index_value: + description: Index value of the substitution service template runtime instance + type: integer + status: supported + default: 0 + required: false + constraints: + - greater_or_equal: 0 + count: + description: Count + type: float + status: supported + default: 1 + required: false + scaling_enabled: + description: Indicates whether service scaling is enabled + type: boolean + status: supported + default: true + required: false + mandatory: + description: Mandatory + type: boolean + status: supported + default: true + required: false + + org.openecomp.datatypes.heat.network.neutron.Subnet: + derived_from: tosca.datatypes.Root + description: A subnet represents an IP address block that can be used for assigning IP addresses to virtual instances + properties: + tenant_id: + description: The ID of the tenant who owns the network + type: string + status: supported + required: false + enable_dhcp: + description: Set to true if DHCP is enabled and false if DHCP is disabled + type: boolean + status: supported + default: true + required: false + ipv6_address_mode: + description: IPv6 address mode + type: string + status: supported + required: false + constraints: + - valid_values: + - dhcpv6-stateful + - dhcpv6-stateless + - slaac + ipv6_ra_mode: + description: IPv6 RA (Router Advertisement) mode + type: string + status: supported + required: false + constraints: + - valid_values: + - dhcpv6-stateful + - dhcpv6-stateless + - slaac + value_specs: + description: Extra parameters to include in the request + type: map + status: supported + entry_schema: + type: string + default: {} + required: false + allocation_pools: + description: The start and end addresses for the allocation pools + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.network.AllocationPool + required: false + subnetpool: + description: The name or ID of the subnet pool + type: string + status: supported + required: false + dns_nameservers: + description: A specified set of DNS name servers to be used + type: list + status: supported + entry_schema: + type: string + default: [] + required: false + host_routes: + description: The gateway IP address + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.network.subnet.HostRoute + required: false + ip_version: + description: The gateway IP address + type: integer + status: supported + default: 4 + required: false + constraints: + - valid_values: + - 4 + - 6 + name: + description: The name of the subnet + type: string + status: supported + required: false + prefixlen: + description: Prefix length for subnet allocation from subnet pool + type: integer + status: supported + required: false + constraints: + - greater_or_equal: 0 + cidr: + description: The CIDR + type: string + status: supported + required: false + gateway_ip: + description: The gateway IP address + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrail.network.rule.Rule: + derived_from: tosca.datatypes.Root + description: policy rule + properties: + src_ports: + description: Source ports + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrail.network.rule.PortPairs + required: false + protocol: + description: Protocol + type: string + status: supported + required: false + dst_addresses: + description: Destination addresses + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork + required: false + apply_service: + description: Service to apply + type: string + status: supported + required: false + dst_ports: + description: Destination ports + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrail.network.rule.PortPairs + required: false + src_addresses: + description: Source addresses + type: list + status: supported + entry_schema: + type: org.openecomp.datatypes.heat.contrail.network.rule.VirtualNetwork + required: false + direction: + description: Direction + type: string + status: supported + required: false + + org.openecomp.datatypes.heat.contrailV2.virtual.network.rule.RefDataSequence: + derived_from: tosca.datatypes.Root + description: network policy refs data sequence + properties: + network_policy_refs_data_sequence_major: + description: Network Policy ref data sequence Major + type: integer + status: supported + required: false + network_policy_refs_data_sequence_minor: + description: Network Policy ref data sequence Minor + type: integer + status: supported + required: false + + org.openecomp.datatypes.Naming: + derived_from: tosca.datatypes.Root + description: Naming + properties: + ecomp_generated_naming: + description: | + "true" indicates that the name for the instance will be auto-generated by ECOMP. "false" indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name). + type: boolean + default: true + required: false + status: supported + naming_policy: + description: Reference to naming policy that ECOMP will use when the name is auto-generated + type: string + required: false + status: supported + instance_name: + description: Reference to naming policy that ECOMP will use when the name is auto-generated + type: string + required: false + status: supported + + org.openecomp.datatypes.EcompGeneratedNaming: + derived_from: org.openecomp.datatypes.Naming + description: Naming + properties: + naming_policy: + description: Referenc to naming policy that ECOMP will use when the name is auto-generated + type: string + required: false + + org.openecomp.datatypes.UserDefinedNaming: + derived_from: org.openecomp.datatypes.Naming + description: Naming + properties: + instance_name: + description: Reference to naming policy that ECOMP will use when the name is auto-generated + type: string + required: false + + org.openecomp.datatypes.Root: + derived_from: tosca.datatypes.Root + description: > + The AT&T root Data Type all other Data Types derive from + properties: + supplemental_data: + type: map + entry_schema: + description: > + A placeholder for missing properties that would be included in future ecomp model versions. + fromat <key>:<value> + type: string + + org.openecomp.datatypes.EcompHoming: + derived_from: org.openecomp.datatypes.Root + properties: + ecomp_selected_instance_node_target: + type: boolean + required: true + default: false + description: > + "true" indicates that the target deployment node for this instance will be auto-selected by ECOMP + "false" indicates operator-supplied instance target deployment node required (e.g. VID will present a prompt to operator and collect the + operator-selected target node for the deployment of this Network instance). + homing_policy: + type: string + required: false + description: Referenc to a service level homing policy that ECOMP will use for instance deployment target node + instance_node_target: + type: string + required: false + description: Instance target deployment node + + org.openecomp.datatypes.EcompNaming: + derived_from: org.openecomp.datatypes.Root + properties: + ecomp_generated_naming: + type: boolean + required: true + default: true + description: > + "true" indicates that the name for the instance will be auto-generated by ECOMP. + "false" indicates operator-supplied name required (e.g. VID will present prompt to operator and collect the operator-supplied instance name). + naming_policy: + type: string + required: false + description: Referenc to naming policy that ECOMP will use when the name is auto-generated + org.openecomp.datatypes.network.NetworkAssignments: + derived_from: org.openecomp.datatypes.Root + properties: + ecomp_generated_network_assignment: + type: boolean + required: true + default: false + description: > + "true" indicates that the network assignments will be auto-generated by ECOMP + "false" indicates operator-supplied Network assignments file upload is required (e.g. VID will present prompt to operator to upload operator-supplied Network assignments file). + network_assignments_file: + type: string + required: false + description: Filename of the template that specifies all of the configurable name/value pairs of Network assignments in this Network model + multi_tenant: + type: boolean + required: true + default: true + description: true means this network is shared by multiple Openstack tenants + min_subnets_count: + type: integer + required: true + description: Quantity of subnets that must be initially assigned + ip_network_address_plan: + type: string + required: true + description: Reference to EIPAM, VLAN or other address plan ID used to assign subnets to this network + vlan_network_address_plan: + type: string + required: true + description: Reference to VLAN or other address plan ID used to assign subnets to this network + org.openecomp.datatypes.network.PhysicalNetwork: + derived_from: org.openecomp.datatypes.Root + properties: + provider_network: + type: boolean + required: true + description: true indicates that this a Neutron provider type of network + physical_network_name: + type: string + required: false + constraint: + - valid_values: + - Physnet-SRIOV-1 + - Physnet-SRIOV-2 + - Physnet-SRIOV-11 + - Physnet-SRIOV-12 + description: > + Identifies the NUMA processor cluster to which this physical network interface belongs. + NUMA instance correlates to the first digit of the Physical Network Name suffix (e.g. "01" = NUMA 0, "11" = NUMA 1) + numa: + type: string + required: false + constraint: + - valid_values: + - NUMA 0 + - NUMA 1 + description: > + PNIC instance within the NUMA processor cluster + PNIC Instance correlates to the second digit of the Physical Network Name suffix (e.g. "01" = PNIC 1, "02" = "PNIC 2) + pnic_instance: + type: integer + required: false + description: PNIC instance within the NUMA processor cluster + + org.openecomp.datatypes.network.NetworkFlows: + derived_from: org.openecomp.datatypes.Root + properties: + is_network_policy: + type: boolean + required: false + default: false + description: true indicates the network has 1 or more policies + network_policy: + type: string + required: flase + description: Identifies the specific Cloud network policy that must be applied to this network (source - from Policy Manager) + vpn_binding: + type: string + required: false + description: Identifies the specific VPN Binding entry in A&AI that must be applied when creating this network (source - A&AI) + + org.openecomp.datatypes.Artifact: + derived_from: org.openecomp.datatypes.Root + properties: + artifact_name: + type: string + required: true + description: Artifcat name + artifact_type: + type: string + required: true + description: Artifcat type + artifact_uuid: + type: string + required: true + description: Artifcat UUID + artifact_checksum: + type: string + required: true + description: Artifact checksum + artifact_url: + type: string + required: true + description: Artifcay URL. Can also include only the file name
\ No newline at end of file |