从零开始学OpenDaylight(碳版本)之三:Hello示例

从零开始学OpenDaylight(碳版本)之三:Hello示例

 

文章转载此处:https://www.cnblogs.com/FrankZhou2017/p/7236035.html

本文源自:https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL:Startup_Project_Archetype part2

一、构建Hello项目

1. 执行构建项目命令:

mvn archetype:generate -DarchetypeGroupId=org.opendaylight.controller -DarchetypeArtifactId=opendaylight-startup-archetype -DarchetypeRepository=http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/ -DarchetypeCatalog=http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/archetype-catalog.xml

提示如下信息:

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.031 s
[INFO] Finished at: 2017-07-25T18:53:36+08:00
[INFO] Final Memory: 14M/245M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:3.0.1:generate (default-cli) on project standalone-pom: archetypeCatalog 'http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/archetype-catalog.xml' is not supported anymore. Please read the plugin documentation for details. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

搜索未找到答案,使用Example部分的命令: 

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

 输入交互信息:

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

或者: 根据 opendaylight-startup-archetype在nexus私服(https://nexus.opendaylight.org)查询的坐标信息:


  org.opendaylight.controller
  opendaylight-startup-archetype
  1.3.0-Carbon

 

D:\CODE\odlexample\ex1hello>mvn archetype:generate -DarchetypeGroupId=org.opendaylight.controller -DarchetypeArtifactId=opendaylight-startup-archetype -DarchetypeVersion=1.3.0-Carbon
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[WARNING] Archetype not found in any catalog. Falling back to central repository.
[WARNING] Add a repsoitory with id 'archetype' in your settings.xml if archetype's repository is elsewhere.
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
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: opendaylight-startup-archetype:1.3.0-Carbon
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.opendaylight.hello
[INFO] Parameter: artifactId, Value: hello
[INFO] Parameter: version, Value: 0.1.0-SNAPSHOT
[INFO] Parameter: package, Value: org.opendaylight.hello
[INFO] Parameter: packageInPathFormat, Value: org/opendaylight/hello
[INFO] Parameter: classPrefix, Value: Hello
[INFO] Parameter: package, Value: org.opendaylight.hello
[INFO] Parameter: version, Value: 0.1.0-SNAPSHOT
[INFO] Parameter: copyright, Value: no
[INFO] Parameter: groupId, Value: org.opendaylight.hello
[INFO] Parameter: artifactId, Value: hello
[INFO] Parameter: copyrightYear, Value: 2017
[WARNING] Don't override file D:\CODE\odlexample\ex1hello\hello\pom.xml
[INFO] Project created from Archetype in dir: D:\CODE\odlexample\ex1hello\hello
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 43.046 s

[INFO] Final Memory: 21M/367M
[INFO] ------------------------------------------------------------------------

D:\CODE\odlexample\ex1hello>tree /f
D:.
└─hello
    │  .gitignore
    │  .gitreview
    │  deploy-site.xml
    │  pom.xml
    │
    ├─api
    │  │  pom.xml
    │  │
    │  └─src
    │      └─main
    │          └─yang
    │                  hello.yang
    │
    ├─artifacts
    │      pom.xml
    │
    ├─cli
    │  │  pom.xml
    │  │
    │  └─src
    │      └─main
    │          ├─java
    │          │  └─org
    │          │      └─opendaylight
    │          │          └─hello
    │          │              └─cli
    │          │                  ├─api
    │          │                  │      HelloCliCommands.java
    │          │                  │
    │          │                  ├─commands
    │          │                  │      HelloCliTestCommand.java
    │          │                  │
    │          │                  └─impl
    │          │                          HelloCliCommandsImpl.java
    │          │
    │          └─resources
    │              └─org
    │                  └─opendaylight
    │                      └─blueprint
    │                              cli-blueprint.xml
    │
    ├─features
    │  │  pom.xml
    │  │
    │  └─src
    │      └─main
    │          └─features
    │                  features.xml
    │
    ├─impl
    │  │  pom.xml
    │  │
    │  └─src
    │      ├─main
    │      │  ├─java
    │      │  │  └─org
    │      │  │      └─opendaylight
    │      │  │          └─hello
    │      │  │              └─impl
    │      │  │                      HelloProvider.java
    │      │  │
    │      │  └─resources
    │      │      └─org
    │      │          └─opendaylight
    │      │              └─blueprint
    │      │                      impl-blueprint.xml
    │      │
    │      └─test
    │          └─java
    ├─it
    │  │  pom.xml
    │  │
    │  └─src
    │      └─test
    │          └─java
    │              └─org
    │                  └─opendaylight
    │                      └─hello
    │                          └─it
    │                                  HelloIT.java
    │
    ├─karaf
    │      pom.xml
    │
    └─src
        ├─main
        │  └─resources
        │          stylesheet.css
        │
        └─site
                site.xml

 

 

 

2. 成功后执行如下信息:

[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: opendaylight-startup-archetype:1.3.0-Carbon
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.opendaylight.hello
[INFO] Parameter: artifactId, Value: hello
[INFO] Parameter: version, Value: 0.1.0-SNAPSHOT
[INFO] Parameter: package, Value: org.opendaylight.hello
[INFO] Parameter: packageInPathFormat, Value: org/opendaylight/hello
[INFO] Parameter: classPrefix, Value: hello
[INFO] Parameter: package, Value: org.opendaylight.hello
[INFO] Parameter: version, Value: 0.1.0-SNAPSHOT
[INFO] Parameter: copyright, Value: No
[INFO] Parameter: groupId, Value: org.opendaylight.hello
[INFO] Parameter: artifactId, Value: hello
[INFO] Parameter: copyrightYear, Value: 2017
[WARNING] Don't override file D:\CODE\odlexample\hello\hello\pom.xml
[INFO] Project created from Archetype in dir: D:\CODE\odlexample\hello\hello
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 45.526 s

 3. 构建Hello项目:

mvn clean install -Dmaven.test.failure.ignore=true

 成功后提示如下信息:

[INFO] --- maven-site-plugin:3.6:attach-descriptor (generate-site) @ hello-aggregator ---
[INFO] Attaching 'src\site\site.xml' site descriptor with classifier 'site'.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] ODL :: org.opendaylight.hello :: hello-api ......... SUCCESS [ 19.565 s]
[INFO] ODL :: org.opendaylight.hello :: hello-impl ........ SUCCESS [  8.826 s]
[INFO] ODL :: org.opendaylight.hello :: hello-cli ......... SUCCESS [  8.878 s]
[INFO] ODL :: org.opendaylight.hello :: hello-features .... SUCCESS [15:41 min]
[INFO] ODL :: org.opendaylight.hello :: hello-karaf ....... SUCCESS [ 41.676 s]
[INFO] ODL :: org.opendaylight.hello :: hello-artifacts ... SUCCESS [  1.794 s]
[INFO] ODL :: org.opendaylight.hello :: hello-it .......... SUCCESS [03:38 min]
[INFO] hello .............................................. SUCCESS [ 23.209 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 21:07 min

对应features.xml 

xml version="1.0" encoding="UTF-8"?>


<features name="odl-hello-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0">
  <repository>mvn:org.opendaylight.yangtools/features-yangtools/{{VERSION}}/xml/featuresrepository>
  <repository>mvn:org.opendaylight.controller/features-mdsal/{{VERSION}}/xml/featuresrepository>
  <repository>mvn:org.opendaylight.mdsal.model/features-mdsal-model/{{VERSION}}/xml/featuresrepository>
  <repository>mvn:org.opendaylight.netconf/features-restconf/{{VERSION}}/xml/featuresrepository>
  <repository>mvn:org.opendaylight.dluxapps/features-dluxapps/{{VERSION}}/xml/featuresrepository>
  <feature name='odl-hello-api' version='${project.version}' description='OpenDaylight :: hello :: api'>
    <feature version='${mdsal.model.version}'>odl-mdsal-modelsfeature>
    <bundle>mvn:org.opendaylight.hello/hello-api/{{VERSION}}bundle>
  feature>
  <feature name='odl-hello' version='${project.version}' description='OpenDaylight :: hello'>
    <feature version='${mdsal.version}'>odl-mdsal-brokerfeature>
    <feature version='${project.version}'>odl-hello-apifeature>
    <bundle>mvn:org.opendaylight.hello/hello-impl/{{VERSION}}bundle>
  feature>
  <feature name='odl-hello-rest' version='${project.version}' description='OpenDaylight :: hello :: REST'>
    <feature version="${project.version}">odl-hellofeature>
    <feature version="${restconf.version}">odl-restconffeature>
  feature>
  <feature name='odl-hello-ui' version='${project.version}' description='OpenDaylight :: hello :: UI'>
    <feature version="${project.version}">odl-hello-restfeature>
    <feature version="${restconf.version}">odl-mdsal-apidocsfeature>
    <feature version="${dluxapps.version}">odl-dluxapps-yangmanfeature>
  feature>
  <feature name='odl-hello-cli' version='${project.version}' description='OpenDaylight :: hello :: CLI'>
    <feature version="${project.version}">odl-hellofeature>
    <bundle>mvn:org.opendaylight.hello/hello-cli/{{VERSION}}bundle>
  feature>

features>

 

查看基本功能、关闭OpenDaylight与上文同;

二、增加简单的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;
            }
        }
    }
}

 

