blob: ea85c59886d93ee9d8954a7f63a8e2fd0cf15b30 [file] [log] [blame]
;
;
; Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
;
; ====================================================================
; Licensed 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.
; ====================================================================
;
(ns org.jclouds.ssh-test
(:require
[clojure.contrib.logging :as logging])
(:import
org.jclouds.ssh.SshClient
org.jclouds.domain.Credentials
org.jclouds.io.Payload
org.jclouds.net.IPSocket
org.jclouds.compute.domain.ExecResponse))
(defn instantiate [impl-class & args]
(let [constructor (first
(filter
(fn [c] (= (count args) (count (.getParameterTypes c))))
(.getDeclaredConstructors impl-class)))]
(.newInstance impl-class (object-array args))))
;; define an instance or implementation of the following interfaces:
(defn maybe-invoke [f & args]
(when f
(apply f args)))
(defn default-exec
"Default exec function - replies to ./runscript status by returning 1"
[cmd]
(merge
{:exit 0 :err "stderr" :out "stdout"}
(condp = cmd
"./bootstrap status" {:exit 1 :out "[]"}
{})))
(deftype NoOpClient
[socket username password]
SshClient
(connect [this])
(disconnect [this])
(exec [this cmd]
(logging/info (format "ssh cmd: %s" cmd))
(let [response (default-exec cmd)]
(ExecResponse. (:out response) (:err response) (:exit response))))
(get [this path] )
(^void put [this ^String path ^String content])
(^void put [this ^String path ^org.jclouds.io.Payload content])
(getUsername [this] username)
(getHostAddress [this] (.getAddress socket)) )
(defn no-op-ssh-client
[socket username password]
(NoOpClient. socket username password))
(deftype SshClientFactory
[factory-fn]
org.jclouds.ssh.SshClient$Factory
(^org.jclouds.ssh.SshClient
create
[_ ^IPSocket socket ^String username ^String password-or-key]
(factory-fn socket username password-or-key))
(^org.jclouds.ssh.SshClient
create
[_ ^IPSocket socket ^String username ^bytes password-or-key]
(factory-fn socket username password-or-key))
(^org.jclouds.ssh.SshClient
create
[_ ^IPSocket socket ^Credentials credentials]
(factory-fn socket (.identity credentials) (.credential credentials)))
)
(deftype Module
[factory binder]
com.google.inject.Module
(configure
[this abinder]
(reset! binder abinder)
(.. @binder (bind org.jclouds.ssh.SshClient$Factory)
(toInstance factory))))
(defn ssh-test-module
"Create a module that specifies the factory for creating a test service"
[factory]
(let [binder (atom nil)]
(Module. factory binder)))
(defn ssh-test-client
"Create a module that can be passed to a compute-context, and which implements
an ssh client with the provided map of function implementations. Keys are
clojurefied versions of org.jclouds.ssh.SshClient's methods"
[factory-fn]
(ssh-test-module (SshClientFactory. factory-fn)))