Implementing VBD API in Vpp renderer
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / groupbasedpolicy / renderer / vpp / manager / BridgeDomainManagerImpl.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.manager;
10
11 import java.util.Arrays;
12
13 import javax.annotation.Nonnull;
14
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
17 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
20 import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager;
21 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanVni;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyTypesVbridgeAugment;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyTypesVbridgeAugmentBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyVbridgeAugment;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyVbridgeAugmentBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.network.topology.topology.topology.types.VbridgeTopologyBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.tunnel.vxlan.rev160429.TunnelTypeVxlan;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.tunnel.vxlan.rev160429.network.topology.topology.tunnel.parameters.VxlanTunnelParametersBuilder;
30 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
32 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
33 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;
34 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
38 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.TopologyTypes;
39 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.TopologyTypesBuilder;
40 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.node.attributes.SupportingNodeBuilder;
41
42 import com.google.common.base.Optional;
43 import com.google.common.base.Preconditions;
44 import com.google.common.util.concurrent.AsyncFunction;
45 import com.google.common.util.concurrent.CheckedFuture;
46 import com.google.common.util.concurrent.Futures;
47 import com.google.common.util.concurrent.ListenableFuture;
48
49 public class BridgeDomainManagerImpl implements BridgeDomainManager {
50
51     private static final TopologyId SUPPORTING_TOPOLOGY_NETCONF = new TopologyId("topology-netconf");
52     private static final TopologyTypes VBRIDGE_TOPOLOGY_TYPE = new TopologyTypesBuilder().addAugmentation(
53             TopologyTypesVbridgeAugment.class,
54             new TopologyTypesVbridgeAugmentBuilder().setVbridgeTopology(new VbridgeTopologyBuilder().build()).build())
55         .build();
56     private final DataBroker dataProvder;
57
58     public BridgeDomainManagerImpl(DataBroker dataProvder) {
59         this.dataProvder = Preconditions.checkNotNull(dataProvder);
60     }
61
62     @Override
63     public ListenableFuture<Void> createVxlanBridgeDomainOnVppNode(@Nonnull String bridgeDomainName,
64             @Nonnull VxlanVni vni, NodeId vppNode) {
65         TopologyKey topologyKey = new TopologyKey(new TopologyId(bridgeDomainName));
66         ReadOnlyTransaction rTx = dataProvder.newReadOnlyTransaction();
67         CheckedFuture<Optional<Topology>, ReadFailedException> futureTopology =
68                 rTx.read(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getTopologyIid(topologyKey));
69         rTx.close();
70         return Futures.transform(futureTopology, new AsyncFunction<Optional<Topology>, Void>() {
71
72             @Override
73             public ListenableFuture<Void> apply(Optional<Topology> optTopology) throws Exception {
74                 WriteTransaction wTx = dataProvder.newWriteOnlyTransaction();
75                 if (!optTopology.isPresent()) {
76                     TopologyVbridgeAugment vbridgeAugment =
77                             new TopologyVbridgeAugmentBuilder().setTunnelType(TunnelTypeVxlan.class)
78                                 .setArpTermination(false)
79                                 .setFlood(true)
80                                 .setForward(true)
81                                 .setLearn(true)
82                                 .setUnknownUnicastFlood(true)
83                                 .setTunnelParameters(new VxlanTunnelParametersBuilder().setVni(vni).build())
84                                 .build();
85                     Topology topology = new TopologyBuilder().setKey(topologyKey)
86                         .setTopologyTypes(VBRIDGE_TOPOLOGY_TYPE)
87                         .addAugmentation(TopologyVbridgeAugment.class, vbridgeAugment)
88                         .build();
89
90                     wTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getTopologyIid(topology.getKey()),
91                             topology, true);
92                 }
93                 Node node = new NodeBuilder().setNodeId(vppNode)
94                     .setSupportingNode(Arrays.asList(new SupportingNodeBuilder()
95                         .setTopologyRef(SUPPORTING_TOPOLOGY_NETCONF).setNodeRef(vppNode).build()))
96                     .build();
97                 wTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getNodeIid(topologyKey, node.getKey()),
98                         node);
99                 return wTx.submit();
100             }
101         });
102     }
103
104     @Override
105     public ListenableFuture<Void> removeBridgeDomainFromVppNode(@Nonnull String bridgeDomainName, NodeId vppNode) {
106         WriteTransaction wTx = dataProvder.newWriteOnlyTransaction();
107         wTx.delete(LogicalDatastoreType.CONFIGURATION,
108                 VppIidFactory.getNodeIid(new TopologyKey(new TopologyId(bridgeDomainName)), new NodeKey(vppNode)));
109         return wTx.submit();
110     }
111
112 }