Fix build faliures due to OFPlugin checktyle fixes
[netvirt.git] / vpnservice / sfc / translator / src / main / java / org / opendaylight / netvirt / sfc / translator / portchain / PortPairGroupTranslator.java
1 /*
2  * Copyright (c) 2016, 2017 Brocade Communications 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.netvirt.sfc.translator.portchain;
10
11 import com.google.common.base.Preconditions;
12 import java.util.ArrayList;
13 import java.util.Arrays;
14 import java.util.List;
15 import org.opendaylight.netvirt.sfc.translator.SfcMdsalHelper;
16 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfDataPlaneLocatorName;
17 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfName;
18 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffDataPlaneLocatorName;
19 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName;
20 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocator;
21 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocatorBuilder;
22 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.sff.data.plane.locator.DataPlaneLocatorBuilder;
23 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
24 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderBuilder;
25 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.ServiceFunctionDictionary;
26 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.ServiceFunctionDictionaryBuilder;
27 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.service.function.dictionary.SffSfDataPlaneLocator;
28 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.service.function.dictionary.SffSfDataPlaneLocatorBuilder;
29 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.Mac;
30 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sff.logical.rev160620.service.function.forwarders.service.function.forwarder.sff.data.plane.locator.data.plane.locator.locator.type.LogicalInterface;
31 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.sfc.sff.logical.rev160620.service.function.forwarders.service.function.forwarder.sff.data.plane.locator.data.plane.locator.locator.type.LogicalInterfaceBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pair.groups.PortPairGroup;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 /**
38  * Class will convert OpenStack Port Pair API yang models present in
39  * neutron northbound project to OpenDaylight SFC yang models.
40  */
41 public final class PortPairGroupTranslator {
42     private static final Logger LOG = LoggerFactory.getLogger(PortPairGroupTranslator.class);
43
44     private static final String DPL_EGRESS_SUFFIX = "-egress";
45     private static final String DPL_INGRESS_SUFFIX = "-ingress";
46
47     private PortPairGroupTranslator() { }
48
49     public static ServiceFunctionForwarder buildServiceFunctionForwarder(
50             PortPairGroup portPairGroup,
51             List<PortPair> portPairs) {
52         Preconditions.checkNotNull(portPairGroup, "Port pair group must not be null");
53         Preconditions.checkNotNull(portPairs, "Port pairs must not be null");
54         Preconditions.checkElementIndex(0, portPairs.size(), "There must be at least one port pair");
55
56         //Currently we only support one SF per type. Mean, one port-pair per port-pair-group.
57         final PortPair portPair = portPairs.get(0);
58
59         ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
60         sffBuilder.setName(new SffName(SfcMdsalHelper.NETVIRT_LOGICAL_SFF_NAME));
61
62         DataPlaneLocatorBuilder forwardDplBuilder = new DataPlaneLocatorBuilder();
63         forwardDplBuilder.setTransport(Mac.class);
64         String forwardPort = portPair.getEgress().getValue();
65         LogicalInterface forwardInterface = new LogicalInterfaceBuilder().setInterfaceName(forwardPort).build();
66         forwardDplBuilder.setLocatorType(forwardInterface);
67         SffDataPlaneLocatorBuilder sffForwardDplBuilder = new SffDataPlaneLocatorBuilder();
68         sffForwardDplBuilder.setDataPlaneLocator(forwardDplBuilder.build());
69         String forwardDplName = portPair.getName() + DPL_EGRESS_SUFFIX;
70         sffForwardDplBuilder.setName(new SffDataPlaneLocatorName(forwardDplName));
71
72         DataPlaneLocatorBuilder reverseDplBuilder = new DataPlaneLocatorBuilder();
73         reverseDplBuilder.setTransport(Mac.class);
74         String reversePort = portPair.getIngress().getValue();
75         LogicalInterface reverseInterface = new LogicalInterfaceBuilder().setInterfaceName(reversePort).build();
76         reverseDplBuilder.setLocatorType(reverseInterface);
77         SffDataPlaneLocatorBuilder sffReverseDplBuilder = new SffDataPlaneLocatorBuilder();
78         sffReverseDplBuilder.setDataPlaneLocator(reverseDplBuilder.build());
79         String reverseDplName = portPair.getName() + DPL_INGRESS_SUFFIX;
80         sffReverseDplBuilder.setName(new SffDataPlaneLocatorName(reverseDplName));
81
82         List<SffDataPlaneLocator> sffDataPlaneLocator = new ArrayList<>();
83         sffDataPlaneLocator.add(sffForwardDplBuilder.build());
84         sffDataPlaneLocator.add(sffReverseDplBuilder.build());
85         sffBuilder.setSffDataPlaneLocator(sffDataPlaneLocator);
86
87         SffSfDataPlaneLocatorBuilder sffSfDataPlaneLocatorBuilder = new SffSfDataPlaneLocatorBuilder();
88         sffSfDataPlaneLocatorBuilder.setSffForwardDplName(new SffDataPlaneLocatorName(forwardDplName));
89         sffSfDataPlaneLocatorBuilder.setSfForwardDplName(new SfDataPlaneLocatorName(forwardDplName));
90         sffSfDataPlaneLocatorBuilder.setSffReverseDplName(new SffDataPlaneLocatorName(reverseDplName));
91         sffSfDataPlaneLocatorBuilder.setSfReverseDplName(new SfDataPlaneLocatorName(reverseDplName));
92         ServiceFunctionDictionaryBuilder sfdBuilder = new ServiceFunctionDictionaryBuilder();
93         sfdBuilder.setName(new SfName(portPair.getName()));
94         sfdBuilder.setSffSfDataPlaneLocator(sffSfDataPlaneLocatorBuilder.build());
95
96         List<ServiceFunctionDictionary> sfdList = new ArrayList<>();
97         sfdList.add(sfdBuilder.build());
98         sffBuilder.setServiceFunctionDictionary(sfdList);
99
100         return sffBuilder.build();
101     }
102
103     public static ServiceFunctionForwarder removePortPairFromServiceFunctionForwarder(
104             ServiceFunctionForwarder serviceFunctionForwarder,
105             PortPair deletedPortPair) {
106         Preconditions.checkNotNull(deletedPortPair, "Port pair must not be null");
107
108         String portPairName = deletedPortPair.getName();
109         ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder(serviceFunctionForwarder);
110
111         List<ServiceFunctionDictionary> serviceFunctionDictionaryList = sffBuilder.getServiceFunctionDictionary();
112         if (serviceFunctionDictionaryList == null) {
113             LOG.debug("SF dictionary is empty");
114             return serviceFunctionForwarder;
115         }
116
117         ServiceFunctionDictionary serviceFunctionDictionary = serviceFunctionDictionaryList.stream()
118                 .filter(sfDictionary -> sfDictionary.getName().getValue().equals(portPairName))
119                 .findFirst()
120                 .orElse(null);
121
122         if (serviceFunctionDictionary == null) {
123             LOG.debug("SFF dictionary entry for port pair {} not found", portPairName);
124             return serviceFunctionForwarder;
125         }
126
127         SffSfDataPlaneLocator sffSfDataPlaneLocator = serviceFunctionDictionary.getSffSfDataPlaneLocator();
128         if (sffSfDataPlaneLocator != null) {
129             List<SffDataPlaneLocatorName> locators = Arrays.asList(
130                     sffSfDataPlaneLocator.getSffDplName(),
131                     sffSfDataPlaneLocator.getSffForwardDplName(),
132                     sffSfDataPlaneLocator.getSffReverseDplName());
133             List<SffDataPlaneLocator> sffDplList = sffBuilder.getSffDataPlaneLocator();
134             if (sffDplList != null) {
135                 sffDplList.stream()
136                         .filter(sffDataPlaneLocator -> locators.contains(sffDataPlaneLocator.getName()))
137                         .map(sffDplList::remove);
138             }
139         }
140         serviceFunctionDictionaryList.remove(serviceFunctionDictionary);
141
142         return sffBuilder.build();
143     }
144 }