Streamlined UnimgrMapper, cleaned up the code
[unimgr.git] / impl / src / main / java / org / opendaylight / unimgr / command / UniCreateCommand.java
1 /*
2  * Copyright (c) 2015 CableLabs 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.unimgr.command;
9
10 import java.util.List;
11 import java.util.Map;
12 import java.util.Map.Entry;
13
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
16 import org.opendaylight.unimgr.impl.UnimgrConstants;
17 import org.opendaylight.unimgr.impl.UnimgrMapper;
18 import org.opendaylight.unimgr.impl.UnimgrUtils;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeRef;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.unimgr.rev151012.UniAugmentation;
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
23 import org.opendaylight.yangtools.yang.binding.DataObject;
24 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 import com.google.common.base.Optional;
29
30 public class UniCreateCommand extends AbstractCreateCommand {
31
32     private static final Logger LOG = LoggerFactory.getLogger(UniCreateCommand.class);
33
34     public UniCreateCommand(DataBroker dataBroker,
35             Map<InstanceIdentifier<?>, DataObject> changes) {
36         super.dataBroker = dataBroker;
37         super.changes = changes;
38     }
39
40     @Override
41     public void execute() {
42         for (Entry<InstanceIdentifier<?>, DataObject> created : changes.entrySet()) {
43             if (created.getValue() != null && created.getValue() instanceof UniAugmentation) {
44                 UniAugmentation uni = (UniAugmentation) created.getValue();
45                 InstanceIdentifier<?> uniKey = created.getKey();
46                 LOG.info("New UNI created {}.", uni.getIpAddress().getIpv4Address());
47                 /* We assume that when the user specifies the
48                  * ovsdb-node-ref that the node already exists in
49                  * the controller and that the OVS instance is in
50                  * active mode.
51                  *
52                  * We assume that when the user doesn't specify the
53                  * ovsdb-node-id that the node doesn't exist therefor
54                  * has to be created with the IP address because it's
55                  * in passive mode.
56                  *
57                  * Active mode (TCP): the UUID is in format ovsdb://UUID
58                  * Passive mode (PTCP): the UUID is in format ovsdb://IP:6640
59                  *
60                  */
61                 if (uni.getOvsdbNodeRef() != null) {
62                     OvsdbNodeRef ovsdbNodeRef = uni.getOvsdbNodeRef();
63                     Optional<Node> optionalNode = UnimgrUtils.readNode(dataBroker,
64                                                                        LogicalDatastoreType.OPERATIONAL,
65                                                                        ovsdbNodeRef.getValue());
66                     if (!optionalNode.isPresent()) {
67                         LOG.info("Invalid OVSDB node instance identifier specified, "
68                                + "attempting to retrieve the node.");
69                         Optional<Node> optionalOvsdbNode = UnimgrUtils.findOvsdbNode(dataBroker,
70                                                                                      uni);
71                         Node ovsdbNode;
72                         if (optionalOvsdbNode.isPresent()) {
73                             ovsdbNode = optionalOvsdbNode.get();
74                             LOG.info("Retrieved the OVSDB node {}", ovsdbNode.getNodeId());
75                             UnimgrUtils.updateUniNode(LogicalDatastoreType.CONFIGURATION,
76                                                       uniKey,
77                                                       uni,
78                                                       ovsdbNode,
79                                                       dataBroker);
80                         } else {
81                             ovsdbNode = UnimgrUtils.createOvsdbNode(dataBroker,
82                                                                     uni);
83                             LOG.info("Could not retrieve the OVSDB node,"
84                                    + " created a new one: {}", ovsdbNode.getNodeId());
85                             UnimgrUtils.updateUniNode(LogicalDatastoreType.CONFIGURATION,
86                                                       uniKey,
87                                                       uni,
88                                                       ovsdbNode,
89                                                       dataBroker);
90                         }
91                     }
92                 } else {
93                     // We assume the ovs is in passive mode
94                     // Check if the ovsdb node exist
95                     Optional<Node> optionalOvsdbNode = UnimgrUtils.findOvsdbNode(dataBroker,
96                                                                                  uni);
97                     Node ovsdbNode;
98                     if (optionalOvsdbNode.isPresent()) {
99                         ovsdbNode = optionalOvsdbNode.get();
100                         LOG.info("Retrieved the OVSDB node");
101                         UnimgrUtils.updateUniNode(LogicalDatastoreType.CONFIGURATION,
102                                                   uniKey,
103                                                   uni,
104                                                   ovsdbNode,
105                                                   dataBroker);
106                     } else {
107                         ovsdbNode = UnimgrUtils.createOvsdbNode(dataBroker,
108                                                                 uni);
109                         if (ovsdbNode != null) {
110                             LOG.info("Could not retrieve the OVSDB node,"
111                                     + "created a new one: {}", ovsdbNode.getNodeId());
112                              UnimgrUtils.updateUniNode(LogicalDatastoreType.CONFIGURATION,
113                                                        uniKey,
114                                                        uni,
115                                                        ovsdbNode,
116                                                        dataBroker);
117                         }
118                     }
119                 }
120             }
121             if (created.getValue() != null && created.getValue() instanceof OvsdbNodeAugmentation) {
122                 OvsdbNodeAugmentation ovsdbNodeAugmentation = (OvsdbNodeAugmentation) created
123                                                                                           .getValue();
124                 InstanceIdentifier<Node> ovsdbIid = created.getKey().firstIdentifierOf(Node.class);
125                 if (ovsdbNodeAugmentation != null) {
126                     LOG.info("Received an OVSDB node create {}",
127                             ovsdbNodeAugmentation.getConnectionInfo()
128                                                  .getRemoteIp()
129                                                  .getIpv4Address()
130                                                  .getValue());
131                     List<Node> uniNodes = UnimgrUtils.getUniNodes(dataBroker);
132                     if (uniNodes != null && !uniNodes.isEmpty()) {
133                         for (Node uniNode: uniNodes) {
134                             UniAugmentation uniAugmentation = uniNode.getAugmentation(UniAugmentation.class);
135                             if (uniAugmentation.getOvsdbNodeRef() != null
136                                     && uniAugmentation.getOvsdbNodeRef().getValue() != null) {
137                                 InstanceIdentifier<Node> ovsdbNodeRefIid = uniAugmentation
138                                                                             .getOvsdbNodeRef()
139                                                                             .getValue()
140                                                                             .firstIdentifierOf(Node.class);
141                                 if (ovsdbNodeRefIid.equals(ovsdbIid)) {
142                                     Optional<Node> optionalOvsdbNode = UnimgrUtils.readNode(dataBroker,
143                                                                                             LogicalDatastoreType.OPERATIONAL,
144                                                                                             ovsdbIid);
145                                     if (optionalOvsdbNode.isPresent()) {
146                                         InstanceIdentifier<Node> uniIid =
147                                                                     UnimgrMapper.getUniIid(dataBroker,
148                                                                                            uniAugmentation.getIpAddress(),
149                                                                                            LogicalDatastoreType.CONFIGURATION);
150                                         UnimgrUtils.createBridgeNode(dataBroker,
151                                                                      ovsdbIid,
152                                                                      uniAugmentation,
153                                                                      UnimgrConstants.DEFAULT_BRIDGE_NAME);
154                                         UnimgrUtils.updateUniNode(LogicalDatastoreType.OPERATIONAL,
155                                                                   uniIid,
156                                                                   uniAugmentation,
157                                                                   ovsdbIid,
158                                                                   dataBroker);
159                                     }
160                                 }
161                             } else if (ovsdbNodeAugmentation
162                                           .getConnectionInfo()
163                                           .getRemoteIp()
164                                           .equals(uniAugmentation.getIpAddress())) {
165                                 InstanceIdentifier<Node> uniIid = UnimgrMapper.getUniIid(dataBroker,
166                                                                                          uniAugmentation.getIpAddress(),
167                                                                                          LogicalDatastoreType.CONFIGURATION);
168                                 UnimgrUtils.createBridgeNode(dataBroker,
169                                                              ovsdbIid,
170                                                              uniAugmentation,
171                                                              UnimgrConstants.DEFAULT_BRIDGE_NAME);
172                                 UnimgrUtils.updateUniNode(LogicalDatastoreType.OPERATIONAL,
173                                                           uniIid,
174                                                           uniAugmentation,
175                                                           ovsdbIid,
176                                                           dataBroker);
177                             }
178                         }
179                     } else {
180                         LOG.info("Received a new OVSDB node connection from {}"
181                                 + ovsdbNodeAugmentation.getConnectionInfo()
182                                         .getRemoteIp().getIpv4Address());
183                     }
184                 }
185             }
186         }
187     }
188
189 }