Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

Launching CCSDK

SDN-R is an extension of CCSDK (Common Controller Software Development KIt), and SDN-R uses the same procedure as CCSDK to create a running instance.   To To begin, clone the ccsdk/distribution repository and look at the docker-compose.yml file in ccsdk/distribution/src/main/yaml.

...

Here are annotated contents of that file (master branch July 25, 2018, version 0.3.0-SNAPSHOTDec. 4, 2018).  The current value of the CCSDK_DOCKER_IMAGE_VERSION environment variable can be found in the version manifest file of the ONAP integration repository in the directory integration/version-manifest /src/main/resources/docker-manifest.csv (for releases; docker-manifest-staging for current images).

Executing this docker-compose.yml file will create and launch the containers.  Navigate to <path>/ccsdk/distribution/src/main/yaml and enter the commands as in the sample terminal session below (the credentials to login to NEXUS_DOCKER_REPO are docker:docker).  If you are executing this command for the first time, you will see output as the images are downloaded and extracted.

...

And you can browse to the OpenDaylight apidoc/explorer (http://localhost:8383/apidoc/explorer/index.html).  Note that port 8383 in the host is forwarded to port 8181 in the odlsli container, and the credentials are not the usual "admin:admin."  The password is shown below in the annotated startODL.sh file below (user name: admin; password: Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U).

Image Modified

Working with the CCSDK containers

You can work with the CCSDK containers as you would any docker container, for example:

Code Block
titleBash session with the odlsli container
%: docker exec -t -i ccsdk_odlsli_container /bin/bash -c 'TERM=xterm exec /bin/bash'
root@744e3cc8a7fb:/# pwd
/
root@744e3cc8a7fb:/# echo $ODL_HOME
/opt/opendaylight/current
root@744e3cc8a7fb:/# echo $SDNC_CONFIG_DIR/
/opt/onap/ccsdk/data/properties/
root@744e3cc8a7fb:/# ps -elf | grep opendaylight
4 S root         1     0  0  80   0 -  1126 wait   18:34 ?        00:00:00 /bin/sh /opt/opendaylight/current/bin/karaf
0 S root        96     1  8  80   0 - 2002545 futex_ 18:34 ?      00:10:07 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Djava.security.properties=/opt/opendaylight/current/etc/odl.java.security -server -Xms128M -Xmx2048m -XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Djava.security.egd=file:/dev/./urandom -Djava.endorsed.dirs=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/endorsed:/usr/lib/jvm/java-8-openjdk-amd64/lib/endorsed:/opt/opendaylight/current/lib/endorsed -Djava.ext.dirs=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/lib/jvm/java-8-openjdk-amd64/lib/ext:/opt/opendaylight/current/lib/ext -Dkaraf.instances=/opt/opendaylight/current/instances -Dkaraf.home=/opt/opendaylight/current -Dkaraf.base=/opt/opendaylight/current -Dkaraf.data=/opt/opendaylight/current/data -Dkaraf.etc=/opt/opendaylight/current/etc -Dkaraf.restart.jvm.supported=true -Djava.io.tmpdir=/opt/opendaylight/current/data/tmp -Djava.util.logging.config.file=/opt/opendaylight/current/etc/java.util.logging.properties -Dkaraf.startLocalConsole=true -Dkaraf.startRemoteShell=true -classpath /opt/opendaylight/current/lib/boot/org.apache.karaf.diagnostic.boot-4.0.10.jar:/opt/opendaylight/current/lib/boot/org.apache.karaf.jaas.boot-4.0.10.jar:/opt/opendaylight/current/lib/boot/org.apache.karaf.main-4.0.10.jar:/opt/opendaylight/current/lib/boot/org.osgi.core-6.0.0.jar org.apache.karaf.main.Main
0 S root      1186  1164  0  80   0 -  2821 pipe_w 20:30 pts/0    00:00:00 grep --color=auto opendaylight
root@744e3cc8a7fb:/# cd $ODL_HOME
root@cded16733254:/opt/opendaylight# ls -l
total 76
-rw-r--r-- 1 root root  1126 Apr 19 02:59 CONTRIBUTING.markdown
-rw-r--r-- 1 root root 11266 Apr 19 02:59 LICENSE
-rw-r--r-- 1 root root   172 Apr 19 02:59 README.markdown
drwxr-xr-x 1 root root  4096 Jul 26 18:26 bin
-rw-r--r-- 1 root root    76 Apr 19 02:59 build.url
drwxr-xr-x 1 root root  4096 Jul 26 18:26 configuration
lrwxrwxrwx 1 root root    17 Jul 26 12:47 current -> /opt/opendaylight
drwxr-xr-x 3 root root  4096 Jul 26 18:26 daexim
drwxr-xr-x 1 root root  4096 Jul 26 18:26 data
drwxr-xr-x 2 root root  4096 Apr 19 02:59 deploy
drwxr-xr-x 1 root root  4096 Jul 26 18:26 etc
drwxr-xr-x 2 root root  4096 Jul 26 18:25 instances
drwxr-xr-x 2 root root  4096 Jul 26 18:26 journal
lrwxrwxrwx 1 root root    17 Jul 26 12:47 karaf-0.8.1 -> /opt/opendaylight
-rw-r--r-- 1 root root     3 Jul 26 18:25 karaf.pid
drwxr-xr-x 5 root root  4096 Apr 19 02:59 lib
-rw-r--r-- 1 root root     0 Jul 26 18:25 lock
drwxr-xr-x 2 root root  4096 Jul 26 18:26 snapshots
drwxr-xr-x 1 root root  4096 Jul 26 13:00 system
-rw-r--r-- 1 root root  1926 Apr 19 02:59 taglist.log
root@cded16733254:/opt/opendaylight# ls -l bin
total 3316
-rwxr-xr-x 1 root root 3231548 Apr 19 02:59 aaa-cli-jar.jar
-rwxr-xr-x 1 root root    3243 Apr 19 02:59 client
-rw-r--r-- 1 root root    4334 Apr 19 02:59 client.bat
-rwxr-xr-x 1 root root    8328 Apr 19 02:59 configure-cluster-ipdetect.sh
-rwxr-xr-x 1 root root    7388 Apr 19 02:59 configure_cluster.sh
drwxr-xr-x 2 root root    4096 Apr 19 02:59 contrib
-rwxr-xr-x 1 root root     722 Apr 19 02:59 custom_shard_config.txt
-rw-r--r-- 1 root root   16071 Jul 26 18:26 idmtool
-rwxr-xr-x 1 root root    9999 Apr 19 02:59 inc
-rwxr-xr-x 1 root root    4090 Apr 19 02:59 instance
-rw-r--r-- 1 root root    5364 Apr 19 02:59 instance.bat
-rwxr-xr-x 1 root root   11560 Apr 19 02:59 karaf
-rw-r--r-- 1 root root   16816 Apr 19 02:59 karaf.bat
-rwxr-xr-x 1 root root    2924 Apr 19 02:59 set_persistence.sh
-rwxr-xr-x 1 root root    2284 Apr 19 02:59 setenv
-rw-r--r-- 1 root root    2330 Apr 19 02:59 setenv.bat
-rwxr-xr-x 1 root root    3227 Apr 19 02:59 shell
-rw-r--r-- 1 root root    4702 Apr 19 02:59 shell.bat
-rwxr-xr-x 1 root root    2016 Apr 19 02:59 start
-rw-r--r-- 1 root root    2495 Apr 19 02:59 start.bat
-rwxr-xr-x 1 root root    1865 Apr 19 02:59 status
-rw-r--r-- 1 root root    2448 Apr 19 02:59 status.bat
-rwxr-xr-x 1 root root    1867 Apr 19 02:59 stop
-rw-r--r-- 1 root root    2444 Apr 19 02:59 stop.bat
root@744e3cc8a7fb:/opt/opendaylight/current# ./bin/client
Logging in as karaf

    ________                       ________                .__  .__       .__     __
    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_
     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \<   |  ||  | |  |/ ___\|  |  \   __\
    /    |    \  |_> >  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  >   Y  \  |
    \_______  /   __/ \___  >___|  /_______  (____  / ____||____/__\___  /|___|  /__|
            \/|__|        \/     \/        \/     \/\/            /_____/      \/


Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown OpenDaylight.

opendaylight-user@root>

The entrypoint script for the odlsli container

The entrypoint script for the odlsli container is /opt/onap/ccsdk/bin/startODL.sh.  Here is the home directory and bin directory for the user ccsdk.

...

And here is the startODL.sh file:

Image Modified

Creating the ODLSLI Container

To see how the ODLSLI container is constructed, we look at the pom.xml file in the directory ccsdk/distribution/odlsli.

Image Modified

ODLSLI pom.xml initialization and dependencies

Master branch, Nov 7, 2018

Image Modified

ODLSLI pom.xml: Preliminaries and setting the version value of the ODLSLI docker image

Image Modified

ODLSLI pom.xml: Prepare the directories and files for a 'docker build' command

Rather than annotate this section of the pom.xml file - which is straightforward - I summarize the actions in the text below.  The pom.xml file uses three phases in the build life cycle to prepare the directory structure and files in ./target/docker-stage prior to building the docker image.  They are:

  • validate
    • plugin: org.codehaus.groovy.maven : gmavin-plugin (described above)
      • set the version of the ODLSLI docker image to be used in NEXUS_DOCKER_REPO
      • Note: the name of the image is set in the property 'image.name' in the pom.xml properties section.
    • plugin: maven-resources-plugin
      • goal: copy-resources
        • id: copy-dockerfile
          • copy Docker file
          • from ./src/main/docker/
          • to ./target/docker-stage/
        • id: copy-scripts
          • copy all of the scripts (*.sh files)
          • from ./src/main/scripts/ 
          • to ./target/docker-stage/opt/onap/ccsdk/bin/
        • id: copy-odl-resources
          • copy the files:
            • idmlight.db.mv.db

            • org.ops4j.pax.logging.cfg

            • install_ccsdk.yml

            • ansible-sources.list

          • from ./src/main/resources/ 
          • to ./target/docker-stage/
        • id: copy-config
          • copy the file org.ops4j.pax.logging.cfg
          • from ./src/main/resources/
          • to ./target/docker-stage/
        • id: copy-data
          • copy all of the MySQL databases (*.dump)
          • from ./src/main/resources/ 
          • to ./target/docker-stage/opt/onap/ccsdk/data/
        • id: copy-properties
          • copy all of the properties files (*.properties)
          • from ./src/main/properties/ 
          • to ./target/docker-stage/opt/onap/ccsdk/data/properties/
        • id: copy-keystores
          • copy all *.jks files
          • from ./src/main/stores/ 
          • to ./target/docker-stage/opt/onap/ccsdk/data/stores/
  • generate-sources
    • plugin: org.apache.maven.plugins : maven-dependency-plugin
      • goal: unpack-dependencies
        • id: "unpack features"
          • unzip all of the dependencies
          • from a local or remote Maven repository
          • to ./target/docker-stage
          • Note: all of the zipped features are rooted at the "system" folder, so they will be unzipped into the proper structure for the OpenDaylight feature repository.
      • goal: unpack
        • id: "unpack dgs"
          • Unzip the zipped artifact org.onap.ccsdk.distribution : platform-logic-installer : ${project.version}
          • from a local or remote Maven repository
          • to ./target/docker-stage/opt/onap/ccsdk/
          • Note: this unzips the artifact into the home directory of user ccsdk in the docker container
  • process-sources
    • plugin: org.codehaus.mojo : exec-maven-plugin
      • goal: exec
        • id: "change shell permissions"
          • This executes the following command in the local computer:
          • find ./target/docker-stage/opt/onap/ccsdk -name "*.sh" -exec chmod +x {} \;
          • I.e., make all of the bash scripts in the ccsdk home directory executable.

ODLSLI pom.xml: Docker Profile

The "docker" profile defines an the additional "package" phase in which the docker image is built and deployed to NEXUS_DOCKER_REPO with the image name ${image.name}:${project.docker.latesttag.version}, which currently translates to "onap/ccsdk-odlsli-image:0.3-STAGING-latest."    I expect that the "docker build profile" in the pom.xml file requires special privileges because it deploys the image .  There is also a "deploy" phase in which the generated image is pushed to NEXUS_DOCKER_REPO, but this requires special privileges.  We discuss this section below.

Image Added

The Dockerfile

We have seen how the pom.xml file create creates the ~/ccsdk/distribution/odlsli/target/docker-stage directory in preparation for building the docker image.  The next step is to inspect the Dockerfile that creates the image, discussed here.

Image Modified

Building the docker image

Using maven

One can create the image using the maven command "mvn --activate-profiles docker clean package" or equivalently "mvn -P docker clean package."  This generates these images:

Image Added

We see that a single image (all have the same IMAGE ID) is given four tags.

Using maven and 'docker build'

By running the command 'mvn clean process-sources' By running the command 'mvn clean process-sources' and getting a BUILD SUCCESS, a properly constructed directory will be created at ~/git/ccsdk/distribution/odlsli/target/docker-stage/.

...

Code Block
titlePulling and Renaming the OpenDaylight Oxygen docker image
%: docker pull ${NEXUS_DOCKER_REPO}/onap/ccsdk-odl-oxygen-image:0.3.0-SNAPSHOT
0.3.0-SNAPSHOT: Pulling from onap/ccsdk-odl-oxygen-image
95871a411089: Pull complete
f7253e37cce8: Pull complete
12d05d7bd5c4: Pull complete
db27ec99c6c2: Pull complete
8fd62e3405ff: Pull complete
ce430a842b90: Pull complete
de7dcf5d4be1: Pull complete
e3de3d1054ec: Pull complete
d66bd2234856: Pull complete
6be70fc7e3a6: Pull complete
Digest: sha256:80da6c8e0f70d0dddd2be462634b297fc0dc5256cb93619b30a66441d1a89cb8
Status: Downloaded newer image for nexus3.onap.org:10001/onap/ccsdk-odl-oxygen-image:0.3.0-SNAPSHOT
%: docker tag ${NEXUS_DOCKER_REPO}/onap/ccsdk-odl-oxygen-image:0.3.0-SNAPSHOT onap/ccsdk-odl-oxygen-image:0.3.0-SNAPSHOT
%: docker images
REPOSITORY                                                 TAG                  IMAGE ID            CREATED             SIZE
onap/ccsdk-odl-oxygen-image                                0.3.0-SNAPSHOT       bb02ebe49933        8 hours ago         1.72GB
nexus3.onap.org:10001/onap/ccsdk-odl-oxygen-image          0.3.0-SNAPSHOT       bb02ebe49933        8 hours ago         1.72GB
nexus3.onap.org:10001/onap/ccsdk-dgbuilder-image           0.3-STAGING-latest   eb208aa7f163        4 days ago          1.04GB
nexus3.onap.org:10001/onap/ccsdk-odlsli-image              0.3-STAGING-latest   665a42becd61        4 days ago          1.8GB
mysql/mysql-server                                         5.6                  8d97ef4de156        3 months ago        226MB

Running the ODLSLI pom.xml file

One can now navigate to to the ~/ccsdk/distribution/odlsli/target/docker-stage directory and build the docker image as shown here.  We tag the image with the name onap/sdnr:0.3.0-SNAPSHOT.

...

Alternatively, one can edit the docker-compose.yml file to use the newly created onap/sndr:0.3.0-SNAPSHOT image rather than the ccsdk-odlsli-image pulled from NEXUS_DOCKER_REPO.  That will also create and launch the new SDNR container.

Creating the zip installation files for karaf features

We have seen how the karaf features for CCSDK are included in the dependencies section of the pom.xml file in ~/ccsdk/distribution/odlsli/ and that the features are referenced as files with the name structure <feature-name>-installer.<version>-repo.zip.  The next step is to understand how these zip installation files are created.  A good example is the "sliapi" feature, which is in the gerrit repository ccsdk/sli/core, shown here.

...

The sliapi directory contains the usual directories for a karaf feature with an additional directory "installer."  This directory contains the code that creates the installation zip file that is referenced in the dependencies section of the ODLSLI pom.xml file.

Context for the installer

Anchor
component-meta-feature
component-meta-feature
OpenDaylight Guidelines and Component Meta-Features

CCSDK is based on OpenDaylight and follows the recommended practices of that group.  There are documented guidelines for karaf features, and another aspect is what OpenDaylight calls "component meta-features," in which several related features are grouped together to simplify their installation.  For example, these features implement NETCONF in OpenDaylight:

...

Rather than install each feature individually in the karaf client, one can use the component meta-feature "odl-netconf-all" and install all of the features with the single command "feature:install odl-netconf-all."  Recall that the Dockerfile for ccsdk_odlsli_container set sets these environment variables:

...

So CCSDK has created a component meta-feature for each of the SLI repositories, and we will encounter commands in the Maven pom.xml files and directory and file structures to implement them.

Inspecting the installer pom.xml file

Below is the annotated pom.xml file.  It executes two maven phases: prepare-package and package.  Maven executes the prepare-package phase before the package phase, although, in the pom.xml file, the prepare-package code appears after the prepare code.  In the annotations, the sequence is indicated by number.

Anchor
procedure-to-install-ccsdk-features
procedure-to-install-ccsdk-features
Procedure to install CCSDK features prior to Casablanca

Another aspect for the context of the installer is that CCSDK changed the procedure to install karaf features from Beijing to Casablanca, but some elements of the prior procedure are still present.  Prior to Casablanca, all of the CCSDK features were copied into the CCSDK home directory (/opt/onap/ccsdk) in the folder '/opt/onap/ccsdk/features/,' and the entry point script in the Docker container installed them.  The contents of the CCSDK home directory and features directory for Beijing are shown here.

Image Added

As we can see, each feature is in a directory with the name "ccsdk-<feature-name>," and the directory contains a zip file with the name "ccsdk-<feature-name>-<version>.zip" and an 'install-feature.sh' script.  The zip file is simply the maven repository for the feature, as shown here for ccsdk-sliapi.

Image Added

And here is the 'install-feature.sh' script.

Image Added

Anchor
sliapi-installer-pom
sliapi-installer-pom
Inspecting the installer pom.xml file

Below is the annotated pom.xml file, which executes three maven phases in sequence: validate, prepare-package and package.  However, the commands in the code do not appear in the sequence in which they are executed.  For the sake of clarity, we discuss the commands in the sequence in which are executed.

Installer pom.xml file part 0

Image Added

install-feature.sh script

As we described in a previous section, the installation folder (<features.boot>) for a particular feature contains the zipped maven repository and an installation script for that feature.  The script is below, and as you can see, it references the <features.respositories> and <features.boot> properties in commands sent to the karaf client.

Code Block
languagebash
titleinstall-feature.sh
ODL_HOME=${ODL_HOME:-/opt/opendaylight/current}
ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client}
INSTALLERDIR=$(dirname $0)

REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip

if [ -f ${REPOZIP} ]
then
        unzip -d ${ODL_HOME} ${REPOZIP}
else
        echo "ERROR : repo zip ($REPOZIP) not found"
        exit 1
fi

${ODL_KARAF_CLIENT} feature:repo-add ${features.repositories}
${ODL_KARAF_CLIENT} feature:install ${features.boot}

Installer pom.xml file part 1

Continuing with the pom.xml file in the installer module, we now discuss the command first executed in the "validate" phase.

Image Added

To see the result of this command, we show the changes in the installer directory after it is executed.  We begin with 'mvn clean' and then execute part one and show the result.

Image Added

As expected, install-feature.sh has been copied into target/stage and the parameter values have been inserted into the placeholders.

Installer pom.xml file part 2

Now the command executed in the "prepare-package" phase.

Image Added

And we show the result of executing the command.

Image Added

The maven repositories have been copied into installer/target/assembly with the correct structure and properly rooted at system/, although, as mentioned, the artifact "features-sliapi" in not included.

Installer pom.xml part 3

Parts 1 and 2 have copied all of the necessary maven repositories and scripts into the correct folder structure and with the correct parameter values.  The pom.xml file now zips them up.

Image Added

assemble_mvnrepo_zip.xml

Image Added

And after it is executed...

Image Added

The repositories have been properly zipped up into installer/target/stage/ccsdk-sliapi-0.3.0-SNAPSHOT-repo.zip.

Installer pom.xml part 4

And the final step.

Image Added

assemble_installer_zip.xml

Image Added

And after it is executed...

Image Added

Voilà!

Installation in Casablanca

Setting the startup features

We have described the installation procedure prior to Casablanca, and we now turn to the procedure beginning in Casablanca.  As we mentioned earlier, OpenDaylight is configured in Casablanca to install the CCSDK features upon booting up rather than afterwards in a bash script, and "component meta-features" are used rather than the individual features. OpenDaylight boots up much more quickly using this procedure.  Features to install at boot time are configured in $ODL_HOME/etc/org.apache.karaf.features.cfg in two parameters: featuresRepositories and featuresBoot.  We begin by looking in ccsdk/distribution/odlsli/src/main/docker/Dockerfile for the FROM IMAGE of the CCSDK container (master branch, 8/25/2018)::

%: head Dockerfile
# Base ubuntu with added packages needed for open ecomp
FROM onap/ccsdk-odl-oxygen-image:${project.version}
MAINTAINER CCSDK Team (onap-ccsdk@lists.onap.org)
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
ENV ODL_HOME /opt/opendaylight
ENV SDNC_CONFIG_DIR /opt/onap/ccsdk/data/properties
ENV CCSDK_SLI_CORE_REPO mvn:org.onap.ccsdk.sli.core/ccsdk-sli-core-all/${ccsdk.sli.core.version}/xml/features
ENV CCSDK_SLI_ADAPTORS_REPO mvn:org.onap.ccsdk.sli.adaptors/ccsdk-sli-adaptors-all/${ccsdk.sli.adaptors.version}/xml/features
ENV CCSDK_SLI_NORTHBOUND_REPO mvn:org.onap.ccsdk.sli.northbound/ccsdk-sli-northbound-all/${ccsdk.sli.northbound.version}/xml/features
ENV CCSDK_SLI_PLUGINS_REPO mvn:org.onap.ccsdk.sli.plugins/ccsdk-sli-plugins-all/${ccsdk.sli.plugins.version}/xml/features

In "onap/ccsdk-odl-oxygen-image," the file $ODL_HOME/etc/org.apache.karaf.features.cfg sets these values for the two startup parameters:

  • featuresRepositories = file:${karaf.home}/etc/290021b0-51f7-4e02-8efa-007cad16f73a.xml
  • featuresBoot = 0af5d86a-980c-48a9-a02d-bdac71ff8529

Startup features in the Dockerfile FROM IMAGE

These universally unique identifiers (UUIDs) identify the startup features.  featuresRepositories references the file $ODL_HOME/etc/290021b0-51f7-4e02-8efa-007cad16f73a.xml, shown here.

root@6cd44c751205:/opt/opendaylight/current/etc# cat $ODL_HOME/etc/290021b0-51f7-4e02-8efa-007cad16f73a.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
     <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="290021b0-51f7-4e02-8efa-007cad16f73a">
     <repository>mvn:org.apache.karaf.features/framework/4.1.5/xml/features</repository>
     <repository>mvn:org.opendaylight.integration/features-index/0.8.1/xml/features</repository>
     <repository>mvn:org.apache.karaf.features/standard/4.1.5/xml/features</repository>
     <feature name="0af5d86a-980c-48a9-a02d-bdac71ff8529" version="0.0.0">
           <feature prerequisite="false" dependency="false">framework</feature>
          <feature prerequisite="false" dependency="false">standard</feature>
          <feature prerequisite="false" dependency="false">ssh</feature>
          <bundle>mvn:org.apache.aries.quiesce/org.apache.aries.quiesce.api/1.0.0</bundle>
          <bundle>mvn:org.osgi/org.osgi.service.event/1.3.1</bundle>
          <bundle>mvn:org.bouncycastle/bcprov-jdk15on/1.59</bundle>
          <bundle>mvn:org.bouncycastle/bcpkix-jdk15on/1.59</bundle>
          <bundle>mvn:org.bouncycastle/bcprov-ext-jdk15on/1.59</bundle>
          <bundle>mvn:org.apache.felix/org.apache.felix.metatype/1.1.6</bundle>
          <bundle>mvn:org.opendaylight.odlparent/karaf.branding/3.1.0</bundle>
     </feature>
</features>

And the featuresBoot value of 0af5d86a-980c-48a9-a02d-bdac71ff8529 references the name of the feature in the xml file and pulls in all of the features and bundles included in that file.  After logging into a running docker container of the ODL oxygen image, we see that these relatively few features are installed.

No Format
opendaylight-user@root>feature:list -i
Name                                 | Version | Required | State   | Repository                           | Description
-------------------------------------+---------+----------+---------+--------------------------------------+--------------------------------------------------
aries-proxy                          | 4.1.5   |          | Started | standard-4.1.5                       | Aries Proxy
aries-blueprint                      | 4.1.5   |          | Started | standard-4.1.5                       | Aries Blueprint
feature                              | 4.1.5   |          | Started | standard-4.1.5                       | Features Support
shell                                | 4.1.5   |          | Started | standard-4.1.5                       | Karaf Shell
shell-compat                         | 4.1.5   |          | Started | standard-4.1.5                       | Karaf Shell Compatibility
deployer                             | 4.1.5   |          | Started | standard-4.1.5                       | Karaf Deployer
bundle                               | 4.1.5   |          | Started | standard-4.1.5                       | Provide Bundle support
config                               | 4.1.5   |          | Started | standard-4.1.5                       | Provide OSGi ConfigAdmin support
diagnostic                           | 4.1.5   |          | Started | standard-4.1.5                       | Provide Diagnostic support
instance                             | 4.1.5   |          | Started | standard-4.1.5                       | Provide Instance support
jaas                                 | 4.1.5   |          | Started | standard-4.1.5                       | Provide JAAS support
log                                  | 4.1.5   |          | Started | standard-4.1.5                       | Provide Log support
package                              | 4.1.5   |          | Started | standard-4.1.5                       | Package commands and mbeans
service                              | 4.1.5   |          | Started | standard-4.1.5                       | Provide Service support
system                               | 4.1.5   |          | Started | standard-4.1.5                       | Provide System support
kar                                  | 4.1.5   |          | Started | standard-4.1.5                       | Provide KAR (KARaf archive) support
ssh                                  | 4.1.5   |          | Started | standard-4.1.5                       | Provide a SSHd server on Karaf
management                           | 4.1.5   |          | Started | standard-4.1.5                       | Provide a JMX MBeanServer and a set of MBeans in
wrap                                 | 0.0.0   |          | Started | standard-4.1.5                       | Wrap URL handler
standard                             | 4.1.5   |          | Started | standard-4.1.5                       | Wrap feature describing all features part of a st
0af5d86a-980c-48a9-a02d-bdac71ff8529 | 0.0.0   | x        | Started | 290021b0-51f7-4e02-8efa-007cad16f73a |

Editing the parameters for the startup karaf features

The above is the starting point for the CCSDK image.  Recall that the Dockerfile for the CCSDK image contains these commands:

No Format
ENV ODL_HOME /opt/opendaylight
ENV SDNC_CONFIG_DIR /opt/onap/ccsdk/data/properties
ENV CCSDK_SLI_CORE_REPO mvn:org.onap.ccsdk.sli.core/ccsdk-sli-core-all/${ccsdk.sli.core.version}/xml/features
ENV CCSDK_SLI_ADAPTORS_REPO mvn:org.onap.ccsdk.sli.adaptors/ccsdk-sli-adaptors-all/${ccsdk.sli.adaptors.version}/xml/features
ENV CCSDK_SLI_NORTHBOUND_REPO mvn:org.onap.ccsdk.sli.northbound/ccsdk-sli-northbound-all/${ccsdk.sli.northbound.version}/xml/features
ENV CCSDK_SLI_PLUGINS_REPO mvn:org.onap.ccsdk.sli.plugins/ccsdk-sli-plugins-all/${ccsdk.sli.plugins.version}/xml/features
...
RUN cat $ODL_HOME/etc/org.apache.karaf.features.cfg.orig | sed -e "\|featuresRepositories|s|$|, ${CCSDK_SLI_CORE_REPO}, ${CCSDK_SLI_ADAPTORS_REPO}, ${CCSDK_SLI_NORTHBOUND_REPO}, ${CCSDK_SLI_PLUGINS_REPO}|" > $ODL_HOME/etc/org.apache.karaf.features.cfg
RUN echo featuresBoot=config,standard,region,package,kar,ssh,management,odl-restconf-all,odl-mdsal-all,odl-mdsal-apidocs,odl-daexim-all,ccsdk-sli-core-all,ccsdk-sli-adaptors-all,ccsdk-sli-northbound-all,ccsdk-sli-plugins-all >> $ODL_HOME/etc/org.apache.karaf.features.cfg

These commands append new repositories to featuresRepositories and set featuresBoot to the desired feature names. (Note: the final content of the file is not what I expect from these commands, but the objective is achieved, i.e., the parameters are set to the correct values.)  We inspect the features.xml file for the repository containing our example feature sliapi.

ENV CCSDK_SLI_CORE_REPO mvn:org.onap.ccsdk.sli.core/ccsdk-sli-core-all/${ccsdk.sli.core.version}/xml/features

No Format
% cd ~/.m2/repository/org/onap/ccsdk/sli/core/ccsdk-sli-core-all/0.3.0-SNAPSHOT
% cat ccsdk-sli-core-all-0.3.0-SNAPSHOT-features.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="ccsdk-sli-core-all">
    <repository>mvn:org.onap.ccsdk.sli.core/ccsdk-slicore-utils/0.3.0-SNAPSHOT/xml/features</repository>
    <repository>mvn:org.onap.ccsdk.sli.core/ccsdk-dblib/0.3.0-SNAPSHOT/xml/features</repository>
    <repository>mvn:org.onap.ccsdk.sli.core/ccsdk-filters/0.3.0-SNAPSHOT/xml/features</repository>
    <repository>mvn:org.onap.ccsdk.sli.core/ccsdk-sli/0.3.0-SNAPSHOT/xml/features</repository>
    <repository>mvn:org.onap.ccsdk.sli.core/ccsdk-sliapi/0.3.0-SNAPSHOT/xml/features</repository>
    <repository>mvn:org.onap.ccsdk.sli.core/ccsdk-sliPluginUtils/0.3.0-SNAPSHOT/xml/features</repository>
    <feature name="ccsdk-sli-core-all" description="ccsdk-sli-core :: features :: ccsdk-sli-core-all" version="0.3.0.SNAPSHOT">
        <details>Root POM to be used in place of odlparent for CCSDK based projects</details>
        <feature version="0.3.0.SNAPSHOT" prerequisite="false" dependency="false">ccsdk-slicore-utils</feature>
        <feature version="0.3.0.SNAPSHOT" prerequisite="false" dependency="false">ccsdk-dblib</feature>
        <feature version="0.3.0.SNAPSHOT" prerequisite="false" dependency="false">ccsdk-filters</feature>
        <feature version="0.3.0.SNAPSHOT" prerequisite="false" dependency="false">ccsdk-sli</feature>
        <feature version="0.3.0.SNAPSHOT" prerequisite="false" dependency="false">ccsdk-sliapi</feature>
        <feature version="0.3.0.SNAPSHOT" prerequisite="false" dependency="false">ccsdk-sliPluginUtils</feature>
    </feature>
</features>

We see that the component meta-feature ccsdk-sli-core-all contains the repository and name for all of the features in the ccsdk/sli/core repository, including sliapi.

Constructing the component meta-feature

To see how the ccsdk-sli-core-all is constructed, we inspect the features directory in ccsdk/sli/core.

Image Added

The pom.xml file of interest is features/ccsdk-sli-core-all/pom.xml, which we show here in its entirety.

No Format
%: cat pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>

        <parent>
                <groupId>org.onap.ccsdk.parent</groupId>
                <artifactId>single-feature-parent</artifactId>
                <version>1.1.0-SNAPSHOT</version>
                <relativePath />
        </parent>

        <groupId>org.onap.ccsdk.sli.core</groupId>
        <artifactId>ccsdk-sli-core-all</artifactId>
        <version>0.3.0-SNAPSHOT</version>
        <packaging>feature</packaging>

        <name>ccsdk-sli-core :: features :: ${project.artifactId}</name>
        <dependencyManagement>
                <dependencies>
                        <dependency>
                                <groupId>org.opendaylight.mdsal.model</groupId>
                                <artifactId>mdsal-model-artifacts</artifactId>
                                <version>${odl.mdsal.model.version}</version>
                                <type>pom</type>
                                <scope>import</scope>
                        </dependency>
                        <dependency>
                                <groupId>org.opendaylight.controller</groupId>
                                <artifactId>mdsal-artifacts</artifactId>
                                <version>${odl.mdsal.version}</version>
                                <type>pom</type>
                                <scope>import</scope>
                        </dependency>
                </dependencies>
        </dependencyManagement>

        <dependencies>
                <dependency>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>ccsdk-slicore-utils</artifactId>
                        <version>${project.version}</version>
                        <type>xml</type>
                        <classifier>features</classifier>
                </dependency>
                <dependency>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>ccsdk-dblib</artifactId>
                        <version>${project.version}</version>
                        <type>xml</type>
                        <classifier>features</classifier>
                </dependency>
                <dependency>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>ccsdk-filters</artifactId>
                        <version>${project.version}</version>
                        <type>xml</type>
                        <classifier>features</classifier>
                </dependency>
                <dependency>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>ccsdk-sli</artifactId>
                        <version>${project.version}</version>
                        <type>xml</type>
                        <classifier>features</classifier>
                </dependency>
                <dependency>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>ccsdk-sliapi</artifactId>
                        <version>${project.version}</version>
                        <type>xml</type>
                        <classifier>features</classifier>
                </dependency>
                <dependency>
                        <groupId>${project.groupId}</groupId>
                        <artifactId>ccsdk-sliPluginUtils</artifactId>
                        <version>${project.version}</version>
                        <type>xml</type>
                        <classifier>features</classifier>
                </dependency>
        </dependencies>
</project>

We see that it includes dependencies for the feature.xml file for each feature in the ccsdk/sli/core repository and generates the feature.xml file (packaging>feature</packaging>) for ccsdk-sli-core-all.  I believe that all of the other folders in ccsdk/sli/core/features are vestigial or - at least - uninvolved in the installation of features in ccsdk_odlsli_container.Image Removed