Committed by
Gerrit Code Review
Added loading of BMv2 JSON config during device discovery in BMv2 device
provider Change-Id: I2000ddb3eefbda0423aaa9e60dfdd1be7fd12bdc
Showing
1 changed file
with
35 additions
and
18 deletions
... | @@ -24,9 +24,12 @@ import org.jboss.netty.util.HashedWheelTimer; | ... | @@ -24,9 +24,12 @@ import org.jboss.netty.util.HashedWheelTimer; |
24 | import org.jboss.netty.util.Timeout; | 24 | import org.jboss.netty.util.Timeout; |
25 | import org.jboss.netty.util.TimerTask; | 25 | import org.jboss.netty.util.TimerTask; |
26 | import org.onlab.packet.ChassisId; | 26 | import org.onlab.packet.ChassisId; |
27 | +import org.onlab.util.HexString; | ||
27 | import org.onlab.util.Timer; | 28 | import org.onlab.util.Timer; |
28 | import org.onosproject.bmv2.api.runtime.Bmv2ControlPlaneServer; | 29 | import org.onosproject.bmv2.api.runtime.Bmv2ControlPlaneServer; |
29 | import org.onosproject.bmv2.api.runtime.Bmv2Device; | 30 | import org.onosproject.bmv2.api.runtime.Bmv2Device; |
31 | +import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException; | ||
32 | +import org.onosproject.bmv2.ctl.Bmv2ThriftClient; | ||
30 | import org.onosproject.common.net.AbstractDeviceProvider; | 33 | import org.onosproject.common.net.AbstractDeviceProvider; |
31 | import org.onosproject.core.ApplicationId; | 34 | import org.onosproject.core.ApplicationId; |
32 | import org.onosproject.core.CoreService; | 35 | import org.onosproject.core.CoreService; |
... | @@ -37,7 +40,6 @@ import org.onosproject.net.Device; | ... | @@ -37,7 +40,6 @@ import org.onosproject.net.Device; |
37 | import org.onosproject.net.DeviceId; | 40 | import org.onosproject.net.DeviceId; |
38 | import org.onosproject.net.MastershipRole; | 41 | import org.onosproject.net.MastershipRole; |
39 | import org.onosproject.net.PortNumber; | 42 | import org.onosproject.net.PortNumber; |
40 | -import org.onosproject.net.SparseAnnotations; | ||
41 | import org.onosproject.net.behaviour.PortDiscovery; | 43 | import org.onosproject.net.behaviour.PortDiscovery; |
42 | import org.onosproject.net.config.ConfigFactory; | 44 | import org.onosproject.net.config.ConfigFactory; |
43 | import org.onosproject.net.config.NetworkConfigEvent; | 45 | import org.onosproject.net.config.NetworkConfigEvent; |
... | @@ -57,13 +59,11 @@ import java.util.concurrent.Executors; | ... | @@ -57,13 +59,11 @@ import java.util.concurrent.Executors; |
57 | import java.util.concurrent.TimeUnit; | 59 | import java.util.concurrent.TimeUnit; |
58 | 60 | ||
59 | import static org.onlab.util.Tools.groupedThreads; | 61 | import static org.onlab.util.Tools.groupedThreads; |
62 | +import static org.onosproject.bmv2.api.runtime.Bmv2Device.*; | ||
60 | import static org.onosproject.bmv2.ctl.Bmv2ThriftClient.forceDisconnectOf; | 63 | import static org.onosproject.bmv2.ctl.Bmv2ThriftClient.forceDisconnectOf; |
61 | import static org.onosproject.bmv2.ctl.Bmv2ThriftClient.ping; | 64 | import static org.onosproject.bmv2.ctl.Bmv2ThriftClient.ping; |
62 | import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY; | 65 | import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY; |
63 | import static org.slf4j.LoggerFactory.getLogger; | 66 | import static org.slf4j.LoggerFactory.getLogger; |
64 | -import static org.onosproject.bmv2.api.runtime.Bmv2Device.SCHEME; | ||
65 | -import static org.onosproject.bmv2.api.runtime.Bmv2Device.MANUFACTURER; | ||
66 | -import static org.onosproject.bmv2.api.runtime.Bmv2Device.HW_VERSION; | ||
67 | 67 | ||
68 | /** | 68 | /** |
69 | * BMv2 device provider. | 69 | * BMv2 device provider. |
... | @@ -176,27 +176,44 @@ public class Bmv2DeviceProvider extends AbstractDeviceProvider { | ... | @@ -176,27 +176,44 @@ public class Bmv2DeviceProvider extends AbstractDeviceProvider { |
176 | activeDevices.compute(did, (k, v) -> { | 176 | activeDevices.compute(did, (k, v) -> { |
177 | if (!deviceService.isAvailable(did)) { | 177 | if (!deviceService.isAvailable(did)) { |
178 | // Device not available in the core, connect it now. | 178 | // Device not available in the core, connect it now. |
179 | - SparseAnnotations annotations = DefaultAnnotations.builder() | 179 | + DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder() |
180 | - .set(AnnotationKeys.PROTOCOL, SCHEME) | 180 | + .set(AnnotationKeys.PROTOCOL, SCHEME); |
181 | - .build(); | 181 | + dumpJsonConfigToAnnotations(did, annotationsBuilder); |
182 | DeviceDescription descr = new DefaultDeviceDescription( | 182 | DeviceDescription descr = new DefaultDeviceDescription( |
183 | did.uri(), Device.Type.SWITCH, MANUFACTURER, HW_VERSION, | 183 | did.uri(), Device.Type.SWITCH, MANUFACTURER, HW_VERSION, |
184 | - UNKNOWN, UNKNOWN, new ChassisId(), annotations); | 184 | + UNKNOWN, UNKNOWN, new ChassisId(), annotationsBuilder.build()); |
185 | providerService.deviceConnected(did, descr); | 185 | providerService.deviceConnected(did, descr); |
186 | } | 186 | } |
187 | - // Discover ports. | 187 | + updatePorts(did); |
188 | - Device device = deviceService.getDevice(did); | ||
189 | - if (device.is(PortDiscovery.class)) { | ||
190 | - PortDiscovery portConfig = device.as(PortDiscovery.class); | ||
191 | - List<PortDescription> portDescriptions = portConfig.getPorts(); | ||
192 | - providerService.updatePorts(did, portDescriptions); | ||
193 | - } else { | ||
194 | - LOG.warn("No PortDiscovery behavior for device {}", did); | ||
195 | - } | ||
196 | return true; | 188 | return true; |
197 | }); | 189 | }); |
198 | } | 190 | } |
199 | 191 | ||
192 | + private void dumpJsonConfigToAnnotations(DeviceId did, DefaultAnnotations.Builder builder) { | ||
193 | + // TODO: store json config string somewhere else, possibly in a Bmv2Controller (see ONOS-4419) | ||
194 | + try { | ||
195 | + String md5 = Bmv2ThriftClient.of(did).getJsonConfigMd5(); | ||
196 | + // Convert to hex string for readability. | ||
197 | + md5 = HexString.toHexString(md5.getBytes()); | ||
198 | + String jsonString = Bmv2ThriftClient.of(did).dumpJsonConfig(); | ||
199 | + builder.set("bmv2JsonConfigMd5", md5); | ||
200 | + builder.set("bmv2JsonConfigValue", jsonString); | ||
201 | + } catch (Bmv2RuntimeException e) { | ||
202 | + LOG.warn("Unable to dump device JSON config from device {}: {}", did, e); | ||
203 | + } | ||
204 | + } | ||
205 | + | ||
206 | + private void updatePorts(DeviceId did) { | ||
207 | + Device device = deviceService.getDevice(did); | ||
208 | + if (device.is(PortDiscovery.class)) { | ||
209 | + PortDiscovery portConfig = device.as(PortDiscovery.class); | ||
210 | + List<PortDescription> portDescriptions = portConfig.getPorts(); | ||
211 | + providerService.updatePorts(did, portDescriptions); | ||
212 | + } else { | ||
213 | + LOG.warn("No PortDiscovery behavior for device {}", did); | ||
214 | + } | ||
215 | + } | ||
216 | + | ||
200 | private void disconnectDevice(DeviceId did) { | 217 | private void disconnectDevice(DeviceId did) { |
201 | LOG.debug("Trying to disconnect device from core... deviceId={}", did); | 218 | LOG.debug("Trying to disconnect device from core... deviceId={}", did); |
202 | 219 | ||
... | @@ -204,7 +221,7 @@ public class Bmv2DeviceProvider extends AbstractDeviceProvider { | ... | @@ -204,7 +221,7 @@ public class Bmv2DeviceProvider extends AbstractDeviceProvider { |
204 | activeDevices.compute(did, (k, v) -> { | 221 | activeDevices.compute(did, (k, v) -> { |
205 | if (deviceService.isAvailable(did)) { | 222 | if (deviceService.isAvailable(did)) { |
206 | providerService.deviceDisconnected(did); | 223 | providerService.deviceDisconnected(did); |
207 | - // Make sure to close the transport session with device. | 224 | + // Make sure to close the transport session with device. Do we really need this? |
208 | forceDisconnectOf(did); | 225 | forceDisconnectOf(did); |
209 | } | 226 | } |
210 | return null; | 227 | return null; | ... | ... |
-
Please register or login to post a comment