OpenDaylight(Oxygen)でFeature間のコンフリクト?

概要

結構前の資料だが、この辺りの資料を見て、YANGとそれを使ったMD-SALのしくみが気になったので、OpenDaylightを試してみようと思った。

あまり最近の参考になりそうなページがない…かなり古く画像のリンクも切れてしまっているが、こちらを参考にしてやってみた。

また、dlux(UI)の部分についてはこちらを参考にした。

Mininetで構築したスイッチをODLから管理する(まずはGUIトポロジー確認)、というのをやりたかったが、結果としてうまく動かなかった。機能間のコンフリクト?が起きているのか、原因の詳細まで解析していない。記事にある古いバージョンのODLを使えばうまくいくのかもしれない。

環境

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を使った方が速そう。