I am working on an opendaylight project that uses apache karaf. At the start of the program, I need karaf to have some features installed. Currently (and this works) I manually type this into the shell and the features get installed:
$ bin/karaf
Apache Karaf starting up. Press Enter to open the shell now...
100% [========================================================================]
Karaf started in 9s. Bundle stats: 409 active, 410 total
________ ________ .__ .__ .__ __
\_____ \ ______ ____ ____ \______ \ _____ ___.__.| | |__| ____ | |___/ |_
/ | \\____ \_/ __ \ / \ | | \\__ \< | || | | |/ ___\| | \ __\
/ | \ |_> > ___/| | \| ` \/ __ \\___ || |_| / /_/ > 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>feature:install odl-restconf odl-mdsal-apidocs odl-openflowplugin-flow-services-rest odl-openflowplugin-app-table-miss-enforcer odl-openflowplugin-nxm-extensions odl-restconf-all odl-openflowplugin-flow-services
opendaylight-user@root>
All this works. However, what I need is for this feature install to occur at the start automatically. I am aware there is a shell.init.script
file and I have attempted to add this line to the botton of it:
feature:install odl-restconf odl-mdsal-apidocs odl-openflowplugin-flow-services-rest odl-openflowplugin-app-table-miss-enforcer odl-openflowplugin-nxm-extensions odl-restconf-all odl-openflowplugin-flow-services
But when I do this, I get the following error:
/opt/opendaylight-0.11.0/etc/shell.init.script: Command not found: feature:install
I am also aware that adding a featuresBoot element to org.apache.karaf.features.cfg
featuresBoot = odl-restconf
(I shortened it to just one feature for ease of testing)
And I get this error:
org.apache.felix.resolver.reason.ReasonException: Unable to resolve root: missing requirement [root] osgi.identity; osgi.identity=odl-restconf; type=karaf.feature; version="[1.10.0,1.10.0]"; filter:="(&(osgi.identity=odl-restconf)(type=karaf.feature)(version>=1.10.0)(version<=1.10.0))" [caused by: Unable to resolve odl-restconf/1.10.0: missing requirement [odl-restconf/1.10.0] osgi.identity; osgi.identity=odl-restconf-nb-rfc8040; type=karaf.feature; version="[1.10.0,1.10.0]" [caused by: Unable to resolve odl-restconf-nb-rfc8040/1.10.0: missing requirement [odl-restconf-nb-rfc8040/1.10.0] osgi.identity; osgi.identity=odl-restconf-common; type=karaf.feature; version="[1.10.0,1.10.0]" [caused by: Unable to resolve odl-restconf-common/1.10.0: missing requirement [odl-restconf-common/1.10.0] osgi.identity; osgi.identity=odl-mdsal-broker; type=karaf.feature; version="[1.10.0,1.10.0]" [caused by: Unable to resolve odl-mdsal-broker/1.10.0: missing requirement [odl-mdsal-broker/1.10.0] osgi.identity; osgi.identity=org.opendaylight.controller.sal-binding-broker-impl; type=osgi.bundle; version="[1.10.0,1.10.0]"; resolution:=mandatory [caused by: Unable to resolve org.opendaylight.controller.sal-binding-broker-impl/1.10.0: missing requirement [org.opendaylight.controller.sal-binding-broker-impl/1.10.0] osgi.wiring.package; filter:="(&(osgi.wiring.package=org.osgi.service.blueprint)(version>=1.0.0)(!(version>=2.0.0)))"]]]]]
So, I can tell that karaf is at least acknowledging the shell.init.script and org.apache.karaf.features.cfg, however I am clearly using the wrong syntax. I have exhausted my googling in finding the right syntax or finding examples of this. In fact, when I do google for this issue, I get advice along the lines of "use the shell.init.script" file, without an example or a link to documentation for how to use it.
For example, here is a similar question script to run commands at start of apache karaf but the answers really aren't full or complete. I don't know where to put the suggested commands, etc.
Anyway, I hope someone here can show me what specific command one uses in either shell.init.script or org.apache.karaf.features.cfg to accomplish this goal. (The goal being the equivalent initialization command to accomplish what I can successfully do manually as noted at the top)
Update: I also tried this type of command:
echo "feature:install odl-restconf odl-mdsal-apidocs odl-openflowplugin-flow-services-rest odl-openflowplugin-app-table-miss-enforcer odl-openflowplugin-nxm-extensions odl-restconf-all odl-openflowplugin-flow-services" | /opt/opendaylight-0.11.0/bin/karaf
Which also didn't work. I don't get any error messages, I just know my restconf isn't working. Funny enough I did see all the features getting piped into the karaf shell, and the shell did seem to freeze up (seemingly like it was processing the command) but no-go after the cursor returned to me.
Thanks to @jamo as his answer lead me to the answer. I needed to only add this to etc/org.apache.karaf.features.cfg:
featuresBoot = odl-restconf,odl-mdsal-apidocs,odl-openflowplugin-flow-services-rest,odl-openflowplugin-app-table-miss-enforcer,odl-openflowplugin-nxm-extensions,odl-restconf-all,odl-openflowplugin-flow-services, 25921329-8d07-420b-af13-94948bf1a78d
I believe the trick was having the final 25921329-8d07-420b-af13-94948bf1a78d
which is some hex value that is in the default cfg file and I ensure it stayed in there.