2 * Copyright © 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.ovsdb.hwvtepsouthbound.transact;
11 import static org.opendaylight.ovsdb.lib.operations.Operations.op;
13 import com.google.common.base.Optional;
14 import java.util.Collection;
15 import java.util.HashMap;
16 import java.util.List;
18 import java.util.Map.Entry;
19 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
20 import org.opendaylight.ovsdb.lib.notation.UUID;
21 import org.opendaylight.ovsdb.lib.operations.TransactionBuilder;
22 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
23 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalRouter;
24 import org.opendaylight.ovsdb.utils.mdsal.utils.TransactionType;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Acls;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalRouters;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.AclBindings;
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;
39 public class LogicalRouterUpdateCommand extends AbstractTransactCommand<LogicalRouters, HwvtepGlobalAugmentation> {
40 private static final Logger LOG = LoggerFactory.getLogger(LogicalRouterUpdateCommand.class);
42 public LogicalRouterUpdateCommand(HwvtepOperationalState state,
43 Collection<DataTreeModification<Node>> changes) {
44 super(state, changes);
48 public void execute(TransactionBuilder transaction) {
49 Map<InstanceIdentifier<Node>, List<LogicalRouters>> updateMap =
50 extractUpdated(getChanges(),LogicalRouters.class);
52 for (Entry<InstanceIdentifier<Node>, List<LogicalRouters>> updated:
53 updateMap.entrySet()) {
54 updateLogicalRouter(transaction, updated.getKey(), updated.getValue());
58 private void updateLogicalRouter(TransactionBuilder transaction, final InstanceIdentifier<Node> instanceIdentifier,
59 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());
65 final Optional<LogicalRouters> operationalRouterOptional =
66 getOperationalState().getLogicalRouters(instanceIdentifier, lrouter.key());
67 LogicalRouter logicalRouter = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(),
69 setDescription(logicalRouter, lrouter);
71 setSwitchBindings(transaction, logicalRouter, lrouter.getSwitchBindings());
72 setStaticRoutes(logicalRouter, lrouter.getStaticRoutes());
73 setAclBindings(logicalRouter, lrouter.getAclBindings());
75 if (!operationalRouterOptional.isPresent()) {
76 setName(logicalRouter, lrouter, operationalRouterOptional);
77 LOG.trace("Creating LogicalRouter entry: {}", logicalRouter);
78 transaction.add(op.insert(logicalRouter).withId(TransactUtils.getLogicalRouterId(lrouter)));
79 transaction.add(op.comment("Logical Router: Creating " + lrouter.getHwvtepNodeName().getValue()));
80 UUID lrUuid = new UUID(TransactUtils.getLogicalRouterId(lrouter));
81 updateCurrentTxData(LogicalRouters.class, routerKey, lrUuid, lrouter);
82 updateControllerTxHistory(TransactionType.ADD, logicalRouter);
84 LogicalRouters updatedLRouter = operationalRouterOptional.get();
85 String existingLogicalRouterName = updatedLRouter.getHwvtepNodeName().getValue();
86 LogicalRouter extraLogicalRouter = TyperUtils.getTypedRowWrapper(transaction.getDatabaseSchema(),
88 extraLogicalRouter.setName("");
89 LOG.trace("Updating LogicalRouter entry: {}", logicalRouter);
90 transaction.add(op.update(logicalRouter)
91 .where(extraLogicalRouter.getNameColumn().getSchema().opEqual(existingLogicalRouterName))
93 transaction.add(op.comment("Logical Router: Updating " + existingLogicalRouterName));
94 updateControllerTxHistory(TransactionType.UPDATE, logicalRouter);
100 private void setDescription(final LogicalRouter logicalRouter, final LogicalRouters inputRouter) {
101 if (inputRouter.getHwvtepNodeDescription() != null) {
102 logicalRouter.setDescription(inputRouter.getHwvtepNodeDescription());
104 LOG.warn("Logical router {} is missing a description string", inputRouter.getHwvtepNodeName());
108 private void setName(final LogicalRouter logicalRouter, final LogicalRouters inputRouter,
109 Optional<LogicalRouters> inputRouterOptional) {
110 if (inputRouter.getHwvtepNodeName() != null) {
111 logicalRouter.setName(inputRouter.getHwvtepNodeName().getValue());
112 } else if (inputRouterOptional.isPresent() && inputRouterOptional.get().getHwvtepNodeName() != null) {
113 logicalRouter.setName(inputRouterOptional.get().getHwvtepNodeName().getValue());
117 private void setSwitchBindings(final TransactionBuilder transaction, final LogicalRouter logicalRouter,
118 final List<SwitchBindings> switchBindings) {
119 if (switchBindings != null) {
120 Map<String, UUID> bindingMap = new HashMap<>();
121 for (SwitchBindings switchBinding : switchBindings) {
122 @SuppressWarnings("unchecked")
123 InstanceIdentifier<LogicalSwitches> lswitchIid =
124 (InstanceIdentifier<LogicalSwitches>)switchBinding.getLogicalSwitchRef().getValue();
125 Optional<LogicalSwitches> operationalSwitchOptional =
126 getOperationalState().getLogicalSwitches(lswitchIid);
127 if (operationalSwitchOptional.isPresent()) {
128 Uuid logicalSwitchUuid = operationalSwitchOptional.get().getLogicalSwitchUuid();
129 bindingMap.put(switchBinding.getDestinationAddress().getIpv4Prefix().getValue(),
130 new UUID(logicalSwitchUuid.getValue()));
132 bindingMap.put(switchBinding.getDestinationAddress().getIpv4Prefix().getValue(),
133 TransactUtils.getLogicalSwitchUUID(transaction, getOperationalState(), lswitchIid));
136 logicalRouter.setSwitchBinding(bindingMap);
140 private void setAclBindings(final LogicalRouter logicalRouter, final List<AclBindings> aclBindings) {
141 if (aclBindings != null) {
142 Map<String, UUID> bindingMap = new HashMap<>();
143 for (AclBindings aclBinding : aclBindings) {
144 @SuppressWarnings("unchecked")
145 InstanceIdentifier<Acls> aclIid =
146 (InstanceIdentifier<Acls>)aclBinding.getAclRef().getValue();
147 Optional<Acls> operationalAclOptional =
148 getOperationalState().getAcls(aclIid);
149 if (operationalAclOptional.isPresent()) {
150 Uuid aclUuid = operationalAclOptional.get().getAclUuid();
151 bindingMap.put(aclBinding.getRouterInterface().stringValue(),
152 new UUID(aclUuid.getValue()));
154 bindingMap.put(aclBinding.getRouterInterface().stringValue(),
155 TransactUtils.getAclUUID(aclIid));
158 logicalRouter.setAclBinding(bindingMap);
163 private void setStaticRoutes(final LogicalRouter logicalRouter, final List<StaticRoutes> staticRoutes) {
164 if (staticRoutes != null) {
165 Map<String, String> staticRoutesMap = new HashMap<>();
166 for (StaticRoutes staticRoute : staticRoutes) {
167 staticRoutesMap.put(staticRoute.getDestinationAddress().stringValue(),
168 staticRoute.getNexthopAddress().stringValue());
170 logicalRouter.setStaticRoutes(staticRoutesMap);
175 protected List<LogicalRouters> getData(final HwvtepGlobalAugmentation augmentation) {
176 return augmentation.getLogicalRouters();