ODL(OpenDayLight) 기본 튜토리얼 #5 – DataStore 구현

이번에는 DataStore를 구현해보도록 하겠다.

아래와 같이 단순한 구조로 ODL의 dataStore를 사용하는 방법을 알아보자

역시 가장먼저 구현 해줘야 하는것은 Yang 파일이다. 기존에 만들어놓은 hello.yang 파일을 조금 수정하도록 한다.

hello.yang 파일에 아래와 같이 container 를 하나 선언해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
container helloWorld{
leaf counter{
type uint32;
config true;
default 100;
}

leaf value{
type string;
config false;
mandatory false;
}
}

그리고 나서 HelloWorldImpl.java 파일에서 RPC가 호출됬을 경우 DataStore에 넘겨진 값을 저장도록 구현한다. 그전에 HelloWorldImpl.java 에서 DataBroker를 사용하기 위해 HelloProvider.java 에서 session을 넘겨줘야 한다.

HelloProvider.java

1
2
3
4
5
6
7
8
@Override
public void onSessionInitiated(ProviderContext session) {
LOG.info("HelloProvider Session Initiated");
HelloWorldImpl helloWorldImpl=new HelloWorldImpl();
helloWorldImpl.setDb(session); //HelloWorldImpl class로 session을 넘겨 사용하도록 해준다.

this.helloService=session.addRpcImplementation(HelloService.class,helloWorldImpl);
}

HelloWorldImpl.java

  • hello-world-write RPC가 호출되면 strin 으로 넘겨온 값을 저장하도록 구현한다.

  • OPERATIONAL tree에는 strin 값이 저장되게 하고 CONFIGURATION tree 에는 DataStore에 값이 저장될때마다 helloCounter 값이 1씩 증가된값을 저장하도록 한다.

    • OPERATIONAL : 네트워크 상태의 변경이 감지되면 현재 네트워크 상태를 저장
    • CONFIGURATION : 네트워크 장비의 설정을 변경하려는 요청이 저장.

즉 네트워크 구성에 대한 request 요청이 오면 CONFIGURATION tree에 데이터가 저장되고 실제 네트워크 장비에 명령을 내려 설정을 마치면 변경된 정보가 OPERATIONAL tree에 저장이 된다.

Q4. Which data is stored in MD-SAL config datastore and operational datastore?

A. The config store is where “requests” are stored and the operational store is where “network state as discovered from the network” is stored. So Flows are requested by being placed in the config store, but after they are configured on the NE and ODL “discovers” them that data is put in the operational store.

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
public void setDb(BindingAwareBroker.ProviderContext session){
this.db=session.getSALService(DataBroker.class);
this.session = session;

}

public Future<RpcResult<HelloWorldWriteOutput>> helloWorldWrite(HelloWorldWriteInput input){
final ReadWriteTransaction tx=db.newReadWriteTransaction();

tx.put(LogicalDatastoreType.OPERATIONAL,HELLO_IID,new HelloWorldBuilder().setValue(input.getStrin()).build());
tx.put(LogicalDatastoreType.CONFIGURATION,HELLO_IID,new HelloWorldBuilder().setCounter(helloCounter++).build());

try{
tx.submit().get();

}catch(InterruptedException e){
System.out.println(e.getMessage());

}catch(ExecutionException e){
System.out.println(e.getMessage());
}

//Noti 호출
NotificationProviderService notiService = session.getSALService(NotificationProviderService.class);
NotiUpdatedBuilder builder = new NotiUpdatedBuilder();
builder.setNotiId(input.getStrin());
notiService.publish(builder.build());
//


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

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

결과:

1
2
3
4
5
6
[데이터전송]
POST : http://localhost:8181/restconf/operations/hello:hello-world-write
data : {"hello:input": { "strin":"test1"}}
[데이터확인]
GET : http://localhost:8181/restconf/config/hello:helloWorld/
GET : http://localhost:8181/restconf/operational/hello:helloWorld/

http://localhost:8181/apidoc/explorer/index.html 에 접속하여 위와 같이 데이터를 전송하면 실습이 가능하다.

최종적으로는 operational tree 에는 strin 으로 전달된 데이터가 저장되고 operational tree에는 helloCounter 값이 저장된다.

공유하기