Federation plugin
[netvirt.git] / vpnservice / federation-plugin / impl / src / main / java / org / opendaylight / netvirt / federation / plugin / filters / FederationIetfInterfaceFilter.java
1 /*
2  * Copyright (c) 2017 Hewlett Packard Enterprise, Co. 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.federation.plugin.filters;
10
11 import javax.inject.Inject;
12 import javax.inject.Singleton;
13
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
16 import org.opendaylight.netvirt.elanmanager.api.IElanService;
17 import org.opendaylight.netvirt.federation.plugin.FederatedMappings;
18 import org.opendaylight.netvirt.federation.plugin.FederationPluginConstants;
19 import org.opendaylight.netvirt.federation.plugin.FederationPluginUtils;
20 import org.opendaylight.netvirt.federation.plugin.PendingModificationCache;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.federation.plugin.rev170219.IfShadowProperties;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 @Singleton
30 public class FederationIetfInterfaceFilter implements FederationPluginFilter<Interface, Interfaces> {
31     private static final Logger LOG = LoggerFactory.getLogger(FederationIetfInterfaceFilter.class);
32
33     private final DataBroker dataBroker;
34     private final IElanService elanService;
35
36     @Inject
37     public FederationIetfInterfaceFilter(final DataBroker dataBroker, final IElanService elanService) {
38         this.dataBroker = dataBroker;
39         this.elanService = elanService;
40         FederationPluginFilterRegistry.registerFilter(FederationPluginConstants.IETF_INTERFACE_KEY, this);
41     }
42
43     @Override
44     public FilterResult applyEgressFilter(Interface iface, FederatedMappings federatedMappings,
45             PendingModificationCache<DataTreeModification<?>> pendingModifications,
46             DataTreeModification<Interface> dataTreeModification) {
47         String interfaceName = iface.getName();
48         if (isShadow(iface)) {
49             LOG.trace("Interface {} filtered out. Reason: shadow interface", interfaceName);
50             return FilterResult.DENY;
51         }
52
53         if (!L2vlan.class.equals(iface.getType())) {
54             LOG.trace("Interface {} filtered out. Reason: type {}", interfaceName, iface.getType());
55             return FilterResult.DENY;
56         }
57
58         if (elanService.isExternalInterface(interfaceName)) {
59             LOG.trace("Interface {} filtered out. Reason: external interface", interfaceName);
60             return FilterResult.DENY;
61         }
62
63         if (FederationPluginUtils.isDhcpInterface(dataBroker, interfaceName)) {
64             LOG.trace("Interface {} filtered out. Reason: dhcp interface", interfaceName);
65             return FilterResult.DENY;
66         }
67
68         ElanInterface elanInterface = elanService.getElanInterfaceByElanInterfaceName(interfaceName);
69         if (elanInterface == null) {
70             elanInterface = FederationPluginUtils.getAssociatedDataObjectFromPending(
71                     FederationPluginConstants.ELAN_INTERFACE_KEY, iface, pendingModifications);
72             if (elanInterface == null) {
73                 LOG.debug("ELAN Interface {} not found. Queueing IETF interface", interfaceName);
74                 return FilterResult.QUEUE;
75             }
76         }
77
78         String elanInstanceName = elanInterface.getElanInstanceName();
79         if (!federatedMappings.containsProducerNetworkId(elanInstanceName)) {
80             LOG.trace("Interface {} filtered out. Reason: network {} not federated", elanInterface.getName(),
81                     elanInstanceName);
82             return FilterResult.DENY;
83         }
84
85         return FilterResult.ACCEPT;
86     }
87
88     @Override
89     public FilterResult applyIngressFilter(String listenerKey, Interfaces iface) {
90         return FilterResult.ACCEPT;
91     }
92
93     private boolean isShadow(Interface iface) {
94         IfShadowProperties ifShadowProperties = iface.getAugmentation(IfShadowProperties.class);
95         return ifShadowProperties != null && Boolean.TRUE.equals(ifShadowProperties.isShadow());
96     }
97
98 }