Add implementation for setting unnumbered interface
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / groupbasedpolicy / renderer / vpp / commands / RoutingCommand.java
1 /*
2  * Copyright (c) 2016 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
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;
10
11 import com.google.common.base.Preconditions;
12 import com.google.common.base.Strings;
13 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;
16 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.StaticRoutes1;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.StaticRoutes1Builder;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol._static.routes.Ipv4Builder;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ipv4.unicast.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol._static.routes.ipv4.Route;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.Static;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocol;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocolBuilder;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.RoutingProtocolKey;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.routing.rev140524.routing.routing.instance.routing.protocols.routing.protocol.StaticRoutesBuilder;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.RoutingProtocolVppAttr;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.RoutingProtocolVppAttrBuilder;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.VniReference;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.vpp.routing.rev161214.routing.routing.instance.routing.protocols.routing.protocol.VppProtocolAttributesBuilder;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 import java.util.List;
35
36 public class RoutingCommand extends AbstractConfigCommand {
37
38     private static final Logger LOG = LoggerFactory.getLogger(RoutingCommand.class);
39     public static String ROUTER_INSTANCE_NAME = "vpp-routing-instance";
40     public static String DEFAULT_ROUTING_PROTOCOL = "learned-protocol-0";
41     private List<Route> routes;
42     private String routerProtocol;
43     private Long vrfId;
44
45     private RoutingCommand(RoutingCommandBuilder builder) {
46         operation = builder.getOperation();
47         routerProtocol = builder.getRouterProtocol();
48         vrfId = builder.getVrfId();
49         routes = builder.getRoutes();
50     }
51
52     public static RoutingCommandBuilder builder() {
53         return new RoutingCommandBuilder();
54     }
55
56     List<Route> getRoutes() {
57         return routes;
58     }
59
60     String getRouterProtocol() {
61         return routerProtocol;
62     }
63
64     Long getVrfId() {
65         return vrfId;
66     }
67
68     @Override public InstanceIdentifier getIid() {
69         String routerProtocol = this.routerProtocol;
70         if (Strings.isNullOrEmpty(routerProtocol)) {
71             routerProtocol = DEFAULT_ROUTING_PROTOCOL;
72         }
73         return VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(routerProtocol));
74     }
75
76     void put(ReadWriteTransaction rwTx) {
77         InstanceIdentifier<RoutingProtocol> routingInstanceIid =
78                 VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(routerProtocol));
79         rwTx.put(LogicalDatastoreType.CONFIGURATION, routingInstanceIid, getRoutingProtocolBuilder().build(), true);
80     }
81
82     void merge(ReadWriteTransaction rwTx) {
83         rwTx.merge(LogicalDatastoreType.CONFIGURATION,
84                 VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(routerProtocol)),
85                 getRoutingProtocolBuilder().build(), true);
86     }
87
88     void delete(ReadWriteTransaction rwTx) {
89         try {
90             rwTx.delete(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getRoutingInstanceIid(new RoutingProtocolKey(
91                     routerProtocol)));
92         } catch (IllegalStateException ex) {
93             LOG.debug("Routing protocol not deleted from DS {}", this, ex);
94         }
95     }
96
97     @Override
98     public String toString() {
99         return "RoutingCommand [routerProtocol=" + routerProtocol + ", routes=" + routes + ", operations="
100                 + operation + "]";
101     }
102
103     private RoutingProtocolBuilder getRoutingProtocolBuilder() {
104         return new RoutingProtocolBuilder()
105                 .setEnabled(true)
106                 .setType(Static.class)
107                 .setName(routerProtocol)
108                 .addAugmentation(RoutingProtocolVppAttr.class, new RoutingProtocolVppAttrBuilder().setVppProtocolAttributes(
109                         new VppProtocolAttributesBuilder().setPrimaryVrf(new VniReference(vrfId)).build()).build())
110                 .setStaticRoutes(new StaticRoutesBuilder().addAugmentation(StaticRoutes1.class,
111                         new StaticRoutes1Builder().setIpv4(new Ipv4Builder().setRoute(routes).build()).build()).build());
112     }
113
114     public static class RoutingCommandBuilder {
115
116         private General.Operations operation;
117         private String routerProtocol;
118         private Long vrfId;
119         private List<Route> routes;
120
121         public General.Operations getOperation() {
122             return operation;
123         }
124
125         public RoutingCommandBuilder setOperation(General.Operations operation) {
126             this.operation = operation;
127             return this;
128         }
129
130         String getRouterProtocol() {
131             return routerProtocol;
132         }
133
134         public RoutingCommandBuilder setRouterProtocol(String routerProtocol) {
135             this.routerProtocol = routerProtocol;
136             return this;
137         }
138
139         Long getVrfId() {
140             return vrfId;
141         }
142
143         public RoutingCommandBuilder setVrfId(Long vrfId) {
144             this.vrfId = vrfId;
145             return this;
146         }
147
148         List<Route> getRoutes() {
149             return routes;
150         }
151
152         public RoutingCommandBuilder setRoutes(List<Route> routes) {
153             this.routes = routes;
154             return this;
155         }
156
157         /**
158          * RoutingCommand build method.
159          *
160          * @return RoutingCommand
161          * @throws IllegalArgumentException if routerProtocol, operation or vrfId is null.
162          */
163         public RoutingCommand build() {
164             Preconditions.checkArgument(this.operation != null);
165             Preconditions.checkArgument(this.routerProtocol != null);
166             Preconditions.checkArgument(this.vrfId != null);
167             return new RoutingCommand(this);
168         }
169
170
171     }
172 }