2 * Copyright (c) 2017 Hewlett Packard Enterprise, Co. 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.federation.plugin.filters;
11 import javax.inject.Inject;
12 import javax.inject.Singleton;
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;
30 public class FederationIetfInterfaceFilter implements FederationPluginFilter<Interface, Interfaces> {
31 private static final Logger LOG = LoggerFactory.getLogger(FederationIetfInterfaceFilter.class);
33 private final DataBroker dataBroker;
34 private final IElanService elanService;
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);
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;
53 if (!L2vlan.class.equals(iface.getType())) {
54 LOG.trace("Interface {} filtered out. Reason: type {}", interfaceName, iface.getType());
55 return FilterResult.DENY;
58 if (elanService.isExternalInterface(interfaceName)) {
59 LOG.trace("Interface {} filtered out. Reason: external interface", interfaceName);
60 return FilterResult.DENY;
63 if (FederationPluginUtils.isDhcpInterface(dataBroker, interfaceName)) {
64 LOG.trace("Interface {} filtered out. Reason: dhcp interface", interfaceName);
65 return FilterResult.DENY;
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;
78 String elanInstanceName = elanInterface.getElanInstanceName();
79 if (!federatedMappings.containsProducerNetworkId(elanInstanceName)) {
80 LOG.trace("Interface {} filtered out. Reason: network {} not federated", elanInterface.getName(),
82 return FilterResult.DENY;
85 return FilterResult.ACCEPT;
89 public FilterResult applyIngressFilter(String listenerKey, Interfaces iface) {
90 return FilterResult.ACCEPT;
93 private boolean isShadow(Interface iface) {
94 IfShadowProperties ifShadowProperties = iface.getAugmentation(IfShadowProperties.class);
95 return ifShadowProperties != null && Boolean.TRUE.equals(ifShadowProperties.isShadow());