第3部分:添加一些配置数据——我的面包太轻!
我们在第3部分中,将在我们的yang toaster文件中探索定义和启用配置属性(而不是操作属性)。在本节中,我们将定义一个新的配置属性的烤面包机将允许用户修改每个级别的煮熟度需要的秒数。更重要的是,我们将说明我们的OpendaylightToaster如何注册配置数据的变化,以及用户如何设置,更新和删除这些信息。
1.1 为toaster.yang添加配置属性
第一步是为在toaster.yang文件中的Toaster容器添加一个新的属性,darknessFactor。
1. container toaster {
1. ...
2.
3. leaf darknessFactor {
4. type uint32;
5. config true;
6. default 1000;
7. description
8. "The darkness factor. Basically, the number of ms to multiple the doneness value by.";
9. }
10.
11. ...
12. }
现在运行以下代码来生成更新Toaster接口。
1. Mvn clean install
1.2 监听的变化
为了在配置数据发生变化时让我们的OpendaylightToaster得到通知我们需要实现DataChangeListener接口。
注意:有多个DataChangeListener接口。我们必须实现org.opendaylight.controller.sal.binding.api.data. DataChangeListener;接口。
1. ...
13. import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
14. ...
15. public class OpendaylightToaster implements ToasterData, ToasterService, AutoCloseable, DataChangeListener {
16. ...
17. @Override
18. public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
19. //TODO - implement
20. }
21. ...
22. }
DataChangeListener接口有一个单一方法,onDataChanged,通过改变事件。更改事件可以包含多个节点的变化(在列表的情况下),但在我们的例子中我们只有一个单一节点,这也是我们正在寻找的。下一步是从更改事件中提取更新的数据。通过为onDataChanged方法提供以下实现。
1. ...
23. //Thread safe holder for our darkness multiplier.
24. private AtomicLong darknessFactor = new AtomicLong( 1000 );
25. ...
26. @Override
27. public void onDataChanged(DataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
28. DataObject dataObject = change.getUpdatedSubtree();
29. if( dataObject instanceof Toaster )
30. {
31. Toaster toaster = (Toaster) dataObject;
32. Long darkness = toaster.getDarknessFactor();
33. if( darkness != null )
34. {
35. darknessFactor.set( darkness );
36. }
37. }
38. }
39. ...
最后一步是去修改MakeToastTask调用方法用来让我们新的darkness factor代替一个hard-coded值。
1. private class MakeToastTask implements Callable<Void> {
40. ...
41. @Override
42. public Void call() throws InterruptedException {
43. try
44. {
45. // make toast just sleeps for n seconds per doneness level.
46. long darknessFactor = OpendaylightToaster.this.darknessFactor.get();
47. Thread.sleep(darknessFactor * toastRequest.getToasterDoneness());
48. }
49. catch( InterruptedException e ) {
50. ...
51. }
52. ...
53. }
54. }
最后一步是注册侦听器与DataProviderService服务为了接收通知。我们将在ToasterProviderModule.createInstance()中执行此登记:
1. @Override
55. public java.lang.AutoCloseable createInstance() {
56. final OpendaylightToaster opendaylightToaster = new OpendaylightToaster();
57.
58. ...
59.
60. final ListenerRegistration<DataChangeListener> dataChangeListenerRegistration =
61. dataBrokerService.registerDataChangeListener( OpendaylightToaster.TOASTER_IID, opendaylightToaster );
62.
63.
64. ...
65. final class AutoCloseableToaster implements AutoCloseable {
66. @Override
67. public void close() throws Exception {
68. dataChangeListenerRegistration.close(); //closes the listener registrations (removes it)
69. ...
70. }
71. }
72. ...
73. }
74.
我们已经注册了烤面包机作为一个用来更改下面的烤面包机节点和节点的侦听器。
1.3 改变the Darkness Factor
为改变the darkness factor我们将使用一个REST通过MD-SAL调用restconf 提供的服务。一旦启动控制器,将会执行以下PUT:
1. HTTP Method: PUT
75. URL: http://localhost:8080/restconf/config/toaster:toaster
76. HEADER: content-type: application/yang.data+json
77. BODY:
78. {
79. toaster:
80. {
81. darknessFactor: "2000"
82. }
83. }
你应该收到返回代码200。如果你执行一下GET去获得相同的URL,你应该看到返回更新的darkness factor。此时,如果你执行make-toast RPC call您应该看到延迟反映的 darknessFactor * the doneness的值。
注意:这是一个在restconf中已知的bug。