安装环境:Ubuntu18.04
一、安装依赖
1. 安装JDK:
sudo apt update sudo apt install openjdk-8-jdk-headless
选择默认的 JDK:
~$ sudo update-alternatives --config java There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 auto mode 1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode 2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode Press <enter> to keep the current choice[*], or type selection number: 2 ~$ java -version
设置 JAVA_HOME:
echo JAVA_HOME=export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 >> ~/.bashrc source ~/.bashrc
2. 安装 maven:
sudo apt install maven
mvn -v
3. 安装 Sublime-Text3:(可选)
wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add - sudo apt-get install apt-transport-https echo "deb https://download.sublimetext.com/ apt/stable/" | sudo tee /etc/apt/sources.list.d/sublime-text.list sudo apt-get update sudo apt-get install sublime-text
二、搭建 ODL 代码框架
1. 获取配置 mvn 的 setting.xml:
~$ mkdir .m2
~$ wget -q -O - https://raw.githubusercontent.com/opendaylight/odlparent/master/settings.xml > ~/.m2/settings.xml
如果无法下载,则可以拷贝以下内容:
<?xml version="1.0" encoding="UTF-8"?> <!-- vi: set et smarttab sw=2 tabstop=2: --> <!-- Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html --> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <profiles> <profile> <id>opendaylight-release</id> <repositories> <repository> <id>opendaylight-mirror</id> <name>opendaylight-mirror</name> <url>https://nexus.opendaylight.org/content/repositories/public/</url> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> </releases> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>opendaylight-mirror</id> <name>opendaylight-mirror</name> <url>https://nexus.opendaylight.org/content/repositories/public/</url> <releases> <enabled>true</enabled> <updatePolicy>never</updatePolicy> </releases> <snapshots> <enabled>false</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> <profile> <id>opendaylight-snapshots</id> <repositories> <repository> <id>opendaylight-snapshot</id> <name>opendaylight-snapshot</name> <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>opendaylight-snapshot</id> <name>opendaylight-snapshot</name> <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url> <releases> <enabled>false</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> </profile> </profiles> <activeProfiles> <activeProfile>opendaylight-release</activeProfile> <activeProfile>opendaylight-snapshots</activeProfile> </activeProfiles> </settings>View Code
2. 生成 odl 代码框架:
~$ mvn archetype:generate -DarchetypeGroupId=org.opendaylight.controller -DarchetypeArtifactId=opendaylight-startup-archetype -DarchetypeVersion=1.3.0-Carbon
Define value for property 'groupId': org.opendaylight.hello
Define value for property 'artifactId': hello
[INFO] Using property: version = 0.1.0-SNAPSHOT
Define value for property 'package' org.opendaylight.hello: :
Define value for property 'classPrefix' Hello: :
Define value for property 'copyright': ming
[INFO] Using property: copyrightYear = 2017
Confirm properties configuration:
groupId: org.opendaylight.hello
artifactId: hello
version: 0.1.0-SNAPSHOT
package: org.opendaylight.hello
classPrefix: Hello
copyright: ming
copyrightYear: 2017
Y: : y
3. 编译:
~$ cd hello/ ~/hello$ mvn clean install -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true
4. 启动 odl 控制器:
~/hello$ cd karaf/target/assembly/bin
~/hello/karaf/target/assembly/bin$ ./karaf
opendaylight-user@root> feature:list | grep hello
5. Web 界面登录:
访问:http://127.0.0.1:8181/index.html 用户名密码都是 admin
。
三、RPC 实现
1. 编写、编译 yang 文件:
文件:~/hello/api/src/main/yang/hello.yang
module hello {
yang-version 1;
namespace "urn:opendaylight:params:xml:ns:yang:hello";
prefix "hello";
revision "2015-01-05" {
description "Initial revision of hello model";
}
rpc hello-world {
input {
leaf name {
type string;
}
}
output {
leaf greeting {
type string;
}
}
}
}
编译:(生成 RPC 定义等内容)
~/hello/api$ mvn clean install -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true
2. 编写 impl-blueprint.xml文件:
注册 RPC。
文件:~/hello/impl/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
<?xml version="1.0" encoding="UTF-8"?> <!-- vi: set et smarttab sw=4 tabstop=4: --> <!-- Copyright © 2017 ming and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html --> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0" odl:use-default-for-reference-types="true"> <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker" odl:type="default" /> <bean id="provider" class="org.opendaylight.hello.impl.HelloProvider" init-method="init" destroy-method="close"> <argument ref="dataBroker" /> </bean> <odl:rpc-implementation ref="provider"/> </blueprint>
3. 实现 RPC 处理函数:
文件:~/hello/impl/src/main/java/org/opendaylight/hello/impl/HelloProvider.java
package org.opendaylight.hello.impl; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hello.rev150105.HelloService; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hello.rev150105.HelloWorldInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hello.rev150105.HelloWorldOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hello.rev150105.HelloWorldOutputBuilder; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.Future; public class HelloProvider implements HelloService { private static final Logger LOG = LoggerFactory.getLogger(HelloProvider.class); private final DataBroker dataBroker; public HelloProvider(final DataBroker dataBroker) { this.dataBroker = dataBroker; } @Override public Future<RpcResult<HelloWorldOutput>> helloWorld(HelloWorldInput input) { HelloWorldOutputBuilder helloBuilder = new HelloWorldOutputBuilder(); helloBuilder.setGreeting("Hello " + input.getName()); return RpcResultBuilder.success(helloBuilder.build()).buildFuture(); } /** * Method called when the blueprint container is created. */ public void init() { LOG.info("HelloProvider Session Initiated"); } /** * Method called when the blueprint container is destroyed. */ public void close() { LOG.info("HelloProvider Closed"); } }
~/hello$ mvn clean install -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true
4. 启动 odl:
~/hello/karaf/target/assembly/bin$ ./karaf
5. 查看、测试 API:
打开:http://localhost:8181/apidoc/explorer/index.html
点击:hello(2015-01-05) -> post /operations/hello:hello-world
在参数部分输入:
{ "input": { "name": "SDN" } }
点击:Try it out!
参考资料:
https://www.cnblogs.com/goldsunshine/p/11175698.html
https://www.cnblogs.com/leoych/p/13570303.html
https://docs.opendaylight.org/en/stable-aluminium/developer-guide/developing-apps-on-the-opendaylight-controller.html
https://www.cnblogs.com/goldsunshine/p/11176164.html
https://www.cnblogs.com/goldsunshine/p/11298951.html