ODL(OpenDayLight) 기본 튜토리얼 #3 – RPC 구현

Yang파일에 RPC 선언

RPC를 구현하기 위해선 yang파일에 rpc를 선언해줘야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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-write{
input{
leaf strin{
type string;
}
}
output{
leaf strout{
type string;
}
}
}
rpc hello-world-read{
input{
leaf strin{
type string;
}

}
output{
leaf strout{
type string;
}
}

}
}

위 yang 파일에선 hello-world-write , hello-world-read 두개의 RPC를 선언했다. yang 파일을 만든 후 api module을 bulid 하면 target 밑에 java source code가 생성된다.

xxxProvider.java 파일에 RPC 등록

karaf를 구동하면 Impl module이 자동으로 기동되는데 xxxProvider.java 파일에 있는 onSessionInitiated 메소드에 RPC를 등록해주어 사용이 가능하도록 해준다.

1
2
3
4
5
6
7
private RpcRegistration<HelloService> helloService;

@Override
public void onSessionInitiated(ProviderContext session) {
LOG.info("HelloProvider Session Initiated");
this.helloService=session.addRpcImplementation(HelloService.class,helloWorldImpl);
}

위 소스의 설명을 하면

  • private RpcRegistration helloService; 에서 HelloService 는 위에 생성한 yang 파일의 모듈명이다. 예제에선 hello 라는 이름으로 모듈을 생성했고 RPC로 생성될때는 $module명+Service = HelloService 라고 생성되는것이다.
    그리고 실제로 RPC가 작동할 helloWorldImpl.java 를 생성해주고 RPC interface를 구현해준다.

helloWorldImpl.java 구현

helloWorldImpl.java는 HelloService 를 implements 받아 생성된 메서드를 구현해줘야 한다. 위의 yang 파일에선 hello-world-write , hello-world-read 두가지 RPC를 선언했으므로 두개의 메서드를 implements 받아 구현한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public Future<RpcResult<HelloWorldWriteOutput>> helloWorldWrite(HelloWorldWriteInput input){

HelloWorldWriteOutputBuilder helloWriteBuilder=new HelloWorldWriteOutputBuilder();
helloWriteBuilder.setStrout("return"+input.getStrin());

return RpcResultBuilder.success(helloWriteBuilder.build()).buildFuture();
}

public Future<RpcResult<HelloWorldReadOutput>> helloWorldRead(HelloWorldReadInput input){

HelloWorldReadOutputBuilder helloReadBuilder=new HelloWorldReadOutputBuilder();

try{
helloReadBuilder.setStrout("Echo :: "+input.getStrin());
}catch(InterruptedException e){
System.out.println(e.getMessage());
}catch(ExecutionException e){
System.out.println(e.getMessage());
}

return RpcResultBuilder.success(helloReadBuilder.build()).buildFuture();
}

내용추가

impl 빌드 할때 Line does not match expected header 에러가 발생하면 impl 의 pom.xml 파일에 아래 내용을 추가해주면 된다.

1
2
3
4
5
6
7
8
<build>
<plugin>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</build>

실행 결과

각각을 선택하여 {“hello:input”: { “strin”:”OpenDayLight”}} 이라는 메시지를 전송하면 이에대한 응답이 올것이다.

공유하기