OpenDayLight——HelloWorld
既然學習OpenDayLight編程這個鬼,就得像學語言一樣來一個HelloWorld來試試水,經過幾天的折騰,總算成功輸出HelloWorld了,這里記錄下整個過程以供后續參考。
一、實驗環境描述
本次實驗是在win7 64位+8G內存環境下實現;java版本為1.8.0_131;maven版本為3.5.0;這些安裝過程就不記錄了!
二、構建項目
1、執行如下命令構建項目;
mvn archetype:generate -DarchetypeGroupId=org.opendaylight.controller -DarchetypeArtifactId=opendaylight-startup-archetype -DarchetypeRepository=http://nexus.opendaylight.org/content/repositories/opendaylight.release -DarchetypeCatalog=remote -DarchetypeVersion=1.3.0-Carbon
圖 1
2、按下回車后,一會屏幕中需要你輸入一些如下信息,需要你輸入的:
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: : hello Define value for property 'copyright': no [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: No copyrightYear: 2017 Y: : Y
如圖2所示:
圖 2
3、輸入完成后,按下回車等待片刻即可出現如下頁面,則完成項目框架的生成:
圖 3
4、輸入如下命令構建項目,命令第一次執行過程很長,筆者需要執行3個小時。執行成功后如圖4所示
mvn clean install -DskipTests
圖 4
三、添加HelloWorld RPC API
1、編輯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;
}
}
}
}
增加完之后執行如下指令,生成相應的接口文件:
mvn clean install -DskipTests
執行成功后,如圖5所示:
圖 5
修改如上的yang文件后,生成如下幾個類
impl/src/main/java/org/opendaylight/hello/impl/helloProvider.java
impl/src/main/resources/org/opendaylight/blueprint/impl-blueprint.xml
api/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/hello/rev150105/HelloService.java
2、綁定MD-SAL
在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 no 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" /> <reference id="rpcRegistry" interface="org.opendaylight.controller.sal.binding.api.RpcProviderRegistry"/> <bean id="provider" class="org.opendaylight.hello.impl.helloProvider" init-method="init" destroy-method="close"> <argument ref="dataBroker" /> <argument ref="rpcRegistry" /> </bean> </blueprint>
在impl/src/main/java/org/opendaylight/hello/impl/目錄下新建HelloWorldImpl.java文件,代碼如下,注釋不可省略,否則編譯報錯:
/*
* Copyright © 2017 no 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
*/
package org.opendaylight.hello.impl;
import java.util.concurrent.Future;
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;
public class HelloWorldImpl implements HelloService{
@Override
public Future<RpcResult<HelloWorldOutput>> helloWorld(HelloWorldInput input) {
HelloWorldOutputBuilder helloBuilder = new HelloWorldOutputBuilder();
helloBuilder.setGreeting("Hello " + input.getName());
return RpcResultBuilder.success(helloBuilder.build()).buildFuture();
}
}
在impl/src/main/java/org/opendaylight/hello/impl/目錄下修改helloProvider文件,增加如下代碼
/* * Copyright © 2017 no 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 */ package org.opendaylight.hello.impl; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hello.rev150105.HelloService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class helloProvider { private static final Logger LOG = LoggerFactory.getLogger(helloProvider.class); private final DataBroker dataBroker; private final RpcProviderRegistry rpcProviderRegistry; private RpcRegistration<HelloService> serviceRegistration; public helloProvider(final DataBroker dataBroker, RpcProviderRegistry rpcProviderRegistry) { this.dataBroker = dataBroker; this.rpcProviderRegistry = rpcProviderRegistry; } /** * Method called when the blueprint container is created. */ public void init() { serviceRegistration = rpcProviderRegistry.addRpcImplementation(HelloService.class, new HelloWorldImpl()); LOG.info("helloProvider Session Initiated"); } /** * Method called when the blueprint container is destroyed. */ public void close() { serviceRegistration.close(); LOG.info("helloProvider Closed"); } }
四、編譯及驗證
1、執行如下指令,對剛才所修改的代碼進行編譯
mvn clean install -DskipTests
2、編譯完成后,啟動OpenDayLight,如圖6所示:
F:\OpenDayLight\hello\karaf\target\assembly\bin>karaf
圖 6
3、在瀏覽器中輸入如下地址(賬號密碼:admin\admin)
http://localhost:8181/apidoc/explorer/index.html
顯示如圖7所示,找到新增的hello
圖 7
4、雙擊hello欄,如圖8顯示
圖 8
5、在Value中輸入如下的值后,點擊Try it out,返回如圖9結果,即驗證HelloWorld成功。
{"hello:input": { "name":"hello"}}
圖 9