Akihiro Yamanouchi
Committed by Gerrit Code Review

[ONOS-4849] NETCONF function for FUJITSU OLT #6

- Add alart command for FUJITSU OLT
   volt-notification-alertfilter <netconf:target>
   volt-notification-setalertfilter <netconf:target> <alert-severity>
   volt-notification-subscribe <netconf:target> {disable}
- Update fujitsu-drivers.xml and shell-config.xml in FUJITSU directory
- Apply Yuta's and Andrea's suggestion to startSubscription method and other methods which related to startSubscription method.
  -> Remove startSubscriptionConnection() and createSubscriptionString() method in 4th patch-set.
  -> Modify cosmetic issue related to Static-string.
  -> Update "No replay" to "No reply" in VoltGetPonLinksCommand.java

Change-Id: I2c8d5484ea0ff9f0b1b970fe8b183bec12193c46
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +
17 +package org.onosproject.drivers.fujitsu;
18 +
19 +import org.onosproject.net.DeviceId;
20 +import org.onosproject.drivers.fujitsu.behaviour.VoltAlertConfig;
21 +import org.onosproject.net.driver.AbstractHandlerBehaviour;
22 +import org.onosproject.net.driver.DriverHandler;
23 +import org.onosproject.netconf.NetconfController;
24 +import org.onosproject.mastership.MastershipService;
25 +import org.slf4j.Logger;
26 +
27 +import java.io.IOException;
28 +import java.util.Set;
29 +
30 +import com.google.common.collect.ImmutableSet;
31 +import static com.google.common.base.Preconditions.checkNotNull;
32 +import static org.onosproject.drivers.fujitsu.FujitsuVoltXmlUtility.*;
33 +import static org.slf4j.LoggerFactory.getLogger;
34 +
35 +/**
36 + * Implementation to get and set parameters available in vOLT
37 + * through the Netconf protocol.
38 + */
39 +public class FujitsuVoltAlertConfig extends AbstractHandlerBehaviour
40 + implements VoltAlertConfig {
41 +
42 + private final Logger log = getLogger(FujitsuVoltAlertConfig.class);
43 + private static final String VOLT_ALERTS = "volt-alerts";
44 + private static final String ALERT_FILTER = "alert-filter";
45 + private static final String NOTIFY_ALERT = "notify-alert";
46 + private final Set<String> severityLevels = ImmutableSet.of(
47 + "none", "info", "minor", "major", "critical");
48 + private static final String DISABLE = "disable";
49 +
50 +
51 + @Override
52 + public String getAlertFilter() {
53 + DriverHandler handler = handler();
54 + NetconfController controller = handler.get(NetconfController.class);
55 + MastershipService mastershipService = handler.get(MastershipService.class);
56 + DeviceId ncDeviceId = handler.data().deviceId();
57 + checkNotNull(controller, "Netconf controller is null");
58 + String reply = null;
59 +
60 + if (!mastershipService.isLocalMaster(ncDeviceId)) {
61 + log.warn("Not master for {} Use {} to execute command",
62 + ncDeviceId,
63 + mastershipService.getMasterFor(ncDeviceId));
64 + return reply;
65 + }
66 +
67 + try {
68 + StringBuilder request = new StringBuilder();
69 + request.append(VOLT_NE_OPEN).append(VOLT_NE_NAMESPACE);
70 + request.append(ANGLE_RIGHT).append(NEW_LINE);
71 + request.append(buildStartTag(VOLT_ALERTS));
72 + request.append(buildEmptyTag(ALERT_FILTER));
73 + request.append(buildEndTag(VOLT_ALERTS));
74 + request.append(VOLT_NE_CLOSE);
75 +
76 + reply = controller.
77 + getDevicesMap().get(ncDeviceId).getSession().
78 + get(request.toString(), REPORT_ALL);
79 + } catch (IOException e) {
80 + log.error("Cannot communicate to device {} exception ", ncDeviceId, e);
81 + }
82 + return reply;
83 + }
84 +
85 + @Override
86 + public void setAlertFilter(String severity) {
87 + DriverHandler handler = handler();
88 + NetconfController controller = handler.get(NetconfController.class);
89 + MastershipService mastershipService = handler.get(MastershipService.class);
90 + DeviceId ncDeviceId = handler.data().deviceId();
91 + checkNotNull(controller, "Netconf controller is null");
92 +
93 + if (!mastershipService.isLocalMaster(ncDeviceId)) {
94 + log.warn("Not master for {} Use {} to execute command",
95 + ncDeviceId,
96 + mastershipService.getMasterFor(ncDeviceId));
97 + return;
98 + }
99 +
100 + if (!severityLevels.contains(severity)) {
101 + log.error("Invalid severity level: " + severity);
102 + return;
103 + }
104 +
105 + try {
106 + StringBuilder request = new StringBuilder();
107 + request.append(VOLT_NE_OPEN).append(VOLT_NE_NAMESPACE);
108 + request.append(ANGLE_RIGHT).append(NEW_LINE);
109 + request.append(buildStartTag(VOLT_ALERTS));
110 + request.append(buildStartTag(ALERT_FILTER, false));
111 + request.append(severity);
112 + request.append(buildEndTag(ALERT_FILTER));
113 + request.append(buildEndTag(VOLT_ALERTS));
114 + request.append(VOLT_NE_CLOSE);
115 +
116 + controller.getDevicesMap().get(ncDeviceId).getSession().
117 + editConfig(RUNNING, null, request.toString());
118 + } catch (IOException e) {
119 + log.error("Cannot communicate to device {} exception ", ncDeviceId, e);
120 + }
121 + }
122 +
123 + @Override
124 + public void subscribe(String mode) {
125 + DriverHandler handler = handler();
126 + NetconfController controller = handler.get(NetconfController.class);
127 + MastershipService mastershipService = handler.get(MastershipService.class);
128 + DeviceId ncDeviceId = handler.data().deviceId();
129 + checkNotNull(controller, "Netconf controller is null");
130 +
131 + if (!mastershipService.isLocalMaster(ncDeviceId)) {
132 + log.warn("Not master for {} Use {} to execute command",
133 + ncDeviceId,
134 + mastershipService.getMasterFor(ncDeviceId));
135 + return;
136 + }
137 +
138 + if (mode != null) {
139 + if (!DISABLE.equals(mode)) {
140 + log.error("Invalid mode: " + mode);
141 + return;
142 + }
143 + }
144 +
145 + try {
146 + if (mode != null) {
147 + controller.getDevicesMap().get(ncDeviceId).getSession().
148 + endSubscription();
149 + } else {
150 + StringBuilder request = new StringBuilder();
151 + request.append(ANGLE_LEFT).append(NOTIFY_ALERT).append(SPACE);
152 + request.append(VOLT_NE_NAMESPACE).append(SLASH).append(ANGLE_RIGHT);
153 +
154 + controller.getDevicesMap().get(ncDeviceId).getSession().
155 + startSubscription(request.toString());
156 + }
157 + } catch (IOException e) {
158 + log.error("Cannot communicate to device {} exception ", ncDeviceId, e);
159 + }
160 + }
161 +
162 +}
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +package org.onosproject.drivers.fujitsu.behaviour;
17 +
18 +import com.google.common.annotations.Beta;
19 +import org.onosproject.net.driver.HandlerBehaviour;
20 +
21 +/**
22 + * Device behaviour to obtain and set alert filter in vOLT.
23 + * Device behaviour to subscribe to receive notifications from vOLT.
24 + */
25 +@Beta
26 +public interface VoltAlertConfig extends HandlerBehaviour {
27 +
28 + /**
29 + * Get alert filter severity level.
30 + *
31 + * @return response string
32 + */
33 + String getAlertFilter();
34 +
35 + /**
36 + * Set alert filter severity level.
37 + *
38 + * @param severity input data in string
39 + */
40 + void setAlertFilter(String severity);
41 +
42 + /**
43 + * Subscribe to receive notifications or unsubscribe.
44 + *
45 + * @param mode disable subscription
46 + */
47 + void subscribe(String mode);
48 +}
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +package org.onosproject.drivers.fujitsu.cli;
17 +
18 +import org.apache.karaf.shell.commands.Argument;
19 +import org.apache.karaf.shell.commands.Command;
20 +import org.onosproject.cli.AbstractShellCommand;
21 +import org.onosproject.net.DeviceId;
22 +import org.onosproject.drivers.fujitsu.behaviour.VoltAlertConfig;
23 +import org.onosproject.net.driver.DriverHandler;
24 +import org.onosproject.net.driver.DriverService;
25 +
26 +/**
27 + * Gets alert filter severity level in vOLT.
28 + */
29 +@Command(scope = "onos", name = "volt-notification-alertfilter",
30 + description = "Gets alert filter severity level in vOLT")
31 +public class VoltGetAlertFilterCommand extends AbstractShellCommand {
32 +
33 + @Argument(index = 0, name = "uri", description = "Device ID",
34 + required = true, multiValued = false)
35 + String uri = null;
36 +
37 + private DeviceId deviceId;
38 +
39 + @Override
40 + protected void execute() {
41 + DriverService service = get(DriverService.class);
42 + deviceId = DeviceId.deviceId(uri);
43 + DriverHandler h = service.createHandler(deviceId);
44 + VoltAlertConfig voltNe = h.behaviour(VoltAlertConfig.class);
45 + String reply = voltNe.getAlertFilter();
46 + if (reply != null) {
47 + print("%s", reply);
48 + } else {
49 + print("No reply from %s", deviceId.toString());
50 + }
51 + }
52 +}
...@@ -50,7 +50,7 @@ public class VoltGetPonLinksCommand extends AbstractShellCommand { ...@@ -50,7 +50,7 @@ public class VoltGetPonLinksCommand extends AbstractShellCommand {
50 if (reply != null) { 50 if (reply != null) {
51 print("%s", reply); 51 print("%s", reply);
52 } else { 52 } else {
53 - print("No replay from %s", deviceId.toString()); 53 + print("No reply from %s", deviceId.toString());
54 } 54 }
55 } 55 }
56 56
......
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +package org.onosproject.drivers.fujitsu.cli;
17 +
18 +import org.apache.karaf.shell.commands.Argument;
19 +import org.apache.karaf.shell.commands.Command;
20 +import org.onosproject.cli.AbstractShellCommand;
21 +import org.onosproject.net.DeviceId;
22 +import org.onosproject.drivers.fujitsu.behaviour.VoltAlertConfig;
23 +import org.onosproject.net.driver.DriverHandler;
24 +import org.onosproject.net.driver.DriverService;
25 +
26 +/**
27 + * Sets alert filter severity level in vOLT.
28 + */
29 +@Command(scope = "onos", name = "volt-notification-setalertfilter",
30 + description = "Sets alert filter severity level in vOLT")
31 +public class VoltSetAlertFilterCommand extends AbstractShellCommand {
32 +
33 + @Argument(index = 0, name = "uri", description = "Device ID",
34 + required = true, multiValued = false)
35 + String uri = null;
36 +
37 + @Argument(index = 1, name = "target", description = "Severity level",
38 + required = true, multiValued = false)
39 + String severity = null;
40 +
41 + private DeviceId deviceId;
42 +
43 + @Override
44 + protected void execute() {
45 + DriverService service = get(DriverService.class);
46 + deviceId = DeviceId.deviceId(uri);
47 + DriverHandler h = service.createHandler(deviceId);
48 + VoltAlertConfig volt = h.behaviour(VoltAlertConfig.class);
49 + volt.setAlertFilter(severity);
50 + }
51 +}
1 +/*
2 + * Copyright 2016-present Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +package org.onosproject.drivers.fujitsu.cli;
17 +
18 +import org.apache.karaf.shell.commands.Argument;
19 +import org.apache.karaf.shell.commands.Command;
20 +import org.onosproject.cli.AbstractShellCommand;
21 +import org.onosproject.net.DeviceId;
22 +import org.onosproject.drivers.fujitsu.behaviour.VoltAlertConfig;
23 +import org.onosproject.net.driver.DriverHandler;
24 +import org.onosproject.net.driver.DriverService;
25 +
26 +/**
27 + * Subscribes to receive notifications of vOLT or unsubscribes.
28 + */
29 +@Command(scope = "onos", name = "volt-notification-subscribe",
30 + description = "Subscribes to receive notifications of vOLT")
31 +public class VoltSubscribeCommand extends AbstractShellCommand {
32 +
33 + @Argument(index = 0, name = "uri", description = "Device ID",
34 + required = true, multiValued = false)
35 + String uri = null;
36 +
37 + @Argument(index = 1, name = "mode", description = "Disable subscription",
38 + required = false, multiValued = false)
39 + String mode = null;
40 +
41 + private DeviceId deviceId;
42 +
43 + @Override
44 + protected void execute() {
45 + DriverService service = get(DriverService.class);
46 + deviceId = DeviceId.deviceId(uri);
47 + DriverHandler h = service.createHandler(deviceId);
48 + VoltAlertConfig volt = h.behaviour(VoltAlertConfig.class);
49 + volt.subscribe(mode);
50 + }
51 +}
...@@ -59,8 +59,25 @@ ...@@ -59,8 +59,25 @@
59 <ref component-id="deviceIdCompleter"/> 59 <ref component-id="deviceIdCompleter"/>
60 </completers> 60 </completers>
61 </command> 61 </command>
62 + <command>
63 + <action class="org.onosproject.drivers.fujitsu.cli.VoltGetAlertFilterCommand"/>
64 + <completers>
65 + <ref component-id="deviceIdCompleter"/>
66 + </completers>
67 + </command>
68 + <command>
69 + <action class="org.onosproject.drivers.fujitsu.cli.VoltSetAlertFilterCommand"/>
70 + <completers>
71 + <ref component-id="deviceIdCompleter"/>
72 + </completers>
73 + </command>
74 + <command>
75 + <action class="org.onosproject.drivers.fujitsu.cli.VoltSubscribeCommand"/>
76 + <completers>
77 + <ref component-id="deviceIdCompleter"/>
78 + </completers>
79 + </command>
62 </command-bundle> 80 </command-bundle>
63 81
64 <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/> 82 <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
65 -
66 </blueprint> 83 </blueprint>
......
...@@ -30,5 +30,7 @@ ...@@ -30,5 +30,7 @@
30 impl="org.onosproject.drivers.fujitsu.FujitsuVoltOnuConfig"/> 30 impl="org.onosproject.drivers.fujitsu.FujitsuVoltOnuConfig"/>
31 <behaviour api="org.onosproject.drivers.fujitsu.behaviour.VoltOnuOperConfig" 31 <behaviour api="org.onosproject.drivers.fujitsu.behaviour.VoltOnuOperConfig"
32 impl="org.onosproject.drivers.fujitsu.FujitsuVoltOnuOperConfig"/> 32 impl="org.onosproject.drivers.fujitsu.FujitsuVoltOnuOperConfig"/>
33 + <behaviour api="org.onosproject.drivers.fujitsu.behaviour.VoltAlertConfig"
34 + impl="org.onosproject.drivers.fujitsu.FujitsuVoltAlertConfig"/>
33 </driver> 35 </driver>
34 -</drivers>
...\ No newline at end of file ...\ No newline at end of file
36 +</drivers>
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.netconf; 17 package org.onosproject.netconf;
18 18
19 +import com.google.common.annotations.Beta;
19 import java.util.List; 20 import java.util.List;
20 import java.util.concurrent.CompletableFuture; 21 import java.util.concurrent.CompletableFuture;
21 22
...@@ -60,7 +61,7 @@ public interface NetconfSession { ...@@ -60,7 +61,7 @@ public interface NetconfSession {
60 throws NetconfException; 61 throws NetconfException;
61 62
62 /** 63 /**
63 - * Executes an RPC to the server and wrap the request in RPC header. 64 + * Executes an synchronous RPC to the server and wrap the request in RPC header.
64 * 65 *
65 * @param request the XML containing the request to the server. 66 * @param request the XML containing the request to the server.
66 * @return Server response or ERROR 67 * @return Server response or ERROR
...@@ -158,6 +159,15 @@ public interface NetconfSession { ...@@ -158,6 +159,15 @@ public interface NetconfSession {
158 void startSubscription() throws NetconfException; 159 void startSubscription() throws NetconfException;
159 160
160 /** 161 /**
162 + * Starts subscription to the device's notifications.
163 + *
164 + * @param filterSchema XML subtrees to indicate specific notification
165 + * @throws NetconfException when there is a problem starting the subscription
166 + */
167 + @Beta
168 + void startSubscription(String filterSchema) throws NetconfException;
169 +
170 + /**
161 * Ends subscription to the device's notifications. 171 * Ends subscription to the device's notifications.
162 * 172 *
163 * @throws NetconfException when there is a problem ending the subscription 173 * @throws NetconfException when there is a problem ending the subscription
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 16
17 package org.onosproject.netconf.ctl; 17 package org.onosproject.netconf.ctl;
18 18
19 +import com.google.common.annotations.Beta;
19 import ch.ethz.ssh2.Connection; 20 import ch.ethz.ssh2.Connection;
20 import ch.ethz.ssh2.Session; 21 import ch.ethz.ssh2.Session;
21 import com.google.common.base.Preconditions; 22 import com.google.common.base.Preconditions;
...@@ -66,8 +67,8 @@ public class NetconfSessionImpl implements NetconfSession { ...@@ -66,8 +67,8 @@ public class NetconfSessionImpl implements NetconfSession {
66 private static final String WITH_DEFAULT_CLOSE = "</with-defaults>"; 67 private static final String WITH_DEFAULT_CLOSE = "</with-defaults>";
67 private static final String DEFAULT_OPERATION_OPEN = "<default-operation>"; 68 private static final String DEFAULT_OPERATION_OPEN = "<default-operation>";
68 private static final String DEFAULT_OPERATION_CLOSE = "</default-operation>"; 69 private static final String DEFAULT_OPERATION_CLOSE = "</default-operation>";
69 - private static final String FILTER_OPEN = "<filter type=\"subtree\">"; 70 + private static final String SUBTREE_FILTER_OPEN = "<filter type=\"subtree\">";
70 - private static final String FILTER_CLOSE = "</filter>"; 71 + private static final String SUBTREE_FILTER_CLOSE = "</filter>";
71 private static final String EDIT_CONFIG_OPEN = "<edit-config>"; 72 private static final String EDIT_CONFIG_OPEN = "<edit-config>";
72 private static final String EDIT_CONFIG_CLOSE = "</edit-config>"; 73 private static final String EDIT_CONFIG_CLOSE = "</edit-config>";
73 private static final String TARGET_OPEN = "<target>"; 74 private static final String TARGET_OPEN = "<target>";
...@@ -80,6 +81,8 @@ public class NetconfSessionImpl implements NetconfSession { ...@@ -80,6 +81,8 @@ public class NetconfSessionImpl implements NetconfSession {
80 "xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\""; 81 "xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"";
81 private static final String NETCONF_WITH_DEFAULTS_NAMESPACE = 82 private static final String NETCONF_WITH_DEFAULTS_NAMESPACE =
82 "xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\""; 83 "xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\"";
84 + private static final String SUBSCRIPTION_SUBTREE_FILTER_OPEN =
85 + "<filter xmlns:base10=\"urn:ietf:params:xml:ns:netconf:base:1.0\" base10:type=\"subtree\">";
83 86
84 private final AtomicInteger messageIdInteger = new AtomicInteger(0); 87 private final AtomicInteger messageIdInteger = new AtomicInteger(0);
85 private Connection netconfConnection; 88 private Connection netconfConnection;
...@@ -157,11 +160,13 @@ public class NetconfSessionImpl implements NetconfSession { ...@@ -157,11 +160,13 @@ public class NetconfSessionImpl implements NetconfSession {
157 } 160 }
158 } 161 }
159 162
160 - private void startSubscriptionConnection() throws NetconfException { 163 +
164 + @Beta
165 + private void startSubscriptionConnection(String filterSchema) throws NetconfException {
161 if (!serverCapabilities.contains("interleave")) { 166 if (!serverCapabilities.contains("interleave")) {
162 throw new NetconfException("Device" + deviceInfo + "does not support interleave"); 167 throw new NetconfException("Device" + deviceInfo + "does not support interleave");
163 } 168 }
164 - String reply = sendRequest(createSubscriptionString()); 169 + String reply = sendRequest(createSubscriptionString(filterSchema));
165 if (!checkReply(reply)) { 170 if (!checkReply(reply)) {
166 throw new NetconfException("Subscription not successful with device " 171 throw new NetconfException("Subscription not successful with device "
167 + deviceInfo + " with reply " + reply); 172 + deviceInfo + " with reply " + reply);
...@@ -169,18 +174,37 @@ public class NetconfSessionImpl implements NetconfSession { ...@@ -169,18 +174,37 @@ public class NetconfSessionImpl implements NetconfSession {
169 subscriptionConnected = true; 174 subscriptionConnected = true;
170 } 175 }
171 176
177 + @Override
172 public void startSubscription() throws NetconfException { 178 public void startSubscription() throws NetconfException {
173 if (!subscriptionConnected) { 179 if (!subscriptionConnected) {
174 - startSubscriptionConnection(); 180 + startSubscriptionConnection(null);
175 } 181 }
176 streamHandler.setEnableNotifications(true); 182 streamHandler.setEnableNotifications(true);
177 } 183 }
178 184
179 - private String createSubscriptionString() { 185 + @Beta
186 + @Override
187 + public void startSubscription(String filterSchema) throws NetconfException {
188 + if (!subscriptionConnected) {
189 + startSubscriptionConnection(filterSchema);
190 + }
191 + streamHandler.setEnableNotifications(true);
192 + }
193 +
194 + @Beta
195 + private String createSubscriptionString(String filterSchema) {
180 StringBuilder subscriptionbuffer = new StringBuilder(); 196 StringBuilder subscriptionbuffer = new StringBuilder();
181 subscriptionbuffer.append("<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"); 197 subscriptionbuffer.append("<rpc xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n");
182 subscriptionbuffer.append(" <create-subscription\n"); 198 subscriptionbuffer.append(" <create-subscription\n");
183 subscriptionbuffer.append("xmlns=\"urn:ietf:params:xml:ns:netconf:notification:1.0\">\n"); 199 subscriptionbuffer.append("xmlns=\"urn:ietf:params:xml:ns:netconf:notification:1.0\">\n");
200 + // FIXME Only subtree filtering supported at the moment.
201 + if (filterSchema != null) {
202 + subscriptionbuffer.append(" ");
203 + subscriptionbuffer.append(SUBSCRIPTION_SUBTREE_FILTER_OPEN).append(NEW_LINE);
204 + subscriptionbuffer.append(filterSchema).append(NEW_LINE);
205 + subscriptionbuffer.append(" ");
206 + subscriptionbuffer.append(SUBTREE_FILTER_CLOSE).append(NEW_LINE);
207 + }
184 subscriptionbuffer.append(" </create-subscription>\n"); 208 subscriptionbuffer.append(" </create-subscription>\n");
185 subscriptionbuffer.append("</rpc>\n"); 209 subscriptionbuffer.append("</rpc>\n");
186 subscriptionbuffer.append(ENDPATTERN); 210 subscriptionbuffer.append(ENDPATTERN);
...@@ -323,9 +347,9 @@ public class NetconfSessionImpl implements NetconfSession { ...@@ -323,9 +347,9 @@ public class NetconfSessionImpl implements NetconfSession {
323 rpc.append(NETCONF_BASE_NAMESPACE).append(">\n"); 347 rpc.append(NETCONF_BASE_NAMESPACE).append(">\n");
324 rpc.append(GET_OPEN).append(NEW_LINE); 348 rpc.append(GET_OPEN).append(NEW_LINE);
325 if (filterSchema != null) { 349 if (filterSchema != null) {
326 - rpc.append(FILTER_OPEN).append(NEW_LINE); 350 + rpc.append(SUBTREE_FILTER_OPEN).append(NEW_LINE);
327 rpc.append(filterSchema).append(NEW_LINE); 351 rpc.append(filterSchema).append(NEW_LINE);
328 - rpc.append(FILTER_CLOSE).append(NEW_LINE); 352 + rpc.append(SUBTREE_FILTER_CLOSE).append(NEW_LINE);
329 } 353 }
330 if (withDefaultsMode != null) { 354 if (withDefaultsMode != null) {
331 rpc.append(WITH_DEFAULT_OPEN).append(NETCONF_WITH_DEFAULTS_NAMESPACE).append(">"); 355 rpc.append(WITH_DEFAULT_OPEN).append(NETCONF_WITH_DEFAULTS_NAMESPACE).append(">");
...@@ -577,7 +601,9 @@ public class NetconfSessionImpl implements NetconfSession { ...@@ -577,7 +601,9 @@ public class NetconfSessionImpl implements NetconfSession {
577 } 601 }
578 CompletableFuture<String> completedReply = 602 CompletableFuture<String> completedReply =
579 replies.get(messageId.get()); 603 replies.get(messageId.get());
580 - completedReply.complete(event.getMessagePayload()); 604 + if (completedReply != null) {
605 + completedReply.complete(event.getMessagePayload());
606 + }
581 } 607 }
582 } 608 }
583 } 609 }
......