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