2 * Copyright (c) 2016, 2017 Brocade Communications Systems, Inc. and others. All rights reserved.
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
9 package org.opendaylight.netvirt.sfc.translator.portchain;
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;
38 * Class will convert OpenStack Port Pair API yang models present in
39 * neutron northbound project to OpenDaylight SFC yang models.
41 public final class PortPairGroupTranslator {
42 private static final Logger LOG = LoggerFactory.getLogger(PortPairGroupTranslator.class);
44 private static final String DPL_EGRESS_SUFFIX = "-egress";
45 private static final String DPL_INGRESS_SUFFIX = "-ingress";
47 private PortPairGroupTranslator() { }
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");
56 //Currently we only support one SF per type. Mean, one port-pair per port-pair-group.
57 final PortPair portPair = portPairs.get(0);
59 ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
60 sffBuilder.setName(new SffName(SfcMdsalHelper.NETVIRT_LOGICAL_SFF_NAME));
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));
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));
82 List<SffDataPlaneLocator> sffDataPlaneLocator = new ArrayList<>();
83 sffDataPlaneLocator.add(sffForwardDplBuilder.build());
84 sffDataPlaneLocator.add(sffReverseDplBuilder.build());
85 sffBuilder.setSffDataPlaneLocator(sffDataPlaneLocator);
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());
96 List<ServiceFunctionDictionary> sfdList = new ArrayList<>();
97 sfdList.add(sfdBuilder.build());
98 sffBuilder.setServiceFunctionDictionary(sfdList);
100 return sffBuilder.build();
103 public static ServiceFunctionForwarder removePortPairFromServiceFunctionForwarder(
104 ServiceFunctionForwarder serviceFunctionForwarder,
105 PortPair deletedPortPair) {
106 Preconditions.checkNotNull(deletedPortPair, "Port pair must not be null");
108 String portPairName = deletedPortPair.getName();
109 ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder(serviceFunctionForwarder);
111 List<ServiceFunctionDictionary> serviceFunctionDictionaryList = sffBuilder.getServiceFunctionDictionary();
112 if (serviceFunctionDictionaryList == null) {
113 LOG.debug("SF dictionary is empty");
114 return serviceFunctionForwarder;
117 ServiceFunctionDictionary serviceFunctionDictionary = serviceFunctionDictionaryList.stream()
118 .filter(sfDictionary -> sfDictionary.getName().getValue().equals(portPairName))
122 if (serviceFunctionDictionary == null) {
123 LOG.debug("SFF dictionary entry for port pair {} not found", portPairName);
124 return serviceFunctionForwarder;
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) {
136 .filter(sffDataPlaneLocator -> locators.contains(sffDataPlaneLocator.getName()))
137 .map(sffDplList::remove);
140 serviceFunctionDictionaryList.remove(serviceFunctionDictionary);
142 return sffBuilder.build();