From 2f02ee43956e0b1aad16b8cd8ddab1bd35042e1e Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Mon, 4 Nov 2013 16:08:51 +0100 Subject: [PATCH] Added Model-Driven Inventory Provider for Flow-Capable Node. Change-Id: I3b33837d3898404caebce052ac8b997219aed430 Signed-off-by: Tony Tkacik --- opendaylight/md-sal/inventory-manager/pom.xml | 65 +++++++++ .../FlowCapableInventoryProvider.xtend | 123 ++++++++++++++++++ .../manager/InventoryActivator.xtend | 30 +++++ .../inventory/manager/InventoryMapping.xtend | 47 +++++++ 4 files changed, 265 insertions(+) create mode 100644 opendaylight/md-sal/inventory-manager/pom.xml create mode 100644 opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/FlowCapableInventoryProvider.xtend create mode 100644 opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/InventoryActivator.xtend create mode 100644 opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/InventoryMapping.xtend diff --git a/opendaylight/md-sal/inventory-manager/pom.xml b/opendaylight/md-sal/inventory-manager/pom.xml new file mode 100644 index 0000000000..0a8551a3e4 --- /dev/null +++ b/opendaylight/md-sal/inventory-manager/pom.xml @@ -0,0 +1,65 @@ + + 4.0.0 + + org.opendaylight.controller + sal-parent + 1.0-SNAPSHOT + + org.opendaylight.controller.md + inventory-manager + bundle + + scm:git:ssh://git.opendaylight.org:29418/controller.git + scm:git:ssh://git.opendaylight.org:29418/controller.git + https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL + + + + + com.google.guava + guava + + + org.opendaylight.controller + sal-binding-api + 1.0-SNAPSHOT + + + org.opendaylight.controller.model + model-flow-service + 1.0-SNAPSHOT + + + org.opendaylight.controller.model + model-inventory + 1.0-SNAPSHOT + + + org.eclipse.xtend + org.eclipse.xtend.lib + + + + + + + org.apache.felix + maven-bundle-plugin + + + org.opendaylight.controller.md.inventory.manager.InventoryActivator + org.opendaylight.controller.md.inventory.manager + + + + + org.eclipse.xtend + xtend-maven-plugin + + + maven-clean-plugin + + + + 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 index 0000000000..2b023a72e1 --- /dev/null +++ b/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/FlowCapableInventoryProvider.xtend @@ -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 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); + 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, data.build()); + commit() + } + + override onNodeRemoved(NodeRemoved node) { + val ref = node.nodeRef; + val it = manager.startChange() + + removeRuntimeData(ref.value as InstanceIdentifier); + 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, 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 index 0000000000..5d76924be7 --- /dev/null +++ b/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/InventoryActivator.xtend @@ -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 index 0000000000..7668a3165e --- /dev/null +++ b/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/InventoryMapping.xtend @@ -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(); + } + +} -- 2.36.6