Migrate users of Optional.get()
[ovsdb.git] / hwvtepsouthbound / hwvtepsouthbound-impl / src / main / java / org / opendaylight / ovsdb / hwvtepsouthbound / transact / LogicalRouterUpdateCommand.java
1 /*
2  * Copyright © 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 package org.opendaylight.ovsdb.hwvtepsouthbound.transact;
9
10 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
11
12 import java.util.Collection;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Map.Entry;
17 import java.util.Optional;
18 import org.opendaylight.mdsal.binding.api.DataTreeModification;
19 import org.opendaylight.ovsdb.lib.notation.UUID;
20 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
21 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalRouter;
22 import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Acls;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalRouters;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalRoutersKey;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.AclBindings;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.AclBindingsKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.StaticRoutes;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.SwitchBindings;
33 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 public class LogicalRouterUpdateCommand
39         extends AbstractTransactCommand<LogicalRouters, LogicalRoutersKey, HwvtepGlobalAugmentation> {
40     private static final Logger LOG = LoggerFactory.getLogger(LogicalRouterUpdateCommand.class);
41
42     public LogicalRouterUpdateCommand(final HwvtepOperationalState state,
43             final Collection<DataTreeModification<Node>> changes) {
44         super(state, changes);
45     }
46
47     @Override
48     public void execute(final TransactionBuilder transaction) {
49         Map<InstanceIdentifier<Node>, List<LogicalRouters>> updateMap =
50                 extractUpdated(getChanges(),LogicalRouters.class);
51
52         for (Entry<InstanceIdentifier<Node>, List<LogicalRouters>> updated:
53             updateMap.entrySet()) {
54             updateLogicalRouter(transaction,  updated.getKey(), updated.getValue());
55         }
56     }
57
58     private void updateLogicalRouter(final TransactionBuilder transaction,
59             final InstanceIdentifier<Node> instanceIdentifier, final List<LogicalRouters> routerList) {
60         for (LogicalRouters lrouter: routerList) {
61             InstanceIdentifier<LogicalRouters> routerKey = instanceIdentifier
62                     .augmentation(HwvtepGlobalAugmentation.class).child(LogicalRouters.class, lrouter.key());
63             LOG.debug("Creating logical router named: {}", lrouter.getHwvtepNodeName());
64
65             final Optional<LogicalRouters> operationalRouterOptional =
66                     getOperationalState().getLogicalRouters(instanceIdentifier, lrouter.key());
67             LogicalRouter logicalRouter = transaction.getTypedRowWrapper(LogicalRouter.class);
68             setDescription(logicalRouter, lrouter);
69
70             setSwitchBindings(transaction, logicalRouter, lrouter.getSwitchBindings());
71             setStaticRoutes(logicalRouter, lrouter.getStaticRoutes());
72             setAclBindings(logicalRouter, lrouter.getAclBindings());
73
74             if (!operationalRouterOptional.isPresent()) {
75                 setName(logicalRouter, lrouter, operationalRouterOptional);
76                 LOG.trace("Creating LogicalRouter entry: {}", logicalRouter);
77                 transaction.add(op.insert(logicalRouter).withId(TransactUtils.getLogicalRouterId(lrouter)));
78                 transaction.add(op.comment("Logical Router: Creating " + lrouter.getHwvtepNodeName().getValue()));
79                 UUID lrUuid = new UUID(TransactUtils.getLogicalRouterId(lrouter));
80                 updateCurrentTxData(LogicalRouters.class, routerKey, lrUuid, lrouter);
81                 updateControllerTxHistory(TransactionType.ADD, logicalRouter);
82             } else {
83                 LogicalRouters updatedLRouter = operationalRouterOptional.orElseThrow();
84                 String existingLogicalRouterName = updatedLRouter.getHwvtepNodeName().getValue();
85                 LogicalRouter extraLogicalRouter = transaction.getTypedRowWrapper(LogicalRouter.class);
86                 extraLogicalRouter.setName("");
87                 LOG.trace("Updating LogicalRouter entry: {}", logicalRouter);
88                 transaction.add(op.update(logicalRouter)
89                         .where(extraLogicalRouter.getNameColumn().getSchema().opEqual(existingLogicalRouterName))
90                         .build());
91                 transaction.add(op.comment("Logical Router: Updating " + existingLogicalRouterName));
92                 updateControllerTxHistory(TransactionType.UPDATE, logicalRouter);
93             }
94         }
95
96     }
97
98     private static void setDescription(final LogicalRouter logicalRouter, final LogicalRouters inputRouter) {
99         if (inputRouter.getHwvtepNodeDescription() != null) {
100             logicalRouter.setDescription(inputRouter.getHwvtepNodeDescription());
101         } else {
102             LOG.warn("Logical router {} is missing a description string", inputRouter.getHwvtepNodeName());
103         }
104     }
105
106     private static void setName(final LogicalRouter logicalRouter, final LogicalRouters inputRouter,
107             final Optional<LogicalRouters> inputRouterOptional) {
108         if (inputRouter.getHwvtepNodeName() != null) {
109             logicalRouter.setName(inputRouter.getHwvtepNodeName().getValue());
110         } else if (inputRouterOptional.isPresent() && inputRouterOptional.orElseThrow().getHwvtepNodeName() != null) {
111             logicalRouter.setName(inputRouterOptional.orElseThrow().getHwvtepNodeName().getValue());
112         }
113     }
114
115     private void setSwitchBindings(final TransactionBuilder transaction, final LogicalRouter logicalRouter,
116             final List<SwitchBindings> switchBindings) {
117         if (switchBindings != null) {
118             Map<String, UUID> bindingMap = new HashMap<>();
119             for (SwitchBindings switchBinding : switchBindings) {
120                 @SuppressWarnings("unchecked")
121                 InstanceIdentifier<LogicalSwitches> lswitchIid =
122                         (InstanceIdentifier<LogicalSwitches>)switchBinding.getLogicalSwitchRef().getValue();
123                 Optional<LogicalSwitches> operationalSwitchOptional =
124                         getOperationalState().getLogicalSwitches(lswitchIid);
125                 if (operationalSwitchOptional.isPresent()) {
126                     Uuid logicalSwitchUuid = operationalSwitchOptional.orElseThrow().getLogicalSwitchUuid();
127                     bindingMap.put(switchBinding.getDestinationAddress().getIpv4Prefix().getValue(),
128                             new UUID(logicalSwitchUuid.getValue()));
129                 } else {
130                     bindingMap.put(switchBinding.getDestinationAddress().getIpv4Prefix().getValue(),
131                             TransactUtils.getLogicalSwitchUUID(transaction, getOperationalState(), lswitchIid));
132                 }
133             }
134             logicalRouter.setSwitchBinding(bindingMap);
135         }
136     }
137
138     private void setAclBindings(final LogicalRouter logicalRouter, final Map<AclBindingsKey, AclBindings> aclBindings) {
139         if (aclBindings != null) {
140             Map<String, UUID> bindingMap = new HashMap<>();
141             for (AclBindings aclBinding : aclBindings.values()) {
142                 @SuppressWarnings("unchecked")
143                 InstanceIdentifier<Acls> aclIid =
144                         (InstanceIdentifier<Acls>)aclBinding.getAclRef().getValue();
145                 Optional<Acls> operationalAclOptional =
146                         getOperationalState().getAcls(aclIid);
147                 if (operationalAclOptional.isPresent()) {
148                     Uuid aclUuid = operationalAclOptional.orElseThrow().getAclUuid();
149                     bindingMap.put(aclBinding.getRouterInterface().stringValue(), new UUID(aclUuid.getValue()));
150                 } else {
151                     bindingMap.put(aclBinding.getRouterInterface().stringValue(), TransactUtils.getAclUUID(aclIid));
152                 }
153             }
154             logicalRouter.setAclBinding(bindingMap);
155         }
156
157     }
158
159     private static void setStaticRoutes(final LogicalRouter logicalRouter, final List<StaticRoutes> staticRoutes) {
160         if (staticRoutes != null) {
161             Map<String, String> staticRoutesMap = new HashMap<>();
162             for (StaticRoutes staticRoute : staticRoutes) {
163                 staticRoutesMap.put(staticRoute.getDestinationAddress().stringValue(),
164                         staticRoute.getNexthopAddress().stringValue());
165             }
166             logicalRouter.setStaticRoutes(staticRoutesMap);
167         }
168     }
169
170     @Override
171     protected Map<LogicalRoutersKey, LogicalRouters> getData(final HwvtepGlobalAugmentation augmentation) {
172         return augmentation.getLogicalRouters();
173     }
174 }
175