2 * Copyright (c) 2014 Cisco Systems, Inc. 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.lispflowmapping.netconf.impl;
12 import java.util.concurrent.Callable;
13 import java.util.concurrent.ExecutionException;
14 import java.util.concurrent.ExecutorService;
15 import java.util.concurrent.Executors;
16 import java.util.concurrent.Future;
18 import javax.management.InstanceAlreadyExistsException;
19 import javax.management.InstanceNotFoundException;
21 import org.opendaylight.lispflowmapping.netconf.impl.LispNetconfConnector;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lispflowmapping.netconf.rev140706.BuildConnectorInput;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lispflowmapping.netconf.rev140706.LfmNetconfConnectorService;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lispflowmapping.netconf.rev140706.RemoveConnectorInput;
25 import org.opendaylight.yangtools.yang.common.RpcResult;
26 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
27 import org.opendaylight.controller.config.api.ConflictingVersionException;
28 import org.opendaylight.controller.config.api.ValidationException;
29 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
30 import org.slf4j.LoggerFactory;
31 import org.slf4j.Logger;
33 import com.google.common.util.concurrent.SettableFuture;
36 public class LispDeviceNetconfConnector implements AutoCloseable, LfmNetconfConnectorService {
38 private static final Logger logger = LoggerFactory.getLogger(LispDeviceNetconfConnector.class);
40 private final ExecutorService executor;
41 private LispNetconfConnector nconfConnector;
43 public static LispDeviceNetconfConnector createLispDeviceNetconfConnector() {
44 return new LispDeviceNetconfConnector(Executors.newFixedThreadPool(1), new LispNetconfConnector());
47 public LispDeviceNetconfConnector(ExecutorService executor, LispNetconfConnector nconfConnector) {
48 this.executor = executor;
49 this.nconfConnector = nconfConnector;
50 logger.info( "LispDeviceNetconfConnector constructed" );
54 * Implemented from the AutoCloseable interface.
57 public void close() throws ExecutionException, InterruptedException {
63 * RestConf RPC call implemented from the LfmNetconfConnectorService interface.
66 public Future<RpcResult<Void>> buildConnector(final BuildConnectorInput input) {
67 SettableFuture<RpcResult<Void>> futureResult = SettableFuture.create();
69 logger.trace("Received RPC to buildConnector: " + input);
71 if (verifyBuildInput(input, futureResult) != true) {
75 return executor.submit(new MakeConnector(input));
80 public Future<RpcResult<Void>> removeConnector(final RemoveConnectorInput input) {
81 SettableFuture<RpcResult<Void>> futureResult = SettableFuture.create();
83 if (verifyRemoveInput(input, futureResult) != true) {
87 return executor.submit(new RemoveConnector(input) );
91 private boolean verifyBuildInput(final BuildConnectorInput req, SettableFuture<RpcResult<Void>> futureResult ) {
92 if (req.getInstance() == null) {
93 logger.error("Instance name not initialized");
94 futureResult.set(RpcResultBuilder.<Void> failed()
95 .withError(ErrorType.APPLICATION, "exception", "Instance name not initialized")
100 if (req.getAddress() == null) {
101 logger.error("IP address not initialized");
102 futureResult.set(RpcResultBuilder.<Void> failed()
103 .withError(ErrorType.APPLICATION, "exception", "IP address not initialized")
108 if (req.getPort() == null) {
109 logger.error("Port not initialized");
110 futureResult.set(RpcResultBuilder.<Void> failed()
111 .withError(ErrorType.APPLICATION, "exception", "Port not initialized")
116 if (req.getUsername() == null) {
117 logger.error("Username not initialized");
118 futureResult.set(RpcResultBuilder.<Void> failed()
119 .withError(ErrorType.APPLICATION, "exception", "Username not initialized")
124 if (req.getPassword() == null) {
125 logger.error("Password not initialized");
126 futureResult.set(RpcResultBuilder.<Void> failed()
127 .withError(ErrorType.APPLICATION, "exception", "Password not initialized")
135 private boolean verifyRemoveInput(final RemoveConnectorInput conn, SettableFuture<RpcResult<Void>> futureResult) {
136 if (conn.getInstance() == null) {
137 logger.error("Instance name not initialized");
138 futureResult.set(RpcResultBuilder.<Void> failed()
139 .withError(ErrorType.APPLICATION, "exception", "Instance name not initialized")
148 private class MakeConnector implements Callable<RpcResult<Void>> {
150 final BuildConnectorInput buildConnectorInput;
152 public MakeConnector(final BuildConnectorInput buildConnectorInput) {
153 this.buildConnectorInput = buildConnectorInput;
157 public RpcResult<Void> call() {
160 nconfConnector.createNetconfConnector(buildConnectorInput.getInstance(), buildConnectorInput.getAddress(),
161 buildConnectorInput.getPort().getValue(), buildConnectorInput.getUsername(), buildConnectorInput.getPassword());
162 logger.info("LispNetconfConnector {} built", buildConnectorInput.getInstance());
163 return RpcResultBuilder.<Void>success().build();
164 } catch( InstanceAlreadyExistsException e ) {
165 logger.error("LispNetconfConnector {} already exists!", buildConnectorInput.getInstance());
166 return RpcResultBuilder.<Void> failed()
167 .withError(ErrorType.APPLICATION, "exists", "LispNetconfConnector exists")
169 } catch (ConflictingVersionException ex) {
170 logger.error("LispNetconfConnector {} version exception", buildConnectorInput.getInstance());
171 return RpcResultBuilder.<Void> failed()
172 .withError(ErrorType.APPLICATION, "exception", "LispNetconfConnector version exception")
174 } catch ( ValidationException ex) {
175 logger.error("LispNetconfConnector {} validation exception", buildConnectorInput.getInstance());
176 return RpcResultBuilder.<Void> failed()
177 .withError(ErrorType.APPLICATION, "exception", "LispNetconfConnector validation exception")
185 private class RemoveConnector implements Callable<RpcResult<Void>> {
186 final RemoveConnectorInput removeConnectorInput;
188 public RemoveConnector(final RemoveConnectorInput connectorInput) {
189 this.removeConnectorInput = connectorInput;
193 public RpcResult<Void> call() {
195 nconfConnector.removeNetconfConnector(removeConnectorInput.getInstance());
196 logger.info("LispNetconfConnector {} removed!", removeConnectorInput.getInstance());
197 return RpcResultBuilder.<Void> success().build();
198 } catch( InstanceNotFoundException e ) {
199 logger.info("LispNetconfConnector {} doesn't exists!", removeConnectorInput.getInstance());
200 return RpcResultBuilder.<Void> failed()
201 .withError(ErrorType.APPLICATION, "no-exist", "LispNetconfConnector doesn't exist")
203 } catch( ValidationException e ) {
204 logger.info("LispNetconfConnector {}: Could not validate remove transactions!", removeConnectorInput.getInstance());
205 return RpcResultBuilder.<Void> failed()
206 .withError(ErrorType.APPLICATION, "fail", "LispNetconfConnector doesn't exist")
208 } catch (ConflictingVersionException e) {
209 logger.error("LispNetconfConnector {}: Cannot remove due to conflicting version", removeConnectorInput.getInstance() );
210 return RpcResultBuilder.<Void> failed()
211 .withError(ErrorType.APPLICATION, "fail", "Conflicting version exception")
213 } catch (Exception e) {
214 logger.error("LispNetconfConnector {} exception while removing: {}", removeConnectorInput.getInstance(), e.getClass());
215 return RpcResultBuilder.<Void> failed()
216 .withError(ErrorType.APPLICATION, "fail", "Cannot remove LispNetconfConnector: " + removeConnectorInput.getInstance())