Added Model-Driven Inventory Provider for Flow-Capable Node. 62/2362/6
authorTony Tkacik <ttkacik@cisco.com>
Mon, 4 Nov 2013 15:08:51 +0000 (16:08 +0100)
committerGerrit Code Review <gerrit@opendaylight.org>
Wed, 6 Nov 2013 15:13:05 +0000 (15:13 +0000)
Change-Id: I3b33837d3898404caebce052ac8b997219aed430
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
opendaylight/md-sal/inventory-manager/pom.xml [new file with mode: 0644]
opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/FlowCapableInventoryProvider.xtend [new file with mode: 0644]
opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/InventoryActivator.xtend [new file with mode: 0644]
opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/InventoryMapping.xtend [new file with mode: 0644]

diff --git a/opendaylight/md-sal/inventory-manager/pom.xml b/opendaylight/md-sal/inventory-manager/pom.xml
new file mode 100644 (file)
index 0000000..0a8551a
--- /dev/null
@@ -0,0 +1,65 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.opendaylight.controller</groupId>
+        <artifactId>sal-parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+    <groupId>org.opendaylight.controller.md</groupId>
+    <artifactId>inventory-manager</artifactId>
+    <packaging>bundle</packaging>
+    <scm>
+        <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
+        <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
+        <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL</url>
+    </scm>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-api</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller.model</groupId>
+            <artifactId>model-flow-service</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller.model</groupId>
+            <artifactId>model-inventory</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.xtend</groupId>
+            <artifactId>org.eclipse.xtend.lib</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <configuration>
+                    <instructions>
+                        <Bundle-Activator>org.opendaylight.controller.md.inventory.manager.InventoryActivator</Bundle-Activator>
+                        <Private-Package>org.opendaylight.controller.md.inventory.manager</Private-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.eclipse.xtend</groupId>
+                <artifactId>xtend-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/FlowCapableInventoryProvider.xtend b/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/FlowCapableInventoryProvider.xtend
new file mode 100644 (file)
index 0000000..2b023a7
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.md.inventory.manager
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService
+import org.opendaylight.controller.sal.binding.api.data.DataProviderService
+import org.opendaylight.yangtools.concepts.Registration
+import org.opendaylight.yangtools.yang.binding.NotificationListener
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier
+import org.opendaylight.yangtools.yang.binding.DataObject
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey
+import static extension org.opendaylight.controller.md.inventory.manager.InventoryMapping.*
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey
+import org.slf4j.LoggerFactory
+
+class FlowCapableInventoryProvider implements AutoCloseable {
+
+
+    static val LOG = LoggerFactory.getLogger(FlowCapableInventoryProvider);
+
+    @Property
+    DataProviderService dataService;
+
+    @Property
+    NotificationProviderService notificationService;
+    val NodeChangeCommiter changeCommiter = new NodeChangeCommiter(this);
+
+    Registration<NotificationListener> listenerRegistration
+
+    def void start() {
+        listenerRegistration = notificationService.registerNotificationListener(changeCommiter);
+        LOG.info("Flow Capable Inventory Provider started.");
+        
+    }
+
+    protected def startChange() {
+        return dataService.beginTransaction;
+    }
+
+    override close() {
+       LOG.info("Flow Capable Inventory Provider stopped.");
+        listenerRegistration?.close();
+    }
+    
+}
+
+class NodeChangeCommiter implements OpendaylightInventoryListener {
+
+    @Property
+    val FlowCapableInventoryProvider manager;
+
+    new(FlowCapableInventoryProvider manager) {
+        _manager = manager;
+    }
+
+    override onNodeConnectorRemoved(NodeConnectorRemoved connector) {
+        val ref = connector.nodeConnectorRef;
+
+        // Check path
+        val it = manager.startChange()
+        removeRuntimeData(ref.value as InstanceIdentifier<? extends DataObject>);
+        commit()
+    }
+
+    override onNodeConnectorUpdated(NodeConnectorUpdated connector) {
+        val ref = connector.nodeConnectorRef;
+
+        val flowConnector = connector.getAugmentation(FlowCapableNodeConnectorUpdated);
+
+        val it = manager.startChange()
+        val data = new NodeConnectorBuilder(connector);
+        data.key = (new NodeConnectorKey(connector.id))
+        if (flowConnector != null) {
+            val augment = flowConnector.toInventoryAugment()
+            data.addAugmentation(FlowCapableNodeConnector, augment)
+        }
+
+        putRuntimeData(ref.value as InstanceIdentifier<NodeConnector>, data.build());
+        commit()
+    }
+
+    override onNodeRemoved(NodeRemoved node) {
+        val ref = node.nodeRef;
+        val it = manager.startChange()
+
+        removeRuntimeData(ref.value as InstanceIdentifier<? extends DataObject>);
+        commit()
+    }
+
+    override onNodeUpdated(NodeUpdated node) {
+        val ref = node.nodeRef;
+        val flowNode = node.getAugmentation(FlowCapableNodeUpdated);
+
+        val it = manager.startChange()
+        val data = new NodeBuilder(node);
+        data.key = (new NodeKey(node.id))
+        if (flowNode != null) {
+            val augment = flowNode.toInventoryAugment();
+            data.addAugmentation(FlowCapableNode, augment)
+        }
+
+        putRuntimeData(ref.value as InstanceIdentifier<Node>, data.build())
+        commit()
+    }
+}
diff --git a/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/InventoryActivator.xtend b/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/InventoryActivator.xtend
new file mode 100644 (file)
index 0000000..5d76924
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.md.inventory.manager
+
+import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareProvider
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext
+import org.osgi.framework.BundleContext
+import org.opendaylight.controller.sal.binding.api.data.DataProviderService
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService
+
+class InventoryActivator extends AbstractBindingAwareProvider {
+
+    static var FlowCapableInventoryProvider provider = new FlowCapableInventoryProvider();
+
+    override onSessionInitiated(ProviderContext session) {
+        provider.dataService = session.getSALService(DataProviderService)
+        provider.notificationService = session.getSALService(NotificationProviderService)
+        provider.start();
+    }
+
+    override protected stopImpl(BundleContext context) {
+        provider.close();
+    }
+
+}
diff --git a/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/InventoryMapping.xtend b/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/InventoryMapping.xtend
new file mode 100644 (file)
index 0000000..7668a31
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.controller.md.inventory.manager
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowNodeConnector
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowNode
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder
+
+class InventoryMapping {
+
+    static def FlowCapableNodeConnector toInventoryAugment(FlowNodeConnector updated) {
+        if (updated instanceof FlowCapableNodeConnector) {
+            return updated as FlowCapableNodeConnector;
+        }
+        val it = new FlowCapableNodeConnectorBuilder();
+        advertisedFeatures = updated.advertisedFeatures
+        configuration = updated.configuration
+        currentFeature = updated.currentFeature
+        currentSpeed = updated.currentSpeed
+        hardwareAddress = updated.hardwareAddress
+        maximumSpeed = updated.maximumSpeed
+        name = updated.name
+        peerFeatures = updated.peerFeatures
+        portNumber = updated.portNumber
+        state = updated.state
+        supported = updated.supported
+        return build();
+    }
+
+    static def FlowCapableNode toInventoryAugment(FlowNode source) {
+        if (source instanceof FlowCapableNode) {
+            return source as FlowCapableNode;
+        }
+        val it = new FlowCapableNodeBuilder(source);
+        return build();
+    }
+
+}