MDSAL-API Migration
[genius.git] / interfacemanager / interfacemanager-impl / src / main / java / org / opendaylight / genius / interfacemanager / renderer / ovs / confighelpers / OvsVlanMemberConfigUpdateHelper.java
1 /*
2  * Copyright (c) 2016, 2017 Ericsson India Global Services Pvt Ltd. 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.genius.interfacemanager.renderer.ovs.confighelpers;
9
10 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
11
12 import com.google.common.util.concurrent.ListenableFuture;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.Objects;
16 import javax.inject.Inject;
17 import javax.inject.Singleton;
18
19 import org.apache.aries.blueprint.annotation.service.Reference;
20 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
21 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
22 import org.opendaylight.genius.interfacemanager.IfmUtil;
23 import org.opendaylight.genius.interfacemanager.commons.InterfaceManagerCommonUtils;
24 import org.opendaylight.genius.interfacemanager.commons.InterfaceMetaUtils;
25 import org.opendaylight.mdsal.binding.api.DataBroker;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info.InterfaceParentEntryKey;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntry;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntryKey;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 @Singleton
40 public class OvsVlanMemberConfigUpdateHelper {
41     private static final Logger LOG = LoggerFactory.getLogger(OvsVlanMemberConfigUpdateHelper.class);
42     private static final Logger EVENT_LOGGER = LoggerFactory.getLogger("GeniusEventLogger");
43
44     private final ManagedNewTransactionRunner txRunner;
45     private final InterfaceManagerCommonUtils interfaceManagerCommonUtils;
46     private final OvsVlanMemberConfigAddHelper ovsVlanMemberConfigAddHelper;
47     private final OvsVlanMemberConfigRemoveHelper ovsVlanMemberConfigRemoveHelper;
48     private final InterfaceMetaUtils interfaceMetaUtils;
49
50     @Inject
51     public OvsVlanMemberConfigUpdateHelper(@Reference DataBroker dataBroker,
52             InterfaceManagerCommonUtils interfaceManagerCommonUtils,
53             OvsVlanMemberConfigAddHelper ovsVlanMemberConfigAddHelper,
54             OvsVlanMemberConfigRemoveHelper ovsVlanMemberConfigRemoveHelper,
55             InterfaceMetaUtils interfaceMetaUtils) {
56         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
57         this.interfaceManagerCommonUtils = interfaceManagerCommonUtils;
58         this.ovsVlanMemberConfigAddHelper = ovsVlanMemberConfigAddHelper;
59         this.ovsVlanMemberConfigRemoveHelper = ovsVlanMemberConfigRemoveHelper;
60         this.interfaceMetaUtils = interfaceMetaUtils;
61     }
62
63     public List<ListenableFuture<Void>> updateConfiguration(ParentRefs parentRefsNew, Interface interfaceOld,
64             IfL2vlan ifL2vlanNew, Interface interfaceNew) {
65         LOG.info("updating interface configuration for vlan memeber {} with parent-interface {}", interfaceNew
66             .getName(), parentRefsNew.getParentInterface());
67         EVENT_LOGGER.debug("IFM-OVSVlanMemberConfig,UPDATE Parent {},Child {}", parentRefsNew.getParentInterface(),
68                 interfaceNew.getName());
69         List<ListenableFuture<Void>> futures = new ArrayList<>();
70         ParentRefs parentRefsOld = interfaceOld.augmentation(ParentRefs.class);
71
72         InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(
73                 parentRefsOld.getParentInterface());
74         InterfaceChildEntryKey interfaceChildEntryKey = new InterfaceChildEntryKey(interfaceOld.getName());
75         InterfaceChildEntry interfaceChildEntry = interfaceMetaUtils
76                 .getInterfaceChildEntryFromConfigDS(interfaceParentEntryKey, interfaceChildEntryKey);
77
78         if (interfaceChildEntry == null) {
79             futures.addAll(ovsVlanMemberConfigAddHelper.addConfiguration(interfaceNew.augmentation(ParentRefs.class),
80                     interfaceNew));
81             return futures;
82         }
83
84         IfL2vlan ifL2vlanOld = interfaceOld.augmentation(IfL2vlan.class);
85         if (ifL2vlanOld == null || ifL2vlanNew.getL2vlanMode() != ifL2vlanOld.getL2vlanMode()) {
86             LOG.error("Configuration Error. Vlan Mode Change of Vlan Trunk Member {} as new trunk member: {} is "
87                     + "not allowed.", interfaceOld, interfaceNew);
88             return futures;
89         }
90
91         if (vlanIdModified(ifL2vlanOld.getVlanId(), ifL2vlanNew.getVlanId())
92                 || !Objects.equals(parentRefsOld.getParentInterface(), parentRefsNew.getParentInterface())) {
93             LOG.info("vlan-id modified for interface {}", interfaceNew.getName());
94             futures.addAll(ovsVlanMemberConfigRemoveHelper.removeConfiguration(parentRefsOld, interfaceOld));
95             futures.addAll(ovsVlanMemberConfigAddHelper.addConfiguration(parentRefsNew, interfaceNew));
96             return futures;
97         }
98
99         if (Objects.equals(interfaceNew.isEnabled(), interfaceOld.isEnabled())) {
100             return futures;
101         }
102
103         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
104             .interfaces.rev140508.interfaces.state.Interface pifState = interfaceManagerCommonUtils.getInterfaceState(
105                     parentRefsNew.getParentInterface());
106         if (pifState != null) {
107             OperStatus operStatus = interfaceNew.isEnabled() ? pifState.getOperStatus() : OperStatus.Down;
108             LOG.info("admin-state modified for interface {}", interfaceNew.getName());
109             futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, tx -> {
110                 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces
111                         .rev140508.interfaces.state.Interface>
112                         ifStateId = IfmUtil.buildStateInterfaceId(interfaceNew.getName());
113                 InterfaceBuilder ifaceBuilder = new InterfaceBuilder();
114                 ifaceBuilder.setOperStatus(operStatus);
115                 ifaceBuilder.withKey(IfmUtil.getStateInterfaceKeyFromName(interfaceNew.getName()));
116
117                 tx.merge(ifStateId, ifaceBuilder.build());
118             }));
119         }
120
121         return futures;
122     }
123
124     public static boolean vlanIdModified(VlanId vlanIdOld, VlanId vlanIdNew) {
125         return !Objects.equals(vlanIdOld, vlanIdNew);
126     }
127 }