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
Showing
10 changed files
with
432 additions
and
13 deletions
drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/FujitsuVoltAlertConfig.java
0 → 100644
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 | +} |
drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/behaviour/VoltAlertConfig.java
0 → 100644
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 | +} |
drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltGetAlertFilterCommand.java
0 → 100644
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 | ... | ... |
drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSetAlertFilterCommand.java
0 → 100644
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 | +} |
drivers/fujitsu/src/main/java/org/onosproject/drivers/fujitsu/cli/VoltSubscribeCommand.java
0 → 100644
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 | } | ... | ... |
-
Please register or login to post a comment