Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 33DEA200B40 for ; Thu, 16 Jun 2016 10:12:13 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 32936160A63; Thu, 16 Jun 2016 08:12:13 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id B665D160A65 for ; Thu, 16 Jun 2016 10:12:09 +0200 (CEST) Received: (qmail 62874 invoked by uid 500); 16 Jun 2016 08:12:04 -0000 Mailing-List: contact commits-help@cloudstack.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cloudstack.apache.org Delivered-To: mailing list commits@cloudstack.apache.org Received: (qmail 60994 invoked by uid 99); 16 Jun 2016 08:12:03 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 16 Jun 2016 08:12:03 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 07DF9E97CF; Thu, 16 Jun 2016 08:12:03 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sateesh@apache.org To: commits@cloudstack.apache.org Date: Thu, 16 Jun 2016 08:12:23 -0000 Message-Id: <31c2ac83d3c948a19d2195705930420d@git.apache.org> In-Reply-To: <3abf179c1ff24ceab07691879f2366aa@git.apache.org> References: <3abf179c1ff24ceab07691879f2366aa@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [22/50] [abbrv] git commit: updated refs/heads/deploy-from-snapshot to 44ba14d archived-at: Thu, 16 Jun 2016 08:12:13 -0000 http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/nio/NioClient.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/nio/NioClient.java b/utils/src/com/cloud/utils/nio/NioClient.java deleted file mode 100644 index 2f742f9..0000000 --- a/utils/src/com/cloud/utils/nio/NioClient.java +++ /dev/null @@ -1,125 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.nio; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.SocketChannel; -import java.security.GeneralSecurityException; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLEngine; - -import org.apache.log4j.Logger; - -import org.apache.cloudstack.utils.security.SSLUtils; - -public class NioClient extends NioConnection { - private static final Logger s_logger = Logger.getLogger(NioClient.class); - - protected String _host; - protected String _bindAddress; - protected SocketChannel _clientConnection; - - public NioClient(String name, String host, int port, int workers, HandlerFactory factory) { - super(name, port, workers, factory); - _host = host; - } - - public void setBindAddress(String ipAddress) { - _bindAddress = ipAddress; - } - - @Override - protected void init() throws IOException { - _selector = Selector.open(); - Task task = null; - - try { - _clientConnection = SocketChannel.open(); - _clientConnection.configureBlocking(true); - s_logger.info("Connecting to " + _host + ":" + _port); - - if (_bindAddress != null) { - s_logger.info("Binding outbound interface at " + _bindAddress); - - InetSocketAddress bindAddr = new InetSocketAddress(_bindAddress, 0); - _clientConnection.socket().bind(bindAddr); - } - - InetSocketAddress peerAddr = new InetSocketAddress(_host, _port); - _clientConnection.connect(peerAddr); - - SSLEngine sslEngine = null; - // Begin SSL handshake in BLOCKING mode - _clientConnection.configureBlocking(true); - - SSLContext sslContext = Link.initSSLContext(true); - sslEngine = sslContext.createSSLEngine(_host, _port); - sslEngine.setUseClientMode(true); - sslEngine.setEnabledProtocols(SSLUtils.getSupportedProtocols(sslEngine.getEnabledProtocols())); - - Link.doHandshake(_clientConnection, sslEngine, true); - s_logger.info("SSL: Handshake done"); - s_logger.info("Connected to " + _host + ":" + _port); - - _clientConnection.configureBlocking(false); - Link link = new Link(peerAddr, this); - link.setSSLEngine(sslEngine); - SelectionKey key = _clientConnection.register(_selector, SelectionKey.OP_READ); - link.setKey(key); - key.attach(link); - // Notice we've already connected due to the handshake, so let's get the - // remaining task done - task = _factory.create(Task.Type.CONNECT, link, null); - } catch (GeneralSecurityException e) { - _selector.close(); - throw new IOException("Failed to initialise security", e); - } catch (IOException e) { - _selector.close(); - throw e; - } - - _executor.execute(task); - } - - @Override - protected void registerLink(InetSocketAddress saddr, Link link) { - // don't do anything. - } - - @Override - protected void unregisterLink(InetSocketAddress saddr) { - // don't do anything. - } - - @Override - public void cleanUp() throws IOException { - super.cleanUp(); - if (_clientConnection != null) { - _clientConnection.close(); - } - s_logger.info("NioClient connection closed"); - - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/nio/NioConnection.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/nio/NioConnection.java b/utils/src/com/cloud/utils/nio/NioConnection.java deleted file mode 100644 index 4c66360..0000000 --- a/utils/src/com/cloud/utils/nio/NioConnection.java +++ /dev/null @@ -1,476 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.nio; - -import static com.cloud.utils.AutoCloseableUtil.closeAutoCloseable; - -import java.io.IOException; -import java.net.ConnectException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.nio.channels.CancelledKeyException; -import java.nio.channels.ClosedChannelException; -import java.nio.channels.SelectionKey; -import java.nio.channels.Selector; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.SocketChannel; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLEngine; - -import org.apache.log4j.Logger; - -import org.apache.cloudstack.utils.security.SSLUtils; - -import com.cloud.utils.concurrency.NamedThreadFactory; - -/** - * NioConnection abstracts the NIO socket operations. The Java implementation - * provides that. - */ -public abstract class NioConnection implements Runnable { - private static final Logger s_logger = Logger.getLogger(NioConnection.class);; - - protected Selector _selector; - protected Thread _thread; - protected boolean _isRunning; - protected boolean _isStartup; - protected int _port; - protected List _todos; - protected HandlerFactory _factory; - protected String _name; - protected ExecutorService _executor; - - public NioConnection(String name, int port, int workers, HandlerFactory factory) { - _name = name; - _isRunning = false; - _thread = null; - _selector = null; - _port = port; - _factory = factory; - _executor = new ThreadPoolExecutor(workers, 5 * workers, 1, TimeUnit.DAYS, new LinkedBlockingQueue(), new NamedThreadFactory(name + "-Handler")); - } - - public void start() { - _todos = new ArrayList(); - - _thread = new Thread(this, _name + "-Selector"); - _isRunning = true; - _thread.start(); - // Wait until we got init() done - synchronized (_thread) { - try { - _thread.wait(); - } catch (InterruptedException e) { - s_logger.warn("Interrupted start thread ", e); - } - } - } - - public void stop() { - _executor.shutdown(); - _isRunning = false; - if (_thread != null) { - _thread.interrupt(); - } - } - - public boolean isRunning() { - return _thread.isAlive(); - } - - public boolean isStartup() { - return _isStartup; - } - - @Override - public void run() { - synchronized (_thread) { - try { - init(); - } catch (ConnectException e) { - s_logger.warn("Unable to connect to remote: is there a server running on port " + _port); - return; - } catch (IOException e) { - s_logger.error("Unable to initialize the threads.", e); - return; - } catch (Exception e) { - s_logger.error("Unable to initialize the threads due to unknown exception.", e); - return; - } - _isStartup = true; - _thread.notifyAll(); - } - - while (_isRunning) { - try { - _selector.select(); - - // Someone is ready for I/O, get the ready keys - Set readyKeys = _selector.selectedKeys(); - Iterator i = readyKeys.iterator(); - - if (s_logger.isTraceEnabled()) { - s_logger.trace("Keys Processing: " + readyKeys.size()); - } - // Walk through the ready keys collection. - while (i.hasNext()) { - SelectionKey sk = i.next(); - i.remove(); - - if (!sk.isValid()) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("Selection Key is invalid: " + sk.toString()); - } - Link link = (Link)sk.attachment(); - if (link != null) { - link.terminated(); - } else { - closeConnection(sk); - } - } else if (sk.isReadable()) { - read(sk); - } else if (sk.isWritable()) { - write(sk); - } else if (sk.isAcceptable()) { - accept(sk); - } else if (sk.isConnectable()) { - connect(sk); - } - } - - s_logger.trace("Keys Done Processing."); - - processTodos(); - } catch (Throwable e) { - s_logger.warn("Caught an exception but continuing on.", e); - } - } - synchronized (_thread) { - _isStartup = false; - } - } - - abstract void init() throws IOException; - - abstract void registerLink(InetSocketAddress saddr, Link link); - - abstract void unregisterLink(InetSocketAddress saddr); - - protected void accept(SelectionKey key) throws IOException { - ServerSocketChannel serverSocketChannel = (ServerSocketChannel)key.channel(); - - SocketChannel socketChannel = serverSocketChannel.accept(); - Socket socket = socketChannel.socket(); - socket.setKeepAlive(true); - - if (s_logger.isTraceEnabled()) { - s_logger.trace("Connection accepted for " + socket); - } - - // Begin SSL handshake in BLOCKING mode - socketChannel.configureBlocking(true); - - SSLEngine sslEngine = null; - try { - SSLContext sslContext = Link.initSSLContext(false); - sslEngine = sslContext.createSSLEngine(); - sslEngine.setUseClientMode(false); - sslEngine.setNeedClientAuth(false); - sslEngine.setEnabledProtocols(SSLUtils.getSupportedProtocols(sslEngine.getEnabledProtocols())); - - Link.doHandshake(socketChannel, sslEngine, false); - - } catch (Exception e) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("Socket " + socket + " closed on read. Probably -1 returned: " + e.getMessage()); - } - closeAutoCloseable(socketChannel, "accepting socketChannel"); - closeAutoCloseable(socket, "opened socket"); - return; - } - - if (s_logger.isTraceEnabled()) { - s_logger.trace("SSL: Handshake done"); - } - socketChannel.configureBlocking(false); - InetSocketAddress saddr = (InetSocketAddress)socket.getRemoteSocketAddress(); - Link link = new Link(saddr, this); - link.setSSLEngine(sslEngine); - link.setKey(socketChannel.register(key.selector(), SelectionKey.OP_READ, link)); - Task task = _factory.create(Task.Type.CONNECT, link, null); - registerLink(saddr, link); - _executor.execute(task); - } - - protected void terminate(SelectionKey key) { - Link link = (Link)key.attachment(); - closeConnection(key); - if (link != null) { - link.terminated(); - Task task = _factory.create(Task.Type.DISCONNECT, link, null); - unregisterLink(link.getSocketAddress()); - _executor.execute(task); - } - } - - protected void read(SelectionKey key) throws IOException { - Link link = (Link)key.attachment(); - try { - SocketChannel socketChannel = (SocketChannel)key.channel(); - if (s_logger.isTraceEnabled()) { - s_logger.trace("Reading from: " + socketChannel.socket().toString()); - } - byte[] data = link.read(socketChannel); - if (data == null) { - if (s_logger.isTraceEnabled()) { - s_logger.trace("Packet is incomplete. Waiting for more."); - } - return; - } - Task task = _factory.create(Task.Type.DATA, link, data); - _executor.execute(task); - } catch (Exception e) { - logDebug(e, key, 1); - terminate(key); - } - } - - protected void logTrace(Exception e, SelectionKey key, int loc) { - if (s_logger.isTraceEnabled()) { - Socket socket = null; - if (key != null) { - SocketChannel ch = (SocketChannel)key.channel(); - if (ch != null) { - socket = ch.socket(); - } - } - - s_logger.trace("Location " + loc + ": Socket " + socket + " closed on read. Probably -1 returned."); - } - } - - protected void logDebug(Exception e, SelectionKey key, int loc) { - if (s_logger.isDebugEnabled()) { - Socket socket = null; - if (key != null) { - SocketChannel ch = (SocketChannel)key.channel(); - if (ch != null) { - socket = ch.socket(); - } - } - - s_logger.debug("Location " + loc + ": Socket " + socket + " closed on read. Probably -1 returned: " + e.getMessage()); - } - } - - protected void processTodos() { - List todos; - if (_todos.size() == 0) { - return; // Nothing to do. - } - - synchronized (this) { - todos = _todos; - _todos = new ArrayList(); - } - - if (s_logger.isTraceEnabled()) { - s_logger.trace("Todos Processing: " + todos.size()); - } - SelectionKey key; - for (ChangeRequest todo : todos) { - switch (todo.type) { - case ChangeRequest.CHANGEOPS: - try { - key = (SelectionKey)todo.key; - if (key != null && key.isValid()) { - if (todo.att != null) { - key.attach(todo.att); - Link link = (Link)todo.att; - link.setKey(key); - } - key.interestOps(todo.ops); - } - } catch (CancelledKeyException e) { - s_logger.debug("key has been cancelled"); - } - break; - case ChangeRequest.REGISTER: - try { - key = ((SocketChannel)(todo.key)).register(_selector, todo.ops, todo.att); - if (todo.att != null) { - Link link = (Link)todo.att; - link.setKey(key); - } - } catch (ClosedChannelException e) { - s_logger.warn("Couldn't register socket: " + todo.key); - try { - ((SocketChannel)(todo.key)).close(); - } catch (IOException ignore) { - s_logger.info("[ignored] socket channel"); - } finally { - Link link = (Link)todo.att; - link.terminated(); - } - } - break; - case ChangeRequest.CLOSE: - if (s_logger.isTraceEnabled()) { - s_logger.trace("Trying to close " + todo.key); - } - key = (SelectionKey)todo.key; - closeConnection(key); - if (key != null) { - Link link = (Link)key.attachment(); - if (link != null) { - link.terminated(); - } - } - break; - default: - s_logger.warn("Shouldn't be here"); - throw new RuntimeException("Shouldn't be here"); - } - } - s_logger.trace("Todos Done processing"); - } - - protected void connect(SelectionKey key) throws IOException { - SocketChannel socketChannel = (SocketChannel)key.channel(); - - try { - socketChannel.finishConnect(); - key.interestOps(SelectionKey.OP_READ); - Socket socket = socketChannel.socket(); - if (!socket.getKeepAlive()) { - socket.setKeepAlive(true); - } - if (s_logger.isDebugEnabled()) { - s_logger.debug("Connected to " + socket); - } - Link link = new Link((InetSocketAddress)socket.getRemoteSocketAddress(), this); - link.setKey(key); - key.attach(link); - Task task = _factory.create(Task.Type.CONNECT, link, null); - _executor.execute(task); - } catch (IOException e) { - logTrace(e, key, 2); - terminate(key); - } - } - - protected void scheduleTask(Task task) { - _executor.execute(task); - } - - protected void write(SelectionKey key) throws IOException { - Link link = (Link)key.attachment(); - try { - if (s_logger.isTraceEnabled()) { - s_logger.trace("Writing to " + link.getSocketAddress().toString()); - } - boolean close = link.write((SocketChannel)key.channel()); - if (close) { - closeConnection(key); - link.terminated(); - } else { - key.interestOps(SelectionKey.OP_READ); - } - } catch (Exception e) { - logDebug(e, key, 3); - terminate(key); - } - } - - protected void closeConnection(SelectionKey key) { - if (key != null) { - SocketChannel channel = (SocketChannel)key.channel(); - key.cancel(); - try { - if (channel != null) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Closing socket " + channel.socket()); - } - channel.close(); - } - } catch (IOException ignore) { - s_logger.info("[ignored] channel"); - } - } - } - - public void register(int ops, SocketChannel key, Object att) { - ChangeRequest todo = new ChangeRequest(key, ChangeRequest.REGISTER, ops, att); - synchronized (this) { - _todos.add(todo); - } - _selector.wakeup(); - } - - public void change(int ops, SelectionKey key, Object att) { - ChangeRequest todo = new ChangeRequest(key, ChangeRequest.CHANGEOPS, ops, att); - synchronized (this) { - _todos.add(todo); - } - _selector.wakeup(); - } - - public void close(SelectionKey key) { - ChangeRequest todo = new ChangeRequest(key, ChangeRequest.CLOSE, 0, null); - synchronized (this) { - _todos.add(todo); - } - _selector.wakeup(); - } - - /* Release the resource used by the instance */ - public void cleanUp() throws IOException { - if (_selector != null) { - _selector.close(); - } - } - - public class ChangeRequest { - public static final int REGISTER = 1; - public static final int CHANGEOPS = 2; - public static final int CLOSE = 3; - - public Object key; - public int type; - public int ops; - public Object att; - - public ChangeRequest(Object key, int type, int ops, Object att) { - this.key = key; - this.type = type; - this.ops = ops; - this.att = att; - } - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/nio/NioServer.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/nio/NioServer.java b/utils/src/com/cloud/utils/nio/NioServer.java deleted file mode 100644 index 98a4a51..0000000 --- a/utils/src/com/cloud/utils/nio/NioServer.java +++ /dev/null @@ -1,97 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.nio; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.nio.channels.ClosedChannelException; -import java.nio.channels.SelectionKey; -import java.nio.channels.ServerSocketChannel; -import java.nio.channels.spi.SelectorProvider; -import java.util.WeakHashMap; - -import org.apache.log4j.Logger; - -public class NioServer extends NioConnection { - private final static Logger s_logger = Logger.getLogger(NioServer.class); - - protected InetSocketAddress _localAddr; - private ServerSocketChannel _serverSocket; - - protected WeakHashMap _links; - - public NioServer(String name, int port, int workers, HandlerFactory factory) { - super(name, port, workers, factory); - _localAddr = null; - _links = new WeakHashMap(1024); - } - - @Override - protected void init() throws IOException { - _selector = SelectorProvider.provider().openSelector(); - - _serverSocket = ServerSocketChannel.open(); - _serverSocket.configureBlocking(false); - - _localAddr = new InetSocketAddress(_port); - _serverSocket.socket().bind(_localAddr); - - _serverSocket.register(_selector, SelectionKey.OP_ACCEPT, null); - - s_logger.info("NioConnection started and listening on " + _localAddr.toString()); - } - - @Override - public void cleanUp() throws IOException { - super.cleanUp(); - if (_serverSocket != null) { - _serverSocket.close(); - } - s_logger.info("NioConnection stopped on " + _localAddr.toString()); - } - - @Override - protected void registerLink(InetSocketAddress addr, Link link) { - _links.put(addr, link); - } - - @Override - protected void unregisterLink(InetSocketAddress saddr) { - _links.remove(saddr); - } - - /** - * Sends the data to the address specified. If address is not already - * connected, this does nothing and returns null. If address is already - * connected, then it returns the attached object so the caller can - * prepare for any responses. - * @param saddr - * @param data - * @return null if not sent. attach object in link if sent. - */ - public Object send(InetSocketAddress saddr, byte[] data) throws ClosedChannelException { - Link link = _links.get(saddr); - if (link == null) { - return null; - } - link.send(data); - return link.attachment(); - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/nio/Task.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/nio/Task.java b/utils/src/com/cloud/utils/nio/Task.java deleted file mode 100644 index c77c703..0000000 --- a/utils/src/com/cloud/utils/nio/Task.java +++ /dev/null @@ -1,89 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.nio; - -import org.apache.log4j.Logger; - -/** - * Task represents one todo item for the AgentManager or the AgentManager - * - */ -public abstract class Task implements Runnable { - private static final Logger s_logger = Logger.getLogger(Task.class); - - public enum Type { - CONNECT, // Process a new connection. - DISCONNECT, // Process an existing connection disconnecting. - DATA, // data incoming. - CONNECT_FAILED, // Connection failed. - OTHER // Allows other tasks to be defined by the caller. - }; - - Object _data; - Type _type; - Link _link; - - public Task(Type type, Link link, byte[] data) { - _data = data; - _type = type; - _link = link; - } - - public Task(Type type, Link link, Object data) { - _data = data; - _type = type; - _link = link; - } - - protected Task() { - } - - public Type getType() { - return _type; - } - - public Link getLink() { - return _link; - } - - public byte[] getData() { - return (byte[])_data; - } - - public Object get() { - return _data; - } - - @Override - public String toString() { - return _type.toString(); - } - - abstract protected void doTask(Task task) throws Exception; - - @Override - public final void run() { - try { - doTask(this); - } catch (Throwable e) { - s_logger.warn("Caught the following exception but pushing on", e); - } - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/nio/TrustAllManager.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/nio/TrustAllManager.java b/utils/src/com/cloud/utils/nio/TrustAllManager.java deleted file mode 100644 index 5dffd62..0000000 --- a/utils/src/com/cloud/utils/nio/TrustAllManager.java +++ /dev/null @@ -1,45 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.nio; - -public class TrustAllManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager { - @Override - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return null; - } - - public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) { - return true; - } - - public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) { - return true; - } - - @Override - public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException { - return; - } - - @Override - public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException { - return; - } -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/rest/BasicEncodedRESTValidationStrategy.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/rest/BasicEncodedRESTValidationStrategy.java b/utils/src/com/cloud/utils/rest/BasicEncodedRESTValidationStrategy.java deleted file mode 100644 index bf001cd..0000000 --- a/utils/src/com/cloud/utils/rest/BasicEncodedRESTValidationStrategy.java +++ /dev/null @@ -1,66 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.rest; - -import java.io.IOException; - -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpException; -import org.apache.commons.httpclient.HttpMethodBase; - -/** - * Base 64 encoded authorization strategy. This implementation as opposed to - * {@link RESTValidationStrategy} doesn't do a login after auth error, but instead - * includes the encoded credentials in each request, instead of a cookie. - */ -public class BasicEncodedRESTValidationStrategy extends RESTValidationStrategy { - - public BasicEncodedRESTValidationStrategy(final String host, final String adminuser, final String adminpass) { - super(); - this.host = host; - user = adminuser; - password = adminpass; - } - - public BasicEncodedRESTValidationStrategy() { - } - - @Override - public void executeMethod(final HttpMethodBase method, final HttpClient client, - final String protocol) - throws CloudstackRESTException, HttpException, IOException { - if (host == null || host.isEmpty() || user == null || user.isEmpty() || password == null || password.isEmpty()) { - throw new CloudstackRESTException("Hostname/credentials are null or empty"); - } - - final String encodedCredentials = encodeCredentials(); - method.setRequestHeader("Authorization", "Basic " + encodedCredentials); - client.executeMethod(method); - } - - private String encodeCredentials() { - final String authString = user + ":" + password; - final byte[] authEncBytes = Base64.encodeBase64(authString.getBytes()); - final String authStringEnc = new String(authEncBytes); - return authStringEnc; - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/rest/CloudstackRESTException.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/rest/CloudstackRESTException.java b/utils/src/com/cloud/utils/rest/CloudstackRESTException.java deleted file mode 100644 index 5985fa0..0000000 --- a/utils/src/com/cloud/utils/rest/CloudstackRESTException.java +++ /dev/null @@ -1,39 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.rest; - -public class CloudstackRESTException extends Exception { - - public CloudstackRESTException() { - } - - public CloudstackRESTException(final String message) { - super(message); - } - - public CloudstackRESTException(final Throwable cause) { - super(cause); - } - - public CloudstackRESTException(final String message, final Throwable cause) { - super(message, cause); - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/rest/RESTServiceConnector.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/rest/RESTServiceConnector.java b/utils/src/com/cloud/utils/rest/RESTServiceConnector.java deleted file mode 100644 index 6ededcb..0000000 --- a/utils/src/com/cloud/utils/rest/RESTServiceConnector.java +++ /dev/null @@ -1,395 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.rest; - -import com.google.gson.FieldNamingPolicy; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonDeserializer; -import com.google.gson.reflect.TypeToken; -import org.apache.cloudstack.utils.security.SSLUtils; -import org.apache.cloudstack.utils.security.SecureSSLSocketFactory; -import org.apache.commons.httpclient.ConnectTimeoutException; -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpException; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.HttpMethodBase; -import org.apache.commons.httpclient.HttpStatus; -import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; -import org.apache.commons.httpclient.NameValuePair; -import org.apache.commons.httpclient.cookie.CookiePolicy; -import org.apache.commons.httpclient.methods.DeleteMethod; -import org.apache.commons.httpclient.methods.GetMethod; -import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.commons.httpclient.methods.PutMethod; -import org.apache.commons.httpclient.methods.StringRequestEntity; -import org.apache.commons.httpclient.params.HttpConnectionParams; -import org.apache.commons.httpclient.protocol.Protocol; -import org.apache.commons.httpclient.protocol.ProtocolSocketFactory; -import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory; -import org.apache.log4j.Logger; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Type; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Socket; -import java.net.URL; -import java.net.UnknownHostException; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -/** - * This abstraction encapsulates client side code for REST service communication. It encapsulates - * access in a delegate validation strategy. There may different implementations extending - * {@link RESTValidationStrategy}, and any of them should mention the needed data to work. - * - * This connector allows the use of {@link JsonDeserializer} for specific classes. You can provide - * in the constructor a list of classes and a list of deserializers for these classes. These should - * be a correlated so that Nth deserializer is correctly mapped to Nth class. - */ -public class RESTServiceConnector { - private static final String HTTPS = "https"; - protected static final String GET_METHOD_TYPE = "get"; - protected static final String DELETE_METHOD_TYPE = "delete"; - protected static final String PUT_METHOD_TYPE = "put"; - protected static final String POST_METHOD_TYPE = "post"; - private static final String TEXT_HTML_CONTENT_TYPE = "text/html"; - private static final String JSON_CONTENT_TYPE = "application/json"; - private static final String CONTENT_TYPE = "Content-Type"; - private static final int BODY_RESP_MAX_LEN = 1024; - private static final int HTTPS_PORT = 443; - - private static final Logger s_logger = Logger.getLogger(RESTServiceConnector.class); - - protected final static String protocol = HTTPS; - - private final static MultiThreadedHttpConnectionManager s_httpClientManager = new MultiThreadedHttpConnectionManager(); - - protected RESTValidationStrategy validation; - - private final HttpClient client; - - private final Gson gson; - - - /** - * Getter that may be needed only for test purpose - * - * @return - */ - public Gson getGson() { - return gson; - } - - public RESTServiceConnector(final RESTValidationStrategy validationStrategy) { - this(validationStrategy, null, null); - } - - public RESTServiceConnector(final RESTValidationStrategy validationStrategy, final List> classList, final List> deserializerList) { - validation = validationStrategy; - client = createHttpClient(); - client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); - - try { - // Cast to ProtocolSocketFactory to avoid the deprecated constructor with the SecureProtocolSocketFactory parameter - Protocol.registerProtocol(HTTPS, new Protocol(HTTPS, (ProtocolSocketFactory)new TrustingProtocolSocketFactory(), HTTPS_PORT)); - } catch (final IOException e) { - s_logger.warn("Failed to register the TrustingProtocolSocketFactory, falling back to default SSLSocketFactory", e); - } - - final GsonBuilder gsonBuilder = new GsonBuilder(); - if(classList != null && deserializerList != null) { - for(int i = 0; i < classList.size() && i < deserializerList.size(); i++) { - gsonBuilder.registerTypeAdapter(classList.get(i), deserializerList.get(i)); - } - } - gson = gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); - } - - public HttpClient createHttpClient() { - return new HttpClient(s_httpClientManager); - } - - public HttpMethod createMethod(final String type, final String uri) throws CloudstackRESTException { - String url; - try { - url = new URL(protocol, validation.getHost(), uri).toString(); - } catch (final MalformedURLException e) { - s_logger.error("Unable to build REST Service URL", e); - throw new CloudstackRESTException("Unable to build Nicira API URL", e); - } - - if (POST_METHOD_TYPE.equalsIgnoreCase(type)) { - return new PostMethod(url); - } else if (GET_METHOD_TYPE.equalsIgnoreCase(type)) { - return new GetMethod(url); - } else if (DELETE_METHOD_TYPE.equalsIgnoreCase(type)) { - return new DeleteMethod(url); - } else if (PUT_METHOD_TYPE.equalsIgnoreCase(type)) { - return new PutMethod(url); - } else { - throw new CloudstackRESTException("Requesting unknown method type"); - } - } - - public void setControllerAddress(final String address) { - validation.setHost(address); - } - - public void setAdminCredentials(final String username, final String password) { - validation.setUser(username); - validation.setPassword(password); - } - - public void executeUpdateObject(final T newObject, final String uri, final Map parameters) throws CloudstackRESTException { - - final PutMethod pm = (PutMethod)createMethod(PUT_METHOD_TYPE, uri); - pm.setRequestHeader(CONTENT_TYPE, JSON_CONTENT_TYPE); - try { - pm.setRequestEntity(new StringRequestEntity(gson.toJson(newObject), JSON_CONTENT_TYPE, null)); - } catch (final UnsupportedEncodingException e) { - throw new CloudstackRESTException("Failed to encode json request body", e); - } - - executeMethod(pm); - - if (pm.getStatusCode() != HttpStatus.SC_OK) { - final String errorMessage = responseToErrorMessage(pm); - pm.releaseConnection(); - s_logger.error("Failed to update object : " + errorMessage); - throw new CloudstackRESTException("Failed to update object : " + errorMessage); - } - pm.releaseConnection(); - } - - @SuppressWarnings("unchecked") - public T executeCreateObject(final T newObject, final Type returnObjectType, final String uri, final Map parameters) - throws CloudstackRESTException { - - final PostMethod pm = (PostMethod)createMethod(POST_METHOD_TYPE, uri); - pm.setRequestHeader(CONTENT_TYPE, JSON_CONTENT_TYPE); - try { - pm.setRequestEntity(new StringRequestEntity(gson.toJson(newObject), JSON_CONTENT_TYPE, null)); - } catch (final UnsupportedEncodingException e) { - throw new CloudstackRESTException("Failed to encode json request body", e); - } - - executeMethod(pm); - - if (pm.getStatusCode() != HttpStatus.SC_CREATED) { - final String errorMessage = responseToErrorMessage(pm); - pm.releaseConnection(); - s_logger.error("Failed to create object : " + errorMessage); - throw new CloudstackRESTException("Failed to create object : " + errorMessage); - } - - T result; - try { - result = (T)gson.fromJson(pm.getResponseBodyAsString(), TypeToken.get(newObject.getClass()).getType()); - } catch (final IOException e) { - throw new CloudstackRESTException("Failed to decode json response body", e); - } finally { - pm.releaseConnection(); - } - - return result; - } - - public void executeDeleteObject(final String uri) throws CloudstackRESTException { - final DeleteMethod dm = (DeleteMethod)createMethod(DELETE_METHOD_TYPE, uri); - dm.setRequestHeader(CONTENT_TYPE, JSON_CONTENT_TYPE); - - executeMethod(dm); - - if (dm.getStatusCode() != HttpStatus.SC_NO_CONTENT) { - final String errorMessage = responseToErrorMessage(dm); - dm.releaseConnection(); - s_logger.error("Failed to delete object : " + errorMessage); - throw new CloudstackRESTException("Failed to delete object : " + errorMessage); - } - dm.releaseConnection(); - } - - @SuppressWarnings("unchecked") - public T executeRetrieveObject(final Type returnObjectType, final String uri, final Map parameters) throws CloudstackRESTException { - final GetMethod gm = (GetMethod)createMethod(GET_METHOD_TYPE, uri); - gm.setRequestHeader(CONTENT_TYPE, JSON_CONTENT_TYPE); - if (parameters != null && !parameters.isEmpty()) { - final List nameValuePairs = new ArrayList(parameters.size()); - for (final Entry e : parameters.entrySet()) { - nameValuePairs.add(new NameValuePair(e.getKey(), e.getValue())); - } - gm.setQueryString(nameValuePairs.toArray(new NameValuePair[0])); - } - - executeMethod(gm); - - if (gm.getStatusCode() != HttpStatus.SC_OK) { - final String errorMessage = responseToErrorMessage(gm); - gm.releaseConnection(); - s_logger.error("Failed to retrieve object : " + errorMessage); - throw new CloudstackRESTException("Failed to retrieve object : " + errorMessage); - } - - T returnValue; - try { - returnValue = (T)gson.fromJson(gm.getResponseBodyAsString(), returnObjectType); - } catch (final IOException e) { - s_logger.error("IOException while retrieving response body", e); - throw new CloudstackRESTException(e); - } finally { - gm.releaseConnection(); - } - return returnValue; - } - - public void executeMethod(final HttpMethodBase method) throws CloudstackRESTException { - try { - validation.executeMethod(method, client, protocol); - } catch (final HttpException e) { - s_logger.error("HttpException caught while trying to connect to the REST Service", e); - method.releaseConnection(); - throw new CloudstackRESTException("API call to REST Service Failed", e); - } catch (final IOException e) { - s_logger.error("IOException caught while trying to connect to the REST Service", e); - method.releaseConnection(); - throw new CloudstackRESTException("API call to Nicira REST Service Failed", e); - } - } - - private String responseToErrorMessage(final HttpMethodBase method) { - assert method.isRequestSent() : "no use getting an error message unless the request is sent"; - - if (TEXT_HTML_CONTENT_TYPE.equals(method.getResponseHeader(CONTENT_TYPE).getValue())) { - // The error message is the response content - // Safety margin of 1024 characters, anything longer is probably useless - // and will clutter the logs - try { - return method.getResponseBodyAsString(BODY_RESP_MAX_LEN); - } catch (final IOException e) { - s_logger.debug("Error while loading response body", e); - } - } - - // The default - return method.getStatusText(); - } - - /* Some controllers use a self-signed certificate. The - * TrustingProtocolSocketFactory will accept any provided - * certificate when making an SSL connection to the SDN - * Manager - */ - private class TrustingProtocolSocketFactory implements SecureProtocolSocketFactory { - - private SSLSocketFactory ssf; - - public TrustingProtocolSocketFactory() throws IOException { - // Create a trust manager that does not validate certificate chains - final TrustManager[] trustAllCerts = new TrustManager[] {new X509TrustManager() { - @Override - public X509Certificate[] getAcceptedIssuers() { - return null; - } - - @Override - public void checkClientTrusted(final X509Certificate[] certs, final String authType) { - // Trust always - } - - @Override - public void checkServerTrusted(final X509Certificate[] certs, final String authType) { - // Trust always - } - }}; - - try { - // Install the all-trusting trust manager - final SSLContext sc = SSLUtils.getSSLContext(); - sc.init(null, trustAllCerts, new java.security.SecureRandom()); - ssf = new SecureSSLSocketFactory(sc); - } catch (final KeyManagementException e) { - throw new IOException(e); - } catch (final NoSuchAlgorithmException e) { - throw new IOException(e); - } - } - - @Override - public Socket createSocket(final String host, final int port) throws IOException { - SSLSocket socket = (SSLSocket) ssf.createSocket(host, port); - socket.setEnabledProtocols(SSLUtils.getSupportedProtocols(socket.getEnabledProtocols())); - return socket; - } - - @Override - public Socket createSocket(final String address, final int port, final InetAddress localAddress, final int localPort) throws IOException, UnknownHostException { - Socket socket = ssf.createSocket(address, port, localAddress, localPort); - if (socket instanceof SSLSocket) { - ((SSLSocket)socket).setEnabledProtocols(SSLUtils.getSupportedProtocols(((SSLSocket)socket).getEnabledProtocols())); - } - return socket; - } - - @Override - public Socket createSocket(final Socket socket, final String host, final int port, final boolean autoClose) throws IOException, UnknownHostException { - Socket s = ssf.createSocket(socket, host, port, autoClose); - if (s instanceof SSLSocket) { - ((SSLSocket)s).setEnabledProtocols(SSLUtils.getSupportedProtocols(((SSLSocket)s).getEnabledProtocols())); - } - return s; - } - - @Override - public Socket createSocket(final String host, final int port, final InetAddress localAddress, final int localPort, final HttpConnectionParams params) - throws IOException, UnknownHostException, ConnectTimeoutException { - final int timeout = params.getConnectionTimeout(); - if (timeout == 0) { - Socket socket = createSocket(host, port, localAddress, localPort); - if (socket instanceof SSLSocket) { - ((SSLSocket)socket).setEnabledProtocols(SSLUtils.getSupportedProtocols(((SSLSocket)socket).getEnabledProtocols())); - } - return socket; - } else { - final Socket s = ssf.createSocket(); - if (s instanceof SSLSocket) { - ((SSLSocket)s).setEnabledProtocols(SSLUtils.getSupportedProtocols(((SSLSocket)s).getEnabledProtocols())); - } - s.bind(new InetSocketAddress(localAddress, localPort)); - s.connect(new InetSocketAddress(host, port), timeout); - return s; - } - } - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/rest/RESTValidationStrategy.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/rest/RESTValidationStrategy.java b/utils/src/com/cloud/utils/rest/RESTValidationStrategy.java deleted file mode 100644 index 77ac8d0..0000000 --- a/utils/src/com/cloud/utils/rest/RESTValidationStrategy.java +++ /dev/null @@ -1,165 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.rest; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; - -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpException; -import org.apache.commons.httpclient.HttpMethodBase; -import org.apache.commons.httpclient.HttpStatus; -import org.apache.commons.httpclient.methods.PostMethod; -import org.apache.log4j.Logger; - -/** - * Basic authentication strategy. This strategy needs user and password for authentication. - * - * A login URL is needed which will be used for login and getting the cookie to be - * used in next requests. If an executeMethod request fails due to authorization it will try - * to login, get the cookie and repeat the attempt to execute the method. - */ -public class RESTValidationStrategy { - - private static final Logger s_logger = Logger.getLogger(RESTValidationStrategy.class); - - protected String host; - protected String user; - protected String password; - protected String serverVersion; - protected String loginUrl; - - public RESTValidationStrategy(final String host, final String user, final String password, - final String serverVersion, final String loginUrl) { - super(); - this.host = host; - this.user = user; - this.password = password; - this.serverVersion = serverVersion; - this.loginUrl = loginUrl; - } - - public RESTValidationStrategy(final String loginUrl) { - this.loginUrl = loginUrl; - } - - public RESTValidationStrategy() { - } - - public String getUser() { - return user; - } - - public void setUser(final String user) { - this.user = user; - } - - public String getPassword() { - return password; - } - - public void setPassword(final String password) { - this.password = password; - } - - public String getLoginUrl() { - return loginUrl; - } - - public void setLoginUrl(final String loginUrl) { - this.loginUrl = loginUrl; - } - - public String getHost() { - return host; - } - - public void setHost(final String host) { - this.host = host; - } - - public void executeMethod(final HttpMethodBase method, final HttpClient client, - final String protocol) - throws CloudstackRESTException, HttpException, IOException { - if (host == null || host.isEmpty() || user == null || user.isEmpty() || password == null || password.isEmpty()) { - throw new CloudstackRESTException("Hostname/credentials are null or empty"); - } - - client.executeMethod(method); - if (method.getStatusCode() == HttpStatus.SC_UNAUTHORIZED) { - method.releaseConnection(); - // login and try again - login(protocol, client); - client.executeMethod(method); - } - } - - /** - * Logs against the REST server. The cookie is stored in the _authcookie variable. - *

- * The method returns false if the login failed or the connection could not be made. - * - */ - protected void login(final String protocol, - final HttpClient client) - throws CloudstackRESTException { - String url; - - if (host == null || host.isEmpty() || user == null || user.isEmpty() || password == null || password.isEmpty()) { - throw new CloudstackRESTException("Hostname/credentials are null or empty"); - } - - try { - url = new URL(protocol, host, loginUrl).toString(); - } catch (final MalformedURLException e) { - s_logger.error("Unable to build Nicira API URL", e); - throw new CloudstackRESTException("Unable to build Nicira API URL", e); - } - - final PostMethod pm = new PostMethod(url); - pm.addParameter("username", user); - pm.addParameter("password", password); - - try { - client.executeMethod(pm); - } catch (final HttpException e) { - throw new CloudstackRESTException("REST Service API login failed ", e); - } catch (final IOException e) { - throw new CloudstackRESTException("REST Service API login failed ", e); - } finally { - pm.releaseConnection(); - } - - if (pm.getStatusCode() != HttpStatus.SC_OK) { - s_logger.error("REST Service API login failed : " + pm.getStatusText()); - throw new CloudstackRESTException("REST Service API login failed " + pm.getStatusText()); - } - - // Extract the version for later use - if (pm.getResponseHeader("Server") != null) { - serverVersion = pm.getResponseHeader("Server").getValue(); - s_logger.debug("Server reports version " + serverVersion); - } - - // Success; the cookie required for login is kept in _client - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/script/OutputInterpreter.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/script/OutputInterpreter.java b/utils/src/com/cloud/utils/script/OutputInterpreter.java deleted file mode 100644 index 654f87e..0000000 --- a/utils/src/com/cloud/utils/script/OutputInterpreter.java +++ /dev/null @@ -1,141 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.script; - -import java.io.BufferedReader; -import java.io.IOException; - -import org.apache.log4j.Logger; - -/** - */ -public abstract class OutputInterpreter { - public boolean drain() { - return false; - } - - public String processError(BufferedReader reader) throws IOException { - StringBuilder buff = new StringBuilder(); - String line = null; - while ((line = reader.readLine()) != null) { - buff.append(line); - } - return buff.toString(); - } - - public abstract String interpret(BufferedReader reader) throws IOException; - - public static final OutputInterpreter NoOutputParser = new OutputInterpreter() { - @Override - public String interpret(BufferedReader reader) throws IOException { - return null; - } - }; - - public static class TimedOutLogger extends OutputInterpreter { - private static final Logger s_logger = Logger.getLogger(TimedOutLogger.class); - Process _process; - - public TimedOutLogger(Process process) { - _process = process; - } - - @Override - public boolean drain() { - return true; - } - - @Override - public String interpret(BufferedReader reader) throws IOException { - StringBuilder buff = new StringBuilder(); - - while (reader.ready()) { - buff.append(reader.readLine()); - } - - _process.destroy(); - - try { - while (reader.ready()) { - buff.append(reader.readLine()); - } - } catch (IOException e) { - s_logger.info("[ignored] can not append line to buffer",e); - } - - return buff.toString(); - } - } - - public static class OutputLogger extends OutputInterpreter { - Logger _logger; - - public OutputLogger(Logger logger) { - _logger = logger; - } - - @Override - public String interpret(BufferedReader reader) throws IOException { - StringBuilder builder = new StringBuilder(); - String line = null; - while ((line = reader.readLine()) != null) { - builder.append(line).append("\n"); - } - if (builder.length() > 0) { - _logger.debug(builder.toString()); - } - return null; - } - } - - public static class OneLineParser extends OutputInterpreter { - String line = null; - - @Override - public String interpret(BufferedReader reader) throws IOException { - line = reader.readLine(); - return null; - } - - public String getLine() { - return line; - } - }; - - public static class AllLinesParser extends OutputInterpreter { - String allLines = null; - - @Override - public String interpret(BufferedReader reader) throws IOException { - StringBuilder builder = new StringBuilder(); - String line = null; - while ((line = reader.readLine()) != null) { - builder.append(line).append("\n"); - } - allLines = builder.toString(); - return null; - } - - public String getLines() { - return allLines; - } - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/script/Script.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/script/Script.java b/utils/src/com/cloud/utils/script/Script.java deleted file mode 100644 index 487c62c..0000000 --- a/utils/src/com/cloud/utils/script/Script.java +++ /dev/null @@ -1,502 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.script; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.concurrent.Callable; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; - -import org.apache.commons.io.IOUtils; -import org.apache.log4j.Logger; - -import com.cloud.utils.PropertiesUtil; -import com.cloud.utils.concurrency.NamedThreadFactory; -import com.cloud.utils.script.OutputInterpreter.TimedOutLogger; - -public class Script implements Callable { - private static final Logger s_logger = Logger.getLogger(Script.class); - - private final Logger _logger; - - public static final String ERR_EXECUTE = "execute.error"; - public static final String ERR_TIMEOUT = "timeout"; - private int _defaultTimeout = 3600 * 1000; /* 1 hour */ - private volatile boolean _isTimeOut = false; - - private boolean _passwordCommand = false; - - private static final ScheduledExecutorService s_executors = Executors.newScheduledThreadPool(10, new NamedThreadFactory("Script")); - - String _workDir; - ArrayList _command; - long _timeout; - Process _process; - Thread _thread; - - public int getExitValue() { - return _process.exitValue(); - } - - public Script(String command, long timeout, Logger logger) { - _command = new ArrayList(); - _command.add(command); - _timeout = timeout; - if (_timeout == 0) { - /* always using default timeout 1 hour to avoid thread hang */ - _timeout = _defaultTimeout; - } - _process = null; - _logger = logger != null ? logger : s_logger; - } - - public Script(boolean runWithSudo, String command, long timeout, Logger logger) { - this(command, timeout, logger); - if (runWithSudo) { - _command.add(0, "sudo"); - } - } - - public Script(String command, Logger logger) { - this(command, 0, logger); - } - - public Script(String command) { - this(command, 0, s_logger); - } - - public Script(String command, long timeout) { - this(command, timeout, s_logger); - } - - public void add(String... params) { - for (String param : params) { - _command.add(param); - } - } - - public void add(String param) { - _command.add(param); - } - - public Script set(String name, String value) { - _command.add(name); - _command.add(value); - return this; - } - - public void setWorkDir(String workDir) { - _workDir = workDir; - } - - protected String buildCommandLine(String[] command) { - StringBuilder builder = new StringBuilder(); - boolean obscureParam = false; - for (int i = 0; i < command.length; i++) { - String cmd = command[i]; - if (obscureParam) { - builder.append("******").append(" "); - obscureParam = false; - } else { - builder.append(command[i]).append(" "); - } - - if ("-y".equals(cmd) || "-z".equals(cmd)) { - obscureParam = true; - _passwordCommand = true; - } - } - return builder.toString(); - } - - protected String buildCommandLine(List command) { - StringBuilder builder = new StringBuilder(); - boolean obscureParam = false; - for (String cmd : command) { - if (obscureParam) { - builder.append("******").append(" "); - obscureParam = false; - } else { - builder.append(cmd).append(" "); - } - - if ("-y".equals(cmd) || "-z".equals(cmd)) { - obscureParam = true; - _passwordCommand = true; - } - } - return builder.toString(); - } - - public String execute() { - return execute(new OutputInterpreter.OutputLogger(_logger)); - } - - @Override - public String toString() { - String[] command = _command.toArray(new String[_command.size()]); - return buildCommandLine(command); - } - - static String stackTraceAsString(Throwable throwable) { - //TODO: a StringWriter is bit to heavy weight - try(StringWriter out = new StringWriter(); PrintWriter writer = new PrintWriter(out);) { - throwable.printStackTrace(writer); - return out.toString(); - } catch (IOException e) { - return ""; - } - } - - public String execute(OutputInterpreter interpreter) { - String[] command = _command.toArray(new String[_command.size()]); - - if (_logger.isDebugEnabled()) { - _logger.debug("Executing: " + buildCommandLine(command)); - } - - try { - ProcessBuilder pb = new ProcessBuilder(command); - pb.redirectErrorStream(true); - if (_workDir != null) - pb.directory(new File(_workDir)); - - _process = pb.start(); - if (_process == null) { - _logger.warn("Unable to execute: " + buildCommandLine(command)); - return "Unable to execute the command: " + command[0]; - } - - BufferedReader ir = new BufferedReader(new InputStreamReader(_process.getInputStream())); - - _thread = Thread.currentThread(); - ScheduledFuture future = null; - if (_timeout > 0) { - future = s_executors.schedule(this, _timeout, TimeUnit.MILLISECONDS); - } - - Task task = null; - if (interpreter != null && interpreter.drain()) { - task = new Task(interpreter, ir); - s_executors.execute(task); - } - - while (true) { - try { - if (_process.waitFor() == 0) { - _logger.debug("Execution is successful."); - if (interpreter != null) { - return interpreter.drain() ? task.getResult() : interpreter.interpret(ir); - } else { - // null return exitValue apparently - return String.valueOf(_process.exitValue()); - } - } else { - break; - } - } catch (InterruptedException e) { - if (!_isTimeOut) { - /* - * This is not timeout, we are interrupted by others, - * continue - */ - _logger.debug("We are interrupted but it's not a timeout, just continue"); - continue; - } - - TimedOutLogger log = new TimedOutLogger(_process); - Task timedoutTask = new Task(log, ir); - - timedoutTask.run(); - if (!_passwordCommand) { - _logger.warn("Timed out: " + buildCommandLine(command) + ". Output is: " + timedoutTask.getResult()); - } else { - _logger.warn("Timed out: " + buildCommandLine(command)); - } - - return ERR_TIMEOUT; - } finally { - if (future != null) { - future.cancel(false); - } - Thread.interrupted(); - } - } - - _logger.debug("Exit value is " + _process.exitValue()); - - BufferedReader reader = new BufferedReader(new InputStreamReader(_process.getInputStream()), 128); - - String error; - if (interpreter != null) { - error = interpreter.processError(reader); - } else { - error = String.valueOf(_process.exitValue()); - } - - if (_logger.isDebugEnabled()) { - _logger.debug(error); - } - return error; - } catch (SecurityException ex) { - _logger.warn("Security Exception....not running as root?", ex); - return stackTraceAsString(ex); - } catch (Exception ex) { - _logger.warn("Exception: " + buildCommandLine(command), ex); - return stackTraceAsString(ex); - } finally { - if (_process != null) { - IOUtils.closeQuietly(_process.getErrorStream()); - IOUtils.closeQuietly(_process.getOutputStream()); - IOUtils.closeQuietly(_process.getInputStream()); - _process.destroy(); - } - } - } - - @Override - public String call() { - try { - _logger.trace("Checking exit value of process"); - _process.exitValue(); - _logger.trace("Script ran within the alloted time"); - } catch (IllegalThreadStateException e) { - _logger.warn("Interrupting script."); - _isTimeOut = true; - _thread.interrupt(); - } - return null; - } - - public static class Task implements Runnable { - OutputInterpreter interpreter; - BufferedReader reader; - String result; - boolean done; - - public Task(OutputInterpreter interpreter, BufferedReader reader) { - this.interpreter = interpreter; - this.reader = reader; - result = null; - } - - @Override - public void run() { - synchronized(this) { - done = false; - try { - result = interpreter.interpret(reader); - } catch (IOException ex) { - result = stackTraceAsString(ex); - } catch (Exception ex) { - result = stackTraceAsString(ex); - } finally { - done = true; - notifyAll(); - IOUtils.closeQuietly(reader); - } - } - } - - public synchronized String getResult() throws InterruptedException { - if (!done) { - wait(); - } - return result; - } - } - - public static String findScript(String path, String script) { - s_logger.debug("Looking for " + script + " in the classpath"); - - URL url = ClassLoader.getSystemResource(script); - s_logger.debug("System resource: " + url); - File file = null; - if (url != null) { - file = new File(url.getFile()); - s_logger.debug("Absolute path = " + file.getAbsolutePath()); - return file.getAbsolutePath(); - } - - if (path == null) { - s_logger.warn("No search path specified, unable to look for " + script); - return null; - } - path = path.replace("/", File.separator); - - /** - * Look in WEB-INF/classes of the webapp - * URI workaround the URL encoding of url.getFile - */ - if (path.endsWith(File.separator)) { - url = Script.class.getClassLoader().getResource(path + script); - } else { - url = Script.class.getClassLoader().getResource(path + File.separator + script); - } - s_logger.debug("Classpath resource: " + url); - if (url != null) { - try { - file = new File(new URI(url.toString()).getPath()); - s_logger.debug("Absolute path = " + file.getAbsolutePath()); - return file.getAbsolutePath(); - } catch (URISyntaxException e) { - s_logger.warn("Unable to convert " + url.toString() + " to a URI"); - } - } - - if (path.endsWith(File.separator)) { - path = path.substring(0, path.lastIndexOf(File.separator)); - } - - if (path.startsWith(File.separator)) { - // Path given was absolute so we assume the caller knows what they want. - file = new File(path + File.separator + script); - return file.exists() ? file.getAbsolutePath() : null; - } - - s_logger.debug("Looking for " + script); - String search = null; - for (int i = 0; i < 3; i++) { - if (i == 0) { - String cp = Script.class.getResource(Script.class.getSimpleName() + ".class").toExternalForm(); - int begin = cp.indexOf(File.separator); - - // work around with the inconsistency of java classpath and file separator on Windows 7 - if (begin < 0) - begin = cp.indexOf('/'); - - int endBang = cp.lastIndexOf("!"); - int end = cp.lastIndexOf(File.separator, endBang); - if (end < 0) - end = cp.lastIndexOf('/', endBang); - if (end < 0) - cp = cp.substring(begin); - else - cp = cp.substring(begin, end); - - s_logger.debug("Current binaries reside at " + cp); - search = cp; - } else if (i == 1) { - s_logger.debug("Searching in environment.properties"); - try { - final File propsFile = PropertiesUtil.findConfigFile("environment.properties"); - if (propsFile == null) { - s_logger.debug("environment.properties could not be opened"); - } else { - final Properties props = PropertiesUtil.loadFromFile(propsFile); - search = props.getProperty("paths.script"); - } - } catch (IOException e) { - s_logger.debug("environment.properties could not be opened"); - continue; - } - s_logger.debug("environment.properties says scripts should be in " + search); - } else { - s_logger.debug("Searching in the current directory"); - search = "."; - } - - search += File.separatorChar + path + File.separator; - do { - search = search.substring(0, search.lastIndexOf(File.separator)); - file = new File(search + File.separator + script); - s_logger.debug("Looking for " + script + " in " + file.getAbsolutePath()); - } while (!file.exists() && search.lastIndexOf(File.separator) != -1); - - if (file.exists()) { - return file.getAbsolutePath(); - } - - } - - search = System.getProperty("paths.script"); - - search += File.separatorChar + path + File.separator; - do { - search = search.substring(0, search.lastIndexOf(File.separator)); - file = new File(search + File.separator + script); - s_logger.debug("Looking for " + script + " in " + file.getAbsolutePath()); - } while (!file.exists() && search.lastIndexOf(File.separator) != -1); - - if (file.exists()) { - return file.getAbsolutePath(); - } - - s_logger.warn("Unable to find script " + script); - return null; - } - - public static String runSimpleBashScript(String command) { - return Script.runSimpleBashScript(command, 0); - } - - public static String runSimpleBashScript(String command, int timeout) { - - Script s = new Script("/bin/bash", timeout); - s.add("-c"); - s.add(command); - - OutputInterpreter.OneLineParser parser = new OutputInterpreter.OneLineParser(); - if (s.execute(parser) != null) - return null; - - String result = parser.getLine(); - if (result == null || result.trim().isEmpty()) - return null; - else - return result.trim(); - } - - public static int runSimpleBashScriptForExitValue(String command) { - return runSimpleBashScriptForExitValue(command, 0); - } - - public static int runSimpleBashScriptForExitValue(String command, int timeout) { - - Script s = new Script("/bin/bash", timeout); - s.add("-c"); - s.add(command); - - String result = s.execute(null); - if (result == null || result.trim().isEmpty()) - return -1; - else { - try { - return Integer.parseInt(result.trim()); - } catch (NumberFormatException e) { - return -1; - } - } - } - -} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/83fd8f60/utils/src/com/cloud/utils/script/Script2.java ---------------------------------------------------------------------- diff --git a/utils/src/com/cloud/utils/script/Script2.java b/utils/src/com/cloud/utils/script/Script2.java deleted file mode 100644 index 03c0e0d..0000000 --- a/utils/src/com/cloud/utils/script/Script2.java +++ /dev/null @@ -1,70 +0,0 @@ -// -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -// - -package com.cloud.utils.script; - -import java.util.HashMap; - -import org.apache.log4j.Logger; - -public class Script2 extends Script { - HashMap _params = new HashMap(); - - public static enum ParamType { - NORMAL, PASSWORD, - } - - public Script2(String command, Logger logger) { - this(command, 0, logger); - } - - public Script2(String command, long timeout, Logger logger) { - super(command, timeout, logger); - } - - public void add(String param, ParamType type) { - _params.put(param, type); - super.add(param); - } - - @Override - public void add(String param) { - add(param, ParamType.NORMAL); - } - - private ParamType getType(String cmd) { - return _params.get(cmd); - } - - @Override - protected String buildCommandLine(String[] command) { - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < command.length; i++) { - String cmd = command[i]; - ParamType type = getType(cmd); - if (type == ParamType.PASSWORD) { - builder.append("******").append(" "); - } else { - builder.append(command[i]).append(" "); - } - } - - return builder.toString(); - } -}