2. 执行

 mvn clean install -Dmaven.test.failure.ignore=true

 

成功显示如下信息:

[INFO] Reactor Summary:
[INFO]
[INFO] ODL :: org.opendaylight.hello :: hello-api ......... SUCCESS [ 22.707 s]
[INFO] ODL :: org.opendaylight.hello :: hello-impl ........ SUCCESS [ 10.392 s]
[INFO] ODL :: org.opendaylight.hello :: hello-cli ......... SUCCESS [  9.901 s]
[INFO] ODL :: org.opendaylight.hello :: hello-features .... SUCCESS [15:43 min]
[INFO] ODL :: org.opendaylight.hello :: hello-karaf ....... SUCCESS [ 35.899 s]
[INFO] ODL :: org.opendaylight.hello :: hello-artifacts ... SUCCESS [  1.349 s]
[INFO] ODL :: org.opendaylight.hello :: hello-it .......... SUCCESS [03:37 min]
[INFO] hello .............................................. SUCCESS [ 23.311 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 21:07 min

 到目前生成的类

helloProvider.java:作为服务提供者,后续将绑定helloService及其实现Impl.

/*
 * 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.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class helloProvider {

    private static final Logger LOG = LoggerFactory.getLogger(helloProvider.class);

    private final DataBroker dataBroker;

    public helloProvider(final DataBroker dataBroker) {
        this.dataBroker = dataBroker;
    }

    /**
     * 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");
    }
}

 helloService.java

package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.hello.rev150105;
import org.opendaylight.yangtools.yang.binding.RpcService;
import org.opendaylight.yangtools.yang.common.RpcResult;
import java.util.concurrent.Future;

/**
 * Interface for implementing the following YANG RPCs defined in module hello
 * 
 * rpc hello-world {
 *     input {
 *         leaf name {
 *             type string;
 *         }
 *     }
 *     
 *     output {
 *         leaf greeting {
 *             type string;
 *         }
 *     }
 * }
 * 
*
*/ public interface HelloService extends RpcService { Future> helloWorld(HelloWorldInput input); }

 impl-blueprint.xml内容: 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
xml version="1.0" encoding="UTF-8"?>
< 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 >
 
blueprint >

在 Blueprint XML 中,bean 元素将定义一个 bean 管理器。用于对象构造的参数由 argument 元素指定;注入的属性则由 property 子元素指定。

property 元素指定要注入的属性的名称和值。属性名与 Java 类中的 setter 方法名对应。例如,如果属性名为 foo,那么对应的 setter 方法为 setFoo(arg)。属性名和对应的 setter 方法名遵循 JavaBeans 规范中定义的属性设计模式。

详细信息可参考:https://www.ibm.com/developerworks/cn/opensource/os-osgiblueprint/

3. 实现RPC API:创建HelloWorldImpl.java(目录:impl/src/main/java/org/opendaylight/hello/impl)

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> helloWorld(HelloWorldInput input) {
        HelloWorldOutputBuilder helloBuilder = new HelloWorldOutputBuilder();
        helloBuilder.setGreeting("Hello " + input.getName());
        return RpcResultBuilder.success(helloBuilder.build()).buildFuture();
    }

}

 4. 绑定MD-SAL

