2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint;
10 import static com.google.common.base.Preconditions.checkNotNull;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
14 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
15 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.node.SwitchManager;
18 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
19 import org.opendaylight.groupbasedpolicy.util.DataTreeChangeHandler;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
34 * Determines node-id and node-connector-id as location for an endpoint based on port-name.
36 public class OfOverlayContextListener extends DataTreeChangeHandler<OfOverlayContext> {
38 private static final Logger LOG = LoggerFactory.getLogger(OfOverlayContextListener.class);
39 private final SwitchManager swManager;
41 public OfOverlayContextListener(DataBroker dataProvider, SwitchManager swManager) {
43 this.swManager = checkNotNull(swManager);
44 registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier
45 .builder(Endpoints.class).child(Endpoint.class).augmentation(OfOverlayContext.class).build()));
49 protected void onWrite(DataObjectModification<OfOverlayContext> rootNode,
50 InstanceIdentifier<OfOverlayContext> rootIdentifier) {
51 OfOverlayContext ofOverlayCtx = rootNode.getDataAfter();
52 LOG.trace("on write: \n OfOverlayContext: {} \n rootIdentifier: {}", ofOverlayCtx, rootIdentifier);
53 if (ofOverlayCtx.getNodeConnectorId() != null && ofOverlayCtx.getNodeId() != null) {
54 return; // Location is already on EP
56 Name portName = ofOverlayCtx.getPortName();
57 updateLocationBasedOnPortName(portName, rootIdentifier);
61 protected void onDelete(DataObjectModification<OfOverlayContext> rootNode,
62 InstanceIdentifier<OfOverlayContext> rootIdentifier) {
67 protected void onSubtreeModified(DataObjectModification<OfOverlayContext> rootNode,
68 InstanceIdentifier<OfOverlayContext> rootIdentifier) {
69 Name newPortName = rootNode.getDataAfter().getPortName();
70 Name oldPortName = rootNode.getDataBefore().getPortName();
71 LOG.trace("on update: \n old OfOverlayContext: {} \n new OfOverlayContext: {} \n rootIdentifier: {}",
72 rootNode.getDataBefore(), rootNode.getDataAfter(), rootIdentifier);
73 if (oldPortName == null && newPortName == null) {
74 LOG.debug("Cannot update location for EP {} because port-name is missing.",
75 rootIdentifier.firstKeyOf(Endpoint.class));
78 if (oldPortName != null && newPortName != null && oldPortName.equals(newPortName)) {
79 LOG.debug("No need to update location for EP {} because port-name {} was not changed.",
80 rootIdentifier.firstKeyOf(Endpoint.class), oldPortName.getValue());
83 updateLocationBasedOnPortName(newPortName, rootIdentifier);
86 private void updateLocationBasedOnPortName(Name portName, InstanceIdentifier<OfOverlayContext> rootIdentifier) {
87 if (portName == null) {
88 LOG.debug("Cannot determine EP location for EP because port-name is missing.",
89 rootIdentifier.firstKeyOf(Endpoint.class));
92 InstanceIdentifier<NodeConnector> ncIid = swManager.getNodeConnectorIidForPortName(portName);
94 LOG.debug("Cannot determine EP location for EP {} because node-connector with port-name {}"
95 + " does not exist on any node.", rootIdentifier.firstKeyOf(Endpoint.class), portName);
98 NodeId nodeId = ncIid.firstKeyOf(Node.class).getId();
99 NodeConnectorId ncId = ncIid.firstKeyOf(NodeConnector.class).getId();
100 WriteTransaction wTx = dataProvider.newWriteOnlyTransaction();
101 OfOverlayContext newOfOverlayCtx =
102 new OfOverlayContextBuilder().setNodeId(nodeId).setNodeConnectorId(ncId).build();
103 wTx.merge(LogicalDatastoreType.OPERATIONAL, rootIdentifier, newOfOverlayCtx);
104 DataStoreHelper.submitToDs(wTx);