BUG-1116: add BGP application peer skeleton
[bgpcep.git] / bgp / rib-impl / src / main / java / org / opendaylight / protocol / bgp / rib / impl / ApplicationPeer.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. 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.protocol.bgp.rib.impl;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.net.InetAddresses;
12
13 import java.util.Map.Entry;
14
15 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
16 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
17 import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
18 import org.opendaylight.protocol.bgp.rib.spi.Peer;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.UpdateBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.ApplicationRibId;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
24 import org.opendaylight.yangtools.yang.binding.DataObject;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26
27 public class ApplicationPeer implements AutoCloseable, Peer, DataChangeListener {
28     private final byte[] rawIdentifier;
29     private final RIB targetRib;
30     private final String name;
31
32     public ApplicationPeer(final ApplicationRibId applicationRibId, final Ipv4Address ipAddress, final RIB targetRib) {
33         this.name = applicationRibId.getValue().toString();
34         this.targetRib = Preconditions.checkNotNull(targetRib);
35         this.rawIdentifier = InetAddresses.forString(ipAddress.getValue()).getAddress();
36     }
37
38     @Override
39     public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change) {
40         // FIXME: first notification needs to simulate connection-up and populate the peer tables
41
42         final UpdateBuilder ub = new UpdateBuilder();
43
44         // NOTE: this is pretty much what AbstractTopologyBuilder.onLocRIBChange() does
45         for (Entry<InstanceIdentifier<?>, DataObject> data : change.getCreatedData().entrySet()) {
46             // FIXME: populate MPReach with these
47         }
48         for (Entry<InstanceIdentifier<?>, DataObject> data : change.getUpdatedData().entrySet()) {
49             // FIXME: populate MPReach with these
50         }
51         for (InstanceIdentifier<?> data : change.getRemovedPaths()) {
52             // FIXME: populate MPUnreach with these
53         }
54
55         targetRib.updateTables(this, ub.build());
56     }
57
58     @Override
59     public String getName() {
60         return name;
61     }
62
63     @Override
64     public void close() {
65         for (BgpTableType t : targetRib.getLocalTables()) {
66             targetRib.clearTable(this, new TablesKey(t.getAfi(), t.getSafi()));
67         }
68     }
69
70     @Override
71     public byte[] getRawIdentifier() {
72         return rawIdentifier;
73     }
74 }