Bump upstream versions
[netconf.git] / netconf / netconf-topology-impl / src / main / java / org / opendaylight / netconf / topology / impl / NetconfConnectorFactoryImpl.java
1 /*
2  * Copyright (c) 2016 Inocybe Technologies 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.netconf.topology.impl;
9
10 import com.google.common.util.concurrent.FutureCallback;
11 import com.google.common.util.concurrent.MoreExecutors;
12 import org.opendaylight.mdsal.binding.api.DataBroker;
13 import org.opendaylight.mdsal.binding.api.WriteTransaction;
14 import org.opendaylight.mdsal.common.api.CommitInfo;
15 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
16 import org.opendaylight.netconf.topology.api.NetconfConnectorFactory;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.DomainName;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPwBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.login.pw.LoginPasswordBuilder;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
29 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
30 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
32 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
33 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.opendaylight.yangtools.yang.common.Uint16;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 /**
40  * Created by adetalhouet on 2016-11-03.
41  */
42 public class NetconfConnectorFactoryImpl implements NetconfConnectorFactory {
43     private static final Logger LOG = LoggerFactory.getLogger(NetconfConnectorFactoryImpl.class);
44
45     private static final InstanceIdentifier<Topology> TOPOLOGY_PATH = InstanceIdentifier.create(NetworkTopology.class)
46             .child(Topology.class, new TopologyKey(new TopologyId("topology-netconf")));
47
48     @Override
49     public Node newInstance(final DataBroker dataBroker,
50                             final String instanceName,
51                             final String address,
52                             final Integer port,
53                             final String username,
54                             final String password,
55                             final Boolean tcpOnly,
56                             final Boolean reconnectOnSchemaChange) {
57
58         final NodeKey nodeKey = new NodeKey(new NodeId(instanceName));
59         final Node node =  new NodeBuilder()
60                 .withKey(nodeKey)
61                 .addAugmentation(new NetconfNodeBuilder()
62                     .setHost(createHost(address))
63                     .setPort(new PortNumber(Uint16.valueOf(port)))
64                     .setCredentials(new LoginPwBuilder()
65                         .setLoginPassword(new LoginPasswordBuilder()
66                             .setUsername(username)
67                             .setPassword(password)
68                             .build())
69                         .build())
70                     .setTcpOnly(tcpOnly)
71                     .setReconnectOnChangedSchema(reconnectOnSchemaChange)
72                     .build())
73                 .build();
74
75         final InstanceIdentifier<Node> nodePath = TOPOLOGY_PATH.child(Node.class, nodeKey);
76         final WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
77         transaction.put(LogicalDatastoreType.CONFIGURATION, nodePath, node);
78         transaction.commit().addCallback(new FutureCallback<CommitInfo>() {
79             @Override
80             public void onSuccess(final CommitInfo result) {
81                 LOG.debug("Node {} was successfully added to the topology", instanceName);
82             }
83
84             @Override
85             public void onFailure(final Throwable throwable) {
86                 LOG.error("Node {} creation failed", instanceName, throwable);
87             }
88         }, MoreExecutors.directExecutor());
89         return node;
90     }
91
92     private static Host createHost(final String host) {
93         try {
94             return new Host(new IpAddress(new Ipv4Address(host)));
95         } catch (IllegalArgumentException e) {
96             LOG.debug("Cannot interpret {} as an Ipv4Address", host, e);
97         }
98         try {
99             return new Host(new IpAddress(new Ipv6Address(host)));
100         } catch (IllegalArgumentException e) {
101             LOG.debug("Cannot interpret {} as an Ipv6Address", host, e);
102         }
103         return new Host(new DomainName(host));
104     }
105 }