Upgrading ACL implementation
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / groupbasedpolicy / renderer / vpp / policy / acl / GbpAceBuilder.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.policy.acl;
10
11 import javax.annotation.Nullable;
12
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.Ace;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.AceBuilder;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Actions;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.ActionsBuilder;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.Matches;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.MatchesBuilder;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.DenyBuilder;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160708.access.lists.acl.access.list.entries.ace.actions.packet.handling.PermitBuilder;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRange;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.DestinationPortRangeBuilder;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRange;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160708.acl.transport.header.fields.SourcePortRangeBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAce;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.VppAceBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.VppAceNodesBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.AceIpVersion;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv4;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv4Builder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv6;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.access.lists.acl.access.list.entries.ace.matches.ace.type.vpp.ace.vpp.ace.nodes.ace.ip.version.AceIpv6Builder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.icmp.header.fields.IcmpCodeRangeBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.icmp.header.fields.IcmpTypeRangeBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.IpProtocol;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.IcmpBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.OtherBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.TcpBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.UdpBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.icmp.IcmpNodesBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.other.OtherNodesBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.tcp.TcpNodes;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.tcp.TcpNodesBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodes;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpp.acl.rev170615.acl.ip.protocol.header.fields.ip.protocol.udp.UdpNodesBuilder;
48
49 import com.google.common.base.Optional;
50 import com.google.common.base.Preconditions;
51
52 public class GbpAceBuilder {
53
54     private final String name;
55     private Short protocol;
56     private SourcePortRangeBuilder sourcePortRangeBuilder;
57     private DestinationPortRangeBuilder destinationPortRangeBuilder;
58     private AceIpVersion aceIpVersion;
59     private AceIpv4 aceIpv4;
60     private AceIpv6 aceIpv6;
61     private IpProtocol ipProtocol;
62     private Actions action; // deny is a default action in the model
63
64     private static final Short FIRST_ICMP = 0;
65     private static final Short LAST_ICMP = 254;
66
67     GbpAceBuilder(String name) {
68         this.name = Preconditions.checkNotNull(name, "Cannot build rule with empty name.");
69         this.sourcePortRangeBuilder = new SourcePortRangeBuilder();
70         this.destinationPortRangeBuilder = new DestinationPortRangeBuilder();
71     }
72
73     public String getName() {
74         return name;
75     }
76
77     public Short getProtocol() {
78         return protocol;
79     }
80
81     public SourcePortRangeBuilder getSourcePortRangeBuilder() {
82         return sourcePortRangeBuilder;
83     }
84
85     public DestinationPortRangeBuilder getDestinationPortRangeBuilder() {
86         return destinationPortRangeBuilder;
87     }
88
89     public AceIpVersion getAceIpVersion() {
90         return aceIpVersion;
91     }
92
93     public Actions getAction() {
94         return action;
95     }
96
97     public Optional<AceIpVersion> getEtherType() {
98         return (aceIpVersion != null) ? Optional.of(aceIpVersion) : Optional.absent();
99     }
100
101     public GbpAceBuilder setProtocol(short protocol) {
102         this.protocol = protocol;
103         return this;
104     }
105
106     public GbpAceBuilder setSourcePortRange(SourcePortRangeBuilder sourcePortRangeBuilder) {
107         if (sourcePortRangeBuilder != null) {
108             this.sourcePortRangeBuilder = sourcePortRangeBuilder;
109         }
110         return this;
111     }
112
113     public GbpAceBuilder setDestinationPortRange(DestinationPortRangeBuilder destPortRangeBuilder) {
114         if (destPortRangeBuilder != null) {
115             this.destinationPortRangeBuilder = destPortRangeBuilder;
116         }
117         return this;
118     }
119
120     public GbpAceBuilder setIpv4EtherType() {
121         this.aceIpVersion = new AceIpv4Builder().build();
122         return this;
123     }
124
125     public GbpAceBuilder setIpv6EtherType() {
126         this.aceIpVersion = new AceIpv6Builder().build();
127         return this;
128     }
129
130     public GbpAceBuilder setIpAddresses(@Nullable Ipv4Prefix srcIp, @Nullable Ipv4Prefix dstIp) {
131         AceIpv4Builder aceIpv4Builder = (aceIpv4 != null) ? new AceIpv4Builder(aceIpv4) : new AceIpv4Builder();
132         if (srcIp != null) {
133             aceIpv4Builder.setSourceIpv4Network(srcIp);
134         }
135         if (dstIp != null) {
136             aceIpv4Builder.setDestinationIpv4Network(dstIp);
137         }
138         this.aceIpv4 = aceIpv4Builder.build();
139         this.aceIpVersion = aceIpv4;
140         return this;
141     }
142
143     public GbpAceBuilder setIpAddresses(@Nullable Ipv6Prefix srcIp, @Nullable Ipv6Prefix dstIp) {
144         AceIpv6Builder aceIpv6Builder = (aceIpv6 != null) ? new AceIpv6Builder(aceIpv6) : new AceIpv6Builder();
145         if (srcIp != null) {
146             aceIpv6Builder.setSourceIpv6Network(srcIp);
147         }
148         if (dstIp != null) {
149             aceIpv6Builder.setDestinationIpv6Network(dstIp);
150         }
151         this.aceIpv6 = aceIpv6Builder.build();
152         this.aceIpVersion = aceIpv6;
153         return this;
154     }
155
156     public GbpAceBuilder setPermit() {
157         this.action = new ActionsBuilder().setPacketHandling(new PermitBuilder().setPermit(true).build()).build();
158         return this;
159     }
160
161     public GbpAceBuilder setDeny() {
162         this.action = new ActionsBuilder().setPacketHandling(new DenyBuilder().setDeny(true).build()).build();
163         return this;
164     }
165
166     public GbpAceBuilder setAction(Actions actions) {
167         this.action = actions;
168         return this;
169     }
170
171     public Ace build() {
172         if (protocol == null || protocol == 0) {
173             ipProtocol =
174                     new OtherBuilder().setOtherNodes(new OtherNodesBuilder().setProtocol((short) 0).build()).build();
175         } else {
176             if (protocol == 1) {
177                 ipProtocol = new IcmpBuilder().setIcmpNodes(new IcmpNodesBuilder()
178                     .setIcmpTypeRange(new IcmpTypeRangeBuilder().setFirst(FIRST_ICMP).setLast(LAST_ICMP).build())
179                     .setIcmpCodeRange(new IcmpCodeRangeBuilder().setFirst(FIRST_ICMP).setLast(LAST_ICMP).build())
180                     .build()).build();
181             }
182             SourcePortRange sourcePortRange = (sourcePortRangeBuilder.getLowerPort() != null
183                     && sourcePortRangeBuilder.getUpperPort() != null) ? sourcePortRangeBuilder.build() : null;
184             DestinationPortRange destPortRange = (destinationPortRangeBuilder.getLowerPort() != null
185                     && destinationPortRangeBuilder.getUpperPort() != null) ? destinationPortRangeBuilder.build() : null;
186             if (protocol == 6) {
187                 TcpNodes tcpNodes = new TcpNodesBuilder().setSourcePortRange(sourcePortRange)
188                     .setDestinationPortRange(destPortRange)
189                     .build();
190                 ipProtocol = new TcpBuilder().setTcpNodes(tcpNodes).build();
191             }
192             if (protocol == 17) {
193                 UdpNodes udpNodes = new UdpNodesBuilder().setSourcePortRange(sourcePortRange)
194                     .setDestinationPortRange(destPortRange)
195                     .build();
196                 ipProtocol = new UdpBuilder().setUdpNodes(udpNodes).build();
197                 ipProtocol = new UdpBuilder().setUdpNodes(udpNodes).build();
198             }
199         }
200         VppAce vppAce = new VppAceBuilder()
201             .setVppAceNodes(new VppAceNodesBuilder().setAceIpVersion(aceIpVersion).setIpProtocol(ipProtocol).build())
202             .build();
203         Matches matches = new MatchesBuilder().setAceType(vppAce).build();
204         AceBuilder aceBuilder = new AceBuilder();
205         aceBuilder.setMatches(matches);
206         aceBuilder.setActions(action);
207         aceBuilder.setRuleName(name);
208         return aceBuilder.build();
209     }
210
211     @Override
212     public String toString() {
213         StringBuilder sb = new StringBuilder();
214         appendNonNullTo(sb, "GbpAceBuilder [name=", name);
215         if (sourcePortRangeBuilder != null) {
216             appendNonNullTo(sb, ", srcPort=lower:", sourcePortRangeBuilder.getLowerPort());
217             appendNonNullTo(sb, ", srcPort=upper:", sourcePortRangeBuilder.getUpperPort());
218         }
219         if (sourcePortRangeBuilder != null) {
220             appendNonNullTo(sb, ", dstPort=lower:", destinationPortRangeBuilder.getLowerPort());
221             appendNonNullTo(sb, ", dstPort=upper:", destinationPortRangeBuilder.getUpperPort());
222         }
223         appendNonNullTo(sb, ", protocol=", protocol);
224         appendNonNullTo(sb, ", aceIpVersion=", aceIpVersion);
225         appendNonNullTo(sb, ", action=", action);
226         return sb.toString();
227     }
228
229     private void appendNonNullTo(StringBuilder sb, String key, Object value) {
230         if (value != null && key!= null) {
231             sb.append(key).append(value);
232         }
233     }
234 }