Merge "Report (TCP) port number for switches"
authorJozef Bacigal <jozef.bacigal@pantheon.tech>
Mon, 26 Jun 2017 07:23:37 +0000 (07:23 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 26 Jun 2017 07:23:37 +0000 (07:23 +0000)
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/multipart/DescMultipartWriter.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/DeviceInitializationUtil.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/util/PathUtil.java

index b9f31770838107a057e2b7f48cc20d3077847c6e..6e4bfce22ced679103b3319d343bd543ebfe4f09 100644 (file)
@@ -43,6 +43,7 @@ public class DescMultipartWriter extends AbstractMultipartWriter<Desc> {
                 .setMeter(Collections.emptyList())
                 .setGroup(Collections.emptyList())
                 .setIpAddress(DeviceInitializationUtil.getIpAddress(connectionContext, getInstanceIdentifier()))
+                .setPortNumber(DeviceInitializationUtil.getPortNumber(connectionContext, getInstanceIdentifier()))
                 .setSwitchFeatures(DeviceInitializationUtil.getSwitchFeatures(connectionContext))
                 .build(),
             withParents);
index c5f2f447227675569db66054dc813bc119211d03..f8248d3500f6d8eba9bc8b2258c46561fd7c4f13 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.openflowplugin.impl.util;
 
 import java.net.InetSocketAddress;
+import java.util.Optional;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
@@ -16,6 +17,7 @@ import org.opendaylight.openflowplugin.api.openflow.device.TxFacade;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.SwitchFeaturesUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SwitchFeatures;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
@@ -52,16 +54,16 @@ public class DeviceInitializationUtil {
         for (int i = 0; i < nrOfTables; i++) {
             try {
                 txFacade.writeToTransaction(LogicalDatastoreType.OPERATIONAL,
-                    deviceInfo
-                        .getNodeInstanceIdentifier()
-                        .augmentation(FlowCapableNode.class)
-                        .child(Table.class, new TableKey((short) i)),
-                    new TableBuilder()
-                        .setId((short) i)
-                        .addAugmentation(
-                            FlowTableStatisticsData.class,
-                            new FlowTableStatisticsDataBuilder().build())
-                        .build());
+                        deviceInfo
+                                .getNodeInstanceIdentifier()
+                                .augmentation(FlowCapableNode.class)
+                                .child(Table.class, new TableKey((short) i)),
+                        new TableBuilder()
+                                .setId((short) i)
+                                .addAugmentation(
+                                        FlowTableStatisticsData.class,
+                                        new FlowTableStatisticsDataBuilder().build())
+                                .build());
             } catch (final Exception e) {
                 LOG.debug("makeEmptyTables: Failed to write node {} to DS ", deviceInfo.getLOGValue(), e);
             }
@@ -72,21 +74,39 @@ public class DeviceInitializationUtil {
      * Retrieve ip address from connection
      * @param connectionContext connection context
      * @param instanceIdentifier instance identifier
-     * @return ip adress
+     * @return ip address
      */
     public static IpAddress getIpAddress(final ConnectionContext connectionContext,
                                          final InstanceIdentifier<Node> instanceIdentifier) {
-        final InetSocketAddress remoteAddress = connectionContext
-            .getConnectionAdapter()
-            .getRemoteAddress();
+        final String node = PathUtil.extractNodeId(instanceIdentifier).getValue();
 
-        if (remoteAddress == null) {
-            LOG.warn("IP address of the node {} cannot be obtained. No connection with switch.", instanceIdentifier);
-            return null;
-        }
+        return getRemoteAddress(connectionContext, instanceIdentifier)
+                .map(inetSocketAddress -> {
+                    final IpAddress ipAddress = IetfInetUtil.INSTANCE.ipAddressFor(inetSocketAddress.getAddress());
+                    LOG.info("IP address of the node {} is: {}", node, ipAddress);
+                    return ipAddress;
+                })
+                .orElse(null);
+    }
+
+    /**
+     * Retrieve port number from connection
+     * @param connectionContext connection context
+     * @param instanceIdentifier instance identifier
+     * @return port number
+     */
+    public static PortNumber getPortNumber(final ConnectionContext connectionContext,
+                                           final InstanceIdentifier<Node> instanceIdentifier) {
+        final String node = PathUtil.extractNodeId(instanceIdentifier).getValue();
+
+        return getRemoteAddress(connectionContext, instanceIdentifier)
+                .map(inetSocketAddress -> {
+                    final int port = inetSocketAddress.getPort();
+                    LOG.info("Port number of the node {} is: {}", node, port);
+                    return new PortNumber(port);
+                })
+                .orElse(null);
 
-        LOG.info("IP address of the node {} is: {}", instanceIdentifier, remoteAddress);
-        return IetfInetUtil.INSTANCE.ipAddressFor(remoteAddress.getAddress());
     }
 
     /**
@@ -96,10 +116,24 @@ public class DeviceInitializationUtil {
      */
     public static SwitchFeatures getSwitchFeatures(final ConnectionContext connectionContext) {
         return SwitchFeaturesUtil
-            .getInstance()
-            .buildSwitchFeatures(new GetFeaturesOutputBuilder(connectionContext
-                .getFeatures())
-                .build());
+                .getInstance()
+                .buildSwitchFeatures(new GetFeaturesOutputBuilder(connectionContext
+                        .getFeatures())
+                        .build());
+    }
+
+    private static Optional<InetSocketAddress> getRemoteAddress(final ConnectionContext connectionContext,
+                                                                final InstanceIdentifier<Node> instanceIdentifier) {
+        final Optional<InetSocketAddress> inetSocketAddress = Optional
+                .ofNullable(connectionContext.getConnectionAdapter())
+                .flatMap(connectionAdapter -> Optional.ofNullable(connectionAdapter.getRemoteAddress()));
+
+        if (!inetSocketAddress.isPresent()) {
+            LOG.warn("Remote address of the node {} cannot be obtained. No connection with switch.", PathUtil
+                    .extractNodeId(instanceIdentifier));
+        }
+
+        return inetSocketAddress;
     }
 
 }
index 36ee174c7533034805e9965d9ae421400c10974c..b3dbec8f4907b95f280e8dbc6daf59002fe92e93 100644 (file)
@@ -17,17 +17,25 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
  * Purpose: utility class providing path and {@link InstanceIdentifier} tools
  */
 public class PathUtil {
-
     private PathUtil() {
         throw new IllegalStateException("This class should not be instantiated.");
     }
 
+    /**
+     * Extracts node id from instance identifier
+     * @param input instance identifier
+     * @return node-id from given instance identifier
+     */
+    public static NodeId extractNodeId(final InstanceIdentifier<Node> input) {
+        return input.firstKeyOf(Node.class).getId();
+    }
 
     /**
+     * Extracts node id from node reference
      * @param input reference to {@link Node}
      * @return node-id from given reference
      */
     public static NodeId extractNodeId(final NodeRef input) {
         return input.getValue().firstKeyOf(Node.class).getId();
     }
-}
+}
\ No newline at end of file