(1).  在文件impl-blueprint.xml( src/main/resources/org/opendaylight/blueprint)注册RPC引用,增加粗体部分

xml version="1.0" encoding="UTF-8"?>
 
 
 <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.spark.impl.HelloProvider"
     init-method="init" destroy-method="close">
     <argument ref="dataBroker" />
     <argument ref="rpcRegistry" />
  bean>

 blueprint>

 

 

(2). 类HelloProvider注入DataBroker和RPCProviderRegistry 

(3). 类HelloProvider中init方法中绑定HelloService和HelloWorldImpl

    private RpcRegistration 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. 启动OpenDayLight

D:\CODE\odlexample\hello\hello\karaf\target\assembly\bin>karaf
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=256M; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0
Apache Karaf starting up. Press Enter to open the shell now...
100% [========================================================================]

Karaf started in 29s. Bundle stats: 294 active, 294 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>

 

2. 浏览器打开如下地址(admin\admin):
http://localhost:8181/apidoc/explorer/index.html     

 3. 测试结果

从零开始学OpenDaylight(碳版本)之三:Hello示例_第1张图片

写入值,请求之后,提示成功!

从零开始学OpenDaylight(碳版本)之三:Hello示例_第2张图片

 

 也可以使用另外一种方式来测试:

http://localhost:8181/index.html

 

 从零开始学OpenDaylight(碳版本)之三:Hello示例_第3张图片

 

你可能感兴趣的:(opendaylight)