BUG 8883 : LOG enhancement for NAT service module
[netvirt.git] / vpnservice / natservice / natservice-impl / src / main / java / org / opendaylight / netvirt / natservice / internal / ExternalSubnetVpnInstanceListener.java
1 /*
2  * Copyright (c) 2017 HPE, 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 package org.opendaylight.netvirt.natservice.internal;
9
10 import com.google.common.base.Optional;
11
12 import javax.annotation.PostConstruct;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
18 import org.opendaylight.genius.mdsalutil.NwConstants;
19 import org.opendaylight.netvirt.elanmanager.api.IElanService;
20 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceToVpnId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstance;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.subnets.Subnets;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
27 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 @Singleton
32 public class ExternalSubnetVpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInstance,
33     ExternalSubnetVpnInstanceListener> implements AutoCloseable {
34     private static final Logger LOG = LoggerFactory.getLogger(ExternalSubnetVpnInstanceListener.class);
35     private final DataBroker dataBroker;
36     private final SNATDefaultRouteProgrammer snatDefaultRouteProgrammer;
37     private final IElanService elanService;
38     private final IVpnManager vpnManager;
39
40     @Inject
41     public ExternalSubnetVpnInstanceListener(final DataBroker dataBroker,
42             final SNATDefaultRouteProgrammer snatDefaultRouteProgrammer,
43             final IElanService elanService, final IVpnManager vpnManager) {
44         this.dataBroker = dataBroker;
45         this.snatDefaultRouteProgrammer = snatDefaultRouteProgrammer;
46         this.elanService = elanService;
47         this.vpnManager = vpnManager;
48     }
49
50     @Override
51     @PostConstruct
52     public void init() {
53         LOG.info("{} init", getClass().getSimpleName());
54         registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
55     }
56
57     @Override
58     protected InstanceIdentifier<VpnInstance> getWildCardPath() {
59         return InstanceIdentifier.create(VpnInstanceToVpnId.class).child(VpnInstance.class);
60     }
61
62     @Override
63     protected void remove(InstanceIdentifier<VpnInstance> key, VpnInstance vpnInstance) {
64         LOG.trace("remove : External Subnet VPN Instance remove mapping method - key:{}. value={}",
65                 vpnInstance.getKey(), vpnInstance);
66         String possibleExtSubnetUuid = vpnInstance.getVpnInstanceName();
67         Optional<Subnets> optionalSubnets = NatUtil.getOptionalExternalSubnets(dataBroker,
68                 new Uuid(possibleExtSubnetUuid));
69         if (optionalSubnets.isPresent()) {
70             addOrDelDefaultFibRouteToSNATFlow(vpnInstance, optionalSubnets.get(), NwConstants.DEL_FLOW);
71             invokeSubnetDeletedFromVpn(possibleExtSubnetUuid);
72         }
73     }
74
75     @Override
76     protected void update(InstanceIdentifier<VpnInstance> key, VpnInstance vpnInstanceOrig,
77             VpnInstance vpnInstanceNew) {
78         LOG.trace("update : External Subnet VPN Instance update mapping method - key:{} original:{} new:{}",
79                 vpnInstanceNew.getKey(), vpnInstanceOrig, vpnInstanceNew);
80     }
81
82     @Override
83     protected void add(InstanceIdentifier<VpnInstance> key, VpnInstance vpnInstance) {
84         LOG.trace("add : External Subnet VPN Instance OP Data Entry add mapping method - key:{}. value={}",
85                 vpnInstance.getKey(), vpnInstance);
86         String possibleExtSubnetUuid = vpnInstance.getVpnInstanceName();
87         Optional<Subnets> optionalSubnets = NatUtil.getOptionalExternalSubnets(dataBroker,
88                 new Uuid(possibleExtSubnetUuid));
89         if (optionalSubnets.isPresent()) {
90             LOG.debug("add : VpnInstance {} for external subnet {}.", possibleExtSubnetUuid,
91                     optionalSubnets.get());
92             addOrDelDefaultFibRouteToSNATFlow(vpnInstance, optionalSubnets.get(), NwConstants.ADD_FLOW);
93             invokeSubnetAddedToVpn(possibleExtSubnetUuid);
94         }
95     }
96
97     private void invokeSubnetAddedToVpn(String externalSubnetId) {
98         Uuid externalSubnetUuid = new Uuid(externalSubnetId);
99         Subnetmap subnetMap = NatUtil.getSubnetMap(dataBroker, externalSubnetUuid);
100         if (subnetMap == null) {
101             LOG.error("invokeSubnetAddedToVpn : Cannot invoke onSubnetAddedToVpn for subnet-id {} in vpn-id {}"
102                     + " due to this subnet missing in Subnetmap model", externalSubnetUuid, externalSubnetId);
103             return;
104         }
105         ElanInstance elanInstance = elanService.getElanInstance(subnetMap.getNetworkId().getValue());
106         vpnManager.onSubnetAddedToVpn(subnetMap, false, elanInstance.getElanTag());
107
108     }
109
110     private void invokeSubnetDeletedFromVpn(String externalSubnetId) {
111         Uuid externalSubnetUuid = new Uuid(externalSubnetId);
112         Subnetmap subnetMap = NatUtil.getSubnetMap(dataBroker, externalSubnetUuid);
113         vpnManager.onSubnetDeletedFromVpn(subnetMap, false);
114     }
115
116     private void addOrDelDefaultFibRouteToSNATFlow(VpnInstance vpnInstance, Subnets subnet, int flowAction) {
117         String vpnInstanceName = vpnInstance.getVpnInstanceName();
118         LOG.debug("addOrDelDefaultFibRouteToSNATFlow : VpnInstance {} for external subnet {}.",
119                 vpnInstanceName, subnet);
120         Long vpnId = vpnInstance.getVpnId();
121         snatDefaultRouteProgrammer.addOrDelDefaultFibRouteToSNATForSubnet(subnet,
122                 subnet.getExternalNetworkId().getValue(), flowAction, vpnId);
123     }
124
125     @Override
126     protected ExternalSubnetVpnInstanceListener getDataTreeChangeListener() {
127         return ExternalSubnetVpnInstanceListener.this;
128     }
129 }