2 * Copyright (c) 2015 Yale University 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.alto.altohosttracker.plugin.internal;
11 import java.util.Iterator;
13 import java.util.HashMap;
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.concurrent.ExecutorService;
18 import java.util.concurrent.Executors;
19 import java.util.concurrent.ExecutionException;
20 import java.util.regex.Pattern;
21 import java.util.regex.Matcher;
23 import com.google.common.base.Optional;
24 import com.google.common.base.Preconditions;
25 import com.google.common.util.concurrent.FutureCallback;
26 import com.google.common.util.concurrent.Futures;
27 import com.google.common.util.concurrent.ListenableFuture;
28 import com.google.common.util.concurrent.CheckedFuture;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.hosttracker.rev150416.DstCosts1;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.hosttracker.rev150416.DstCosts1Builder;
32 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
33 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
34 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
35 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
36 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
37 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
38 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.host.tracker.rev140624.HostNode;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.address.tracker.rev140617.AddressCapableNodeConnector;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.address.tracker.rev140617.address.node.connector.Addresses;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
44 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
45 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
46 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
47 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
48 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.Resources;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.ResourcesBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.NetworkMaps;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMapKey;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.NetworkMapsBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMap;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.network.maps.NetworkMapBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.CostMaps;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.CostMapsBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.cost.maps.CostMap;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.cost.maps.CostMapBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.EndpointPropertyMap;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.resources.EndpointPropertyMapBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.TypedIpv4Address;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.TypedEndpointAddress;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.EndpointPropertyType;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.EndpointPropertyValue;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.property.map.data.EndpointProperties;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.property.map.data.EndpointPropertiesBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.property.map.data.EndpointPropertiesKey;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.property.map.data.endpoint.properties.Properties;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.property.map.data.endpoint.properties.PropertiesBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ResourceSpecificEndpointProperty;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.MapBuilder;
73 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix;
74 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ResourceId;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.TagString;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.ValidIdString;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.PidName;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.cost.map.meta.CostType;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.cost.map.meta.CostTypeBuilder;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.dependent.vtags.DependentVtags;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.dependent.vtags.DependentVtagsBuilder;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.CostMode;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.CostMetric;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.cost.map.map.DstCosts;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.cost.map.map.DstCostsBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroup;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroupBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.address.group.EndpointAddressGroupKey;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.EndpointAddressType;
91 import org.opendaylight.yangtools.concepts.ListenerRegistration;
92 import org.opendaylight.yangtools.yang.binding.DataObject;
93 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
94 import org.slf4j.Logger;
95 import org.slf4j.LoggerFactory;
97 public class AltoHostTrackerImpl implements DataChangeListener {
100 private static final int CPUS = Runtime.getRuntime().availableProcessors();
104 * controller/opendaylight/md-sal/topology-manager/src/main/java
106 * /md/controller/topology/manager/FlowCapableTopologyProvider.java
108 private static final String TOPOLOGY_NAME = "flow:1";
110 private static final String NMRESOURCEID = "hosttracker-network-map";
112 private static final String CMRESOURCEID = "hosttracker-cost-map";
114 private static final String EPMRESOURCEID = "hosttracker-endpoint-property-map";
116 private static final Logger log = LoggerFactory
117 .getLogger(AltoHostTrackerImpl.class);
119 private static Map<String, String> networkMap;
120 private static Map<String, String> endpointPropertyMap;
122 private final DataBroker dataService;
123 private final String topologyId;
125 private String networkTag=null;
126 // public static final InstanceIdentifier<Resources> ALTO_IID =
127 // InstanceIdentifier.builder(Resources.class).toInstance();
129 ExecutorService exec = Executors.newFixedThreadPool(CPUS);
131 private ListenerRegistration<DataChangeListener> hostNodeListerRegistration;
133 private ListenerRegistration<DataChangeListener> networkMapListerRegistration;
135 public AltoHostTrackerImpl(DataBroker dataService, String topologyId) {
136 networkMap = new HashMap<String, String>();
137 endpointPropertyMap = new HashMap<String, String>();
139 p = Pattern.compile("[0-9]+.[0-9]+.[0-9]+.[0-9]+");
141 Preconditions.checkNotNull(dataService,
142 "dataBrokerService should not be null.");
143 this.dataService = dataService;
144 if (topologyId == null || topologyId.isEmpty()) {
145 this.topologyId = TOPOLOGY_NAME;
147 this.topologyId = topologyId;
151 public void submit(final WriteTransaction writeTx) {
152 final CheckedFuture writeTxResultFuture = writeTx.submit();
153 Futures.addCallback(writeTxResultFuture, new FutureCallback() {
155 public void onSuccess(Object o) {
156 log.debug("ConcurrentHashMap write successful for tx :{}",
157 writeTx.getIdentifier());
161 public void onFailure(Throwable throwable) {
162 log.error("ConcurrentHashMap write transaction {} failed",
163 writeTx.getIdentifier(), throwable.getCause());
168 public void writeDefaultCostMaps() {
169 ResourceId nm_rid = new ResourceId(new ValidIdString(NMRESOURCEID));
170 ResourceId rid = new ResourceId(new ValidIdString(CMRESOURCEID));
172 InstanceIdentifier<CostMaps> ALTO_CMS = InstanceIdentifier
173 .builder(Resources.class).child(CostMaps.class).build();
175 TagString tag = new TagString(TagGenerator.getTag(32));
176 ValidIdString vis0 = new ValidIdString("pid0");
177 PidName pid0 = new PidName(vis0);
178 ValidIdString vis1 = new ValidIdString("pid1");
179 PidName pid1 = new PidName(vis1);
181 TagString dtag = new TagString(this.networkTag);
182 DependentVtags dv = new DependentVtagsBuilder().setResourceId(nm_rid)
183 .setTag(dtag).build();
184 List<DependentVtags> dvList = new ArrayList<DependentVtags>();
186 CostType ct = new CostTypeBuilder().setCostMode(CostMode.Numerical)
187 .setCostMetric(new CostMetric("hcm"))
188 .setDescription("hosttracker cost metric").build();
189 org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.cost.map.Meta meta = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.cost.map.MetaBuilder()
190 .setDependentVtags(dvList).setCostType(ct).build();
192 DstCosts1 dcs11 = new DstCosts1Builder().setCostInHosttracker(10)
194 DstCosts1 dcs12 = new DstCosts1Builder().setCostInHosttracker(0)
196 DstCosts dcs1 = new DstCostsBuilder().setDst(pid1)
197 .addAugmentation(DstCosts1.class, dcs12).build();
198 DstCosts dcs2 = new DstCostsBuilder().setDst(pid0)
199 .addAugmentation(DstCosts1.class, dcs11).build();
200 List<DstCosts> dcsList = new ArrayList<DstCosts>();
204 org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.cost.map.Map map = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.cost.map.MapBuilder()
205 .setSrc(pid1).setDstCosts(dcsList).build();
207 List<org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.cost.map.Map> mapList = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.cost.map.Map>();
211 CostMap cm = new CostMapBuilder().setResourceId(rid).setTag(tag)
212 .setMeta(meta).setMap(mapList).build();
214 List<CostMap> cmList = new ArrayList<CostMap>();
218 CostMaps cms = new CostMapsBuilder().setCostMap(cmList).build();
220 final WriteTransaction writeTx = this.dataService
221 .newWriteOnlyTransaction();
223 writeTx.put(LogicalDatastoreType.CONFIGURATION, ALTO_CMS, cms, true);
224 } catch (Exception e) {
230 public void writeDefaultNetworkMaps() {
231 InstanceIdentifier<NetworkMaps> ALTO_NM = InstanceIdentifier
232 .builder(Resources.class).child(NetworkMaps.class).build();
233 final WriteTransaction tx = dataService.newWriteOnlyTransaction();
235 tx.put(LogicalDatastoreType.CONFIGURATION, ALTO_NM,
236 loadNetworkMaps(), true);
237 } catch (Exception e) {
243 public void writeDefaultEndpointpropertyMap() {
244 InstanceIdentifier<EndpointPropertyMap> ALTO_EPM = InstanceIdentifier
245 .builder(Resources.class).child(EndpointPropertyMap.class)
247 ResourceId rid = new ResourceId(new ValidIdString(
248 "default-endpoint-property-map"));
249 TagString tag = new TagString(TagGenerator.getTag(32));
251 DependentVtags dv = new DependentVtagsBuilder().setResourceId(rid)
252 .setTag(tag).build();
253 List<DependentVtags> dvList = new ArrayList<DependentVtags>();
256 org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.property.map.Meta meta = new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.service.types.rev150404.endpoint.property.map.MetaBuilder()
257 .setDependentVtags(dvList).build();
258 TypedIpv4Address ti4 = new TypedIpv4Address("ipv4:0.0.0.0");
259 TypedEndpointAddress tea = new TypedEndpointAddress(ti4);
260 EndpointPropertyType etp = new EndpointPropertyType(
261 new ResourceSpecificEndpointProperty(
262 "default-endpoint-property-map.property"));
263 EndpointPropertyValue epv = new EndpointPropertyValue("PID1");
265 endpointPropertyMap.put("0.0.0.0", "ipv4");
267 Properties ps = new PropertiesBuilder().setPropertyType(etp)
268 .setProperty(epv).build();
269 List<Properties> psList = new ArrayList<Properties>();
272 EndpointProperties ep = new EndpointPropertiesBuilder()
273 .setEndpoint(tea).setProperties(psList).build();
274 List<EndpointProperties> epList = new ArrayList<EndpointProperties>();
277 EndpointPropertyMap epm = new EndpointPropertyMapBuilder()
278 .setMeta(meta).setEndpointProperties(epList).build();
280 final WriteTransaction tx = dataService.newWriteOnlyTransaction();
282 tx.put(LogicalDatastoreType.CONFIGURATION, ALTO_EPM, epm, true);
283 } catch (Exception e) {
290 private Resources buildResources() {
292 return new ResourcesBuilder().setNetworkMaps(loadNetworkMaps())
294 } catch (Exception e) {
301 private NetworkMaps loadNetworkMaps() throws Exception {
302 return new NetworkMapsBuilder().setNetworkMap(loadNetworkMapList())
306 private List<NetworkMap> loadNetworkMapList() {
307 List<NetworkMap> networkMapList = new ArrayList<NetworkMap>();
308 ResourceId rid = new ResourceId(new ValidIdString(NMRESOURCEID));
309 this.networkTag = TagGenerator.getTag(32);
310 TagString tag = new TagString(this.networkTag);
311 ValidIdString vis = new ValidIdString("pid0");
312 PidName pid = new PidName(vis);
313 IpPrefix ep = new IpPrefix(new Ipv4Prefix("0.0.0.0/0"));
315 networkMap.put("0.0.0.0/0", "pid0");
317 List<org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map> mapList = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map>();
319 List<IpPrefix> epList = new ArrayList<IpPrefix>();
322 EndpointAddressGroup eag = new EndpointAddressGroupBuilder()
324 new EndpointAddressType(
325 EndpointAddressType.Enumeration.Ipv4))
326 .setEndpointPrefix(epList).build();
328 List<EndpointAddressGroup> eagList = new ArrayList<EndpointAddressGroup>();
331 org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map map = new MapBuilder()
332 .setPid(pid).setEndpointAddressGroup(eagList).build();
336 NetworkMap networkMap = new NetworkMapBuilder().setResourceId(rid)
337 .setTag(tag).setMap(mapList).build();
339 networkMapList.add(networkMap);
341 return networkMapList;
344 public void writeTest() {
345 InstanceIdentifier<NetworkMaps> ALTO_IID = InstanceIdentifier
346 .builder(Resources.class).child(NetworkMaps.class).build();
347 final WriteTransaction tx = dataService.newWriteOnlyTransaction();
349 tx.put(LogicalDatastoreType.CONFIGURATION, ALTO_IID,
350 loadNetworkMaps(), true);
351 } catch (Exception e) {
353 final CheckedFuture writeTxResultFuture = tx.submit();
354 Futures.addCallback(writeTxResultFuture, new FutureCallback<Void>() {
356 public void onSuccess(final Void result) {
357 log.info("write success.");
358 notifyCallback(true);
362 public void onFailure(final Throwable t) {
363 log.error("Failed to initiate resources", t);
364 notifyCallback(false);
367 void notifyCallback(final boolean result) {
372 public void readTest() {
373 InstanceIdentifier<Resources> resources = InstanceIdentifier.builder(
374 Resources.class).build();
375 ListenableFuture<Optional<Resources>> futureResources;
376 try (ReadOnlyTransaction readTx = dataService.newReadOnlyTransaction()) {
377 futureResources = readTx.read(LogicalDatastoreType.OPERATIONAL,
381 Optional<Resources> opNodes = null;
383 opNodes = futureResources.get();
384 } catch (ExecutionException | InterruptedException ex) {
385 log.warn(ex.getLocalizedMessage());
387 if (opNodes != null && opNodes.isPresent())
388 log.info("resources:" + opNodes.get());
391 public void mergeEndpointPropertyMapForAddresses(Addresses addrs) {
392 if (addrs == null) {// || addrs.getIp() == null || addrs.getMac() ==
394 // IpPrefix ep = new IpPrefix(new Ipv4Prefix("1.1.1.1/32"));
398 String ipAddress = addrs.getIp().toString();
399 String mac = addrs.getMac().toString();
400 Matcher m = p.matcher(ipAddress);
402 ipAddress = m.group();
405 if (endpointPropertyMap.containsKey(ipAddress))
408 TypedIpv4Address ti4 = new TypedIpv4Address("ipv4:" + ipAddress);
409 TypedEndpointAddress tea = new TypedEndpointAddress(ti4);
411 EndpointPropertyType etp1 = new EndpointPropertyType(
412 new ResourceSpecificEndpointProperty(
413 "default-endpoint-property-map.pid"));
414 EndpointPropertyValue epv1 = new EndpointPropertyValue("PID1");
416 EndpointPropertyType etp2 = new EndpointPropertyType(
417 new ResourceSpecificEndpointProperty("priv:ietf-mac.prop"));
418 EndpointPropertyValue epv2 = new EndpointPropertyValue(mac);
420 endpointPropertyMap.put(ipAddress, "ipv4");
422 Properties ps1 = new PropertiesBuilder().setPropertyType(etp1)
423 .setProperty(epv1).build();
424 Properties ps2 = new PropertiesBuilder().setPropertyType(etp2)
425 .setProperty(epv2).build();
427 List<Properties> psList = new ArrayList<Properties>();
431 EndpointProperties ep = new EndpointPropertiesBuilder()
432 .setEndpoint(tea).setProperties(psList).build();
434 InstanceIdentifier<EndpointProperties> ALTO_EP = InstanceIdentifier
435 .builder(Resources.class)
436 .child(EndpointPropertyMap.class)
437 .child(EndpointProperties.class,
438 new EndpointPropertiesKey(tea)).build();
440 final WriteTransaction tx = dataService.newWriteOnlyTransaction();
444 tx.merge(LogicalDatastoreType.CONFIGURATION, ALTO_EP, ep, true);
445 } catch (Exception e) {
453 public void mergeNetworkMapForAddressesList(List<Addresses> addrsList,
454 String resourceIdString, String pidString, String addressType) {
455 ResourceId rid = new ResourceId(new ValidIdString(resourceIdString));
456 ValidIdString vis = new ValidIdString(pidString);
457 PidName pid = new PidName(vis);
459 EndpointAddressType eat;
460 if (addressType == "ipv4") {
461 eat = new EndpointAddressType(EndpointAddressType.Enumeration.Ipv4);
463 eat = new EndpointAddressType(EndpointAddressType.Enumeration.Ipv6);
466 InstanceIdentifier<EndpointAddressGroup> ALTO_EAG = InstanceIdentifier
467 .builder(Resources.class)
468 .child(NetworkMaps.class)
469 .child(NetworkMap.class, new NetworkMapKey(rid))
470 .child(org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map.class,
471 new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.MapKey(
473 .child(EndpointAddressGroup.class,
474 new EndpointAddressGroupKey(eat)).build();
476 List<IpPrefix> epList = new ArrayList<IpPrefix>();
478 if (addrsList == null) {
479 // IpPrefix ep = new IpPrefix(new Ipv4Prefix("1.1.1.1/32"));
483 for (int i = 0; i < addrsList.size(); i++) {
484 Addresses addrs = addrsList.get(i);
485 if (addrs.getIp() == null)
487 String ipAddress = addrs.getIp().toString();
489 Matcher m = p.matcher(ipAddress);
491 ipAddress = m.group();
495 if (networkMap.containsKey(ipAddress))
497 IpPrefix ep = new IpPrefix(new Ipv4Prefix(ipAddress));
499 networkMap.put(ipAddress, pidString);
502 if (epList.size() == 0)
505 final WriteTransaction tx = dataService.newWriteOnlyTransaction();
510 EndpointAddressGroup eag = new EndpointAddressGroupBuilder()
512 new EndpointAddressType(
513 EndpointAddressType.Enumeration.Ipv4))
514 .setEndpointPrefix(epList).build();
517 tx.merge(LogicalDatastoreType.CONFIGURATION, ALTO_EAG, eag, true);
518 } catch (Exception e) {
524 public void removeAddressesList(List<Addresses> addrsList,
525 String resourceIdString, String pidString, String addressType) {
526 if (addrsList == null) {
529 for (int i = 0; i < addrsList.size(); i++) {
530 Addresses addrs = addrsList.get(i);
531 if (addrs.getIp() == null)
533 String ipAddress = addrs.getIp().toString();
535 Matcher m = p.matcher(ipAddress);
537 ipAddress = m.group();
541 if (endpointPropertyMap.containsKey(ipAddress))
542 endpointPropertyMap.remove(ipAddress);
546 TypedIpv4Address ti4 = new TypedIpv4Address("ipv4:" + ipAddress);
547 TypedEndpointAddress tea = new TypedEndpointAddress(ti4);
549 InstanceIdentifier<EndpointProperties> ALTO_EP = InstanceIdentifier
550 .builder(Resources.class)
551 .child(EndpointPropertyMap.class)
552 .child(EndpointProperties.class,
553 new EndpointPropertiesKey(tea)).build();
555 final WriteTransaction writeTx = this.dataService
556 .newWriteOnlyTransaction();
557 writeTx.delete(LogicalDatastoreType.OPERATIONAL, ALTO_EP);
561 if (networkMap.containsKey(ipAddress))
562 networkMap.remove(ipAddress);
569 ResourceId rid = new ResourceId(new ValidIdString(resourceIdString));
570 ValidIdString vis = new ValidIdString(pidString);
571 PidName pid = new PidName(vis);
573 EndpointAddressType eat;
574 if (addressType == "ipv4") {
575 eat = new EndpointAddressType(EndpointAddressType.Enumeration.Ipv4);
577 eat = new EndpointAddressType(EndpointAddressType.Enumeration.Ipv6);
580 InstanceIdentifier<EndpointAddressGroup> ALTO_EAG = InstanceIdentifier
581 .builder(Resources.class)
582 .child(NetworkMaps.class)
583 .child(NetworkMap.class, new NetworkMapKey(rid))
584 .child(org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map.class,
585 new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.MapKey(
587 .child(EndpointAddressGroup.class,
588 new EndpointAddressGroupKey(eat)).build();
590 List<IpPrefix> epList = new ArrayList<IpPrefix>();
592 Iterator iter = networkMap.entrySet().iterator();
593 while (iter.hasNext()) {
594 Map.Entry<String, String> entry = (Map.Entry<String, String>) iter
596 String ipAddress = entry.getKey();
598 IpPrefix ep = new IpPrefix(new Ipv4Prefix(ipAddress));
602 if (epList.size() == 0) {
603 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map> ALTO_MP = InstanceIdentifier
604 .builder(Resources.class)
605 .child(NetworkMaps.class)
606 .child(NetworkMap.class, new NetworkMapKey(rid))
607 .child(org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.Map.class,
608 new org.opendaylight.yang.gen.v1.urn.opendaylight.alto.rev150404.network.map.MapKey(
611 final WriteTransaction tx = dataService.newWriteOnlyTransaction();
615 tx.delete(LogicalDatastoreType.CONFIGURATION, ALTO_MP);
616 } catch (Exception e) {
621 EndpointAddressGroup eag = new EndpointAddressGroupBuilder()
623 new EndpointAddressType(
624 EndpointAddressType.Enumeration.Ipv4))
625 .setEndpointPrefix(epList).build();
627 final WriteTransaction tx = dataService.newWriteOnlyTransaction();
631 tx.put(LogicalDatastoreType.CONFIGURATION, ALTO_EAG, eag, true);
632 } catch (Exception e) {
639 public void registerAsDataChangeListener() {
640 ResourceId ridForDelete = new ResourceId(NMRESOURCEID);
641 InstanceIdentifier<NetworkMap> networkMapForDelete = InstanceIdentifier
642 .builder(Resources.class).child(NetworkMaps.class)
643 .child(NetworkMap.class, new NetworkMapKey(ridForDelete))
646 InstanceIdentifier<HostNode> hostNodes = InstanceIdentifier
647 .builder(NetworkTopology.class)//
648 .child(Topology.class,
649 new TopologyKey(new TopologyId(topologyId)))//
650 .child(Node.class).augmentation(HostNode.class).build();
652 InstanceIdentifier<Addresses> addrCapableNodeConnectors = //
654 .builder(Nodes.class)
656 .child(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node.class) //
657 .child(NodeConnector.class) //
658 .augmentation(AddressCapableNodeConnector.class)//
659 .child(Addresses.class).build();
661 // ReadOnlyTransaction newReadOnlyTransaction =
662 // dataService.newReadOnlyTransaction();
663 InstanceIdentifier<Nodes> iins = addrCapableNodeConnectors
664 .firstIdentifierOf(Nodes.class);
665 // InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node>
668 // addrCapableNodeConnectors.firstIdentifierOf(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node.class);
669 // ListenableFuture<Optional<NodeConnector>> dataFuture =
670 // newReadOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, iinc);
671 ListenableFuture<Optional<Nodes>> futureNodes;
673 * try { NodeConnector get = dataFuture.get().get();
674 * log.info("test "+get); } catch (InterruptedException |
675 * ExecutionException ex) {
676 * //java.util.logging.Logger.getLogger(HostTracker2Impl
677 * .class.getName()).log(Level.SEVERE, null, ex);
678 * log.info("exception on get"); }
680 try (ReadOnlyTransaction readTx = dataService.newReadOnlyTransaction()) {
681 futureNodes = readTx.read(LogicalDatastoreType.OPERATIONAL, iins);
682 // futureNode = readTx.read(LogicalDatastoreType.OPERATIONAL, iin);
685 Optional<Nodes> opNodes = null;
687 opNodes = futureNodes.get();
688 } catch (ExecutionException | InterruptedException ex) {
689 log.warn(ex.getLocalizedMessage());
692 List<Addresses> addrsList = new ArrayList<Addresses>();
693 if (opNodes != null && opNodes.isPresent()) {
694 // log.info("node connector:"+opNodes.get());
695 Nodes ns = opNodes.get();
696 for (org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node n : ns
698 for (NodeConnector nc : n.getNodeConnector()) {
699 AddressCapableNodeConnector acnc = nc
700 .getAugmentation(AddressCapableNodeConnector.class);
702 for (Addresses addrs : acnc.getAddresses()) {
703 log.info("existing address: " + addrs);
704 addrsList.add(addrs);
705 mergeEndpointPropertyMapForAddresses(addrs);
711 mergeNetworkMapForAddressesList(addrsList, NMRESOURCEID, "pid1", "ipv4");
713 * Futures.addCallback(dataFuture, new
714 * FutureCallback<Optional<NodeConnector>>() {
715 * @Override public void onSuccess(final Optional<NodeConnector> result)
716 * { if (result.isPresent()) { log.info("Processing NEW NODE? " +
717 * result.get().getId().getValue()); // processHost(result, dataObject,
719 * @Override public void onFailure(Throwable arg0) { } });
722 this.hostNodeListerRegistration = dataService
723 .registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
724 hostNodes, this, DataChangeScope.SUBTREE);
726 this.networkMapListerRegistration = dataService
727 .registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
728 networkMapForDelete, this, DataChangeScope.BASE);
730 // log.info("register data change");
734 public void onDataChanged(
735 final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
736 exec.submit(new Runnable() {
739 if (change == null) {
740 log.info("In onDataChanged: No processing done as change even is null.");
743 Map<InstanceIdentifier<?>, DataObject> updatedData = change
745 Map<InstanceIdentifier<?>, DataObject> createdData = change
747 Map<InstanceIdentifier<?>, DataObject> originalData = change
749 Set<InstanceIdentifier<?>> deletedData = change
752 for (InstanceIdentifier<?> iid : deletedData) {
753 log.info("deletedData");
754 if (iid.getTargetType().equals(Node.class)) {
755 Node node = ((Node) originalData.get(iid));
756 HostNode hostNode = node
757 .getAugmentation(HostNode.class);
758 if (hostNode != null) {
759 List<Addresses> addrsList = hostNode.getAddresses();
760 removeAddressesList(addrsList, NMRESOURCEID,
763 } else if (iid.getTargetType().equals(NetworkMap.class)) {
765 endpointPropertyMap.clear();
767 log.info("delete all!");
771 for (Map.Entry<InstanceIdentifier<?>, DataObject> entrySet : updatedData
773 InstanceIdentifier<?> iiD = entrySet.getKey();
774 final DataObject dataObject = entrySet.getValue();
775 if (dataObject instanceof Addresses) {
776 Addresses addrs = (Addresses) dataObject;
777 log.info("updatedData addresses:" + addrs);
778 List<Addresses> addrsList = new ArrayList();
779 addrsList.add(addrs);
780 mergeNetworkMapForAddressesList(addrsList,
781 NMRESOURCEID, "pid1", "ipv4");
782 mergeEndpointPropertyMapForAddresses(addrs);
784 } else if (dataObject instanceof Node) {
785 log.info("updatedData node");
789 for (Map.Entry<InstanceIdentifier<?>, DataObject> entrySet : createdData
791 InstanceIdentifier<?> iiD = entrySet.getKey();
792 final DataObject dataObject = entrySet.getValue();
793 if (dataObject instanceof Addresses) {
794 Addresses addrs = (Addresses) dataObject;
795 log.info("createdData addresses:" + addrs);
796 List<Addresses> addrsList = new ArrayList();
797 addrsList.add(addrs);
798 mergeNetworkMapForAddressesList(addrsList,
799 NMRESOURCEID, "pid1", "ipv4");
800 mergeEndpointPropertyMapForAddresses(addrs);
801 } else if (dataObject instanceof Node) {
802 log.info("createdData node");
809 public void close() {
810 this.hostNodeListerRegistration.close();