OpenDaylight(Oxygen)でFeature間のコンフリクト?
概要
結構前の資料だが、この辺りの資料を見て、YANGとそれを使ったMD-SALのしくみが気になったので、OpenDaylightを試してみようと思った。
あまり最近の参考になりそうなページがない…かなり古く画像のリンクも切れてしまっているが、こちらを参考にしてやってみた。
また、dlux(UI)の部分についてはこちらを参考にした。
Mininetで構築したスイッチをODLから管理する(まずはGUIでトポロジー確認)、というのをやりたかったが、結果としてうまく動かなかった。機能間のコンフリクト?が起きているのか、原因の詳細まで解析していない。記事にある古いバージョンのODLを使えばうまくいくのかもしれない。
環境
- VirtualBox 6.1
- Ubuntu 18.04
Ubuntu VMのメモリ/CPUは4GB RAM, 2 Core (最初1GB RAMだったがさすがに足りなくエラーになった。CPU使用率も常に100%いくので、もっと増やした方がいい)
- OpenDaylight Oxygen(0.8.4)
【SDNチャレンジ】 第10回 OpenDaylight動作編① ではかなり前のHeliumリリースを使っているが、JDK1.7を入れたくない、できれば最新に近いバージョンで動いてくれたら嬉しい、という淡い期待を持って、Oxygenを選択。
※最新版(Aluminium)は、dlux(UI)やl2switchが未対応のようだったので、dluxが動きそうなOxygenを使うことにした。
参考:I can't install dlux and l2switch features in opendaylight - Stack Overflow
※dluxについては、このドキュメントページがあったので、Oxygenで動きそうと思った。 Using the OpenDaylight User Interface (DLUX) — OpenDaylight Documentation Oxygen documentation
実施内容
JDK8をインストール
# apt install openjdk-8-jre-headless
OpenDaylight Oxygen (0.8.4)をダウンロード
# wget https://nexus.opendaylight.org/content/repositories/opendaylight.release/org/opendaylight/integration/karaf/0.8.4/karaf-0.8.4.zip # unzip karaf-0.8.4.zip # cd karaf-0.8.4
ODLを起動
# ./bin/karaf karaf: JAVA_HOME not set; results may vary Apache Karaf starting up. Press Enter to open the shell now... 100% [========================================================================] Karaf started in 0s. Bundle stats: 13 active, 13 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という形のプラグイン形式(OSGi)になっており、必要なものを読み込んで使うようだ。
まずodl-l2switch-switchを入れてみる。
opendaylight-user@root>feature:install odl-l2switch-switch
別ターミナルでポート状態確認。
# ss -antu | grep -e 6653 -e 6633 tcp LISTEN 0 128 *:6653 *:* tcp LISTEN 0 128 *:6633 *:*
6653と6633がLISTENになった。 次にodl-dlux-coreを入れてみる。
opendaylight-user@root>feature:install odl-dlux-core
ここでUI(http://[my_ip]:8181/index.html)にアクセスしてみると、なぜかhttp://[my_ip]:8181/index.html#/topologyに飛ばされ、画面は灰色。
試しにodl-dluxapps-nodesを追加してみる。
opendaylight-user@root>feature:install odl-dluxapps-nodes
UIは見れるようになったが、6653と6633がLISTENされなくなってしまった。
# ss -antu | grep -e 6653 -e 6633 #
この状態でmininetを起動しても、
# mn --controller=remote *** Creating network *** Adding controller Unable to contact the remote controller at 127.0.0.1:6653 Unable to contact the remote controller at 127.0.0.1:6633 (以下略)
となる。
ちなみに逆の順番で、dlux→l2switchの順にinstallすると、以下のエラーが出る。
opendaylight-user@root>feature:install odl-dlux-core odl-dluxapps-nodes opendaylight-user@root>feature:install odl-l2switch-switch Exception in thread "config-blank-txn-0" java.lang.IllegalStateException: Error while copying old configuration from ModuleInternalInfo [name=ModuleIdentifier{factoryName='distributed-operational-datastore-provider', instanceName='distributed-operational-store-module'}] to org.opendaylight.controller.config.yang.config.distributed_datastore_provider.DistributedOperationalDataStoreProviderModuleFactory@18015a7d at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModule(ConfigTransactionControllerImpl.java:220) at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModulesAndProcessFactoryDiff(ConfigTransactionControllerImpl.java:112) at org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl.beginConfigSafe(ConfigRegistryImpl.java:240) at org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl.beginConfig(ConfigRegistryImpl.java:198) at org.opendaylight.controller.config.manager.impl.osgi.BlankTransactionServiceTracker.lambda$new$0(BlankTransactionServiceTracker.java:40) at org.opendaylight.controller.config.manager.impl.osgi.BlankTransactionServiceTracker.blankTransactionSync(BlankTransactionServiceTracker.java:75) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.ClassCastException: org.opendaylight.controller.config.yang.config.distributed_datastore_provider.OperationalProperties cannot be cast to org.opendaylight.controller.config.yang.config.distributed_datastore_provider.OperationalProperties at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.AbstractDistributedOperationalDataStoreProviderModuleFactory.handleChangedClass(AbstractDistributedOperationalDataStoreProviderModuleFactory.java:83) at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.AbstractDistributedOperationalDataStoreProviderModuleFactory.createModule(AbstractDistributedOperationalDataStoreProviderModuleFactory.java:59) at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.DistributedOperationalDataStoreProviderModuleFactory.createModule(DistributedOperationalDataStoreProviderModuleFactory.java:30) at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModule(ConfigTransactionControllerImpl.java:217) ... 8 more Exception in thread "config-blank-txn-1" java.lang.IllegalStateException: Error while copying old configuration from ModuleInternalInfo [name=ModuleIdentifier{factoryName='distributed-operational-datastore-provider', instanceName='distributed-operational-store-module'}] to org.opendaylight.controller.config.yang.config.distributed_datastore_provider.DistributedOperationalDataStoreProviderModuleFactory@18015a7d at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModule(ConfigTransactionControllerImpl.java:220) at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModulesAndProcessFactoryDiff(ConfigTransactionControllerImpl.java:112) at org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl.beginConfigSafe(ConfigRegistryImpl.java:240) at org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl.beginConfig(ConfigRegistryImpl.java:198) at org.opendaylight.controller.config.manager.impl.osgi.BlankTransactionServiceTracker.lambda$new$0(BlankTransactionServiceTracker.java:40) at org.opendaylight.controller.config.manager.impl.osgi.BlankTransactionServiceTracker.blankTransactionSync(BlankTransactionServiceTracker.java:75) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.ClassCastException: org.opendaylight.controller.config.yang.config.distributed_datastore_provider.OperationalProperties cannot be cast to org.opendaylight.controller.config.yang.config.distributed_datastore_provider.OperationalProperties at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.AbstractDistributedOperationalDataStoreProviderModuleFactory.handleChangedClass(AbstractDistributedOperationalDataStoreProviderModuleFactory.java:83) at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.AbstractDistributedOperationalDataStoreProviderModuleFactory.createModule(AbstractDistributedOperationalDataStoreProviderModuleFactory.java:59) at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.DistributedOperationalDataStoreProviderModuleFactory.createModule(DistributedOperationalDataStoreProviderModuleFactory.java:30) at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModule(ConfigTransactionControllerImpl.java:217) ... 8 more Exception in thread "config-blank-txn-2" java.lang.IllegalStateException: Error while copying old configuration from ModuleInternalInfo [name=ModuleIdentifier{factoryName='distributed-operational-datastore-provider', instanceName='distributed-operational-store-module'}] to org.opendaylight.controller.config.yang.config.distributed_datastore_provider.DistributedOperationalDataStoreProviderModuleFactory@18015a7d at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModule(ConfigTransactionControllerImpl.java:220) at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModulesAndProcessFactoryDiff(ConfigTransactionControllerImpl.java:112) at org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl.beginConfigSafe(ConfigRegistryImpl.java:240) at org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl.beginConfig(ConfigRegistryImpl.java:198) at org.opendaylight.controller.config.manager.impl.osgi.BlankTransactionServiceTracker.lambda$new$0(BlankTransactionServiceTracker.java:40) at org.opendaylight.controller.config.manager.impl.osgi.BlankTransactionServiceTracker.blankTransactionSync(BlankTransactionServiceTracker.java:75) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.ClassCastException: org.opendaylight.controller.config.yang.config.distributed_datastore_provider.OperationalProperties cannot be cast to org.opendaylight.controller.config.yang.config.distributed_datastore_provider.OperationalProperties at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.AbstractDistributedOperationalDataStoreProviderModuleFactory.handleChangedClass(AbstractDistributedOperationalDataStoreProviderModuleFactory.java:83) at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.AbstractDistributedOperationalDataStoreProviderModuleFactory.createModule(AbstractDistributedOperationalDataStoreProviderModuleFactory.java:59) at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.DistributedOperationalDataStoreProviderModuleFactory.createModule(DistributedOperationalDataStoreProviderModuleFactory.java:30) at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModule(ConfigTransactionControllerImpl.java:217) ... 8 more Exception in thread "config-blank-txn-3" java.lang.IllegalStateException: Error while copying old configuration from ModuleInternalInfo [name=ModuleIdentifier{factoryName='distributed-operational-datastore-provider', instanceName='distributed-operational-store-module'}] to org.opendaylight.controller.config.yang.config.distributed_datastore_provider.DistributedOperationalDataStoreProviderModuleFactory@18015a7d at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModule(ConfigTransactionControllerImpl.java:220) at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModulesAndProcessFactoryDiff(ConfigTransactionControllerImpl.java:112) at org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl.beginConfigSafe(ConfigRegistryImpl.java:240) at org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl.beginConfig(ConfigRegistryImpl.java:198) at org.opendaylight.controller.config.manager.impl.osgi.BlankTransactionServiceTracker.lambda$new$0(BlankTransactionServiceTracker.java:40) at org.opendaylight.controller.config.manager.impl.osgi.BlankTransactionServiceTracker.blankTransactionSync(BlankTransactionServiceTracker.java:75) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.ClassCastException: org.opendaylight.controller.config.yang.config.distributed_datastore_provider.OperationalProperties cannot be cast to org.opendaylight.controller.config.yang.config.distributed_datastore_provider.OperationalProperties at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.AbstractDistributedOperationalDataStoreProviderModuleFactory.handleChangedClass(AbstractDistributedOperationalDataStoreProviderModuleFactory.java:83) at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.AbstractDistributedOperationalDataStoreProviderModuleFactory.createModule(AbstractDistributedOperationalDataStoreProviderModuleFactory.java:59) at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.DistributedOperationalDataStoreProviderModuleFactory.createModule(DistributedOperationalDataStoreProviderModuleFactory.java:30) at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModule(ConfigTransactionControllerImpl.java:217) ... 8 more Exception in thread "config-blank-txn-4" java.lang.IllegalStateException: Error while copying old configuration from ModuleInternalInfo [name=ModuleIdentifier{factoryName='distributed-operational-datastore-provider', instanceName='distributed-operational-store-module'}] to org.opendaylight.controller.config.yang.config.distributed_datastore_provider.DistributedOperationalDataStoreProviderModuleFactory@18015a7d at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModule(ConfigTransactionControllerImpl.java:220) at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModulesAndProcessFactoryDiff(ConfigTransactionControllerImpl.java:112) at org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl.beginConfigSafe(ConfigRegistryImpl.java:240) at org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl.beginConfig(ConfigRegistryImpl.java:198) at org.opendaylight.controller.config.manager.impl.osgi.BlankTransactionServiceTracker.lambda$new$0(BlankTransactionServiceTracker.java:40) at org.opendaylight.controller.config.manager.impl.osgi.BlankTransactionServiceTracker.blankTransactionSync(BlankTransactionServiceTracker.java:75) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.ClassCastException: org.opendaylight.controller.config.yang.config.distributed_datastore_provider.OperationalProperties cannot be cast to org.opendaylight.controller.config.yang.config.distributed_datastore_provider.OperationalProperties at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.AbstractDistributedOperationalDataStoreProviderModuleFactory.handleChangedClass(AbstractDistributedOperationalDataStoreProviderModuleFactory.java:83) at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.AbstractDistributedOperationalDataStoreProviderModuleFactory.createModule(AbstractDistributedOperationalDataStoreProviderModuleFactory.java:59) at org.opendaylight.controller.config.yang.config.distributed_datastore_provider.DistributedOperationalDataStoreProviderModuleFactory.createModule(DistributedOperationalDataStoreProviderModuleFactory.java:30) at org.opendaylight.controller.config.manager.impl.ConfigTransactionControllerImpl.copyExistingModule(ConfigTransactionControllerImpl.java:217) ... 8 more
ExistingModuleという文字も見え、機能がコンフリクトしているのか、依存関係の問題か、そのあたりの問題が起きていそう。karaf-0.8.4/data/logにkaraf.logがあることも発見したが、解析するより素直にHeliumを使った方が速そう。