Fixes for DVR
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / groupbasedpolicy / renderer / vpp / lisp / flat / overlay / StaticRoutingHelper.java
1 /*
2  * Copyright (c) 2017 Cisco Systems. 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 package org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.flat.overlay;
9
10 import com.google.common.base.Preconditions;
11
12 import java.util.Collections;
13 import java.util.List;
14
15 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.LispStateManager;
16 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.exception.LispConfigCommandFailedException;
17 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.HostRelatedInfoContainer;
18 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.PortInterfaces;
19 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.PortRouteState;
20 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.VrfHolder;
21 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.info.container.states.VrfState;
22 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.util.Constants;
23 import org.opendaylight.groupbasedpolicy.renderer.vpp.lisp.util.IpAddressUtil;
24 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.GbpNetconfTransaction;
25 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.StaticRoutes1;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv4;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv4Builder;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.Route;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.RouteBuilder;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.RouteKey;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.route.next.hop.options.SimpleNextHopBuilder;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.route.next.hop.options.TableLookupBuilder;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev170917.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.route.next.hop.options.table.lookup.TableLookupParamsBuilder;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.Static;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocol;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocolBuilder;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocolKey;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol.StaticRoutes;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.RoutingProtocolVppAttr;
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.RoutingProtocolVppAttrBuilder;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.VniReference;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev170917.routing.routing.instance.routing.protocols.routing.protocol.VppProtocolAttributesBuilder;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
48 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
49 import org.slf4j.Logger;
50 import org.slf4j.LoggerFactory;
51
52 public class StaticRoutingHelper {
53     private static final Logger LOG = LoggerFactory.getLogger(StaticRoutingHelper.class);
54
55     private HostRelatedInfoContainer hostRelatedInfoContainer = HostRelatedInfoContainer.getInstance();
56
57     synchronized boolean addRoutingProtocolForVrf(InstanceIdentifier<Node> nodeIid, long vrfId) {
58         RoutingProtocolBuilder builder = new RoutingProtocolBuilder();
59         builder.setKey(getRoutingProtocolName(vrfId));
60         builder.setName(getRoutingProtocolName(vrfId).getName());
61         builder.setType(Static.class);
62         builder.setDescription(Constants.DEFAULT_ROUTING_DESCRIPTION);
63         RoutingProtocolVppAttrBuilder vppAugmentationBuilder = new RoutingProtocolVppAttrBuilder();
64
65         vppAugmentationBuilder.
66                 setVppProtocolAttributes(new VppProtocolAttributesBuilder()
67                                                 .setPrimaryVrf(new VniReference(vrfId)).build());
68
69         builder.addAugmentation(RoutingProtocolVppAttr.class, vppAugmentationBuilder.build());
70
71         InstanceIdentifier<RoutingProtocol> iid = VppIidFactory
72                 .getRoutingInstanceIid(builder.getKey());
73         if (GbpNetconfTransaction.netconfSyncedWrite(nodeIid, iid, builder.build(),
74                 GbpNetconfTransaction.RETRY_COUNT)) {
75             return true;
76         }
77         return false;
78     }
79
80     synchronized boolean addSingleStaticRouteInRoutingProtocol(Long routeId, String hostName, long portVrfId,
81             Ipv4Address nextHopAddress, Ipv4Prefix ipPrefix, String outgoingInterface, VniReference secondaryVrf) {
82         RouteBuilder builder = new RouteBuilder();
83         builder.setId(routeId);
84         builder.setDestinationPrefix(ipPrefix);
85         builder.setKey(new RouteKey(builder.getId()));
86
87         if (secondaryVrf != null) {
88             builder.setNextHopOptions(new TableLookupBuilder()
89                 .setTableLookupParams(new TableLookupParamsBuilder().setSecondaryVrf(secondaryVrf).build()).build());
90         } else {
91             builder.setNextHopOptions(new SimpleNextHopBuilder().setNextHop(nextHopAddress)
92                 .setOutgoingInterface(outgoingInterface)
93                 .build());
94         }
95         String protocolName = Constants.ROUTING_PROTOCOL_NAME_PREFIX + String.valueOf(portVrfId);
96
97         List<Route> routes = Collections.singletonList(builder.build());
98         Ipv4 ipv4Route = new Ipv4Builder().setRoute(routes).build();
99         RoutingProtocolKey routingProtocolKey = new RoutingProtocolKey(protocolName);
100         InstanceIdentifier<Ipv4> iid = VppIidFactory.getRoutingInstanceIid(routingProtocolKey)
101             .child(StaticRoutes.class)
102             .augmentation(StaticRoutes1.class)
103             .child(Ipv4.class);
104         boolean txResult =
105                 GbpNetconfTransaction.netconfSyncedMerge(VppIidFactory.getNetconfNodeIid(new NodeId(hostName)),
106                         VppIidFactory.getRoutingInstanceIid(routingProtocolKey),
107                         new RoutingProtocolBuilder().setKey(routingProtocolKey).setType(Static.class).build(),
108                         GbpNetconfTransaction.RETRY_COUNT);
109
110         if (txResult && GbpNetconfTransaction.netconfSyncedMerge(VppIidFactory.getNetconfNodeIid(new NodeId(hostName)),
111                 iid, ipv4Route, GbpNetconfTransaction.RETRY_COUNT)) {
112             hostRelatedInfoContainer.addRouteToIntfc(hostName, outgoingInterface, routeId);
113             LOG.trace("addSingleStaticRouteInRoutingProtocol -> Route added for host: {}: {}", hostName, ipv4Route);
114             return true;
115         }
116         return false;
117     }
118
119     public synchronized static boolean deleteSingleStaticRouteFromRoutingProtocol(String hostName, long vrfId, Long routeId) {
120         LOG.trace("deleteSingleStaticRouteFromRoutingProtocol -> deleting route. id: {}, vrf: {}, hostName: {}", routeId, vrfId, hostName);
121
122         String protocolName = Constants.ROUTING_PROTOCOL_NAME_PREFIX + vrfId;
123         InstanceIdentifier<Route> iid = VppIidFactory
124             .getRoutingInstanceIid(new RoutingProtocolKey(protocolName))
125             .child(StaticRoutes.class)
126             .augmentation(StaticRoutes1.class)
127             .child(Ipv4.class)
128             .child(Route.class, new RouteKey(routeId));
129
130         return GbpNetconfTransaction.netconfSyncedDelete(VppIidFactory.getNetconfNodeIid(new NodeId(hostName)), iid,
131             GbpNetconfTransaction.RETRY_COUNT);
132     }
133
134     public static RoutingProtocolKey getRoutingProtocolName(long vrf) {
135         return new RoutingProtocolKey(Constants.ROUTING_PROTOCOL_NAME_PREFIX + vrf);
136     }
137 }