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.transactions.md;
11 import java.util.ArrayList;
12 import java.util.List;
14 import java.util.Map.Entry;
15 import java.util.Optional;
16 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
17 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
18 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
19 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundMapper;
20 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
21 import org.opendaylight.ovsdb.lib.message.TableUpdates;
22 import org.opendaylight.ovsdb.lib.notation.UUID;
23 import org.opendaylight.ovsdb.lib.schema.DatabaseSchema;
24 import org.opendaylight.ovsdb.lib.schema.typed.TyperUtils;
25 import org.opendaylight.ovsdb.schema.hardwarevtep.ACL;
26 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalRouter;
27 import org.opendaylight.ovsdb.schema.hardwarevtep.LogicalSwitch;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepAclRef;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentationBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepLogicalSwitchRef;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepNodeName;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Acls;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalRouters;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalRoutersBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalRoutersKey;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.AclBindings;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.AclBindingsBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.AclBindingsKey;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.StaticRoutes;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.StaticRoutesBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.SwitchBindings;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.logical.router.attributes.SwitchBindingsBuilder;
50 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
51 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
52 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
53 import org.opendaylight.yangtools.yang.binding.util.BindingMap;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
58 public final class HwvtepLogicalRouterUpdateCommand extends AbstractTransactionCommand {
59 private static final Logger LOG = LoggerFactory.getLogger(HwvtepLogicalRouterUpdateCommand.class);
61 private final Map<UUID, LogicalRouter> updatedLRRows;
63 public HwvtepLogicalRouterUpdateCommand(HwvtepConnectionInstance key, TableUpdates updates,
64 DatabaseSchema dbSchema) {
65 super(key, updates, dbSchema);
66 updatedLRRows = TyperUtils.extractRowsUpdated(LogicalRouter.class, getUpdates(), getDbSchema());
70 public void execute(ReadWriteTransaction transaction) {
71 for (Entry<UUID, LogicalRouter> entry : updatedLRRows.entrySet()) {
72 LOG.trace("Updating logical router {} with {}", entry.getKey(), entry.getValue());
73 updateLogicalRouter(transaction, entry.getValue());
77 private void updateLogicalRouter(ReadWriteTransaction transaction, final LogicalRouter router) {
78 final InstanceIdentifier<Node> connectionIId = getOvsdbConnectionInstance().getInstanceIdentifier();
79 Optional<Node> connection = HwvtepSouthboundUtil.readNode(transaction, connectionIId);
80 if (connection.isPresent()) {
81 Node connectionNode = buildConnectionNode(router);
82 transaction.merge(LogicalDatastoreType.OPERATIONAL, connectionIId, connectionNode);
83 InstanceIdentifier<LogicalRouters> routerIid = getOvsdbConnectionInstance().getInstanceIdentifier()
84 .augmentation(HwvtepGlobalAugmentation.class)
85 .child(LogicalRouters.class, new LogicalRoutersKey(new HwvtepNodeName(router.getName())));
86 getOvsdbConnectionInstance().getDeviceInfo().updateDeviceOperData(LogicalRouters.class, routerIid,
87 router.getUuid(), router);
91 private Node buildConnectionNode(final LogicalRouter router) {
92 //Update node with LogicalRouter reference
93 NodeBuilder connectionNode = new NodeBuilder();
94 connectionNode.setNodeId(getOvsdbConnectionInstance().getNodeId());
95 LogicalRoutersBuilder lrBuilder = new LogicalRoutersBuilder();
96 lrBuilder.setLogicalRouterUuid(new Uuid(router.getUuid().toString()));
97 lrBuilder.setHwvtepNodeDescription(router.getDescription());
98 HwvtepNodeName hwvtepName = new HwvtepNodeName(router.getName());
99 lrBuilder.setHwvtepNodeName(hwvtepName);
100 lrBuilder.withKey(new LogicalRoutersKey(hwvtepName));
102 setSwitchBindings(router, lrBuilder);
103 setStaticRoutes(router, lrBuilder);
104 setAclBindings(router, lrBuilder);
107 connectionNode.addAugmentation(new HwvtepGlobalAugmentationBuilder()
108 .setLogicalRouters(BindingMap.of(lrBuilder.build()))
110 return connectionNode.build();
113 private static void setStaticRoutes(final LogicalRouter router, final LogicalRoutersBuilder lrBuilder) {
114 if (isRouterHasStaticRoutes(router)) {
115 List<StaticRoutes> routes = new ArrayList<>();
116 for (Entry<String, String> entry : router.getStaticRoutesColumn().getData().entrySet()) {
117 StaticRoutesBuilder staticRouteBuilder = new StaticRoutesBuilder();
118 staticRouteBuilder.setDestinationAddress(new IpPrefix(new Ipv4Prefix(entry.getKey())));
119 staticRouteBuilder.setNexthopAddress(new IpAddress(new Ipv4Address(entry.getKey())));
120 routes.add(staticRouteBuilder.build());
122 lrBuilder.setStaticRoutes(routes);
126 private static boolean isRouterHasStaticRoutes(final LogicalRouter router) {
127 return router != null && router.getStaticRoutesColumn() != null
128 && router.getStaticRoutesColumn().getData() != null
129 && !router.getStaticRoutesColumn().getData().isEmpty();
132 private void setAclBindings(final LogicalRouter router, final LogicalRoutersBuilder builder) {
133 if (isRouterHasAcls(router)) {
134 var bindings = BindingMap.<AclBindingsKey, AclBindings>orderedBuilder();
135 for (Entry<String, UUID> entry : router.getAclBindingColumn().getData().entrySet()) {
136 AclBindingsBuilder aclBindingBuiler = new AclBindingsBuilder();
137 UUID aclUUID = entry.getValue();
138 ACL acl = (ACL)getOvsdbConnectionInstance().getDeviceInfo().getDeviceOperData(Acls.class, aclUUID);
140 InstanceIdentifier<Acls> aclIid =
141 HwvtepSouthboundMapper.createInstanceIdentifier(getOvsdbConnectionInstance(), acl);
142 aclBindingBuiler.setAclRef(new HwvtepAclRef(aclIid));
143 aclBindingBuiler.setRouterInterface(new IpPrefix(new Ipv4Prefix(entry.getKey())));
144 bindings.add(aclBindingBuiler.build());
146 builder.setAclBindings(bindings.build());
151 private static boolean isRouterHasAcls(final LogicalRouter router) {
152 return router != null && router.getAclBindingColumn() != null
153 && router.getAclBindingColumn().getData() != null
154 && !router.getAclBindingColumn().getData().isEmpty();
157 private void setSwitchBindings(final LogicalRouter router, final LogicalRoutersBuilder builder) {
158 if (isRouterHasSwitchBindings(router)) {
159 List<SwitchBindings> bindings = new ArrayList<>();
160 for (Entry<String, UUID> entry : router.getSwitchBindingColumn().getData().entrySet()) {
161 SwitchBindingsBuilder switchBindingBuiler = new SwitchBindingsBuilder();
162 UUID lsUUID = entry.getValue();
163 LogicalSwitch logicalSwitch = getOvsdbConnectionInstance().getDeviceInfo().getLogicalSwitch(lsUUID);
164 if (logicalSwitch != null) {
165 switchBindingBuiler.setDestinationAddress(new IpPrefix(new Ipv4Prefix(entry.getKey())));
166 InstanceIdentifier<LogicalSwitches> switchIid =
167 HwvtepSouthboundMapper.createInstanceIdentifier(getOvsdbConnectionInstance(), logicalSwitch);
168 switchBindingBuiler.setLogicalSwitchRef(new HwvtepLogicalSwitchRef(switchIid));
169 bindings.add(switchBindingBuiler.build());
172 builder.setSwitchBindings(bindings);
176 private static boolean isRouterHasSwitchBindings(final LogicalRouter router) {
177 return router != null && router.getSwitchBindingColumn() != null
178 && router.getSwitchBindingColumn().getData() != null
179 && !router.getSwitchBindingColumn().getData().isEmpty();