Add blueprint wiring for loopback controller-config
[netconf.git] / netconf / netconf-topology / 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.CheckedFuture;
11 import com.google.common.util.concurrent.FutureCallback;
12 import com.google.common.util.concurrent.Futures;
13 import javax.annotation.Nullable;
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
18 import org.opendaylight.netconf.topology.api.NetconfConnectorFactory;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.HostBuilder;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
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;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.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.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 /**
39  * Created by adetalhouet on 2016-11-03.
40  */
41 public class NetconfConnectorFactoryImpl implements NetconfConnectorFactory {
42
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     /**
49      * {@inheritDoc}
50      */
51     @Override
52     public Node newInstance(final DataBroker dataBroker,
53                             final String instanceName,
54                             final String address,
55                             final Integer port,
56                             final String username,
57                             final String password,
58                             final Boolean tcpOnly,
59                             final Boolean reconnectOnSchemaChange) {
60
61         final NodeId nodeId = new NodeId(instanceName);
62         final NodeKey nodeKey = new NodeKey(nodeId);
63         final Credentials credentials = new LoginPasswordBuilder()
64                 .setUsername(username)
65                 .setPassword(password)
66                 .build();
67         final Host host = HostBuilder.getDefaultInstance(address);
68         final PortNumber portNumber = new PortNumber(port);
69         final NetconfNode netconfNode = new NetconfNodeBuilder()
70                 .setHost(host)
71                 .setPort(portNumber)
72                 .setCredentials(credentials)
73                 .setTcpOnly(tcpOnly)
74                 .setReconnectOnChangedSchema(reconnectOnSchemaChange)
75                 .build();
76         final Node node =  new NodeBuilder()
77                 .setNodeId(nodeId)
78                 .setKey(nodeKey)
79                 .addAugmentation(NetconfNode.class, netconfNode)
80                 .build();
81
82         final InstanceIdentifier<Node> nodePath = TOPOLOGY_PATH.child(Node.class, nodeKey);
83         final WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
84         transaction.put(LogicalDatastoreType.CONFIGURATION, nodePath, node);
85         final CheckedFuture<Void, TransactionCommitFailedException> submitFuture = transaction.submit();
86         Futures.addCallback(submitFuture, new FutureCallback<Void>() {
87             @Override
88             public void onSuccess(@Nullable final Void result) {
89                 LOG.debug("Node {} was successfully added to the topology", instanceName);
90             }
91
92             @Override
93             public void onFailure(final Throwable t) {
94                 LOG.error("Node {} creation failed: {}", instanceName, t);
95             }
96         });
97         return node;
98     }
99 }