1f41128894aa452d073ea6a66e8605c49e22297d
[bgpcep.git] / bgp / openconfig-impl / src / main / java / org / opendaylight / protocol / bgp / openconfig / impl / openconfig / BGPNeighborProviderImpl.java
1 /*
2  * Copyright (c) 2015 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
9 package org.opendaylight.protocol.bgp.openconfig.impl.openconfig;
10
11 import com.google.common.base.Optional;
12 import java.math.BigDecimal;
13 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
14 import org.opendaylight.protocol.bgp.openconfig.impl.spi.BGPConfigStateStore;
15 import org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil;
16 import org.opendaylight.protocol.bgp.openconfig.spi.pojo.BGPPeerInstanceConfiguration;
17 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.RouteReflectorBuilder;
18 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TimersBuilder;
19 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.TransportBuilder;
20 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.Neighbor;
21 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborBuilder;
22 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbors.NeighborKey;
23 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.PeerType;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.PeerRole;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev160330.BgpPeer;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.ModuleKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.tcpmd5.cfg.rev140427.Rfc2385Key;
28
29 final class BGPNeighborProviderImpl extends AbstractBGPNeighborProvider<BGPPeerInstanceConfiguration> {
30
31     public BGPNeighborProviderImpl(final BindingTransactionChain txChain, final BGPConfigStateStore stateHolders) {
32         super(txChain, stateHolders, Neighbor.class);
33     }
34
35     @Override
36     public Neighbor apply(final BGPPeerInstanceConfiguration config) {
37         return toNeighborConfiguration(config);
38     }
39
40     @Override
41     public ModuleKey createModuleKey(final String instanceName) {
42         return new ModuleKey(instanceName, BgpPeer.class);
43     }
44
45     @Override
46     public Class<BGPPeerInstanceConfiguration> getInstanceConfigurationType() {
47         return BGPPeerInstanceConfiguration.class;
48     }
49
50     private static Neighbor toNeighborConfiguration(final BGPPeerInstanceConfiguration config) {
51         return new NeighborBuilder()
52             .setNeighborAddress(config.getHost())
53             .setKey(new NeighborKey(config.getHost()))
54             .setTransport(new TransportBuilder().setConfig(
55                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.transport.ConfigBuilder()
56                     .setPassiveMode(!config.isActive())
57                     .build()).build())
58             .setConfig(
59                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.ConfigBuilder()
60                     .setAuthPassword(getPassword(config.getPassword()))
61                     .setPeerAs(config.getAsNumber())
62                     .setPeerType(toPeerTye(config.getPeerRole()))
63                     .build())
64             .setAfiSafis(
65                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.AfiSafisBuilder()
66                     .setAfiSafi(OpenConfigUtil.toAfiSafis(config.getAdvertizedTables(),
67                         (afiSAfi, tableType) -> OpenConfigUtil.toNeigborAfiSafiMultiPath(afiSAfi, tableType, config.getAddPathCapabilities())))
68                     .build())
69             .setTimers(new TimersBuilder().setConfig(
70                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.timers.ConfigBuilder()
71                     .setHoldTime(BigDecimal.valueOf(config.getHoldTimer()))
72                     .build()).build())
73             .setRouteReflector(new RouteReflectorBuilder().setConfig(
74                 new org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.neighbor.group.route.reflector.ConfigBuilder()
75                     .setRouteReflectorClient(config.getPeerRole() == PeerRole.RrClient).build()).build())
76             .build();
77     }
78
79     private static PeerType toPeerTye(final PeerRole peerRole) {
80         switch (peerRole) {
81         case Ibgp:
82         case RrClient:
83             return PeerType.INTERNAL;
84         case Ebgp:
85             return PeerType.EXTERNAL;
86         case Internal:
87             break;
88         default:
89             break;
90         }
91         return null;
92     }
93
94     private static String getPassword(final Optional<Rfc2385Key> maybePassword) {
95         if (maybePassword.isPresent()) {
96             return maybePassword.get().getValue();
97         }
98         return null;
99     }
100 }