From e385a7a1d1934c6a3d22df3c3244678ca415134a Mon Sep 17 00:00:00 2001 From: Matej Perina Date: Wed, 3 Apr 2019 09:17:40 +0200 Subject: [PATCH] Proposal to remove OSGi dependencies from the CCSDK project Dependencies on the OSGi frameworks and libraries are removed by integrating the CCSDK project with the lighty.io. It's a toolkit that allows to use ODL services (in this case core services and the Restconf) without the dependency on the Karaf framework and the Blueprint DI. The ccsdk-lighty-module artifact contains lighty.io module that groups all other modules from other repositories and starts/stops them at once. The ccsdk-lighty-distribution artifact starts the lighty.io core, Restconf and the CCSDK integrated with the lighty.io and creates zip distribution with the CCSDK lighty.io application and necessary libraries. The distribution-lighty-ubuntu-docker artifact creates the docker image with the zip distribution from the ccsdk-lighty-application artifact and necessary configuration files. For more information see the README.md file in the lighty/docs directory. More info about the lighty.io - https://lighty.io Change-Id: Id29935c8e2951b400ad3217ff412bc5155384487 Signed-off-by: Matej Perina Signed-off-by: Samuel Kontris --- lighty/ccsdk-lighty-distribution/pom.xml | 79 ++ .../org/onap/ccsdk/distribution/lighty/Main.java | 139 ++ .../src/main/resources/lightyCcsdkConfig.json | 74 + lighty/ccsdk-lighty-module/pom.xml | 97 ++ .../lighty/AAAEncryptionServiceLightyImpl.java | 116 ++ .../lighty/CcsdkLightyApplication.java | 170 +++ .../distribution/lighty/CcsdkLightyModule.java | 206 +++ lighty/docs/README.md | 122 ++ lighty/docs/hello_world.json | 66 + lighty/lighty-ubuntu-docker/pom.xml | 343 +++++ .../src/main/docker/Dockerfile | 16 + .../src/main/docker/docker-compose.yml | 64 + .../src/main/properties/aaiclient.properties | 82 ++ .../src/main/properties/admportal.json | 68 + .../src/main/properties/admportal.log4js.json | 169 +++ .../src/main/properties/dblib.properties | 38 + .../src/main/properties/grpc.properties | 18 + .../src/main/properties/lightyCcsdkConfig.json | 74 + .../src/main/properties/mdsal-resource.properties | 27 + .../src/main/properties/netbox.properties | 19 + .../src/main/properties/partners.json | 16 + .../properties/sdnr-oofpcipoc-api-dg.properties | 35 + .../src/main/properties/sql-resource.properties | 23 + .../src/main/properties/svclogic.properties | 29 + .../main/properties/svclogic.properties.sdnctldb01 | 29 + .../src/main/properties/template-node.properties | 4 + .../src/main/properties/ueb.properties | 4 + .../src/main/resources/ansible-sources.list | 2 + .../src/main/resources/idmlight.db.mv.db | Bin 0 -> 40960 bytes .../src/main/resources/install_ccsdk.yml | 16 + .../src/main/resources/odlsli.dump | 1418 ++++++++++++++++++++ .../src/main/resources/org.ops4j.pax.logging.cfg | 92 ++ .../src/main/scripts/installSdncDb.sh | 45 + .../src/main/scripts/startODL.sh | 52 + .../src/main/stores/truststore.onap.client.jks | Bin 0 -> 117990 bytes lighty/pom.xml | 22 + pom.xml | 1 + 37 files changed, 3775 insertions(+) create mode 100755 lighty/ccsdk-lighty-distribution/pom.xml create mode 100644 lighty/ccsdk-lighty-distribution/src/main/java/org/onap/ccsdk/distribution/lighty/Main.java create mode 100644 lighty/ccsdk-lighty-distribution/src/main/resources/lightyCcsdkConfig.json create mode 100755 lighty/ccsdk-lighty-module/pom.xml create mode 100644 lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/AAAEncryptionServiceLightyImpl.java create mode 100644 lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyApplication.java create mode 100644 lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyModule.java create mode 100644 lighty/docs/README.md create mode 100644 lighty/docs/hello_world.json create mode 100644 lighty/lighty-ubuntu-docker/pom.xml create mode 100644 lighty/lighty-ubuntu-docker/src/main/docker/Dockerfile create mode 100644 lighty/lighty-ubuntu-docker/src/main/docker/docker-compose.yml create mode 100755 lighty/lighty-ubuntu-docker/src/main/properties/aaiclient.properties create mode 100755 lighty/lighty-ubuntu-docker/src/main/properties/admportal.json create mode 100755 lighty/lighty-ubuntu-docker/src/main/properties/admportal.log4js.json create mode 100644 lighty/lighty-ubuntu-docker/src/main/properties/dblib.properties create mode 100644 lighty/lighty-ubuntu-docker/src/main/properties/grpc.properties create mode 100644 lighty/lighty-ubuntu-docker/src/main/properties/lightyCcsdkConfig.json create mode 100644 lighty/lighty-ubuntu-docker/src/main/properties/mdsal-resource.properties create mode 100644 lighty/lighty-ubuntu-docker/src/main/properties/netbox.properties create mode 100755 lighty/lighty-ubuntu-docker/src/main/properties/partners.json create mode 100644 lighty/lighty-ubuntu-docker/src/main/properties/sdnr-oofpcipoc-api-dg.properties create mode 100644 lighty/lighty-ubuntu-docker/src/main/properties/sql-resource.properties create mode 100644 lighty/lighty-ubuntu-docker/src/main/properties/svclogic.properties create mode 100755 lighty/lighty-ubuntu-docker/src/main/properties/svclogic.properties.sdnctldb01 create mode 100644 lighty/lighty-ubuntu-docker/src/main/properties/template-node.properties create mode 100644 lighty/lighty-ubuntu-docker/src/main/properties/ueb.properties create mode 100644 lighty/lighty-ubuntu-docker/src/main/resources/ansible-sources.list create mode 100644 lighty/lighty-ubuntu-docker/src/main/resources/idmlight.db.mv.db create mode 100644 lighty/lighty-ubuntu-docker/src/main/resources/install_ccsdk.yml create mode 100644 lighty/lighty-ubuntu-docker/src/main/resources/odlsli.dump create mode 100644 lighty/lighty-ubuntu-docker/src/main/resources/org.ops4j.pax.logging.cfg create mode 100644 lighty/lighty-ubuntu-docker/src/main/scripts/installSdncDb.sh create mode 100644 lighty/lighty-ubuntu-docker/src/main/scripts/startODL.sh create mode 100755 lighty/lighty-ubuntu-docker/src/main/stores/truststore.onap.client.jks create mode 100644 lighty/pom.xml diff --git a/lighty/ccsdk-lighty-distribution/pom.xml b/lighty/ccsdk-lighty-distribution/pom.xml new file mode 100755 index 00000000..4082589c --- /dev/null +++ b/lighty/ccsdk-lighty-distribution/pom.xml @@ -0,0 +1,79 @@ + + + 4.0.0 + + + io.lighty.core + lighty-app-parent + 10.1.0 + + + org.onap.ccsdk.distribution + ccsdk-lighty-distribution + 0.6.0-SNAPSHOT + jar + + + 1.8 + 1.8 + UTF-8 + + org.onap.ccsdk.distribution.lighty.Main + true + + true + + + + + + org.onap.ccsdk.sli.core + ccsdk-lighty-dependency-versions + ${project.version} + pom + import + + + + + + + io.lighty.core + lighty-controller + + + io.lighty.modules + lighty-restconf-nb-community + + + io.lighty.resources + singlenode-configuration + + + org.onap.ccsdk.distribution + ccsdk-lighty-module + ${project.version} + + + org.onap.ccsdk.sli.core + sliapi-model + ${project.version} + + + org.onap.ccsdk.sli.northbound + dataChange-model + ${project.version} + + + org.onap.ccsdk.sli.northbound + asdcApi-model + ${project.version} + + + org.onap.ccsdk.sli.northbound + lcm-model + ${project.version} + + + + diff --git a/lighty/ccsdk-lighty-distribution/src/main/java/org/onap/ccsdk/distribution/lighty/Main.java b/lighty/ccsdk-lighty-distribution/src/main/java/org/onap/ccsdk/distribution/lighty/Main.java new file mode 100644 index 00000000..47163ea3 --- /dev/null +++ b/lighty/ccsdk-lighty-distribution/src/main/java/org/onap/ccsdk/distribution/lighty/Main.java @@ -0,0 +1,139 @@ +/* + * ============LICENSE_START========================================== + * Copyright (c) 2019 PANTHEON.tech s.r.o. + * =================================================================== + * 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.ccsdk.distribution.lighty; + +import io.lighty.core.controller.impl.config.ControllerConfiguration; +import io.lighty.core.controller.impl.util.ControllerConfigUtils; +import io.lighty.modules.northbound.restconf.community.impl.config.RestConfConfiguration; +import io.lighty.modules.northbound.restconf.community.impl.util.RestConfConfigUtils; +import java.net.InetAddress; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Set; +import java.util.concurrent.ExecutionException; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.opendaylight.yangtools.yang.binding.YangModuleInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Main class of the CCSDK lighty.io application. In order to start the application run main method. Path to + * the configuration file can be provided as argument. If not, then default configuration will be used. + */ +public class Main { + + private static final Logger LOG = LoggerFactory.getLogger(Main.class); + + private ShutdownHook shutdownHook; + + public static void main(String[] args) { + Main app = new Main(); + app.start(args, true); + } + + public void start(String[] args, boolean registerShutdownHook) { + long startTime = System.nanoTime(); + LOG.info(".__ .__ .__ __ .__ _________ _________ _________________ " + + " ____ __."); + LOG.info("| | |__| ____ | |___/ |_ ___.__. |__| ____ \\_ ___ \\\\_ ___ \\ / _____/\\___" + + "___ \\ | |/ _|"); + LOG.info("| | | |/ ___\\| | \\ __< | | | |/ _ \\ ______ / \\ \\// \\ \\/ \\_____ \\ " + + " | | \\| <"); + LOG.info("| |_| / /_/ > Y \\ | \\___ | | ( <_> ) /_____/ \\ \\___\\ \\____/ \\ |" + + " ` \\ | \\"); + LOG.info("|____/__\\___ /|___| /__| / ____| /\\ |__|\\____/ \\______ /\\______ /_______ //___" + + "____ /____|__ \\"); + LOG.info(" /_____/ \\/ \\/ \\/ \\/ \\/ \\/ " + + " \\/ \\/"); + + LOG.info("Starting lighty.io CCSDK application ..."); + LOG.info("https://lighty.io/"); + LOG.info("https://github.com/PantheonTechnologies/lighty-core"); + try { + if (args.length > 0) { + Path configPath = Paths.get(args[0]); + LOG.info("Using configuration from file {} ...", configPath); + //1. get controller configuration + ControllerConfiguration singleNodeConfiguration = + ControllerConfigUtils.getConfiguration(Files.newInputStream(configPath)); + //2. get RESTCONF NBP configuration + RestConfConfiguration restConfConfiguration = RestConfConfigUtils + .getRestConfConfiguration(Files.newInputStream(configPath)); + //3. start lighty + startLighty(singleNodeConfiguration, restConfConfiguration, registerShutdownHook); + } else { + LOG.info("Using default configuration ..."); + Set modelPaths = Stream.concat(RestConfConfigUtils.YANG_MODELS.stream(), + CcsdkLightyModule.YANG_MODELS.stream()).collect(Collectors.toSet()); + //1. get controller configuration + ControllerConfiguration defaultSingleNodeConfiguration = + ControllerConfigUtils.getDefaultSingleNodeConfiguration(modelPaths); + //2. get RESTCONF NBP configuration + RestConfConfiguration restConfConfig = + RestConfConfigUtils.getDefaultRestConfConfiguration(); + restConfConfig.setInetAddress(InetAddress.getLocalHost()); + restConfConfig.setHttpPort(8181); + //3. start lighty + startLighty(defaultSingleNodeConfiguration, restConfConfig, registerShutdownHook); + } + float duration = (System.nanoTime() - startTime)/1_000_000f; + LOG.info("lighty.io and CCSDK started in {}ms", duration); + } catch (Exception e) { + LOG.error("Main CCSDK lighty.io application exception: ", e); + } + } + + private void startLighty(ControllerConfiguration singleNodeConfiguration, + RestConfConfiguration restConfConfiguration, boolean registerShutdownHook) + throws ExecutionException, InterruptedException { + CcsdkLightyApplication ccsdkLightyApplication = new CcsdkLightyApplication(singleNodeConfiguration, + restConfConfiguration); + + if (registerShutdownHook) { + shutdownHook = new ShutdownHook(ccsdkLightyApplication); + Runtime.getRuntime().addShutdownHook(shutdownHook); + } + + ccsdkLightyApplication.start().get(); + } + + private static class ShutdownHook extends Thread { + + private static final Logger LOG = LoggerFactory.getLogger(ShutdownHook.class); + private final CcsdkLightyApplication ccsdkLightyApplication; + + ShutdownHook(CcsdkLightyApplication ccsdkLightyApplication) { + this.ccsdkLightyApplication = ccsdkLightyApplication; + } + + @Override + public void run() { + LOG.info("lighty.io and CCSDK shutting down ..."); + long startTime = System.nanoTime(); + try { + ccsdkLightyApplication.shutdown(); + } catch (Exception e) { + LOG.error("Exception while shutting down lighty.io CCSDK application:", e); + } + float duration = (System.nanoTime() - startTime)/1_000_000f; + LOG.info("lighty.io and CCSDK stopped in {}ms", duration); + } + + } +} diff --git a/lighty/ccsdk-lighty-distribution/src/main/resources/lightyCcsdkConfig.json b/lighty/ccsdk-lighty-distribution/src/main/resources/lightyCcsdkConfig.json new file mode 100644 index 00000000..1abed344 --- /dev/null +++ b/lighty/ccsdk-lighty-distribution/src/main/resources/lightyCcsdkConfig.json @@ -0,0 +1,74 @@ +{ + "controller":{ + "restoreDirectoryPath":"./clustered-datastore-restore", + "maxDataBrokerFutureCallbackQueueSize":1000, + "maxDataBrokerFutureCallbackPoolSize":10, + "metricCaptureEnabled":false, + "mailboxCapacity":1000, + "moduleShardsConfig": "configuration/initial/module-shards.conf", + "modulesConfig": "configuration/initial/modules.conf", + "domNotificationRouterConfig":{ + "queueDepth":65536, + "spinTime":0, + "parkTime":0, + "unit":"MILLISECONDS" + }, + "actorSystemConfig":{ + "akkaConfigPath":"singlenode/akka-default.conf", + "factoryAkkaConfigPath":"singlenode/factory-akka-default.conf" + }, + "schemaServiceConfig":{ + "topLevelModels":[ + { "nameSpace": "urn:TBD:params:xml:ns:yang:network:isis-topology", "name": "isis-topology", "revision": "2013-07-12" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:general-entity", "name": "general-entity", "revision": "2015-08-20" }, + { "nameSpace": "subscribe:to:notification", "name": "subscribe-to-notification", "revision": "2016-10-28" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin", "name": "cluster-admin", "revision": "2015-10-13" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-lisp-address-types", "name": "ietf-lisp-address-types", "revision": "2015-11-05" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:aaa", "name": "aaa", "revision": "2016-12-14" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:config:actor-system-provider:impl", "name": "actor-system-provider-impl", "revision": "2015-10-05" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ospf-topology", "name": "ospf-topology", "revision": "2013-07-12" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider", "name": "distributed-datastore-provider", "revision": "2014-06-12" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-yang-library", "name": "ietf-yang-library", "revision": "2016-06-21" }, + { "nameSpace": "urn:TBD:params:xml:ns:yang:network:isis-topology", "name": "isis-topology", "revision": "2013-10-21" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:inmemory-datastore-provider", "name": "opendaylight-inmemory-datastore-provider", "revision": "2014-06-17" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-restconf", "name": "ietf-restconf", "revision": "2013-10-19" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:iana-afn-safi", "name": "iana-afn-safi", "revision": "2013-07-04" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:config:concurrent-data-broker", "name": "odl-concurrent-data-broker-cfg", "revision": "2014-11-24" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:clustering:entity-owners", "name": "entity-owners", "revision": "2015-08-04" }, + { "nameSpace": "urn:sal:restconf:event:subscription", "name": "sal-remote-augment", "revision": "2014-07-08" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-access-control-list", "name": "ietf-access-control-list", "revision": "2016-02-18" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:pingpong", "name": "opendaylight-pingpong-broker", "revision": "2014-11-07" }, + { "nameSpace": "instance:identifier:patch:module", "name": "instance-identifier-patch-module", "revision": "2015-11-21" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-network-topology", "name": "ietf-network-topology", "revision": "2015-06-08" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-yang-types", "name": "ietf-yang-types", "revision": "2010-09-24" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity", "name": "odl-general-entity", "revision": "2015-09-30" }, + { "nameSpace": "urn:opendaylight:yang:extension:yang-ext", "name": "yang-ext", "revision": "2013-07-09" }, + { "nameSpace": "urn:opendaylight:l2:types", "name": "opendaylight-l2-types", "revision": "2013-08-27" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:md:sal:config:impl:cluster-singleton-service", "name": "cluster-singleton-service-impl", "revision": "2016-07-18" }, + { "nameSpace": "urn:TBD:params:xml:ns:yang:ospf-topology", "name": "ospf-topology", "revision": "2013-10-21" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring", "name": "ietf-restconf-monitoring", "revision": "2017-01-26" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:clustering:prefix-shard-configuration", "name": "prefix-shard-configuration", "revision": "2017-01-10" }, + { "nameSpace": "urn:opendaylight:aaa:app:config", "name": "aaa-app-config", "revision": "2017-06-19" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-restconf", "name": "ietf-restconf", "revision": "2017-01-26" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:config:legacy-entity-ownership-service-provider", "name": "opendaylight-legacy-entity-ownership-service-provider", "revision": "2016-02-26" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:iana-if-type", "name": "iana-if-type", "revision": "2014-05-08" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl", "name": "opendaylight-sal-binding-broker-impl", "revision": "2013-10-28" }, + + { "nameSpace": "org:onap:ccsdk:sli:core:sliapi", "name": "SLI-API", "revision": "2016-11-10" }, + { "nameSpace": "org:onap:ccsdk:sli:northbound:lcm", "name": "LCM", "revision": "2018-03-29" }, + { "nameSpace": "org:onap:ccsdk:sli:northbound:datachange", "name": "DataChange", "revision": "2015-05-19" }, + { "nameSpace": "org:onap:ccsdk:sli:northbound:asdcapi:common", "name": "asdc-api-common", "revision": "2017-02-01" }, + { "nameSpace": "http://xmlns.onap.org/asdc/license-model/1.0", "name": "asdc-license-model", "revision": "2016-04-27" }, + { "nameSpace": "org:onap:ccsdk", "name": "ASDC-API", "revision": "2017-02-01" } + + ] + } + }, + "restconf":{ + "httpPort":8181, + "webSocketPort": 8185, + "restconfServletContextPath":"/restconf", + "jsonRestconfServiceType": "DRAFT_18", + "inetAddress": "0.0.0.0" + } +} diff --git a/lighty/ccsdk-lighty-module/pom.xml b/lighty/ccsdk-lighty-module/pom.xml new file mode 100755 index 00000000..063a17d0 --- /dev/null +++ b/lighty/ccsdk-lighty-module/pom.xml @@ -0,0 +1,97 @@ + + + 4.0.0 + + + org.onap.ccsdk.parent + odlparent-lite + 1.4.0-SNAPSHOT + + + + org.onap.ccsdk.distribution + ccsdk-lighty-module + 0.6.0-SNAPSHOT + jar + + + 2.26 + + + + + + org.onap.ccsdk.sli.core + ccsdk-lighty-dependency-versions + ${project.version} + pom + import + + + + + + + io.lighty.core + lighty-controller + + + io.lighty.modules + lighty-restconf-nb-community + + + org.onap.ccsdk.sli.core + ccsdk-core-lighty + ${project.version} + + + org.apache.karaf.jaas.modules + org.apache.karaf.jaas + + + + + org.onap.ccsdk.sli.adaptors + ccsdk-adaptors-lighty + ${project.version} + + + org.onap.ccsdk.sli.northbound + ccsdk-northbound-lighty + ${project.version} + + + org.onap.ccsdk.sli.plugins + ccsdk-plugins-lighty + ${project.version} + + + + org.onap.ccsdk.sli.core + sli-recording + ${project.version} + + + + org.opendaylight.aaa + aaa-encrypt-service + + + + org.apache.httpcomponents + httpclient + 4.5.2 + + + + org.glassfish.jersey.core + jersey-common + ${jersey.version} + + + org.glassfish.jersey.inject + jersey-hk2 + ${jersey.version} + + + diff --git a/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/AAAEncryptionServiceLightyImpl.java b/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/AAAEncryptionServiceLightyImpl.java new file mode 100644 index 00000000..2610544a --- /dev/null +++ b/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/AAAEncryptionServiceLightyImpl.java @@ -0,0 +1,116 @@ +/* + * ============LICENSE_START========================================== + * Copyright (c) 2019 PANTHEON.tech s.r.o. + * =================================================================== + * 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.ccsdk.distribution.lighty; + +import java.nio.charset.Charset; +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.xml.bind.DatatypeConverter; +import org.onap.ccsdk.sli.core.dblib.DBLIBResourceProvider; +import org.onap.ccsdk.sli.core.dblib.DBLIBResourceProviderLighty; +import org.opendaylight.aaa.encrypt.AAAEncryptionService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Custom implementation of the {@link AAAEncryptionService}. Original class {@link DBLIBResourceProvider} was accessing + * instance of this interface via OGSi (BundleContext) and java reflection. The implementation of + * the {@link AAAEncryptionService} has to be injected via constructor into the lighty.io version of the class with + * removed OSGi dependency {@link DBLIBResourceProviderLighty}. + */ +public class AAAEncryptionServiceLightyImpl implements AAAEncryptionService { + + private static final Logger LOG = LoggerFactory.getLogger(AAAEncryptionServiceLightyImpl.class); + + private final Cipher encryptCipher; + private final Cipher decryptCipher; + + public AAAEncryptionServiceLightyImpl(Cipher encryptCipher, Cipher decryptCipher) { + this.encryptCipher = encryptCipher; + this.decryptCipher = decryptCipher; + } + + @Override + public String encrypt(String data) { + if (data != null && data.length() != 0 ) { + try { + synchronized (encryptCipher) { + byte[] cryptobytes = encryptCipher.doFinal(data.getBytes(Charset.defaultCharset())); + String cryptostring = DatatypeConverter.printBase64Binary(cryptobytes); + return cryptostring; + } + } catch (IllegalBlockSizeException | BadPaddingException e) { + LOG.error("Failed to encrypt data.", e); + return data; + } + } else { + LOG.warn("data is empty or null."); + return data; + } + } + + @Override + public byte[] encrypt(byte[] data) { + if (data != null && data.length != 0) { + try { + synchronized (encryptCipher) { + return encryptCipher.doFinal(data); + } + } catch (IllegalBlockSizeException | BadPaddingException e) { + LOG.error("Failed to encrypt data.", e); + return data; + } + } else { + LOG.warn("data is empty or null."); + return data; + } + } + + @Override + public String decrypt(String encryptedData) { + if (encryptedData != null && encryptedData.length() != 0) { + try { + byte[] cryptobytes = DatatypeConverter.parseBase64Binary(encryptedData); + byte[] clearbytes = decryptCipher.doFinal(cryptobytes); + return new String(clearbytes, Charset.defaultCharset()); + } catch (IllegalBlockSizeException | BadPaddingException e) { + LOG.error("Failed to decrypt encoded data", e); + return encryptedData; + } + } else { + LOG.warn("encryptedData is empty or null."); + return encryptedData; + } + } + + @Override + public byte[] decrypt(byte[] encryptedData) { + if (encryptedData != null && encryptedData.length != 0) { + try { + return decryptCipher.doFinal(encryptedData); + } catch (IllegalBlockSizeException | BadPaddingException e) { + LOG.error("Failed to decrypt encoded data", e); + return encryptedData; + } + } else { + LOG.warn("encryptedData is empty or null."); + return encryptedData; + } + } + +} diff --git a/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyApplication.java b/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyApplication.java new file mode 100644 index 00000000..efecb3f1 --- /dev/null +++ b/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyApplication.java @@ -0,0 +1,170 @@ +/* + * ============LICENSE_START========================================== + * Copyright (c) 2019 PANTHEON.tech s.r.o. + * =================================================================== + * 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.ccsdk.distribution.lighty; + +import io.lighty.core.controller.api.AbstractLightyModule; +import io.lighty.core.controller.api.LightyController; +import io.lighty.core.controller.impl.LightyControllerBuilder; +import io.lighty.core.controller.impl.config.ConfigurationException; +import io.lighty.core.controller.impl.config.ControllerConfiguration; +import io.lighty.modules.northbound.restconf.community.impl.CommunityRestConf; +import io.lighty.modules.northbound.restconf.community.impl.CommunityRestConfBuilder; +import io.lighty.modules.northbound.restconf.community.impl.config.RestConfConfiguration; +import io.lighty.modules.northbound.restconf.community.impl.util.RestConfConfigUtils; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.KeySpec; +import java.util.Base64; +import javax.crypto.Cipher; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.SecretKeySpec; +import org.onap.ccsdk.sli.core.lighty.common.CcsdkLightyUtils; +import org.opendaylight.aaa.encrypt.AAAEncryptionService; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yang.gen.v1.config.aaa.authn.encrypt.service.config.rev160915.AaaEncryptServiceConfig; +import org.opendaylight.yang.gen.v1.config.aaa.authn.encrypt.service.config.rev160915.AaaEncryptServiceConfigBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The implementation of the {@link io.lighty.core.controller.api.LightyModule} that groups all necessary components + * needed to start the CCSDK lighty.io application. + */ +public class CcsdkLightyApplication extends AbstractLightyModule { + + private static final Logger LOG = LoggerFactory.getLogger(CcsdkLightyApplication.class); + + private ControllerConfiguration controllerConfiguration; + private RestConfConfiguration restConfConfiguration; + + private LightyController lightyController; + private CommunityRestConf communityRestConf; + private CcsdkLightyModule ccsdkLightyModule; + + public CcsdkLightyApplication(ControllerConfiguration controllerConfiguration, + RestConfConfiguration restConfConfiguration) { + this.controllerConfiguration = controllerConfiguration; + this.restConfConfiguration = restConfConfiguration; + } + + @Override + protected boolean initProcedure() { + // Start Lighty Controller with base OLD services + LightyControllerBuilder lightyControllerBuilder = new LightyControllerBuilder(); + try { + lightyController = lightyControllerBuilder.from(controllerConfiguration).build(); + } catch (ConfigurationException e) { + LOG.error("Exception thrown while starting Lighty controller!", e); + return false; + } + if (!CcsdkLightyUtils.startLightyModule(lightyController)) { + LOG.error("Unable to start Lighty controller!"); + return false; + } + + // Start RestConf + CommunityRestConfBuilder communityRestConfBuilder = new CommunityRestConfBuilder(); + communityRestConf = communityRestConfBuilder + .from(RestConfConfigUtils.getRestConfConfiguration(restConfConfiguration, + lightyController.getServices())) + .build(); + if (!CcsdkLightyUtils.startLightyModule(communityRestConf)) { + LOG.error("Unable to start RestConf!"); + return false; + } + + // Start Lighty CCSDK + AAAEncryptionService aaaEncryptionService = null; + try { + aaaEncryptionService = createAAAEncryptionService(getDefaultAaaEncryptServiceConfig()); + } catch (ConfigurationException e) { + LOG.error("Exception thrown while initializing {}!", AAAEncryptionService.class, e); + } + DataBroker dataBroker = lightyController.getServices().getControllerBindingDataBroker(); + NotificationPublishService notificationPublishService = lightyController.getServices() + .getControllerBindingNotificationPublishService(); + RpcProviderRegistry rpcProviderRegistry = lightyController.getServices().getControllerRpcProviderRegistry(); + ccsdkLightyModule = new CcsdkLightyModule(dataBroker, notificationPublishService, + rpcProviderRegistry, aaaEncryptionService); + if (!CcsdkLightyUtils.startLightyModule(ccsdkLightyModule)) { + LOG.error("Unable to start CCSDK Lighty module!"); + return false; + } + + return true; + } + + @Override + protected boolean stopProcedure() { + boolean stopSuccessful = true; + + if (!CcsdkLightyUtils.stopLightyModule(ccsdkLightyModule)) { + stopSuccessful = false; + } + + if (!CcsdkLightyUtils.stopLightyModule(communityRestConf)) { + stopSuccessful = false; + } + + if (!CcsdkLightyUtils.stopLightyModule(lightyController)) { + stopSuccessful = false; + } + + return stopSuccessful; + } + + private AAAEncryptionService createAAAEncryptionService(AaaEncryptServiceConfig encrySrvConfig) + throws ConfigurationException { + final byte[] encryptionKeySalt = Base64.getDecoder().decode(encrySrvConfig.getEncryptSalt()); + try { + final SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(encrySrvConfig.getEncryptMethod()); + final KeySpec keySpec = new PBEKeySpec(encrySrvConfig.getEncryptKey().toCharArray(), encryptionKeySalt, + encrySrvConfig.getEncryptIterationCount(), encrySrvConfig.getEncryptKeyLength()); + SecretKey key = new SecretKeySpec(keyFactory.generateSecret(keySpec).getEncoded(), + encrySrvConfig.getEncryptType()); + IvParameterSpec ivParameterSpec = new IvParameterSpec(encryptionKeySalt); + + Cipher encryptCipher = Cipher.getInstance(encrySrvConfig.getCipherTransforms()); + encryptCipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec); + + Cipher decryptCipher = Cipher.getInstance(encrySrvConfig.getCipherTransforms()); + decryptCipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec); + + return new AAAEncryptionServiceLightyImpl(encryptCipher, decryptCipher); + + } catch (NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException + | InvalidAlgorithmParameterException | InvalidKeyException e) { + throw new ConfigurationException(e); + } + } + + private AaaEncryptServiceConfig getDefaultAaaEncryptServiceConfig() { + return new AaaEncryptServiceConfigBuilder().setEncryptKey("V1S1ED4OMeEh") + .setPasswordLength(12).setEncryptSalt("TdtWeHbch/7xP52/rp3Usw==") + .setEncryptMethod("PBKDF2WithHmacSHA1").setEncryptType("AES") + .setEncryptIterationCount(32768).setEncryptKeyLength(128) + .setCipherTransforms("AES/CBC/PKCS5Padding").build(); + } +} diff --git a/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyModule.java b/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyModule.java new file mode 100644 index 00000000..061afc8b --- /dev/null +++ b/lighty/ccsdk-lighty-module/src/main/java/org/onap/ccsdk/distribution/lighty/CcsdkLightyModule.java @@ -0,0 +1,206 @@ +/* + * ============LICENSE_START========================================== + * Copyright (c) 2019 PANTHEON.tech s.r.o. + * =================================================================== + * 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.ccsdk.distribution.lighty; + +import com.google.common.collect.ImmutableSet; +import io.lighty.core.controller.api.AbstractLightyModule; +import java.util.Set; +import org.onap.ccsdk.sli.adaptors.lighty.CcsdkAdaptorsLightyModule; +import org.onap.ccsdk.sli.core.dblib.lighty.DblibModule; +import org.onap.ccsdk.sli.core.lighty.common.CcsdkLightyUtils; +import org.onap.ccsdk.sli.core.sli.lighty.SliModule; +import org.onap.ccsdk.sli.core.sli.recording.Slf4jRecorder; +import org.onap.ccsdk.sli.core.sliapi.lighty.SliApiModule; +import org.onap.ccsdk.sli.core.slipluginutils.lighty.SliPluginUtilsModule; +import org.onap.ccsdk.sli.northbound.lighty.CcsdkNorhboundLightyModule; +import org.onap.ccsdk.sli.plugins.lighty.CcsdkPluginsLightyModule; +import org.opendaylight.aaa.encrypt.AAAEncryptionService; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yangtools.yang.binding.YangModuleInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The implementation of the {@link io.lighty.core.controller.api.LightyModule} that groups all other LightyModules + * from the CCSDK project so they can be all treated as one component (for example started/stopped at once). + * For more information about the lighty.io visit the website https://lighty.io. + */ +public class CcsdkLightyModule extends AbstractLightyModule { + + private static final Logger LOG = LoggerFactory.getLogger(CcsdkLightyModule.class); + + public static final Set YANG_MODELS = ImmutableSet.of( + org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.$YangModuleInfoImpl.getInstance(), + org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.northbound.lcm.rev180329.$YangModuleInfoImpl.getInstance(), + org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.northbound.datachange.rev150519.$YangModuleInfoImpl.getInstance(), + org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.northbound.asdcapi.common.rev170201.$YangModuleInfoImpl.getInstance(), + org.opendaylight.yang.gen.v1.http.xmlns.onap.org.asdc.license.model._1._0.rev160427.$YangModuleInfoImpl.getInstance(), + org.opendaylight.yang.gen.v1.org.onap.ccsdk.rev170201.$YangModuleInfoImpl.getInstance() + ); + + private final DataBroker dataBroker; + private final NotificationPublishService notificationPublishService; + private final RpcProviderRegistry rpcProviderRegistry; + private final AAAEncryptionService aaaEncryptionService; + + private CcsdkAdaptorsLightyModule ccsdkAdaptorsLightyModule; + private CcsdkNorhboundLightyModule ccsdkNorhboundLightyModule; + private CcsdkPluginsLightyModule ccsdkPluginsLightyModule; + private DblibModule dblibModule; + private SliModule sliModule; + private SliApiModule sliApiModule; + private SliPluginUtilsModule sliPluginUtilsModule; + + public CcsdkLightyModule(DataBroker dataBroker, NotificationPublishService notificationPublishService, + RpcProviderRegistry rpcProviderRegistry, AAAEncryptionService aaaEncryptionService) { + this.dataBroker = dataBroker; + this.notificationPublishService = notificationPublishService; + this.rpcProviderRegistry = rpcProviderRegistry; + this.aaaEncryptionService = aaaEncryptionService; + } + + protected boolean initProcedure() { + // FIXME modules from CcsdkCoreLightyModule need to be started separately (not through CcsdkCoreLightyModule + // itself) because SliApiModule is dependent on the adaptors + try { + LOG.debug("Initializing CCSDK Lighty module..."); + + this.dblibModule = new DblibModule(aaaEncryptionService); + if (!CcsdkLightyUtils.startLightyModule(dblibModule)) { + LOG.error("Unable to start DblibModule in CCSDK Core Lighty module!"); + return false; + } + + this.ccsdkAdaptorsLightyModule = new CcsdkAdaptorsLightyModule(dblibModule.getDbLibService()); + if (!CcsdkLightyUtils.startLightyModule(ccsdkAdaptorsLightyModule)) { + LOG.error("Unable to start CcsdkAdaptorsLightyModule in CCSDK Lighty module!"); + return false; + } + + this.sliModule = new SliModule(dblibModule.getDbLibService(), + ccsdkAdaptorsLightyModule.getAaaServiceModule().getAAIService(), new Slf4jRecorder(), + ccsdkAdaptorsLightyModule.getAaaServiceModule().getAAIService(), null); + if (!CcsdkLightyUtils.startLightyModule(sliModule)) { + LOG.error("Unable to start SliModule in CCSDK Core Lighty module!"); + return false; + } + + this.sliApiModule = new SliApiModule(dataBroker, notificationPublishService, rpcProviderRegistry, sliModule.getSvcLogicServiceImpl()); + if (!CcsdkLightyUtils.startLightyModule(sliApiModule)) { + LOG.error("Unable to start SliApiModule in CCSDK Core Lighty module!"); + return false; + } + + this.sliPluginUtilsModule = new SliPluginUtilsModule(); + if (!CcsdkLightyUtils.startLightyModule(sliPluginUtilsModule)) { + LOG.error("Unable to start SliPluginUtilsModule in CCSDK Core Lighty module!"); + return false; + } + + this.ccsdkPluginsLightyModule = new CcsdkPluginsLightyModule(); + if (!CcsdkLightyUtils.startLightyModule(ccsdkPluginsLightyModule)) { + LOG.error("Unable to start CcsdkPluginsLightyModule in CCSDK Lighty module!"); + return false; + } + + this.ccsdkNorhboundLightyModule = + new CcsdkNorhboundLightyModule(sliModule.getSvcLogicServiceImpl(), dataBroker, + notificationPublishService, rpcProviderRegistry); + if (!CcsdkLightyUtils.startLightyModule(ccsdkNorhboundLightyModule)) { + LOG.error("Unable to start CcsdkNorhboundLightyModule in CCSDK Lighty module!"); + return false; + } + + LOG.debug("CCSDK Lighty module was initialized successfully"); + return true; + } catch (Exception e) { + LOG.error("Exception caught!", e); + throw e; + } + } + + protected boolean stopProcedure() { + LOG.debug("Stopping CCSDK Lighty module..."); + + boolean stopSuccessful = true; + + if (!CcsdkLightyUtils.stopLightyModule(ccsdkPluginsLightyModule)) { + stopSuccessful = false; + } + + if (!CcsdkLightyUtils.stopLightyModule(ccsdkNorhboundLightyModule)) { + stopSuccessful = false; + } + + if (!CcsdkLightyUtils.stopLightyModule(ccsdkAdaptorsLightyModule)) { + stopSuccessful = false; + } + + if (!CcsdkLightyUtils.stopLightyModule(sliPluginUtilsModule)) { + stopSuccessful = false; + } + + if (!CcsdkLightyUtils.stopLightyModule(sliApiModule)) { + stopSuccessful = false; + } + + if (!CcsdkLightyUtils.stopLightyModule(sliModule)) { + stopSuccessful = false; + } + + if (!CcsdkLightyUtils.stopLightyModule(dblibModule)) { + stopSuccessful = false; + } + + if (stopSuccessful) { + LOG.debug("CCSDK Lighty module was stopped successfully"); + } else { + LOG.error("CCSDK Lighty module was not stopped successfully!"); + } + return stopSuccessful; + } + + public CcsdkAdaptorsLightyModule getCcsdkAdaptorsLightyModule() { + return ccsdkAdaptorsLightyModule; + } + + public CcsdkNorhboundLightyModule getCcsdkNorhboundLightyModule() { + return ccsdkNorhboundLightyModule; + } + + public CcsdkPluginsLightyModule getCcsdkPluginsLightyModule() { + return ccsdkPluginsLightyModule; + } + + public DblibModule getDblibModule() { + return dblibModule; + } + + public SliModule getSliModule() { + return sliModule; + } + + public SliApiModule getSliApiModule() { + return sliApiModule; + } + + public SliPluginUtilsModule getSliPluginUtilsModule() { + return sliPluginUtilsModule; + } +} diff --git a/lighty/docs/README.md b/lighty/docs/README.md new file mode 100644 index 00000000..7212084d --- /dev/null +++ b/lighty/docs/README.md @@ -0,0 +1,122 @@ +## Integration of the lighty.io with the CCSDK + +These artifacts contain the examples of how can be the CCSDK integrated with the lighty.io. This +integration removes the dependency on the OSGi framework (Karaf) and the Blueprint +dependency injection - instead it uses only the plain java like _main_ method to start +the application and plain java constructors as DI (but it is ready to be integrated with +other frameworks). + +The CCSDK lighty.io modules can be all started at once (as in this example) or only the +selected group of them - in case there is no need to run them all. + +For more information about the lighty.io visit the official web-page +[https://lighty.io](https://lighty.io) or the +[GitHub repository](https://github.com/PantheonTechnologies/lighty-core). + + +### Artifact `ccsdk-lighty-module` + +The artifact `ccsdk-lighty-module` contains implementation of the lighty.io module that groups +all the other lighty.io modules from the other repositories (core, adaptors, plugins, +northbound). These grouped modules can be started all at once using just a few lines of code. + +In addition it contains implementation of the lighty.io module that +groups the lighty.io controller (base services from the ODL), the RESTCONF lighty.io module +(the RESTCONF from the ODL integrated with the lighty.io) and the CCSDK lighty.io module + +### Artifact `ccsdk-lighty-distribution` + +The CCSDK lighty.io application can be started via _main_ method from the _Main_ class. +This artifact generates the _.zip_ file containing the _.jar_ file and all other necessary +libraries. + +The path to the lighty.io configuration file can be passed to the _main_ method (or to +the _.jar_ file) as an argument. This configuration file contains configuration for the +lighty.io controller and the RESTCONF (for example the port or the IP address where should +the RESTCONF listen or the yang modules that should be imported into the application). +The example of the configuration file can be found in the _resources_ directory. +If path to the configuration file will not be passed through the _main_ method then +the default configuration will be used. + + +### Artifact `distribution-lighty-ubuntu-docker` + +The artifact `distribution-lighty-ubuntu-docker` contains the _Dockerfile_ and the _docker-compose.yml_ +files for the CCSDK lighty.io. _Dockerfile_ is very similar to the original file from +the `distribution-odlsli-ubuntu` artifact and the _docker-compose.yml_ to the original file from the +`src/main/yaml` directory in the root of this repository. + +Necessary configuration files and the _.zip_ file containing the CCSDK lighty.io application +are copied by the maven plugins into the respective directories during the the maven build. + +The _Dockerfile_ unpacks the _.zip_ distribution generated by the `ccsdk-lighty-distribution` +artifact and runs the _startODL.sh_ script that starts the CCSDK lighty.io _.jar_ file using +the `src/main/properties/lightyCcsdkConfig.json` configuration file. + +The _docker-compose.yml_ file contains three images - database, CCSDK lighty.io application +and the _DG builder_. + +### How to run + +In order to run the CCSDK lighty.io application build the `distribution-lighty` repository +using the maven with the _docker_ profile enabled (command: `mvn clean install -P docker`). +Then run the _docker-compose_ from the `src/main/docker` directory +(command: `docker-compose -f docker-compose.yml up`). + +After a few seconds CCSDK lighty.io application should be up and running together with the +database and the _DG builder_. + +_DG builder_ web UI can be accessed through the `http://localhost:3000` address and RESTCONF at +the `http://localhost:8383/restconf` address. + + +#### DG Builder and the CCSDK lighty.io application example + +In the browser open the `localhost:3000` URL. Login with the default username `dguser` and +the password `test123`. In the top right corner click on the menu -> import -> Clipboard. +Copy and paste the content of the `hello_world.json` file (from the same directory where is +this readme file located) to the text box. Then click on the OK button and place the graph +to the sheet. + +To upload and activate the imported graph click on the small empty square on the left side +of the `DGSTART` node and then click on the `Upload XML` button. Then click on the `ViewDG List` +button and on the `Activate` link in the row where imported graph is. + +After the graph is activated it can be called using the POST REST request on the address: + +`http:///restconf/operations/SLI-API:execute-graph` + +With the body like: + +``` +{ + "input": { + "module-name": "", + "rpc-name": "", + "mode": "sync", + "sli-parameter": [ + ] + } +} +``` + +So in order to call imported _hello world_ graph send the POST request to the address: + +`http://localhost:8383/restconf/operations/SLI-API:execute-graph` + +with the body: + +``` +{ + "input": { + "module-name": "Test", + "rpc-name": "helloWorld", + "mode": "sync", + "sli-parameter": [ + ] + } +} +``` + +Now the _hello world_ message should be displayed in the console where the CCSDK lighty.io +application is running. diff --git a/lighty/docs/hello_world.json b/lighty/docs/hello_world.json new file mode 100644 index 00000000..c461d8f4 --- /dev/null +++ b/lighty/docs/hello_world.json @@ -0,0 +1,66 @@ +[ + { + "id": "3b052d99.a24df2", + "type": "record", + "name": "record", + "xml": "\n\n\n", + "comments": "", + "outputs": 1, + "x": 779, + "y": 367, + "z": "fca901a.0d76d8", + "wires": [ + [ + + ] + ] + }, + { + "id": "1b3e7bbc.925914", + "type": "dgstart", + "name": "DGSTART", + "outputs": 1, + "x": 240, + "y": 168, + "z": "fca901a.0d76d8", + "wires": [ + [ + "9109b5dc.513d48" + ] + ] + }, + { + "id": "9109b5dc.513d48", + "type": "service-logic", + "name": "Test 1.0", + "module": "Test", + "version": "1.0", + "comments": "", + "xml": "", + "outputs": 1, + "x": 425, + "y": 232, + "z": "fca901a.0d76d8", + "wires": [ + [ + "54587071.4a0dc" + ] + ] + }, + { + "id": "54587071.4a0dc", + "type": "method", + "name": "method", + "xml": "\n", + "comments": "", + "outputs": 1, + "x": 610, + "y": 302, + "z": "fca901a.0d76d8", + "wires": [ + [ + "3b052d99.a24df2" + ] + ] + } +] diff --git a/lighty/lighty-ubuntu-docker/pom.xml b/lighty/lighty-ubuntu-docker/pom.xml new file mode 100644 index 00000000..53616037 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/pom.xml @@ -0,0 +1,343 @@ + + + 4.0.0 + + + org.onap.ccsdk.distribution + distribution-lighty + 0.6.0-SNAPSHOT + + + distribution-lighty-ubuntu-docker + pom + + ccsdk-distribution :: lighty :: ${project.artifactId} + Creates Lighty container + + ONAP + + + + onap/ccsdk-lighty-ubuntu-image + ccsdk-lighty-distribution-${project.version} + ${lighty.app.name}-bin.zip + ${lighty.app.name}.jar + ${project.version} + ${maven.build.timestamp} + ${https_proxy} + deploy + + + + + + org.onap.ccsdk.sli.core + ccsdk-lighty-dependency-versions + ${project.version} + pom + import + + + + + + + + + + org.codehaus.groovy.maven + gmaven-plugin + + + validate + + execute + + + ${basedir}/../../src/main/scripts/TagVersion.groovy + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 3.0.2 + + + unpack dgs + generate-sources + + unpack + + + ${basedir}/target/docker-stage/opt/onap/ccsdk + + + ${project.groupId} + platform-logic-installer + ${project.version} + zip + + + + + + + + + maven-resources-plugin + 2.6 + + + copy-dockerfile + + copy-resources + + validate + + ${basedir}/target/docker-stage + + + src/main/docker + + Dockerfile + + true + + + + + + + copy-ccsdk-lighty-zip + + copy-resources + + validate + + ${basedir}/target/docker-stage + + + ${basedir}/../ccsdk-lighty-distribution/target + + ${lighty.app.zip} + + false + + + + + + + copy-scripts + + copy-resources + + validate + + ${basedir}/target/docker-stage/opt/onap/ccsdk/bin + + + ./src/main/scripts + + *.sh + + false + + + + + + + copy-odl-resources + + copy-resources + + validate + + ${basedir}/target/docker-stage + + + ./src/main/resources + + idmlight.db.mv.db + org.ops4j.pax.logging.cfg + install_ccsdk.yml + ansible-sources.list + + false + + + + + + copy-config + + copy-resources + + validate + + ${basedir}/target/docker-stage + + + ./src/main/resources + + org.ops4j.pax.logging.cfg + + false + + + + + + copy-data + + copy-resources + + validate + + ${basedir}/target/docker-stage/opt/onap/ccsdk/data + + + ./src/main/resources + + *.dump + + false + + + + + + copy-properties + + copy-resources + + validate + + ${basedir}/target/docker-stage/opt/onap/ccsdk/data/properties + + + ./src/main/properties + + *.properties + *.json + + false + + + + + + copy-keystores + + copy-resources + + validate + + ${basedir}/target/docker-stage/opt/onap/ccsdk/data/stores + + + ./src/main/stores + + *.jks + + false + + + + + + + + + org.codehaus.mojo + exec-maven-plugin + 1.5.0 + + + + change shell permissions + process-sources + + exec + + + /usr/bin/find + + ${basedir}/target/docker-stage/opt/onap/ccsdk + -name + *.sh + -exec + chmod + +x + {} + ; + + + + + + + + + + + + docker + + + + io.fabric8 + docker-maven-plugin + 0.28.0 + false + + + + ${image.name} + + try + ${basedir}/target/docker-stage + Dockerfile + + ${project.docker.latestminortag.version} + ${project.docker.latestfulltag.version} + ${project.docker.latesttagtimestamp.version} + + + + + + + + generate-images + package + + build + + + + + push-images + ${docker.push.phase} + + build + push + + + + + + + + + + + diff --git a/lighty/lighty-ubuntu-docker/src/main/docker/Dockerfile b/lighty/lighty-ubuntu-docker/src/main/docker/Dockerfile new file mode 100644 index 00000000..fbf9356f --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/docker/Dockerfile @@ -0,0 +1,16 @@ +# Base ubuntu with added packages needed for open ecomp +FROM onap/ccsdk-ubuntu-image:${project.docker.latestfulltag.version} +MAINTAINER CCSDK Team (onap-ccsdk@lists.onap.org) +ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64 +ENV ODL_HOME /opt/opendaylight/current + +# copy the opendaylight tar and expand +COPY ${lighty.app.zip} /tmp/lighty/ +RUN mkdir -p /opt/lighty \ + && unzip /tmp/lighty/${lighty.app.zip} -d /opt/lighty \ + && rm -rf /tmp/lighty + +COPY opt /opt + +ENTRYPOINT /opt/onap/ccsdk/bin/startODL.sh +EXPOSE 8181 diff --git a/lighty/lighty-ubuntu-docker/src/main/docker/docker-compose.yml b/lighty/lighty-ubuntu-docker/src/main/docker/docker-compose.yml new file mode 100644 index 00000000..14c3dc32 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/docker/docker-compose.yml @@ -0,0 +1,64 @@ +version: '2' + +services: + db: + image: mysql/mysql-server:5.6 + container_name: ccsdk_db_container + ports: + - "3306" + environment: + - MYSQL_ROOT_PASSWORD=openECOMP1.0 + - MYSQL_ROOT_HOST=% + logging: + driver: "json-file" + options: + max-size: "30m" + max-file: "5" + + + odlsli: + image: onap/ccsdk-lighty-ubuntu-image + depends_on : + - db + container_name: ccsdk_lighty_container + entrypoint: ["/opt/onap/ccsdk/bin/startODL.sh"] + ports: + - "8383:8181" + links: + - db:dbhost + - db:sdnctldb01 + - db:sdnctldb02 + environment: + - MYSQL_ROOT_PASSWORD=openECOMP1.0 + - SDNC_CONFIG_DIR=/opt/onap/ccsdk/data/properties + logging: + driver: "json-file" + options: + max-size: "30m" + max-file: "5" + + dgbuilder: + image: nexus3.onap.org:10001/onap/ccsdk-dgbuilder-image + depends_on: + - db + container_name: ccsdk_dgbuilder_container + entrypoint: + - "/bin/bash" + - "-c" + - "cd /opt/onap/ccsdk/dgbuilder/ && ./start.sh sdnc1.0 && wait" + ports: + - "3000:3100" + links: + - db:dbhost + - db:sdnctldb01 + - db:sdnctldb02 + - odlsli:sdnhost + environment: + - MYSQL_ROOT_PASSWORD=openECOMP1.0 + - SDNC_CONFIG_DIR=/opt/onap/ccsdk/data/properties + logging: + driver: "json-file" + options: + max-size: "30m" + max-file: "5" + diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/aaiclient.properties b/lighty/lighty-ubuntu-docker/src/main/properties/aaiclient.properties new file mode 100755 index 00000000..4f27206f --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/aaiclient.properties @@ -0,0 +1,82 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# 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========================================================= +### + +# +# Configuration file for A&AI Client +# + +# +# Certificate keystore and truststore +# +org.onap.ccsdk.sli.adaptors.aai.ssl.trust=/opt/onap/ccsdk/data/stores/truststore.onap.client.jks +org.onap.ccsdk.sli.adaptors.aai.ssl.trust.psswd=adminadmin +org.onap.ccsdk.sli.adaptors.aai.host.certificate.ignore=true + +org.onap.ccsdk.sli.adaptors.aai.client.name=SDNC +org.onap.ccsdk.sli.adaptors.aai.client.psswd=SDNC + +org.onap.ccsdk.sli.adaptors.aai.application=openECOMP +# +# Configuration file for A&AI Client +# +org.onap.ccsdk.sli.adaptors.aai.uri=https://aai.api.simpledemo.onap.org:8443 +connection.timeout=60000 +read.timeout=60000 + +# query +org.onap.ccsdk.sli.adaptors.aai.path.query=/aai/v14/search/sdn-zone-query +org.onap.ccsdk.sli.adaptors.aai.query.nodes=/aai/v14/search/nodes-query?search-node-type={node-type}&filter={entity-identifier}:EQUALS:{entity-name} +org.onap.ccsdk.sli.adaptors.aai.query.generic=/aai/v14/search/generic-query?key={identifier}:{value}&start-node-type={start-node-type}&include=complex&depth=3 + +# named query +org.onap.ccsdk.sli.adaptors.aai.query.named=/aai/search/named-query + +#update +org.onap.ccsdk.sli.adaptors.aai.update=/aai/v14/actions/update + +# UBB Notify +org.onap.ccsdk.sli.adaptors.aai.path.notify=/aai/v14/actions/notify +org.onap.ccsdk.sli.adaptors.aai.notify.selflink.fqdn=<%= @ubbUri %>/restconf/config/L3SDN-API:services/layer3-service-list/{service-instance-id} +org.onap.ccsdk.sli.adaptors.aai.notify.selflink.avpn=<%= @ubbUri %>/restconf/config/L3AVPN-EVC-API:services/service-list/{service-instance-id}/service-data/avpn-logicalchannel-information + +# P-Interfaces +org.onap.ccsdk.sli.adaptors.aai.path.pserver.pinterfaces=/aai/v14/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces +org.onap.ccsdk.sli.adaptors.aai.path.pserver.pinterface=/aai/v14/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces/p-interface/{interface-name} + +# VNF IMAGES +org.onap.ccsdk.sli.adaptors.aai.path.vnf.images=/aai/v14/service-design-and-creation/vnf-images +org.onap.ccsdk.sli.adaptors.aai.path.vnf.image=/aai/v14/service-design-and-creation/vnf-images/vnf-image/{att-uuid} +org.onap.ccsdk.sli.adaptors.aai.path.vnf.image.query=/aai/v14/service-design-and-creation/vnf-images/vnf-image?application={application_model}&application-vendor={application_vendor} + +# service instance +org.onap.ccsdk.sli.adaptors.aai.path.svcinst.query=/aai/v14/search/generic-query?key=service-instance.service-instance-id:{svc-instance-id}&start-node-type=service-instance&include=service-instance +org.onap.ccsdk.sli.adaptors.aai.path.service.instance=/aai/v14/business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id} + +# VNF IMAGES QUERY +org.onap.ccsdk.sli.adaptors.aai.path.vnf.image.query=/aai/v14/service-design-and-creation/vnf-images/vnf-image?application={application_model}&application-vendor={application_vendor} + +# +# Formatting +# +org.onap.ccsdk.sli.adaptors.aai.param.format=filter=%s:%s +org.onap.ccsdk.sli.adaptors.aai.param.vnf_type=vnf-type +org.onap.ccsdk.sli.adaptors.aai.param.physical.location.id=physical-location-id +org.onap.ccsdk.sli.adaptors.aai.param.service.type=service-type diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/admportal.json b/lighty/lighty-ubuntu-docker/src/main/properties/admportal.json new file mode 100755 index 00000000..8d567d0c --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/admportal.json @@ -0,0 +1,68 @@ +{ + "MainMenu": "gamma", + "dbConnLimit": "100", + "home": "/opt/admportal", + "sslEnabled": "false", + "nonSslPort": "8843", + "ConexusNetworkPort": "8443", + "AppNetworkPort": "8543", + "clusterPort": "8443", + "serviceHomingServiceType": "SDN-ETHERNET-INTERNET", + "passwordKey": "QtfJMKggVk", + "preloadImportDirectory": "C:/data/csv", + "clusterPrefixURL": "/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-", + "clusterMidURL": "-shard-", + "clusterSuffixURL": "-config,type=DistributedConfigDatastore", + "shards": [ + "default", + "inventory", + "topology" + ], + "dbFabric": "false", + "ip-addresses": { + "lo": "127.0.0.1", + "eth0": "127.0.0.1", + "docker0": "172.17.0.1", + "virbr0": "192.168.122.1" + }, + "svclogicPropertiesDb01": "/opt/onap/sdnc/data/properties/svclogic.properties.sdnctldb01", + "databases": [ + "dbhost|sdnctldb01" + ], + "dbFabricServer": "localhost", + "dbFabricPort": "32275", + "dbFabricGroupId": "hagroup1", + "dbFabricUser": "admin", + "dbFabricPassword": "admin", + "dbFabricDB": "mysql", + "dbUser": "sdnctl", + "dbPassword": "gamma", + "dbName": "sdnctl", + "odlProtocol": "http", + "odlHost": "sdnhost", + "odlConexusHost": "sdnhost", + "odlPort": "8181", + "odlConexusPort": "8181", + "odlUser": "admin", + "odlPasswd": "admin", + "ConexusNetwork_sslCert": "", + "ConexusNetwork_sslKey": "", + "AppNetwork_sslCert": "", + "AppNetwork_sslKey": "", + "hostnameList": [ + { + "hname": "localhost" + } + ], + "shard_list": [ + { + "shard_name": "default" + }, + { + "shard_name": "inventory" + }, + { + "shard_name": "topology" + } + ] +} diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/admportal.log4js.json b/lighty/lighty-ubuntu-docker/src/main/properties/admportal.log4js.json new file mode 100755 index 00000000..0f41e564 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/admportal.log4js.json @@ -0,0 +1,169 @@ +{ + "appenders": [ + { + "category": "accesslog", + "type" : "file", + "absolute": true, + "filename": "/opt/admportal/logs/accesslog.log" + }, + { + "category" : "usertrace", + "type" : "file", + "absolute" : true, + "filename" : "/opt/admportal/logs/usertrace.log" + }, + { + "category": "tracelog", + "type" : "dateFile", + "absolute": true, + "filename": "/opt/admportal/logs/tracelog.log", + "pattern": "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "tunnel", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/tunnel.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "preload", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/preload.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "eipam", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/eipam.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "instar", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/instar.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "app", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/app.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "csp", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/csp.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "db", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/db.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "admin", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/admin.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "resalloc", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/resalloc.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "logs", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/applogs.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "sla", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/sla.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "gamma", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/gamma.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "odl", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/odl.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "mobility", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/mobility.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "ucpe", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/ucpe.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + }, + { + "category" : "user", + "type" : "dateFile", + "absolute" : true, + "filename" : "/opt/admportal/logs/user.log", + "pattern" : "-yyyy-MM-dd", + "alwaysIncludePattern": true, + "backups" : 14 + } + ] +} diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/dblib.properties b/lighty/lighty-ubuntu-docker/src/main/properties/dblib.properties new file mode 100644 index 00000000..9506ac8d --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/dblib.properties @@ -0,0 +1,38 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# 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========================================================= +### + +# dblib.properrties +org.onap.ccsdk.sli.dbtype=jdbc + +org.onap.ccsdk.sli.jdbc.hosts=sdnctldb01 +org.onap.ccsdk.sli.jdbc.url=jdbc:mysql://dbhost:3306/sdnctl +org.onap.ccsdk.sli.jdbc.driver=org.mariadb.jdbc.Driver +org.onap.ccsdk.sli.jdbc.database=sdnctl +org.onap.ccsdk.sli.jdbc.user=sdnctl +org.onap.ccsdk.sli.jdbc.password=gamma +org.onap.ccsdk.sli.jdbc.connection.name=sdnctldb01 +org.onap.ccsdk.sli.jdbc.connection.timeout=50 +org.onap.ccsdk.sli.jdbc.request.timeout=100 +org.onap.ccsdk.sli.jdbc.limit.init=10 +org.onap.ccsdk.sli.jdbc.limit.min=10 +org.onap.ccsdk.sli.jdbc.limit.max=20 +org.onap.dblib.connection.recovery=false + diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/grpc.properties b/lighty/lighty-ubuntu-docker/src/main/properties/grpc.properties new file mode 100644 index 00000000..797c67e2 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/grpc.properties @@ -0,0 +1,18 @@ +# +# Copyright (C) 2019 Bell Canada. +# +# 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. +# +org.onap.ccsdk.sli.adaptors.grpc.blueprint.processor.url=cds-blueprints-processor-grpc +org.onap.ccsdk.sli.adaptors.grpc.blueprint.processor.port=9111 +org.onap.ccsdk.sli.adaptors.grpc.blueprint.processor.auth=Basic Y2NzZGthcHBzOmNjc2RrYXBwcw== diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/lightyCcsdkConfig.json b/lighty/lighty-ubuntu-docker/src/main/properties/lightyCcsdkConfig.json new file mode 100644 index 00000000..1abed344 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/lightyCcsdkConfig.json @@ -0,0 +1,74 @@ +{ + "controller":{ + "restoreDirectoryPath":"./clustered-datastore-restore", + "maxDataBrokerFutureCallbackQueueSize":1000, + "maxDataBrokerFutureCallbackPoolSize":10, + "metricCaptureEnabled":false, + "mailboxCapacity":1000, + "moduleShardsConfig": "configuration/initial/module-shards.conf", + "modulesConfig": "configuration/initial/modules.conf", + "domNotificationRouterConfig":{ + "queueDepth":65536, + "spinTime":0, + "parkTime":0, + "unit":"MILLISECONDS" + }, + "actorSystemConfig":{ + "akkaConfigPath":"singlenode/akka-default.conf", + "factoryAkkaConfigPath":"singlenode/factory-akka-default.conf" + }, + "schemaServiceConfig":{ + "topLevelModels":[ + { "nameSpace": "urn:TBD:params:xml:ns:yang:network:isis-topology", "name": "isis-topology", "revision": "2013-07-12" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:general-entity", "name": "general-entity", "revision": "2015-08-20" }, + { "nameSpace": "subscribe:to:notification", "name": "subscribe-to-notification", "revision": "2016-10-28" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin", "name": "cluster-admin", "revision": "2015-10-13" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-lisp-address-types", "name": "ietf-lisp-address-types", "revision": "2015-11-05" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:aaa", "name": "aaa", "revision": "2016-12-14" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:config:actor-system-provider:impl", "name": "actor-system-provider-impl", "revision": "2015-10-05" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ospf-topology", "name": "ospf-topology", "revision": "2013-07-12" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider", "name": "distributed-datastore-provider", "revision": "2014-06-12" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-yang-library", "name": "ietf-yang-library", "revision": "2016-06-21" }, + { "nameSpace": "urn:TBD:params:xml:ns:yang:network:isis-topology", "name": "isis-topology", "revision": "2013-10-21" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:inmemory-datastore-provider", "name": "opendaylight-inmemory-datastore-provider", "revision": "2014-06-17" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-restconf", "name": "ietf-restconf", "revision": "2013-10-19" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:iana-afn-safi", "name": "iana-afn-safi", "revision": "2013-07-04" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:config:concurrent-data-broker", "name": "odl-concurrent-data-broker-cfg", "revision": "2014-11-24" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:clustering:entity-owners", "name": "entity-owners", "revision": "2015-08-04" }, + { "nameSpace": "urn:sal:restconf:event:subscription", "name": "sal-remote-augment", "revision": "2014-07-08" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-access-control-list", "name": "ietf-access-control-list", "revision": "2016-02-18" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:dom:pingpong", "name": "opendaylight-pingpong-broker", "revision": "2014-11-07" }, + { "nameSpace": "instance:identifier:patch:module", "name": "instance-identifier-patch-module", "revision": "2015-11-21" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-network-topology", "name": "ietf-network-topology", "revision": "2015-06-08" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-yang-types", "name": "ietf-yang-types", "revision": "2010-09-24" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity", "name": "odl-general-entity", "revision": "2015-09-30" }, + { "nameSpace": "urn:opendaylight:yang:extension:yang-ext", "name": "yang-ext", "revision": "2013-07-09" }, + { "nameSpace": "urn:opendaylight:l2:types", "name": "opendaylight-l2-types", "revision": "2013-08-27" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:md:sal:config:impl:cluster-singleton-service", "name": "cluster-singleton-service-impl", "revision": "2016-07-18" }, + { "nameSpace": "urn:TBD:params:xml:ns:yang:ospf-topology", "name": "ospf-topology", "revision": "2013-10-21" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring", "name": "ietf-restconf-monitoring", "revision": "2017-01-26" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:clustering:prefix-shard-configuration", "name": "prefix-shard-configuration", "revision": "2017-01-10" }, + { "nameSpace": "urn:opendaylight:aaa:app:config", "name": "aaa-app-config", "revision": "2017-06-19" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:ietf-restconf", "name": "ietf-restconf", "revision": "2017-01-26" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:config:legacy-entity-ownership-service-provider", "name": "opendaylight-legacy-entity-ownership-service-provider", "revision": "2016-02-26" }, + { "nameSpace": "urn:ietf:params:xml:ns:yang:iana-if-type", "name": "iana-if-type", "revision": "2014-05-08" }, + { "nameSpace": "urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl", "name": "opendaylight-sal-binding-broker-impl", "revision": "2013-10-28" }, + + { "nameSpace": "org:onap:ccsdk:sli:core:sliapi", "name": "SLI-API", "revision": "2016-11-10" }, + { "nameSpace": "org:onap:ccsdk:sli:northbound:lcm", "name": "LCM", "revision": "2018-03-29" }, + { "nameSpace": "org:onap:ccsdk:sli:northbound:datachange", "name": "DataChange", "revision": "2015-05-19" }, + { "nameSpace": "org:onap:ccsdk:sli:northbound:asdcapi:common", "name": "asdc-api-common", "revision": "2017-02-01" }, + { "nameSpace": "http://xmlns.onap.org/asdc/license-model/1.0", "name": "asdc-license-model", "revision": "2016-04-27" }, + { "nameSpace": "org:onap:ccsdk", "name": "ASDC-API", "revision": "2017-02-01" } + + ] + } + }, + "restconf":{ + "httpPort":8181, + "webSocketPort": 8185, + "restconfServletContextPath":"/restconf", + "jsonRestconfServiceType": "DRAFT_18", + "inetAddress": "0.0.0.0" + } +} diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/mdsal-resource.properties b/lighty/lighty-ubuntu-docker/src/main/properties/mdsal-resource.properties new file mode 100644 index 00000000..d8537471 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/mdsal-resource.properties @@ -0,0 +1,27 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# 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========================================================= +### + +org.onap.ccsdk.sli.adaptors.resource.mdsal.sdnc-user=admin +org.onap.ccsdk.sli.adaptors.resource.mdsal.sdnc-passwd=admin +org.onap.ccsdk.sli.adaptors.resource.mdsal.sdnc-host=localhost +org.onap.ccsdk.sli.adaptors.resource.mdsal.sdnc-protocol=http +org.onap.ccsdk.sli.adaptors.resource.mdsal.sdnc-port=8181 + diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/netbox.properties b/lighty/lighty-ubuntu-docker/src/main/properties/netbox.properties new file mode 100644 index 00000000..4346d177 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/netbox.properties @@ -0,0 +1,19 @@ +# +# Copyright (C) 2019 Bell Canada. +# +# 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. +# + +# Configuration file for Netbox client +org.onap.ccsdk.sli.adaptors.netbox.url=http://netbox-nginx:8080 +org.onap.ccsdk.sli.adaptors.netbox.apikey=onceuponatimeiplayedwithnetbox20180814 \ No newline at end of file diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/partners.json b/lighty/lighty-ubuntu-docker/src/main/properties/partners.json new file mode 100755 index 00000000..9a17a1ac --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/partners.json @@ -0,0 +1,16 @@ +{ + "partnerOne": { + "url": "http://localhost:7001", + "test": "/metrics" + }, + "partnerTwo": { + "url": "http://localhost:7002", + "user": "controller_user", + "password": "P@ssword", + "test": "/metrics" + }, + "partnerThree": { + "url": "http://localhost:7003", + "user": "controller_admin" + } +} diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/sdnr-oofpcipoc-api-dg.properties b/lighty/lighty-ubuntu-docker/src/main/properties/sdnr-oofpcipoc-api-dg.properties new file mode 100644 index 00000000..d4f7e3cb --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/sdnr-oofpcipoc-api-dg.properties @@ -0,0 +1,35 @@ +restapi.templateDir=/opt/onap/ccsdk/restapi/templates +controller.url=http://localhost:8181 +controller.user=admin +controller.pwd=Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U +honeycomb.url=http://{honeycomb-instance-ip}:8183 +honeycomb.user=admin +honeycomb.pwd=admin +restapi.trustStoreFileName=/opt/onap/sdnc/data/stores/truststore.openecomp.client.jks +restapi.trustStorePassword=adminadmin +restapi.keyStoreFileName=/opt/onap/sdnc/data/stores/sdnc.p12 +restapi.keyStorePassword=adminadmin +restapi.connection-oof-url=http://oof.api.simpledemo.onap.org:8698/api/oof/v1/route +naming.gen-name.url=http://neng-serv:8080 +naming.gen-name.user=ccsdkapps +naming.gen-name.pwd=ccsdkapps + + +#Patch Targets +oofpcipoc.patch.pci.target=/oofpcipoc:phy-cell-id-in-use +oofpcipoc.patch.pci.target2=/oofpcipoc:fap-service[oofpcipoc:alias='{alias}']/oofpcipoc:x-0005b9-lte + + +# Templates +restapi.pci-patch.templatefile=oofpcipoc-pci-patch.json +restapi.neighbor-add.templatefile=oofpcipoc-addNeighbor.json +restapi.neighbor-delete.templatefile=oofpcipoc-deleteNeighbor.json +restapi.generic-neighbor-patch.template=oofpcipoc-generic-neighbor-patch.json + +# URLs +restapi.config=/restconf/config +restapi.radio-access=/restconf/config/oofpcipoc:radio-access +restapi.fap-service=/restconf/config/oofpcipoc:radio-access/fap-service/{alias} +restapi.x-005b9-lte=/restconf/config/oofpcipoc:radio-access/fap-service/{alias}/x-0005b9-lte +restapi.lte-ran-neighbor-list-in-use=/restconf/config/oofpcipoc:radio-access/fap-service/{alias}/cell-config/lte/lte-ran/lte-ran-neighbor-list-in-use +restapi.lte-ran-neighbor-in-use=/restconf/config/oofpcipoc:radio-access/fap-service/{alias}/cell-config/lte/lte-ran/lte-ran-neighbor-list-in-use/lte-ran-neighbor-list-in-use-lte-cell/{plmnid}/{cid} diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/sql-resource.properties b/lighty/lighty-ubuntu-docker/src/main/properties/sql-resource.properties new file mode 100644 index 00000000..ac32f773 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/sql-resource.properties @@ -0,0 +1,23 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# 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========================================================= +### + +org.openecomp.sdnc.resource.sql.cryptkey=QtfJMKggVk + diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/svclogic.properties b/lighty/lighty-ubuntu-docker/src/main/properties/svclogic.properties new file mode 100644 index 00000000..54d667cf --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/svclogic.properties @@ -0,0 +1,29 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# 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========================================================= +### + +org.onap.ccsdk.sli.dbtype = dblib +#Note : the next 4 fields are only used if org.onap.ccsdk.sli.dbtype = jdbc +org.onap.ccsdk.sli.jdbc.url=jdbc:mysql://dbhost:3306/sdnctl +org.onap.ccsdk.sli.jdbc.database=sdnctl +org.onap.ccsdk.sli.jdbc.user=sdnctl +org.onap.ccsdk.sli.jdbc.password=gamma + +org.xml.sax.driver=org.apache.xerces.parsers.SAXParser diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/svclogic.properties.sdnctldb01 b/lighty/lighty-ubuntu-docker/src/main/properties/svclogic.properties.sdnctldb01 new file mode 100755 index 00000000..54d667cf --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/svclogic.properties.sdnctldb01 @@ -0,0 +1,29 @@ +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# 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========================================================= +### + +org.onap.ccsdk.sli.dbtype = dblib +#Note : the next 4 fields are only used if org.onap.ccsdk.sli.dbtype = jdbc +org.onap.ccsdk.sli.jdbc.url=jdbc:mysql://dbhost:3306/sdnctl +org.onap.ccsdk.sli.jdbc.database=sdnctl +org.onap.ccsdk.sli.jdbc.user=sdnctl +org.onap.ccsdk.sli.jdbc.password=gamma + +org.xml.sax.driver=org.apache.xerces.parsers.SAXParser diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/template-node.properties b/lighty/lighty-ubuntu-docker/src/main/properties/template-node.properties new file mode 100644 index 00000000..1199a0cd --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/template-node.properties @@ -0,0 +1,4 @@ +velocity.resource.loader=class +velocity.file.resource.loader.path=/home/my/example +velocity.file.resource.loader.cache=true +velocity.custom.property=customValue \ No newline at end of file diff --git a/lighty/lighty-ubuntu-docker/src/main/properties/ueb.properties b/lighty/lighty-ubuntu-docker/src/main/properties/ueb.properties new file mode 100644 index 00000000..88711306 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/properties/ueb.properties @@ -0,0 +1,4 @@ +poolMembers=10.147.29.67:3904 +topic.read=APPC-TEST1 +topic.read.timeout=2500 +topic.write=APPC-TEST1 diff --git a/lighty/lighty-ubuntu-docker/src/main/resources/ansible-sources.list b/lighty/lighty-ubuntu-docker/src/main/resources/ansible-sources.list new file mode 100644 index 00000000..7e166f23 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/resources/ansible-sources.list @@ -0,0 +1,2 @@ +deb http://ppa.launchpad.net/ansible/ansible/ubuntu xenial main +deb-src http://ppa.launchpad.net/ansible/ansible/ubuntu xenial main \ No newline at end of file diff --git a/lighty/lighty-ubuntu-docker/src/main/resources/idmlight.db.mv.db b/lighty/lighty-ubuntu-docker/src/main/resources/idmlight.db.mv.db new file mode 100644 index 0000000000000000000000000000000000000000..c0b7b4992bc438c192c6bc9e0888864946496ace GIT binary patch literal 40960 zcmeHQU2ogg8765lcI7xRi?&F+4r7w0b`rQARCT@Std&>qd1+aaq$y|9vs<2FfzYdN>P&9tQ`vf(Kpt@TC_E*BA5g>XGJAGhI)@M;A_D0#0CUpcAmf zMbw8$)Z%_UVHnosUSeKgc(~1`Wwcb#QbkJ*Ep@as(9%Rp3oTPe8+P5BUTwJE&a@WY zF!08DvzoJ8_9&_b8*}zXyIk^WFQWIG8(yQbX*afPrv>-y7T&dGSJ%C1DY~KJjqQfp zoNeAb;@|tz3SOzGsdU$-(qsp;cbc?|x{;1_$uC2fa3#|3=pOjs>FBwV4TH7V6l<^= ztFtnzvL>srQW8Iu6kS#Ze=yP(C;}7#iU37`B0v$K2v7tl0*8P=C;x7f=!nx^bAfx- zjKNrS_q~(&_+$RHQZm%{@LgnX~KaQ}B!1>i=^c_9V{Q9~0 zI~SPWCx@ZVNm<}dDFSy|6}Z_`eq6{|@5+wnO;8PWZox`M=}Sf7#Go4fB7` zZu5V&Z>Hb9qR;!1CJ=MC@%e2M$v5Rbh9)ETgsbKn_u2EgU< zW#+$dc^D=?!av6+;R<<@y#hjF5=18S@&ClkErNl1|XedDrmELXab!o-?C1=5) z@n(Pi5-s8{!6$>y1FRY6z?yNpi!}pP+uvED#hfLi)wn$)>MPOUIrAnjC*h*$p%V(+ zBtIf>XZhy@?i^fTv6sq!Z4~R4bGBPwZCnOPvVcmyIJszxo6U7kglsAzdUFeQKEb<3 zeXTOw0cn^+b4UKpoN9}ZM2y5fkpqg6NRq6grE_1xB$h0R^Mv>`+MbdJ;xEAt5exUK ztJ$QNWQjkk;+1o|w}2UyFQoyUZfl)C-*K(fj2=rx$2z#G{@6;TSVtw_AjuvS=%`9m zWKDH`NJLgAX5^_ND-Vhi)gB*C2>&)DK;q994U5((hZ6LMSvne5ugY> z1_tB1<}HNyY(UHo555&mxw{;y*G?`H~xm!<^*fGnwP1wiXg z?E8J!kEw4kzZ>O%T1LIziw2+wH-tsp6fP2O-`0;in5^wwO`Qi2%=JTUmJlqzz z_O5uScIY?UpPAFUVs8?IW0y9K!Ev}9*an`77@T+`!rL_-?;A!m;MY*Ve{dO%2K;+D zE5d+(lstzNT{D8RTD7R-;xYJXqg|i~Py{Ff6ak6=MSvne5$J*d=Kmr84*0(o^8cy{ z{NFoN{;w1MZ$$XNhsOV1necy;@PCW&e>B$?Ccrx?HUP+G$p7_znSS?r*Z}Zx%mBb% z1|z@{KLQ4Tgq8SsXrw*D%a8I$`7t`qOD6aCnK-&m=)c z)%{}c5%GP~H1vUX9#TWh#*#R+$J6mwx{xWC-u&09Ot=GJmc zYTUeZsfgSIqOWOwW#b*MZfr~ShPt%*fpY!&TxDrz^@B^7{FzZF_}?Du;w@k%`F}7h z*sI{F%6{`NXwAKM?1h)2t^jaD41JZ)LY|6XB2?f(2y{@g#`!89fF6pR2`*ZC(Vj?S zk(3v*@|2G6@1retn|F0^ZL!`Ncf^HE5dFhBUP?sAJlJr+Q>bKq5ltS$rUzN>Fg9rT zQ*4`&mCjGW_Ta%icXwozd5MW$=-tw}JYeq)zLkQ0S$0r14eA8x`~joe6ak9BqeKAz z4u||Z;QxBa{~gPfJo!-hzd`uF8R7px{QU%gHJu0m77+kaL;yhZpJm5u3jkIq01TL` zz!v}}n4b@Ekr@E&M+|du0e&`N{oNP%#IWIeZ`nVv8$$`A1yBv($<+XWZ2X6{A?G8X z#DWfgj6cqg!&mx{J>XOufLxi+m^L6Jra=$-aj#hxS4){3F(Xn8ITvyo&`x4}4>bnY++U6{V`@y$@ZNHapKQfF@?sM1 z?*pqb0yoVc6S#}~ae+&W!=s|h>y0D-K8~kjthA?NTn=nvzE#Y3iG|ut+XeA5Vj`9)1{_U^m$BFyb_=%Teqz)A83qv!^iG6hxqNm`@pYjou9aKVc z$bF;-MfGj8BvU<5naC=rj1z8>+%p~GN=$0esnoJXvLQbyQVS7w!hkX^?0CC{ok7NV zx(hoo^+WGaKXi0&9D07(=)99%$$bt!V`UK8C$_KF35zcZaWc$RVSki-gL(PU>OwJ< zh^SKgszk#mIj}5YxhF^xjJLX{n!=w2^S1C-pcdh+S{Ko%hGnBsnJ^IDg51Ak3uX*i z>b^6Ef?ZRtV+F3kekG(}->TvG^9AXPA}|O7nE!|TJK+CD$p76G@PF-4`M*i{zqOnH zrvd{&itvAu08qv=^mJJZ3;>qfo&aEWAK35rU7!CqnExFo69D!I!S;yVgv7gHtQVGc z1$$xG2S>}WSH}HW0ekHV83Xs|1r7w6N%l651V3Y#cbDKP{u#r5&j$W)9xDI02>(y@;Qw}<|0_5FfUd!?Kl%@V;82h?tt|mq z{gVCe^?V87Q$_-NEu;Y0%U+v%XWq%by|}iWx^wr&`SVM~d+N>X%7%AmwO&qn<+bd} zO@vh&8 zy_P-KVXws#k0;qpBnEJB67PKna?*hw@PqMJI>i9~TwnWB9$f@l$XtewL8)VGrVJigWc;O>9 zu1F}cAu*h!jVKZalRl{;aVUxeOBIPnuSk#|eZ|o1QBnqrH4MH{MdA^~kMyt<0g3=c cfFkf@B7m7w$iD;rZ-xB7Rt5fV9}@rnKfw5fo&W#< literal 0 HcmV?d00001 diff --git a/lighty/lighty-ubuntu-docker/src/main/resources/install_ccsdk.yml b/lighty/lighty-ubuntu-docker/src/main/resources/install_ccsdk.yml new file mode 100644 index 00000000..e09eceba --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/resources/install_ccsdk.yml @@ -0,0 +1,16 @@ +--- +- hosts: all + become: yes + roles: + - role: ansible-opendaylight + # ODL is already installed, so no need to specify installation method. Specify extra features to install + extra_features: + - odl-restconf-all + - odl-mdsal-all + - odl-mdsal-apidocs + - odl-daexim-all + - odl-restconf-nb-rfc8040 + - ccsdk-sli-core-all + - ccsdk-sli-adaptors-all + - ccsdk-sli-northbound-all + - ccsdk-sli-plugins-all \ No newline at end of file diff --git a/lighty/lighty-ubuntu-docker/src/main/resources/odlsli.dump b/lighty/lighty-ubuntu-docker/src/main/resources/odlsli.dump new file mode 100644 index 00000000..e6b6222a --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/resources/odlsli.dump @@ -0,0 +1,1418 @@ +-- MySQL dump 10.13 Distrib 5.6.22, for Linux (x86_64) +-- +-- Host: sdnctldb01 Database: sdnctl +-- ------------------------------------------------------ +-- Server version 5.6.27-enterprise-commercial-advanced-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; +SET @@SESSION.SQL_LOG_BIN= 0; + +-- +-- Table structure for table `ALLOCATION_ITEM` +-- + +DROP TABLE IF EXISTS `ALLOCATION_ITEM`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ALLOCATION_ITEM` ( + `allocation_item_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `resource_id` bigint(20) NOT NULL, + `application_id` varchar(50) NOT NULL, + `resource_set_id` varchar(200) NOT NULL, + `resource_union_id` varchar(200) NOT NULL, + `resource_share_group_list` varchar(200) DEFAULT NULL, + `lt_used` bigint(20) DEFAULT NULL, + `ll_label` varchar(50) DEFAULT NULL, + `rr_used` varchar(200) DEFAULT NULL, + `allocation_time` datetime NOT NULL, + PRIMARY KEY (`allocation_item_id`), + UNIQUE KEY `allocation_item_id` (`allocation_item_id`), + UNIQUE KEY `IX2_ALLOCATION_ITEM` (`resource_id`,`resource_set_id`), + KEY `IX1_ALLOCATION_ITEM` (`resource_id`) +) ENGINE=InnoDB AUTO_INCREMENT=10104 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + + +-- +-- Table structure for table `DATA_OBJECT_MAPPING` +-- + +DROP TABLE IF EXISTS `DATA_OBJECT_MAPPING`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `DATA_OBJECT_MAPPING` ( + `serial_key` int(11) NOT NULL AUTO_INCREMENT, + `data_object_key` varchar(100) NOT NULL, + `data_object_type` varchar(50) NOT NULL, + `service_type` varchar(50) NOT NULL, + `data_object_key2` varchar(100) NOT NULL, + `data_object_key2_type` varchar(50) NOT NULL, + PRIMARY KEY (`serial_key`), + KEY `IX1_DATA_OBJECT_MAPPING` (`data_object_key`,`data_object_type`,`service_type`), + KEY `IX2_DATA_OBJECT_MAPPING` (`service_type`,`data_object_key2`,`data_object_key2_type`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `DEVICE2CONNECTION_MAPPING` +-- + +DROP TABLE IF EXISTS `DEVICE2CONNECTION_MAPPING`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `DEVICE2CONNECTION_MAPPING` ( + `vnf_host_name` varchar(100) NOT NULL, + `e2e_vpn_key` varchar(30) NOT NULL, + `service_type` varchar(30) NOT NULL, + `connection_id` bigint(20) NOT NULL, + PRIMARY KEY (`vnf_host_name`,`e2e_vpn_key`,`service_type`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `DEVICE2IPADDRESS_CONSUMPTION` +-- + +DROP TABLE IF EXISTS `DEVICE2IPADDRESS_CONSUMPTION`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `DEVICE2IPADDRESS_CONSUMPTION` ( + `serial_key` int(11) NOT NULL AUTO_INCREMENT, + `device_id` varchar(100) NOT NULL, + `device_type` varchar(30) NOT NULL, + `ip_version` varchar(10) NOT NULL, + `consumption_key` varchar(100) NOT NULL, + `logical_interface_service_id` varchar(100) NOT NULL, + `address_type` varchar(30) NOT NULL, + `ip_consumed` varchar(50) NOT NULL, + `vnf_type` varchar(30) NOT NULL, + PRIMARY KEY (`serial_key`), + KEY `IX1_DEVICEIPADDRESS_CONSUMPTION` (`device_id`,`device_type`,`ip_version`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `DEVICE2IPADDRESS_MAPPING` +-- + +DROP TABLE IF EXISTS `DEVICE2IPADDRESS_MAPPING`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `DEVICE2IPADDRESS_MAPPING` ( + `serial_key` int(11) NOT NULL AUTO_INCREMENT, + `device_id` varchar(100) NOT NULL, + `device_type` varchar(30) NOT NULL, + `secondary_key` varchar(100) NOT NULL, + `secondary_key_type` varchar(30) NOT NULL, + `address` varchar(50) NOT NULL, + `address_type` varchar(30) NOT NULL, + `ip_version` varchar(10) NOT NULL, + `length` int(11) NOT NULL, + `status` varchar(30) NOT NULL, + PRIMARY KEY (`serial_key`), + KEY `IX1_DEVICE2IPADDRESS_MAPPING` (`device_id`,`device_type`,`secondary_key`,`secondary_key_type`,`address`,`address_type`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `EIPAM_IP_ASSIGNMENTS` +-- + +DROP TABLE IF EXISTS `EIPAM_IP_ASSIGNMENTS`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `EIPAM_IP_ASSIGNMENTS` ( + `plan_name` varchar(40) NOT NULL, + `client_key` varchar(100) NOT NULL, + `service_type` varchar(40) NOT NULL, + `ip_address` varchar(40) DEFAULT NULL, + `prefix_length` int(2) DEFAULT NULL, + `status` varchar(20) DEFAULT NULL, + `service_instance_id` varchar(80) DEFAULT NULL, + `last_modified_ts` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `prev_status` varchar(20) DEFAULT NULL, + PRIMARY KEY (`plan_name`,`client_key`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `EIPAM_IP_SUBNETS` +-- + +DROP TABLE IF EXISTS `EIPAM_IP_SUBNETS`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `EIPAM_IP_SUBNETS` ( + `entity_id` int(6) NOT NULL, + `service_type` varchar(40) NOT NULL, + `plan_name` varchar(40) NOT NULL, + `address_family` varchar(10) NOT NULL, + `ip_address` varchar(40) NOT NULL, + `prefix_length` int(3) NOT NULL, + `status` varchar(20) NOT NULL, + `last_modified_ts` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`entity_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `EIPAM_IP_SUBNET_KEYS` +-- + +DROP TABLE IF EXISTS `EIPAM_IP_SUBNET_KEYS`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `EIPAM_IP_SUBNET_KEYS` ( + `entity_id` int(6) NOT NULL, + `key_name` varchar(255) NOT NULL, + `key_value` varchar(50) NOT NULL, + `level` int(2) NOT NULL, + PRIMARY KEY (`entity_id`,`key_name`,`key_value`,`level`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `EIPAM_REQUEST_KEY` +-- + +DROP TABLE IF EXISTS `EIPAM_REQUEST_KEY`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `EIPAM_REQUEST_KEY` ( + `key_name_1` varchar(50) NOT NULL, + `address_family` varchar(4) NOT NULL, + `serial_key` int(2) NOT NULL AUTO_INCREMENT, + `plan_name` varchar(50) NOT NULL, + `request_length` int(2) NOT NULL, + `pools_length` int(2) NOT NULL, + `plan_length` int(2) NOT NULL, + `key_name_0` varchar(50) NOT NULL, + `key_name_type_0` varchar(255) NOT NULL, + `key_name_type_1` varchar(255) NOT NULL, + `prefix_length` int(2) NOT NULL, + `group_flag` char(1) NOT NULL, + `address_type` varchar(20) DEFAULT NULL, + PRIMARY KEY (`key_name_1`,`address_family`), + UNIQUE KEY `IX1_EIPAM_REQUEST_KEY` (`serial_key`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_L3_NETWORK` +-- + +DROP TABLE IF EXISTS `GENERIC_L3_NETWORK`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_L3_NETWORK` ( + `network_id` varchar(80) NOT NULL, + `network_name` varchar(80) DEFAULT NULL, + `network_type` varchar(80) DEFAULT NULL, + `network_role` varchar(80) DEFAULT NULL, + `network_technology` varchar(80) DEFAULT NULL, + `neutron_network_id` varchar(80) DEFAULT NULL, + `is_bound_to_vpn` tinyint(1) DEFAULT NULL, + `orchestration_status` varchar(20) DEFAULT NULL, + `heat_stack_id` varchar(80) DEFAULT NULL, + `mso_catalog_key` varchar(80) DEFAULT NULL, + `service_id` varchar(80) NOT NULL, + `tenant_id` varchar(80) NOT NULL, + `physical_location_id` varchar(20) DEFAULT NULL, + `network_role_instance` varchar(80) NOT NULL, + PRIMARY KEY (`network_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_L3_NETWORK_SUBNET` +-- + +DROP TABLE IF EXISTS `GENERIC_L3_NETWORK_SUBNET`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_L3_NETWORK_SUBNET` ( + `network_id` varchar(80) NOT NULL, + `subnet_id` varchar(80) NOT NULL, + `neutron_subnet_id` varchar(80) DEFAULT NULL, + `gateway_address` varchar(45) NOT NULL, + `network_start_address` varchar(45) NOT NULL, + `cidr_mask` varchar(20) NOT NULL, + `ip_version` char(1) NOT NULL, + `orchestration_status` varchar(64) NOT NULL, + `dhcp_enabled` tinyint(1) NOT NULL, + `dhcp_start` varchar(45) DEFAULT NULL, + `dhcp_end` varchar(45) DEFAULT NULL, + PRIMARY KEY (`network_id`,`subnet_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_L3_NETWORK_VPN_BINDING` +-- + +DROP TABLE IF EXISTS `GENERIC_L3_NETWORK_VPN_BINDING`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_L3_NETWORK_VPN_BINDING` ( + `network_id` varchar(80) NOT NULL, + `vpn_id` varchar(80) NOT NULL, + PRIMARY KEY (`network_id`,`vpn_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_VNF` +-- + +DROP TABLE IF EXISTS `GENERIC_VNF`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_VNF` ( + `vnf_id` varchar(80) NOT NULL, + `vnf_name` varchar(80) NOT NULL, + `vnf_type` varchar(200) NOT NULL, + `vnf_name2` varchar(80) DEFAULT NULL, + `service_id` varchar(80) NOT NULL, + `equipment_role` varchar(80) NOT NULL, + `orchestration_status` varchar(20) DEFAULT NULL, + `prov_status` varchar(20) DEFAULT NULL, + `heat_stack_id` varchar(80) DEFAULT NULL, + `mso_catalog_key` varchar(80) DEFAULT NULL, + `regional_resource_zone` varchar(80) DEFAULT NULL, + `operational_state` varchar(80) DEFAULT NULL, + `license_key` varchar(80) DEFAULT NULL, + `ipv4_oam_address` varchar(20) DEFAULT NULL, + `ipv4_loopback0_address` varchar(20) DEFAULT NULL, + `nm_lan_v6_address` varchar(40) DEFAULT NULL, + `management_v6_address` varchar(40) DEFAULT NULL, + `management_option` varchar(45) DEFAULT NULL, + `vcpu` varchar(45) DEFAULT NULL, + `vmemory` varchar(45) DEFAULT NULL, + `vdisk` varchar(45) DEFAULT NULL, + `vcpu_units` varchar(45) DEFAULT NULL, + `vmemory_units` varchar(45) DEFAULT NULL, + `vdisk_units` varchar(45) DEFAULT NULL, + PRIMARY KEY (`vnf_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_VNF_L3_NETWORK` +-- + +DROP TABLE IF EXISTS `GENERIC_VNF_L3_NETWORK`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_VNF_L3_NETWORK` ( + `vnf_id` varchar(80) NOT NULL, + `network_id` varchar(80) NOT NULL, + PRIMARY KEY (`vnf_id`,`network_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_VNF_LICENSE_MANAGEMENT` +-- + +DROP TABLE IF EXISTS `GENERIC_VNF_LICENSE_MANAGEMENT`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_VNF_LICENSE_MANAGEMENT` ( + `vnf_id` varchar(80) NOT NULL, + `att_uuid` varchar(80) NOT NULL, + PRIMARY KEY (`vnf_id`,`att_uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_VNF_LINTERFACE` +-- + +DROP TABLE IF EXISTS `GENERIC_VNF_LINTERFACE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_VNF_LINTERFACE` ( + `vnf_id` varchar(80) NOT NULL, + `interface_name` varchar(255) NOT NULL, + `interface_role` varchar(45) DEFAULT NULL, + `v6_wan_link_ip` varchar(45) DEFAULT NULL, + `selflink` varchar(128) DEFAULT NULL, + `interface_id` varchar(45) DEFAULT NULL, + `macaddr` varchar(64) DEFAULT NULL, + `network_name` varchar(255) DEFAULT NULL, + PRIMARY KEY (`vnf_id`,`interface_name`), + KEY `FK_GENERIC_VNF_LINTERFACE_GENERIC_VNF_IDX` (`vnf_id`), + CONSTRAINT `FK_GENERIC_VNF_LINTERFACE_GENERIC_VNF` FOREIGN KEY (`vnf_id`) REFERENCES `GENERIC_VNF` (`vnf_id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_VNF_PSERVER` +-- + +DROP TABLE IF EXISTS `GENERIC_VNF_PSERVER`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_VNF_PSERVER` ( + `vnf_id` varchar(64) NOT NULL, + `hostname` varchar(255) NOT NULL, + PRIMARY KEY (`vnf_id`,`hostname`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_VNF_SERVICE_INSTANCE` +-- + +DROP TABLE IF EXISTS `GENERIC_VNF_SERVICE_INSTANCE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_VNF_SERVICE_INSTANCE` ( + `vnf_id` varchar(64) NOT NULL, + `service_instance_id` varchar(255) NOT NULL, + `relationship_key` varchar(64) NOT NULL, + `relationship_value` varchar(64) DEFAULT NULL, + `global_customer_id` varchar(255) DEFAULT NULL, + `service_type` varchar(255) DEFAULT NULL, + PRIMARY KEY (`vnf_id`,`service_instance_id`,`relationship_key`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_VNF_VNF_IMAGE` +-- + +DROP TABLE IF EXISTS `GENERIC_VNF_VNF_IMAGE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_VNF_VNF_IMAGE` ( + `vnf_id` varchar(64) NOT NULL, + `att_uuid` varchar(255) NOT NULL, + PRIMARY KEY (`vnf_id`,`att_uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_VNF_VSERVER` +-- + +DROP TABLE IF EXISTS `GENERIC_VNF_VSERVER`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_VNF_VSERVER` ( + `vnf_id` varchar(80) NOT NULL, + `vserver_id` varchar(128) NOT NULL, + `tenant_id` varchar(128) DEFAULT NULL, + PRIMARY KEY (`vnf_id`,`vserver_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `GENERIC_VPN_BINDING` +-- + +DROP TABLE IF EXISTS `GENERIC_VPN_BINDING`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `GENERIC_VPN_BINDING` ( + `vpn_id` varchar(80) NOT NULL, + `vpn_name` varchar(80) NOT NULL, + `global_route_target` varchar(80) NOT NULL, + PRIMARY KEY (`vpn_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `HOSTNAME` +-- + +DROP TABLE IF EXISTS `HOSTNAME`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `HOSTNAME` ( + `hostname` varchar(21) NOT NULL, + `parent_hostname` varchar(21) DEFAULT NULL, + `cust_id` int(11) NOT NULL, + `loc_id` int(11) NOT NULL, + `site_sequence` varchar(2) NOT NULL, + `server_sequence` varchar(2) NOT NULL, + `activation_code` varchar(11) DEFAULT NULL, + `vnf_sequence` varchar(2) DEFAULT NULL, + `vendor_code` varchar(1) NOT NULL, + `virtual_device_type` varchar(2) DEFAULT NULL, + `device_sequence` varchar(3) DEFAULT NULL, + `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`hostname`), + KEY `IN1_HOSTNAME` (`cust_id`), + KEY `IN2_HOSTNAME` (`loc_id`), + KEY `IN3_HOSTNAME` (`vendor_code`), + KEY `IN4_HOSTNAME` (`parent_hostname`), + CONSTRAINT `FK1_HOSTNAME` FOREIGN KEY (`cust_id`) REFERENCES `CUSTOMER` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `FK2_HOSTNAME` FOREIGN KEY (`loc_id`) REFERENCES `LOCATION` (`loc_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `FK3_HOSTNAME` FOREIGN KEY (`vendor_code`) REFERENCES `VENDOR_CODE` (`vendor_code`) ON DELETE NO ACTION ON UPDATE NO ACTION, + CONSTRAINT `FK4_HOSTNAME` FOREIGN KEY (`parent_hostname`) REFERENCES `HOSTNAME` (`hostname`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `IPV4_ADDRESS_POOL` +-- + +DROP TABLE IF EXISTS `IPV4_ADDRESS_POOL`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `IPV4_ADDRESS_POOL` ( + `aic_site_id` varchar(100) NOT NULL, + `universe` varchar(40) NOT NULL, + `status` varchar(40) NOT NULL, + `ipv4_addr` varchar(20) NOT NULL, + PRIMARY KEY (`ipv4_addr`,`universe`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `LINTERFACE_VLAN` +-- + +DROP TABLE IF EXISTS `LINTERFACE_VLAN`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `LINTERFACE_VLAN` ( + `vnf_id` varchar(80) NOT NULL, + `interface_name` varchar(255) NOT NULL, + `vlan_interface` varchar(255) NOT NULL, + `vlan_id_inner` varchar(64) DEFAULT NULL, + `vlan_id_outer` varchar(64) DEFAULT NULL, + PRIMARY KEY (`vnf_id`,`interface_name`,`vlan_interface`), + KEY `FK_LINTERFACE_VLAN_GENERIC_VNF_LINTERFACE_IDX` (`vnf_id`,`interface_name`), + CONSTRAINT `FK_LINTERFACE_VLAN_GENERIC_VNF_LINTERFACE` FOREIGN KEY (`vnf_id`, `interface_name`) REFERENCES `GENERIC_VNF_LINTERFACE` (`vnf_id`, `interface_name`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `LOCATION` +-- + +DROP TABLE IF EXISTS `LOCATION`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `LOCATION` ( + `loc_id` int(11) NOT NULL AUTO_INCREMENT, + `address` varchar(150) NOT NULL, + `city_code_id` int(11) NOT NULL, + `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`loc_id`), + KEY `IN1_LOCATION_IDX` (`city_code_id`), + CONSTRAINT `FK1_LOCATION` FOREIGN KEY (`city_code_id`) REFERENCES `CITY_CODE` (`city_code_id`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB AUTO_INCREMENT=112 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `MAX_PORT_SPEED` +-- + +DROP TABLE IF EXISTS `MAX_PORT_SPEED`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `MAX_PORT_SPEED` ( + `max_port_speed_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `image_file_name` varchar(50) NOT NULL, + `end_point_position` varchar(50) NOT NULL, + `interface_name` varchar(100) NOT NULL, + `max_speed` bigint(20) NOT NULL, + `unit` varchar(10) NOT NULL, + PRIMARY KEY (`max_port_speed_id`), + UNIQUE KEY `max_port_speed_id` (`max_port_speed_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `MAX_SERVER_SPEED` +-- + +DROP TABLE IF EXISTS `MAX_SERVER_SPEED`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `MAX_SERVER_SPEED` ( + `max_server_speed_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `server_model` varchar(50) NOT NULL, + `evc_count` smallint(6) NOT NULL, + `max_speed` bigint(20) NOT NULL, + `unit` varchar(10) NOT NULL, + `description` varchar(500) DEFAULT NULL, + PRIMARY KEY (`max_server_speed_id`), + UNIQUE KEY `max_server_speed_id` (`max_server_speed_id`) +) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + + + +-- +-- Table structure for table `NETWORK_PROFILE` +-- + +DROP TABLE IF EXISTS `NETWORK_PROFILE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `NETWORK_PROFILE` ( + `network_type` varchar(100) NOT NULL, + `technology` varchar(100) NOT NULL, + PRIMARY KEY (`network_type`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `NETWORK_ROLE_VPN_BINDING` +-- + +DROP TABLE IF EXISTS `NETWORK_ROLE_VPN_BINDING`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `NETWORK_ROLE_VPN_BINDING` ( + `network_role` varchar(80) NOT NULL, + `vpn_id` varchar(80) NOT NULL, + PRIMARY KEY (`network_role`,`vpn_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `NODE_TYPES` +-- + +DROP TABLE IF EXISTS `NODE_TYPES`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `NODE_TYPES` ( + `nodetype` varchar(80) NOT NULL, + PRIMARY KEY (`nodetype`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `PARAMETERS` +-- + +DROP TABLE IF EXISTS `PARAMETERS`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `PARAMETERS` ( + `name` varchar(100) NOT NULL, + `value` varchar(24) NOT NULL, + `category` varchar(24) DEFAULT NULL, + `memo` varchar(128) DEFAULT NULL, + PRIMARY KEY (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `PHYSICAL_LINK` +-- + +DROP TABLE IF EXISTS `PHYSICAL_LINK`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `PHYSICAL_LINK` ( + `link_name` varchar(255) NOT NULL, + `speed_value` varchar(64) DEFAULT NULL, + `speed_units` varchar(64) DEFAULT NULL, + `circuit_id` varchar(255) NOT NULL, + `dual_mode` varchar(64) NOT NULL, + PRIMARY KEY (`link_name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `PHYSICAL_LINK_PINTERFACE` +-- + +DROP TABLE IF EXISTS `PHYSICAL_LINK_PINTERFACE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `PHYSICAL_LINK_PINTERFACE` ( + `link_name` varchar(255) NOT NULL, + `hostname` varchar(255) NOT NULL, + `port_name_ft` varchar(255) NOT NULL, + PRIMARY KEY (`link_name`,`hostname`,`port_name_ft`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `PINTERFACE` +-- + +DROP TABLE IF EXISTS `PINTERFACE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `PINTERFACE` ( + `hostname` varchar(255) NOT NULL, + `port_name_ft` varchar(255) NOT NULL, + `interface_name` varchar(255) DEFAULT '', + `physical_speed` varchar(255) DEFAULT '', + `physical_units` varchar(255) DEFAULT '', + `port_description` varchar(255) DEFAULT '', + PRIMARY KEY (`hostname`,`port_name_ft`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `PORTAL_USERS` +-- + +DROP TABLE IF EXISTS `PORTAL_USERS`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `PORTAL_USERS` ( + `email` varchar(64) NOT NULL, + `password` varbinary(255) NOT NULL, + `privilege` char(1) NOT NULL, + PRIMARY KEY (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + + +-- +-- Table structure for table `PSERVER` +-- + +DROP TABLE IF EXISTS `PSERVER`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `PSERVER` ( + `hostname` varchar(255) NOT NULL, + `ptnii_equip_name` varchar(255) DEFAULT '', + `number_of_cpus` varchar(255) DEFAULT '', + `disk_in_gigabytes` varchar(255) DEFAULT '', + `ram_in_megabytes` varchar(255) DEFAULT '', + `equip_type` varchar(255) DEFAULT '', + `equip_vendor` varchar(255) DEFAULT '', + `equip_model` varchar(255) DEFAULT '', + `fqdn` varchar(255) DEFAULT '', + `pserver_selflink` varchar(255) DEFAULT '', + `ipv4_oam_address` varchar(40) DEFAULT NULL, + `serial_number` varchar(255) DEFAULT '', + `pserver_id` varchar(255) DEFAULT '', + `internet_topology` varchar(40) DEFAULT '', + `aic_site_id` varchar(100) DEFAULT '', + `in_maint` varchar(5) DEFAULT '', + `pserver_name2` varchar(255) DEFAULT '', + `purpose` varchar(255) DEFAULT '', + PRIMARY KEY (`hostname`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `RANGE_RULE` +-- + +DROP TABLE IF EXISTS `RANGE_RULE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `RANGE_RULE` ( + `range_rule_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `range_name` varchar(50) NOT NULL, + `service_model` varchar(50) NOT NULL, + `end_point_position` varchar(50) NOT NULL, + `equipment_level` varchar(50) NOT NULL, + `equipment_expression` varchar(2000) NOT NULL, + `ranges` varchar(100) NOT NULL, + PRIMARY KEY (`range_rule_id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `RESOURCE` +-- + +DROP TABLE IF EXISTS `RESOURCE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `RESOURCE` ( + `resource_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `asset_id` varchar(100) NOT NULL, + `resource_name` varchar(50) NOT NULL, + `resource_type` enum('Limit','Label','Range') NOT NULL, + `lt_used` bigint(20) DEFAULT NULL, + `ll_label` varchar(50) DEFAULT NULL, + `ll_reference_count` smallint(6) DEFAULT NULL, + `rr_used` varchar(4000) DEFAULT NULL, + PRIMARY KEY (`resource_id`), + UNIQUE KEY `resource_id` (`resource_id`), + UNIQUE KEY `IX1_RESOURCE` (`asset_id`,`resource_name`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `RESOURCE_LOAD` +-- + +DROP TABLE IF EXISTS `RESOURCE_LOAD`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `RESOURCE_LOAD` ( + `resource_load_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `resource_id` bigint(20) NOT NULL, + `application_id` varchar(20) NOT NULL, + `resource_load_time` datetime NOT NULL, + `resource_expiration_time` datetime DEFAULT NULL, + PRIMARY KEY (`resource_load_id`), + UNIQUE KEY `resource_load_id` (`resource_load_id`), + UNIQUE KEY `IX2_RESOURCE_LOAD` (`resource_id`,`application_id`), + KEY `IX1_RESOURCE_LOAD` (`resource_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `RESOURCE_LOCK` +-- + +DROP TABLE IF EXISTS `RESOURCE_LOCK`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `RESOURCE_LOCK` ( + `resource_lock_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `resource_name` varchar(50) NOT NULL, + `lock_holder` varchar(100) NOT NULL, + `lock_count` smallint(6) NOT NULL, + `lock_time` datetime NOT NULL, + `expiration_time` datetime NOT NULL, + PRIMARY KEY (`resource_lock_id`), + UNIQUE KEY `resource_lock_id` (`resource_lock_id`), + UNIQUE KEY `IX1_RESOURCE_LOCK` (`resource_name`) +) ENGINE=InnoDB AUTO_INCREMENT=2951 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `RESOURCE_RULE` +-- + +DROP TABLE IF EXISTS `RESOURCE_RULE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `RESOURCE_RULE` ( + `resource_rule_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `resource_name` varchar(50) NOT NULL, + `service_model` varchar(50) NOT NULL, + `end_point_position` varchar(50) NOT NULL, + `service_expression` varchar(2000) NOT NULL, + `equipment_level` varchar(50) NOT NULL, + `equipment_expression` varchar(2000) NOT NULL, + `allocation_expression` varchar(2000) NOT NULL, + `soft_limit_expression` varchar(2000) NOT NULL, + `hard_limit_expression` varchar(2000) NOT NULL, + PRIMARY KEY (`resource_rule_id`), + UNIQUE KEY `resource_rule_id` (`resource_rule_id`) +) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `RESOURCE_THRESHOLD` +-- + +DROP TABLE IF EXISTS `RESOURCE_THRESHOLD`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `RESOURCE_THRESHOLD` ( + `resource_threshold_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `resource_rule_id` bigint(20) NOT NULL, + `threshold_expression` varchar(2000) NOT NULL, + `threshold_message` varchar(2000) NOT NULL, + PRIMARY KEY (`resource_threshold_id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + + +-- +-- Table structure for table `SERVICE_RESOURCE` +-- + +DROP TABLE IF EXISTS `SERVICE_RESOURCE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `SERVICE_RESOURCE` ( + `service_resource_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `service_instance_id` varchar(80) NOT NULL, + `service_status` enum('Active','Pending') NOT NULL, + `service_change_number` smallint(6) NOT NULL, + `resource_set_id` varchar(100) NOT NULL, + `resource_union_id` varchar(100) NOT NULL, + PRIMARY KEY (`service_instance_id`,`service_change_number`), + UNIQUE KEY `service_resource_id` (`service_resource_id`), + KEY `IX1_SERVICE_RESOURCE` (`service_instance_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2203 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `SVC_LOGIC` +-- + +DROP TABLE IF EXISTS `SVC_LOGIC`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `SVC_LOGIC` ( + `module` varchar(80) NOT NULL, + `rpc` varchar(80) NOT NULL, + `version` varchar(40) NOT NULL, + `mode` varchar(5) NOT NULL, + `active` varchar(1) NOT NULL, + `graph` longblob, + `modified_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `md5sum` varchar(128) DEFAULT NULL, + PRIMARY KEY (`module`,`rpc`,`version`,`mode`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `TENANT` +-- + +DROP TABLE IF EXISTS `TENANT`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `TENANT` ( + `tenant_id` varchar(255) NOT NULL, + `tenant_name` varchar(255) NOT NULL, + `service_instance_id` varchar(255) NOT NULL, + PRIMARY KEY (`tenant_id`,`tenant_name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `THRESHOLD_NOTIFICATION` +-- + +DROP TABLE IF EXISTS `THRESHOLD_NOTIFICATION`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `THRESHOLD_NOTIFICATION` ( + `resource_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `threshold_expression` varchar(2000) DEFAULT NULL, + `threshold_message` varchar(500) DEFAULT NULL, + PRIMARY KEY (`resource_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + + +-- +-- Table structure for table `VENDOR_CODE` +-- + +DROP TABLE IF EXISTS `VENDOR_CODE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VENDOR_CODE` ( + `vendor_code` varchar(1) NOT NULL, + `vendor` varchar(45) DEFAULT NULL, + PRIMARY KEY (`vendor_code`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VLAN_ID_POOL` +-- + +DROP TABLE IF EXISTS `VLAN_ID_POOL`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VLAN_ID_POOL` ( + `aic_site_id` varchar(100) NOT NULL, + `purpose` varchar(40) NOT NULL, + `status` varchar(40) NOT NULL, + `vlan_id` int(4) NOT NULL, + `svc_instance_id` varchar(80) DEFAULT NULL, + `availability_zone` varchar(100) DEFAULT NULL, + `vplspe_name` varchar(80) DEFAULT NULL, + PRIMARY KEY (`vlan_id`,`aic_site_id`,`purpose`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VLAN_L3INTERFACE_IPV4_ADDRESS` +-- + +DROP TABLE IF EXISTS `VLAN_L3INTERFACE_IPV4_ADDRESS`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VLAN_L3INTERFACE_IPV4_ADDRESS` ( + `vnf_id` varchar(80) NOT NULL, + `interface_name` varchar(255) NOT NULL, + `vlan_interface` varchar(255) NOT NULL, + `l3_interface_ipv4_address` varchar(64) NOT NULL, + `l3_interface_ipv4_prefix_length` varchar(45) DEFAULT NULL, + `vlan_id_inner` varchar(45) DEFAULT NULL, + `vlan_id_outer` varchar(45) DEFAULT NULL, + `is_floating` varchar(1) DEFAULT NULL, + PRIMARY KEY (`vnf_id`,`interface_name`,`vlan_interface`,`l3_interface_ipv4_address`), + KEY `FK_VLAN_L3INTERFACE_IPV4_ADDRESS_LINTERFACE_VLAN_IDX` (`vnf_id`,`interface_name`), + CONSTRAINT `FK_VLAN_L3INTERFACE_IPV4_ADDRESS_LINTERFACE_VLAN` FOREIGN KEY (`vnf_id`, `interface_name`, `vlan_interface`) REFERENCES `LINTERFACE_VLAN` (`vnf_id`, `interface_name`, `vlan_interface`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VLAN_L3INTERFACE_IPV6_ADDRESS` +-- + +DROP TABLE IF EXISTS `VLAN_L3INTERFACE_IPV6_ADDRESS`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VLAN_L3INTERFACE_IPV6_ADDRESS` ( + `vnf_id` varchar(80) NOT NULL, + `interface_name` varchar(255) NOT NULL, + `vlan_interface` varchar(255) NOT NULL, + `l3_interface_ipv6_address` varchar(64) NOT NULL, + `l3_interface_ipv6_prefix_length` varchar(45) DEFAULT NULL, + `vlan_id_inner` varchar(45) DEFAULT NULL, + `vlan_id_outer` varchar(45) DEFAULT NULL, + `is_floating` varchar(1) DEFAULT NULL, + PRIMARY KEY (`vnf_id`,`interface_name`,`vlan_interface`,`l3_interface_ipv6_address`), + KEY `FK_VLAN_L3INTERFACE_IPV6_ADDRESS_LINTERFACE_VLAN_IDX` (`vnf_id`,`interface_name`,`vlan_interface`), + CONSTRAINT `FK_VLAN_L3INTERFACE_IPV6_ADDRESS_LINTERFACE_VLAN` FOREIGN KEY (`vnf_id`, `interface_name`, `vlan_interface`) REFERENCES `LINTERFACE_VLAN` (`vnf_id`, `interface_name`, `vlan_interface`) ON DELETE NO ACTION ON UPDATE NO ACTION +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VLAN_PLAN_ID` +-- + +DROP TABLE IF EXISTS `VLAN_PLAN_ID`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VLAN_PLAN_ID` ( + `plan_type` varchar(40) NOT NULL, + `purpose` varchar(40) NOT NULL, + `vlan_plan_id_count` int(4) NOT NULL, + PRIMARY KEY (`vlan_plan_id_count`,`plan_type`,`purpose`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VLAN_POOL` +-- + +DROP TABLE IF EXISTS `VLAN_POOL`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VLAN_POOL` ( + `aic_site_id` varchar(100) NOT NULL, + `availability_zone` varchar(100) NOT NULL, + `vlan_plan_id` varchar(100) NOT NULL, + `plan_type` varchar(40) NOT NULL, + `purpose` varchar(40) NOT NULL, + `vlan_id` int(4) NOT NULL, + `status` varchar(40) NOT NULL, + `reserved_id` varchar(80) DEFAULT NULL, + PRIMARY KEY (`aic_site_id`,`availability_zone`,`vlan_plan_id`,`plan_type`,`purpose`,`vlan_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VLAN_RANGES` +-- + +DROP TABLE IF EXISTS `VLAN_RANGES`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VLAN_RANGES` ( + `vlan_plan_id` varchar(100) NOT NULL, + `plan_type` varchar(40) NOT NULL, + `purpose` varchar(40) NOT NULL, + `range_start` int(4) NOT NULL, + `range_end` int(4) NOT NULL, + `generated` char(1) DEFAULT NULL, + PRIMARY KEY (`vlan_plan_id`,`plan_type`,`purpose`,`range_start`,`range_end`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VM_NETWORKS` +-- + +DROP TABLE IF EXISTS `VM_NETWORKS`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VM_NETWORKS` ( + `vnf_type` varchar(200) NOT NULL, + `vm_type` varchar(45) NOT NULL, + `network_role` varchar(45) NOT NULL, + `assign_ips` tinyint(1) NOT NULL, + `assign_macs` tinyint(1) NOT NULL, + `assign_floating_ip` tinyint(1) NOT NULL, + `ip_count` int(11) DEFAULT NULL, + PRIMARY KEY (`vnf_type`,`vm_type`,`network_role`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VM_PROFILE` +-- + +DROP TABLE IF EXISTS `VM_PROFILE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VM_PROFILE` ( + `vnf_type` varchar(200) NOT NULL, + `vm_type` varchar(45) NOT NULL, + `vm_count` int(11) NOT NULL, + PRIMARY KEY (`vnf_type`,`vm_type`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VNF` +-- + +DROP TABLE IF EXISTS `VNF`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VNF` ( + `vnf_id` varchar(80) NOT NULL, + `vnf_name` varchar(80) NOT NULL, + `vnf_type` varchar(10) NOT NULL, + `orchestration_status` varchar(20) DEFAULT NULL, + `heat_stack_id` varchar(80) DEFAULT NULL, + `mso_catalog_key` varchar(80) DEFAULT NULL, + `availability_zone` varchar(80) DEFAULT NULL, + `aic_site_id` varchar(80) DEFAULT NULL, + `oam_ipv4_address` varchar(20) DEFAULT NULL, + `vnf_name2` varchar(80) DEFAULT NULL, + `vpe_id` varchar(80) NOT NULL, + `ipv4_loopback0_address` varchar(80) DEFAULT NULL, + `license_key` varchar(256) DEFAULT NULL, + `entitlement_resource_uuid` varchar(256) DEFAULT NULL, + PRIMARY KEY (`vnf_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VNF_IMAGE` +-- + +DROP TABLE IF EXISTS `VNF_IMAGE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VNF_IMAGE` ( + `application_vendor` varchar(255) NOT NULL, + `application_version` varchar(255) NOT NULL, + `att_uuid` varchar(255) NOT NULL, + `application` varchar(255) DEFAULT NULL, + `selflink` varchar(255) DEFAULT NULL, + PRIMARY KEY (`application_vendor`,`application_version`,`att_uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VNF_MODEL_LICENSES` +-- + +DROP TABLE IF EXISTS `VNF_MODEL_LICENSES`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VNF_MODEL_LICENSES` ( + `att_part_number` varchar(255) NOT NULL, + `license_assignment_group` varchar(255) NOT NULL, + `license_required` tinyint(1) DEFAULT NULL, + `entitlement_assignment_group` varchar(255) DEFAULT NULL, + `entitlement_required` tinyint(1) DEFAULT NULL, + `feature_group_uuid` varchar(255) DEFAULT NULL, + PRIMARY KEY (`att_part_number`,`license_assignment_group`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VNF_MODEL_LICENSE_FEATURES` +-- + +DROP TABLE IF EXISTS `VNF_MODEL_LICENSE_FEATURES`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VNF_MODEL_LICENSE_FEATURES` ( + `att_part_number` varchar(255) NOT NULL, + `license_assignment_group` varchar(255) NOT NULL, + `feature` varchar(255) NOT NULL, + PRIMARY KEY (`att_part_number`,`license_assignment_group`,`feature`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VNF_NETWORKS` +-- + +DROP TABLE IF EXISTS `VNF_NETWORKS`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VNF_NETWORKS` ( + `vnf_type` varchar(200) NOT NULL, + `network_role` varchar(45) NOT NULL, + PRIMARY KEY (`vnf_type`,`network_role`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VNF_NETWORK_CONNECTION` +-- + +DROP TABLE IF EXISTS `VNF_NETWORK_CONNECTION`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VNF_NETWORK_CONNECTION` ( + `connection_uuid` varchar(80) NOT NULL, + `vnf_id` varchar(80) NOT NULL, + `connection_id` varchar(80) DEFAULT NULL, + `connection_type` varchar(20) DEFAULT NULL, + `neutron_network_id` varchar(80) DEFAULT NULL, + `neutron_network_name` varchar(80) DEFAULT NULL, + `orchestration_status` varchar(20) DEFAULT NULL, + `switch_id` varchar(40) DEFAULT NULL, + `heat_stack_id` varchar(80) DEFAULT NULL, + `mso_catalog_key` varchar(80) DEFAULT NULL, + `provider_network` varchar(80) DEFAULT NULL, + `port_group_id` varchar(80) DEFAULT NULL, + `port_group_name` varchar(80) DEFAULT NULL, + PRIMARY KEY (`connection_uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VNF_NETWORK_CONNECTION_VLAN` +-- + +DROP TABLE IF EXISTS `VNF_NETWORK_CONNECTION_VLAN`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VNF_NETWORK_CONNECTION_VLAN` ( + `vlan_uuid` varchar(80) NOT NULL, + `vlan_id` int(4) NOT NULL, + `vlan_type` varchar(5) NOT NULL, + `connection_uuid` varchar(80) DEFAULT NULL, + PRIMARY KEY (`vlan_uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VNF_PROFILE` +-- + +DROP TABLE IF EXISTS `VNF_PROFILE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VNF_PROFILE` ( + `vnf_type` varchar(200) NOT NULL, + `availability_zone_count` int(11) NOT NULL, + `equipment_role` varchar(80) NOT NULL, + PRIMARY KEY (`vnf_type`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VPE_LOCK` +-- + +DROP TABLE IF EXISTS `VPE_LOCK`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VPE_LOCK` ( + `vpe_name` varchar(20) NOT NULL, + `vpn_lock` varchar(20) NOT NULL, + PRIMARY KEY (`vpe_name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VPE_POOL` +-- + +DROP TABLE IF EXISTS `VPE_POOL`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VPE_POOL` ( + `vpe_name` varchar(20) NOT NULL, + `ipv4_oam_address` varchar(20) NOT NULL, + `loopback0_ipv4_address` varchar(20) NOT NULL, + `provisioning_status` varchar(10) NOT NULL, + `aic_site_id` varchar(100) NOT NULL, + `availability_zone` varchar(100) NOT NULL, + `vlan_id_outer` varchar(20) NOT NULL, + `vendor` varchar(20) NOT NULL, + `physical_intf_name` varchar(40) NOT NULL, + `physical_intf_speed` varchar(20) NOT NULL, + `physical_intf_units` varchar(20) NOT NULL, + `vpe_uuid` varchar(80) DEFAULT NULL, + `vpe_id` varchar(80) NOT NULL, + `image_filename` varchar(100) DEFAULT NULL, + `as_number` varchar(20) NOT NULL, + `loopback5000` varchar(16) DEFAULT NULL, + `loopback10` varchar(16) DEFAULT NULL, + PRIMARY KEY (`aic_site_id`,`vpe_name`,`availability_zone`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VPLSPE_POOL` +-- + +DROP TABLE IF EXISTS `VPLSPE_POOL`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VPLSPE_POOL` ( + `vplspe_name` varchar(20) NOT NULL, + `aic_site_id` varchar(100) NOT NULL, + `availability_zone` varchar(100) NOT NULL, + `physical_intf_name` varchar(40) NOT NULL, + `physical_intf_speed` varchar(20) NOT NULL, + `physical_intf_units` varchar(20) NOT NULL, + `loopback0_ipv4_address` varchar(20) NOT NULL, + `vlan_id_outer` varchar(20) NOT NULL, + `vplspe_uuid` varchar(80) DEFAULT NULL, + `image_filename` varchar(100) DEFAULT NULL, + `provisioning_status` varchar(10) DEFAULT NULL, + `vendor` varchar(20) DEFAULT NULL, + PRIMARY KEY (`vplspe_name`,`aic_site_id`,`availability_zone`,`physical_intf_name`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VSERVER` +-- + +DROP TABLE IF EXISTS `VSERVER`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VSERVER` ( + `tenant_id` varchar(40) NOT NULL, + `vserver_id` varchar(40) NOT NULL, + `aic_site_id` varchar(100) NOT NULL, + `vendor` varchar(20) NOT NULL, + `image_name` varchar(100) NOT NULL, + `vnf_type` varchar(10) NOT NULL, + `vnf_id` varchar(80) NOT NULL, + PRIMARY KEY (`tenant_id`,`vserver_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VSERVER2` +-- + +DROP TABLE IF EXISTS `VSERVER2`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VSERVER2` ( + `tenant_id` varchar(255) NOT NULL, + `vserver_id` varchar(128) NOT NULL, + `vserver_name` varchar(255) NOT NULL, + `vserver_name2` varchar(255) DEFAULT NULL, + `prov_status` varchar(20) DEFAULT NULL, + `selflink` varchar(255) DEFAULT NULL, + PRIMARY KEY (`tenant_id`,`vserver_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `VSERVER_PSERVER` +-- + +DROP TABLE IF EXISTS `VSERVER_PSERVER`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `VSERVER_PSERVER` ( + `vserver_id` varchar(128) NOT NULL, + `pserver_hostname` varchar(255) DEFAULT NULL, + PRIMARY KEY (`vserver_id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `WAN_COMBO_ALLOWABLE` +-- + +DROP TABLE IF EXISTS `WAN_COMBO_ALLOWABLE`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `WAN_COMBO_ALLOWABLE` ( + `combo_sequence` int(11) NOT NULL AUTO_INCREMENT, + `internet_topology` varchar(20) DEFAULT NULL, + `wan1` varchar(40) DEFAULT NULL, + `wan2` varchar(40) DEFAULT NULL, + `new_start_release` char(5) DEFAULT NULL, + `description` varchar(128) NOT NULL, + PRIMARY KEY (`combo_sequence`), + UNIQUE KEY `IX1_WAN_COMBO_ALLOWABLE` (`internet_topology`,`wan1`,`wan2`) +) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `emp1000` +-- + +DROP TABLE IF EXISTS `emp1000`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `emp1000` ( + `firstName` varchar(20) DEFAULT NULL, + `lastName` varchar(20) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `linda` +-- + +DROP TABLE IF EXISTS `linda`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `linda` ( + `c1` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `testit` +-- + +DROP TABLE IF EXISTS `testit`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `testit` ( + `c1` varchar(12) DEFAULT NULL, + `c2` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `testtable` +-- + +DROP TABLE IF EXISTS `testtable`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `testtable` ( + `city_code_id` int(11) NOT NULL AUTO_INCREMENT, + `city_code` varchar(3) NOT NULL, + `city` varchar(150) NOT NULL, + `state` varchar(10) NOT NULL, + `country_code` varchar(10) NOT NULL, + PRIMARY KEY (`city_code_id`), + KEY `IN1_testtable` (`city`,`state`,`country_code`) +) ENGINE=InnoDB AUTO_INCREMENT=37756 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; +SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2016-11-23 16:01:55 diff --git a/lighty/lighty-ubuntu-docker/src/main/resources/org.ops4j.pax.logging.cfg b/lighty/lighty-ubuntu-docker/src/main/resources/org.ops4j.pax.logging.cfg new file mode 100644 index 00000000..ee35ef70 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/resources/org.ops4j.pax.logging.cfg @@ -0,0 +1,92 @@ +################################################################################ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# +################################################################################ + +# Common pattern layout for appenders +log4j2.pattern = %d{ISO8601} | %-5p | %-16t | %-32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %X{currentGraph} - %X{nodeId} | %m%n + +# Root logger +log4j2.rootLogger.level = INFO +# uncomment to use asynchronous loggers, which require mvn:com.lmax/disruptor/3.3.2 library +#log4j2.rootLogger.type = asyncRoot +#log4j2.rootLogger.includeLocation = false +log4j2.rootLogger.appenderRef.RollingFile.ref = RollingFile +log4j2.rootLogger.appenderRef.PaxOsgi.ref = PaxOsgi +log4j2.rootLogger.appenderRef.Console.ref = Console +log4j2.rootLogger.appenderRef.Console.filter.threshold.type = ThresholdFilter +log4j2.rootLogger.appenderRef.Console.filter.threshold.level = ${karaf.log.console:-OFF} + +# Loggers configuration + +# Spifly logger +log4j2.logger.spifly.name = org.apache.aries.spifly +log4j2.logger.spifly.level = WARN + +# Security audit logger +log4j2.logger.audit.name = org.apache.karaf.jaas.modules.audit +log4j2.logger.audit.level = INFO +log4j2.logger.audit.additivity = false +log4j2.logger.audit.appenderRef.AuditRollingFile.ref = AuditRollingFile + +# Appenders configuration + +# Console appender not used by default (see log4j2.rootLogger.appenderRefs) +log4j2.appender.console.type = Console +log4j2.appender.console.name = Console +log4j2.appender.console.layout.type = PatternLayout +log4j2.appender.console.layout.pattern = ${log4j2.pattern} + +# Rolling file appender +log4j2.appender.rolling.type = RollingRandomAccessFile +log4j2.appender.rolling.name = RollingFile +log4j2.appender.rolling.fileName = ${karaf.data}/log/karaf.log +log4j2.appender.rolling.filePattern = ${karaf.data}/log/karaf.log.%i +# uncomment to not force a disk flush +#log4j2.appender.rolling.immediateFlush = false +log4j2.appender.rolling.append = true +log4j2.appender.rolling.layout.type = PatternLayout +log4j2.appender.rolling.layout.pattern = ${log4j2.pattern} +log4j2.appender.rolling.policies.type = Policies +log4j2.appender.rolling.policies.size.type = SizeBasedTriggeringPolicy +log4j2.appender.rolling.policies.size.size = 16MB + +# Audit file appender +log4j2.appender.audit.type = RollingRandomAccessFile +log4j2.appender.audit.name = AuditRollingFile +log4j2.appender.audit.fileName = ${karaf.data}/security/audit.log +log4j2.appender.audit.filePattern = ${karaf.data}/security/audit.log.%i +log4j2.appender.audit.append = true +log4j2.appender.audit.layout.type = PatternLayout +log4j2.appender.audit.layout.pattern = ${log4j2.pattern} +log4j2.appender.audit.policies.type = Policies +log4j2.appender.audit.policies.size.type = SizeBasedTriggeringPolicy +log4j2.appender.audit.policies.size.size = 8MB + +# OSGi appender +log4j2.appender.osgi.type = PaxOsgi +log4j2.appender.osgi.name = PaxOsgi +log4j2.appender.osgi.filter = * + + +# help with identification of maven-related problems with pax-url-aether +#log4j2.logger.aether.name = shaded.org.eclipse.aether +#log4j2.logger.aether.level = TRACE +#log4j2.logger.http-headers.name = shaded.org.apache.http.headers +#log4j2.logger.http-headers.level = DEBUG +#log4j2.logger.maven.name = org.ops4j.pax.url.mvn +#log4j2.logger.maven.level = TRACE diff --git a/lighty/lighty-ubuntu-docker/src/main/scripts/installSdncDb.sh b/lighty/lighty-ubuntu-docker/src/main/scripts/installSdncDb.sh new file mode 100644 index 00000000..efd7fe02 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/scripts/installSdncDb.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# 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========================================================= +### + +CCSDK_HOME=${CCSDK_HOME:-/opt/onap/ccsdk} +MYSQL_PASSWD=${MYSQL_PASSWD:-openECOMP1.0} + +SDNC_DB_USER=${SDNC_DB_USER:-sdnctl} +SDNC_DB_PASSWD=${SDNC_DB_PASSWD:-gamma} +SDNC_DB_DATABASE=${SDN_DB_DATABASE:-sdnctl} + + +# Create tablespace and user account +mysql -h dbhost -u root -p${MYSQL_PASSWD} mysql <<-END +CREATE DATABASE ${SDNC_DB_DATABASE}; +CREATE USER '${SDNC_DB_USER}'@'localhost' IDENTIFIED BY '${SDNC_DB_PASSWD}'; +CREATE USER '${SDNC_DB_USER}'@'%' IDENTIFIED BY '${SDNC_DB_PASSWD}'; +GRANT ALL PRIVILEGES ON ${SDNC_DB_DATABASE}.* TO '${SDNC_DB_USER}'@'localhost' WITH GRANT OPTION; +GRANT ALL PRIVILEGES ON ${SDNC_DB_DATABASE}.* TO '${SDNC_DB_USER}'@'%' WITH GRANT OPTION; +commit; +END + +if [ -f ${CCSDK_HOME}/data/odlsli.dump ] +then +mysql -h dbhost -u root -p${MYSQL_PASSWD} sdnctl < ${CCSDK_HOME}/data/odlsli.dump +fi diff --git a/lighty/lighty-ubuntu-docker/src/main/scripts/startODL.sh b/lighty/lighty-ubuntu-docker/src/main/scripts/startODL.sh new file mode 100644 index 00000000..d3e8b7c6 --- /dev/null +++ b/lighty/lighty-ubuntu-docker/src/main/scripts/startODL.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +### +# ============LICENSE_START======================================================= +# openECOMP : SDN-C +# ================================================================================ +# Copyright (C) 2017 AT&T Intellectual Property. All rights +# reserved. +# ================================================================================ +# 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========================================================= +### + + +# Install SDN-C platform components if not already installed and start container + +ODL_ADMIN_PASSWORD=${ODL_ADMIN_PASSWORD:-Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U} +CCSDK_HOME=${CCSDK_HOME:-/opt/onap/ccsdk} +SLEEP_TIME=${SLEEP_TIME:-120} +MYSQL_PASSWD=${MYSQL_PASSWD:-openECOMP1.0} + + +# +# Wait for database +# +echo "Waiting for mysql" +until mysql -h dbhost -u root -p${MYSQL_PASSWD} mysql &> /dev/null +do + printf "." + sleep 1 +done +echo -e "\nmysql ready" + +echo "Installing SDN-C database" +${CCSDK_HOME}/bin/installSdncDb.sh +if [ -x ${CCSDK_HOME}/svclogic/bin/install.sh ] +then + echo "Installing directed graphs" + ${CCSDK_HOME}/svclogic/bin/install.sh +fi + +exec java -jar opt/lighty/ccsdk-lighty-distribution-0.5.0-SNAPSHOT/ccsdk-lighty-distribution-0.5.0-SNAPSHOT.jar /opt/onap/ccsdk/data/properties/lightyCcsdkConfig.json diff --git a/lighty/lighty-ubuntu-docker/src/main/stores/truststore.onap.client.jks b/lighty/lighty-ubuntu-docker/src/main/stores/truststore.onap.client.jks new file mode 100755 index 0000000000000000000000000000000000000000..28afd8fa74c18826ecf9555db1c5a52c250ba6d6 GIT binary patch literal 117990 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 + + 4.0.0 + + + org.onap.ccsdk.distribution + distribution-root + 0.6.0-SNAPSHOT + + + distribution-lighty + pom + + ccsdk-distribution :: lighty + Creates Lighty container + + + ccsdk-lighty-module + ccsdk-lighty-distribution + lighty-ubuntu-docker + + diff --git a/pom.xml b/pom.xml index b02e5d07..1c58eb5b 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ alpine ubuntu opendaylight + lighty odlsli dgbuilder dgbuilder-docker -- 2.16.6