Bug 4996 - Wrong flows when using SFC coexistence
[netvirt.git] / openstack / net-virt-sfc / impl / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / sfc / workaround / services / AclUtils.java
1 /*
2  * Copyright © 2016 Red Hat, 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.ovsdb.openstack.netvirt.sfc.workaround.services;
10
11 import java.util.ArrayList;
12 import java.util.List;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.AccessListsBuilder;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.Acl;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.AclBuilder;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.AccessListEntriesBuilder;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.Ace;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.AceBuilder;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.ActionsBuilder;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.MatchesBuilder;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.actions.packet.handling.PermitBuilder;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIpBuilder;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev150317.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv4Builder;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev150611.acl.transport.header.fields.DestinationPortRangeBuilder;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev150611.acl.transport.header.fields.SourcePortRangeBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.acl.rev150105.RedirectToSfc;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.acl.rev150105.RedirectToSfcBuilder;
29
30 public class AclUtils {
31     private static final String ACLNAME= "httpAcl";
32     private static final String RULENAME= "httpRule";
33     private static final String SFCNAME = "SFC";
34
35     public MatchesBuilder matchesBuilder(MatchesBuilder matchesBuilder, int dstPort) {
36         SourcePortRangeBuilder sourcePortRangeBuilder = new SourcePortRangeBuilder()
37                 .setLowerPort(PortNumber.getDefaultInstance("0"))
38                 .setUpperPort(PortNumber.getDefaultInstance("0"));
39
40         PortNumber portNumber = new PortNumber(dstPort);
41         DestinationPortRangeBuilder destinationPortRangeBuilder = new DestinationPortRangeBuilder()
42                 .setLowerPort(portNumber)
43                 .setUpperPort(portNumber);
44
45         AceIpBuilder aceIpBuilder = new AceIpBuilder()
46                 .setSourcePortRange(sourcePortRangeBuilder.build())
47                 .setDestinationPortRange(destinationPortRangeBuilder.build())
48                 .setProtocol((short)6);
49
50         return matchesBuilder.setAceType(aceIpBuilder.build());
51     }
52
53     public ActionsBuilder actionsBuilder(ActionsBuilder actionsBuilder, Boolean permit) {
54         return actionsBuilder.setPacketHandling(new PermitBuilder().setPermit(permit).build());
55     }
56
57     public ActionsBuilder actionsBuilder(ActionsBuilder actionsBuilder, String sfcName, boolean renderRsp) {
58         RedirectToSfcBuilder redirectToSfcBuilder = new RedirectToSfcBuilder()
59                 .setSfcName(sfcName)
60                 .setRenderRsp(renderRsp);
61
62         return actionsBuilder.addAugmentation(RedirectToSfc.class, redirectToSfcBuilder.build());
63     }
64
65     public AceBuilder aceBuilder(AceBuilder accessListEntryBuilder,
66                                  String ruleName,
67                                  MatchesBuilder matchesBuilder,
68                                  ActionsBuilder actionsBuilder) {
69         return accessListEntryBuilder
70                 .setRuleName(ruleName)
71                 .setMatches(matchesBuilder.build())
72                 .setActions(actionsBuilder.build());
73     }
74
75     public AccessListEntriesBuilder accessListEntriesBuidler(AccessListEntriesBuilder accessListEntriesBuilder,
76                                                              AceBuilder aceBuilder) {
77         List<Ace> aceList = new ArrayList<>();
78         aceList.add(aceBuilder.build());
79
80         return accessListEntriesBuilder.setAce(aceList);
81     }
82
83     public AclBuilder aclBuilder(AclBuilder aclBuilder,
84                                  String aclName,
85                                  AccessListEntriesBuilder accessListEntriesBuilder) {
86         return aclBuilder
87                 .setAclName(aclName)
88                 .setAccessListEntries(accessListEntriesBuilder.build());
89     }
90
91     public AccessListsBuilder accessListsbuilder(AccessListsBuilder accessListsBuilder,
92                                                  AclBuilder aclBuilder) {
93         List<Acl> aclList = new ArrayList<>();
94         aclList.add(aclBuilder.build());
95
96         return accessListsBuilder.setAcl(aclList);
97     }
98
99     public AccessListsBuilder accessListsBuilder(boolean renderRsp) {
100         String ruleName = RULENAME;
101         String sfcName = SFCNAME;
102         MatchesBuilder matchesBuilder = matchesBuilder(new MatchesBuilder(), 80);
103         ActionsBuilder actionsBuilder = actionsBuilder(new ActionsBuilder(), sfcName, renderRsp);
104         AceBuilder accessListEntryBuilder =
105                 aceBuilder(new AceBuilder(), ruleName, matchesBuilder, actionsBuilder);
106         AccessListEntriesBuilder accessListEntriesBuilder =
107                 accessListEntriesBuidler(new AccessListEntriesBuilder(), accessListEntryBuilder);
108         AclBuilder accessListBuilder =
109                 aclBuilder(new AclBuilder(), ACLNAME, accessListEntriesBuilder);
110         AccessListsBuilder accessListsBuilder =
111                 accessListsbuilder(new AccessListsBuilder(), accessListBuilder);
112         return accessListsBuilder;
113     }
114 }