Remove clojure bindings These have not seen any development in many years.
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/0bc935dd Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/0bc935dd Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/0bc935dd Branch: refs/heads/master Commit: 0bc935dd57dc8009731d05c533edd831c8642664 Parents: e446b5b Author: Andrew Gaul <[email protected]> Authored: Sun Oct 23 05:21:40 2016 -0700 Committer: Andrew Gaul <[email protected]> Committed: Mon Jul 10 11:39:11 2017 -0700 ---------------------------------------------------------------------- apis/chef/src/main/clojure/org/jclouds/chef.clj | 261 ----------- .../src/test/clojure/org/jclouds/chef_test.clj | 70 --- apis/ec2/pom.xml | 9 - .../src/main/clojure/org/jclouds/ec2/ami2.clj | 84 ---- .../src/main/clojure/org/jclouds/ec2/ebs2.clj | 286 ------------ .../clojure/org/jclouds/ec2/elastic_ip2.clj | 80 ---- .../clojure/org/jclouds/ec2/security_group2.clj | 99 ---- blobstore/pom.xml | 4 - .../src/main/clojure/org/jclouds/blobstore2.clj | 327 -------------- .../clojure/org/jclouds/blobstore2_test.clj | 205 --------- compute/pom.xml | 9 - .../src/main/clojure/org/jclouds/compute2.clj | 450 ------------------- .../src/main/clojure/org/jclouds/modules.clj | 88 ---- .../src/main/clojure/org/jclouds/predicate.clj | 32 -- .../test/clojure/org/jclouds/compute2_test.clj | 158 ------- .../src/test/clojure/org/jclouds/ssh_test.clj | 105 ----- core/pom.xml | 4 - core/src/main/clojure/org/jclouds/core.clj | 213 --------- core/src/test/clojure/org/jclouds/core_test.clj | 78 ---- project/pom.xml | 63 --- providers/aws-ec2/pom.xml | 9 - .../src/main/clojure/org/jclouds/aws/ec2.clj | 62 --- .../test/clojure/org/jclouds/aws/ec2_test.clj | 32 -- 23 files changed, 2728 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/apis/chef/src/main/clojure/org/jclouds/chef.clj ---------------------------------------------------------------------- diff --git a/apis/chef/src/main/clojure/org/jclouds/chef.clj b/apis/chef/src/main/clojure/org/jclouds/chef.clj deleted file mode 100644 index 964cd00..0000000 --- a/apis/chef/src/main/clojure/org/jclouds/chef.clj +++ /dev/null @@ -1,261 +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. -; - -(ns - #^{:author "Adrian Cole" - :doc "A clojure binding to the jclouds chef interface. - -Here's a quick example of how to manipulate a databag on the Chef Platform, -which is basically Chef Server as a Service. - -(use 'org.jclouds.chef) - -(def client \"YOUR_CLIENT\") -;; load the rsa key from ~/.chef/CLIENT_NAME.pem -(def credential (load-pem client)) - -;; create a connection to the chef platform -(def chef (chef-service \"chef\" client credential :chef.endpoint \"https://api.opscode.com/organizations/YOUR_ORG\")) - -(with-chef-service [chef] - (create-databag \"cluster-config\") - (update-databag-item \"cluster-config\" {:id \"master\" :name \"myhost.com\"})) - -;; note that you can create your chef connection like this to do in-memory testing -(def chef (chef-service \"transientchef\" \"\" \"\")) - -See http://code.google.com/p/jclouds for details."} - org.jclouds.chef - (:use [org.jclouds.core]) - (:require (org.danlarkin [json :as json])) - (:import - java.util.Properties - [org.jclouds ContextBuilder] - [org.jclouds.chef ChefClient - ChefService ChefContext] - [org.jclouds.chef.domain DatabagItem])) -(try - (use '[clojure.contrib.reflect :only [get-field]]) - (catch Exception e - (use '[clojure.contrib.java-utils - :only [wall-hack-field] - :rename {wall-hack-field get-field}]))) - -(defn load-pem - "get the pem associated with the supplied identity" - ([#^String identity] - (slurp (str (. System getProperty "user.home") "/.chef/" identity ".pem")))) - -;; TODO find a way to pass the chef provider by default - -(defn chef-service - "Create a logged in context to a chef server. - -provider \"chef\" is a remote connection, and you can pass the option - :chef.endpoint \"https://url\" to override the endpoint - -provider \"transientchef\" is for in-memory when you are looking to do -unit testing" - ([#^String provider #^String identity #^String credential & options] - (let [module-keys (set (keys module-lookup)) - ext-modules (filter #(module-keys %) options) - opts (apply hash-map (filter #(not (module-keys %)) options))] - (.. (ContextBuilder/newBuilder provider) - (credentials provider-identity provider-credential) - (modules (apply modules (concat ext-modules (opts :extensions)))) - (overrides (reduce #(do (.put %1 (name (first %2)) (second %2)) %1) - (Properties.) (dissoc opts :extensions))) - (build ChefContext) - (getChefService))))) - -(defn chef-context - "Returns a chef context from a chef service." - [#^ChefService chef] - (.getContext chef)) - -(defn chef-service? - [object] - (instance? ChefService object)) - -(defn chef-context? - [object] - (instance? ChefContext object)) - -(defn as-chef-service - "Tries hard to produce a chef service from its input arguments" - [& args] - (cond - (chef-service? (first args)) (first args) - (chef-context? (first args)) (.getChefService (first args)) - :else (apply chef-service args))) - -(defn as-chef-api - "Tries hard to produce a chef client from its input arguments" - [& args] - (cond - (chef-service? (first args)) (.getApi (.getContext (first args))) - (chef-context? (first args)) (.getApi (first args)) - :else (.getApi (.getContext (apply chef-service args))))) - -(def *chef*) - -(defmacro with-chef-service - "Specify the default chef service" - [[& chef-or-args] & body] - `(binding [*chef* (as-chef-service ~@chef-or-args)] - ~@body)) - -(defn nodes - "Retrieve the names of the existing nodes in your chef server." - ([] (nodes *chef*)) - ([#^ChefService chef] - (seq (.listNodes (as-chef-api chef))))) - -(defn nodes-with-details - "Retrieve the existing nodes in your chef server including all details." - ([] (nodes *chef*)) - ([#^ChefService chef] - (seq (.listNodes chef)))) - -(defn clients - "Retrieve the names of the existing clients in your chef server." - ([] (clients *chef*)) - ([#^ChefService chef] - (seq (.listClients (as-chef-api chef))))) - -(defn clients-with-details - "Retrieve the existing clients in your chef server including all details." - ([] (clients *chef*)) - ([#^ChefService chef] - (seq (.listClients chef)))) - -(defn cookbooks - "Retrieve the names of the existing cookbooks in your chef server." - ([] (cookbooks *chef*)) - ([#^ChefService chef] - (seq (.listCookbooks (as-chef-api chef))))) - -(defn cookbook-versions - "Retrieve the versions of an existing cookbook in your chef server." - ([name] (cookbook-versions *chef*)) - ([#^ChefService name chef] - (seq (.getVersionsOfCookbook (as-chef-api chef) name)))) - -(defn cookbook-versions-with-details - "Retrieve the existing cookbook versions in your chef server including all details." - ([] (cookbook-versions *chef*)) - ([#^ChefService chef] - (seq (.listCookbookVersions chef)))) - -(defn update-run-list - "Updates the run-list associated with a tag" - ([run-list tag] (update-run-list run-list tag *chef*)) - ([run-list tag #^ChefService chef] - (.updateRunListForTag chef run-list tag))) - -(defn run-list - "Retrieves the run-list associated with a tag" - ([tag] (run-list tag *chef*)) - ([tag #^ChefService chef] - (seq (.getRunListForTag chef tag)))) - -(defn create-bootstrap - "creates a client and bootstrap script associated with a tag" - ([tag] (create-bootstrap tag *chef*)) - ([tag #^ChefService chef] - (.createClientAndBootstrapScriptForTag chef tag))) - -(defn databags - "Retrieve the names of the existing data bags in your chef server." - ([] (databags *chef*)) - ([#^ChefService chef] - (seq (.listDatabags (as-chef-api chef))))) - -(defn databag-exists? - "Predicate to check presence of a databag" - ([databag-name] - (databag-exists? databag-name *chef*)) - ([databag-name #^ChefService chef] - (.databagExists (as-chef-api chef) databag-name))) - -(defn delete-databag - "Delete a data bag, including its items" - ([databag] - (delete-databag databag *chef*)) - ([databag chef] - (.deleteDatabag (as-chef-api chef) databag))) - -(defn create-databag - "create a data bag" - ([databag] - (create-databag databag *chef*)) - ([databag chef] - (.createDatabag (as-chef-api chef) databag))) - -(defn databag-items - "Retrieve the names of the existing items in a data bag in your chef server." - ([databag] - (databag-items databag *chef*)) - ([databag chef] - (seq (.listDatabagItems (as-chef-api chef) databag)))) - -(defn databag-item-exists? - "Predicate to check presence of a databag item" - ([databag-name item-id] - (databag-item-exists? databag-name item-id *chef*)) - ([databag-name item-id #^ChefService chef] - (.databagExists (as-chef-api chef) databag-name item-id))) - -(defn databag-item - "Get an item from the data bag" - ([databag item-id] - (databag-item databag item-id *chef*)) - ([databag item-id chef] - (json/decode-from-str (str (.getDatabagItem (as-chef-api chef) databag item-id))))) - -(defn delete-databag-item - "delete an item from the data bag" - ([databag item-id] - (delete-databag-item databag item-id *chef*)) - ([databag item-id chef] - (.deleteDatabagItem (as-chef-api chef) databag item-id))) - -(defn create-databag-item - "put a new item in the data bag. Note the Map you pass must have an :id key: - -ex. - (create-databag-item \"cluster-config\" {:id \"master\" :name \"myhost.com\"}))" - ([databag value] - (create-databag-item databag value *chef*)) - ([databag value chef] - (let [value-str (json/encode-to-str value)] - (let [value-json (json/decode-from-str value-str)] - (.createDatabagItem (as-chef-api chef) databag - (DatabagItem. (get value-json :id) value-str)))))) - -(defn update-databag-item - "updates an existing item in the data bag. Note the Map you pass must have an :id key: - -ex. - (update-databag-item \"cluster-config\" {:id \"master\" :name \"myhost.com\"}))" - ([databag value] - (update-databag-item databag value *chef*)) - ([databag value chef] - (let [value-str (json/encode-to-str value)] - (let [value-json (json/decode-from-str value-str)] - (.updateDatabagItem (as-chef-api chef) databag - (DatabagItem. (get value-json :id) value-str)))))) http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/apis/chef/src/test/clojure/org/jclouds/chef_test.clj ---------------------------------------------------------------------- diff --git a/apis/chef/src/test/clojure/org/jclouds/chef_test.clj b/apis/chef/src/test/clojure/org/jclouds/chef_test.clj deleted file mode 100644 index bc542f1..0000000 --- a/apis/chef/src/test/clojure/org/jclouds/chef_test.clj +++ /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. -; - -(ns org.jclouds.chef-test - (:use [org.jclouds.chef] :reload-all) - (:use [clojure.test])) - -(defn clean-stub-fixture - "This should allow basic tests to easily be run with another service." - [service account key & options] - (fn [f] - (with-chef-service [(apply chef-service service account key options)] -(doseq [databag (databags)] - (delete-databag databag)) -(f)))) - -(use-fixtures :each (clean-stub-fixture "transientchef" "" "")) - -(deftest chef-service?-test - (is (chef-service? *chef*))) - -(deftest as-chef-service-test - (is (chef-service? (chef-service "transientchef" "" ""))) - (is (chef-service? (as-chef-service *chef*))) - (is (chef-service? (as-chef-service (chef-context *chef*))))) - -(deftest create-existing-databag-test - (is (not (databag-exists? ""))) - (create-databag "fred") - (is (databag-exists? "fred"))) - -(deftest create-databag-test - (create-databag "fred") - (is (databag-exists? "fred"))) - -(deftest databags-test - (is (empty? (databags))) - (create-databag "fred") - (is (= 1 (count (databags))))) - -(deftest databag-items-test - (create-databag "databag") - (is (empty? (databag-items "databag"))) - (is (create-databag-item "databag" {:id "databag-item1" :value "databag-value1"})) - (is (create-databag-item "databag" {:id "databag-item2" :value "databag-value2"})) - (is (= 2 (count (databag-items "databag"))))) - -(deftest databag-item-test - (create-databag "databag") - (is (create-databag-item "databag" {:id "databag-item1" :value "databag-value1"})) - (is (create-databag-item "databag" {:id "databag-item2" :value "databag-value2"})) - (is (= {:id "databag-item2" :value "databag-value2"} (databag-item "databag" "databag-item2")))) - -(deftest run-list-test - (update-run-list #{"recipe[foo]"} "tag") - (is (= ["recipe[foo]"] (run-list "tag")))) http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/apis/ec2/pom.xml ---------------------------------------------------------------------- diff --git a/apis/ec2/pom.xml b/apis/ec2/pom.xml index e648bd7..d6cf48c 100644 --- a/apis/ec2/pom.xml +++ b/apis/ec2/pom.xml @@ -105,15 +105,6 @@ </dependency> </dependencies> - <build> - <plugins> - <plugin> - <groupId>com.theoryinpractise</groupId> - <artifactId>clojure-maven-plugin</artifactId> - </plugin> - </plugins> - </build> - <profiles> <profile> <id>live</id> http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/apis/ec2/src/main/clojure/org/jclouds/ec2/ami2.clj ---------------------------------------------------------------------- diff --git a/apis/ec2/src/main/clojure/org/jclouds/ec2/ami2.clj b/apis/ec2/src/main/clojure/org/jclouds/ec2/ami2.clj deleted file mode 100644 index d58eb6b..0000000 --- a/apis/ec2/src/main/clojure/org/jclouds/ec2/ami2.clj +++ /dev/null @@ -1,84 +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. -; - -(ns - #^{:author "Hunter Hutchinson, [email protected]" - :doc "A clojure binding to the jclouds AMI service interface."} - org.jclouds.ec2.ami2 - (:use org.jclouds.compute2) - (:import org.jclouds.aws.domain.Region - org.jclouds.ec2.features.AMIApi - org.jclouds.ec2.options.CreateImageOptions - org.jclouds.compute.domain.NodeMetadata - (org.jclouds.ec2.domain Volume Volume$Status Snapshot Snapshot$Status AvailabilityZoneInfo))) - -(defn ^org.jclouds.ec2.features.AMIApi - ami-service - "" - [compute] - (-> compute - .getContext - .getProviderSpecificContext - .getApi - .getAMIApi().get)) - -(defn get-region - "Coerces the first parameter into a Region string; strings, keywords, and - NodeMetadata instances are acceptable arguments. An optional second argument - is returned if the first cannot be coerced into a region string. - Returns nil otherwise." - ([v] (get-region v nil)) - ([v default-region] - (cond - (string? v) v - (keyword? v) (name v) - (instance? NodeMetadata v) (let [zone (location v)] - ; no easier way to go from zone -> region? - (if (> (.indexOf zone "-") -1) - (subs zone 0 (-> zone count dec)) - zone)) - :else default-region))) - -(defn- as-string - [v] - (cond - (string? v) v - (keyword? v) (name v) - :else v)) - -(defn- get-string - [map key] - (as-string (get map key))) - -(defn- as-int - [v] - (cond - (number? v) (int v) - (string? v) (Integer/parseInt v) - :else (throw (IllegalArgumentException. - (str "Don't know how to convert object of type " (class v) " to a string"))))) - -(defn create-image-in-region - ([compute region name node-id description] - (.createImageInRegion (ami-service compute) - (get-region region) - (as-string name) - (as-string node-id) - (into-array CreateImageOptions - (when description - [(.withDescription (CreateImageOptions.) description)]))))) - http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/apis/ec2/src/main/clojure/org/jclouds/ec2/ebs2.clj ---------------------------------------------------------------------- diff --git a/apis/ec2/src/main/clojure/org/jclouds/ec2/ebs2.clj b/apis/ec2/src/main/clojure/org/jclouds/ec2/ebs2.clj deleted file mode 100644 index 2bde9a5..0000000 --- a/apis/ec2/src/main/clojure/org/jclouds/ec2/ebs2.clj +++ /dev/null @@ -1,286 +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. -; - -(ns - #^{:author "Chas Emerick, [email protected]" - :doc "A clojure binding to the jclouds EBS service interface."} - org.jclouds.ec2.ebs2 - (:use org.jclouds.compute2 [clojure.core.incubator :only (-?>)]) - (:import org.jclouds.aws.domain.Region - org.jclouds.compute.domain.NodeMetadata - (org.jclouds.ec2.domain Volume Volume$Status Snapshot Snapshot$Status AvailabilityZoneInfo) - (org.jclouds.ec2.options DescribeSnapshotsOptions DetachVolumeOptions CreateSnapshotOptions))) -(defn snapshot? - "Returns true iff the argument is a org.jclouds.ec2.domain.Snapshot." - [s] - (instance? Snapshot s)) - -(defn volume? - "Returns true iff the argument is a org.jclouds.ec2.domain.Volume." - [v] - (instance? Volume v)) - -(defn ^org.jclouds.ec2.services.ElasticBlockStoreClient - ebs-service - "" - [compute] - (-> compute - .getContext - .getProviderSpecificContext - .getApi - .getElasticBlockStoreServices)) - -(defn get-region - "Coerces the first parameter into a Region string; strings, keywords, and - NodeMetadata instances are acceptable arguments. An optional second argument - is returned if the first cannot be coerced into a region string. - Returns nil otherwise." - ([v] (get-region v nil)) - ([v default-region] - (cond - (string? v) v - (keyword? v) (name v) - (instance? NodeMetadata v) (let [zone (location v)] - ; no easier way to go from zone -> region? - (if (> (.indexOf zone "-") -1) - (subs zone 0 (-> zone count dec)) - zone)) - :else default-region))) - -(defn get-volume-id - "Returns a string volume ID taken from the given string, keyword, or Volume argument." - [v] - (cond - (instance? Volume v) (.getId ^Volume v) - (keyword? v) (name v) - (string? v) v - :else (throw (IllegalArgumentException. - (str "Can't obtain volume id from argument of type " (class v)))))) - -(defn volumes - "Returns a set of org.jclouds.ec2.domain.Volume instances corresponding to the - volumes in the specified region (defaulting to your account's default region)." - [compute & [region & volume-ids]] - (set - (.describeVolumesInRegion (ebs-service compute) - (get-region region) - (into-array String (map get-volume-id - (if (get-region region) - volume-ids - (when region (cons region volume-ids)))))))) - -(defn- as-string - [v] - (cond - (string? v) v - (keyword? v) (name v) - :else v)) -(defn- get-string - [map key] - (as-string (get map key))) - -(defn- as-int - [v] - (cond - (number? v) (int v) - (string? v) (Integer/parseInt v) - :else (throw (IllegalArgumentException. - (str "Don't know how to convert object of type " (class v) " to a string"))))) - -(defn- snapshot-options - [optmap] - (let [string-array #(let [v (% optmap)] - (into-array String (cond - (keyword? v) [(name v)] - (string? v) [v] - :else (map as-string v))))] - (-> (DescribeSnapshotsOptions.) - (.ownedBy (string-array :owner)) - (.snapshotIds (string-array :ids)) - (.restorableBy (string-array :restorable-by))))) - -(defn snapshots - "Returns a set of org.jclouds.aws.ec2.domain.Snapshot instances that match - the criteria provided. Options include: - - :region - region string, keyword, or NodeMetadata - :owner - AWS account id (or \"amazon\" or \"self\") - :restorable-by - AWS account id - - Multiple values for each type of criteria can be provided by passing a seq - of the appropriate types as values." - [compute & options] - (let [options (apply hash-map options) - region (:region options) - options (snapshot-options (dissoc options :region))] - (set - (.describeSnapshotsInRegion (ebs-service compute) - (get-region region) - (into-array DescribeSnapshotsOptions [options]))))) - -(defn create-snapshot - "Creates a snapshot of a volume in the specified region with an optional description. - If provided, the description must be < 255 characters in length. Returns the - org.jclouds.aws.ec2.domain.Snapshot object representing the created snapshot." - ([compute ^Volume volume] (create-snapshot compute volume nil)) - ([compute ^Volume volume description] (create-snapshot compute (.getRegion volume) (.getId volume) description)) - ([compute region volume-id description] - (.createSnapshotInRegion (ebs-service compute) - (get-region region) - (as-string volume-id) - (into-array CreateSnapshotOptions (when description - [(.withDescription (CreateSnapshotOptions.) description)]))))) - -(defn delete-snapshot - "Deletes a snapshot in the specified region." - ([compute ^Snapshot snapshot] (delete-snapshot compute (.getRegion snapshot) (.getId snapshot))) - ([compute region snapshot-id] - (.deleteSnapshotInRegion (ebs-service compute) - (get-region region) - (as-string snapshot-id)))) - -(defn get-zone - [v] - (cond - (instance? AvailabilityZoneInfo v) (.getZone v) - (instance? NodeMetadata v) (location ^NodeMetadata v) - (string? v) v - (keyword? v) (name v) - :else (throw (IllegalArgumentException. - (str "Can't obtain zone from argument of type " (class v)))))) - -(defn attach-volume - "Attaches a volume to an instance, returning the resulting org.jclouds.aws.ec2.domain.Attachment." - ([compute ^NodeMetadata node volume device] - (attach-volume compute node (.getProviderId node) (get-volume-id volume) device)) - ([compute region instance-id volume-id device] - (apply #(.attachVolumeInRegion (ebs-service compute) - (get-region region) % %2 %3) - (map as-string [volume-id instance-id device])))) - -(defn detach-volume - "Detaches a volume from the instance to which it is currently attached. - The volume may be specified with a Volume instance, a string, or a keyword. - Providing a logical true value for the :force option will cause the volume - to be forcibly detached, regardless of whether it is in-use (mounted) or not. - - If the volume is specified as a string or keyword, one of the following options - is additionally required: - - :region - the region where the volume is allocated - :node - a node in the region where the volume is allocated - - FYI: It appears that issuing a detatch-volume command while the volume in question is mounted - will cause the volume to be detatched immediately upon the volume beign unmounted." - [compute volume & options] - (let [options (apply hash-map options) - volume-id (get-volume-id volume) - region (get-region (if (instance? Volume volume) - (.getRegion volume) - (or (:region options) (:node options))))] - (when (not region) - (throw (IllegalArgumentException. - "Must specify volume's region via :region or :node options, or by providing a Volume instance."))) - (.detachVolumeInRegion (ebs-service compute) - region - volume-id - (boolean (:force options)) - (into-array DetachVolumeOptions [])))) - -(defn create-volume - "Creates a new volume given a set of options: - - - one of :zone (keyword, string, or AvailabilityZoneInfo) or :node (NodeMetadata) - - one or both of :snapshot (keyword, string, or Snapshot instance) or :size - (string, keyword, or number) - - :device (string or keyword) provided *only* when you want to attach the new volume to - the :node you specified! - - Returns a vector of [created org.jclouds.ec2.domain.Volume, - optional org.jclouds.ec2.domain.Attachment] - - Note that specifying :node instead of :zone will only attach the created volume - :device is also provided. Otherwise, the node is only used to obtain the desired - availability zone. - - Note also that if :device and :node are specified, and the attach operation fails, - you will have \"leaked\" the newly-created volume - (volume creation and attachment cannot be done atomically)." - [compute & options] - (when (-> options count odd?) - (throw (IllegalArgumentException. "Must provide key-value pairs, e.g. :zone :us-east-1d :size 200"))) - (let [options (apply hash-map options) - snapshot (get-string options :snapshot) - snapshot (if (snapshot? snapshot) (.getId snapshot) snapshot) - size (-?> (get-string options :size) as-int) - ^NodeMetadata node (:node options) - zone (or node (get-string options :zone)) - zone (if zone - (get-zone zone) - (throw (IllegalArgumentException. "Must supply a :zone or :node option."))) - ebs (ebs-service compute)] - (when (and (:device options) (not node)) - (throw (IllegalArgumentException. "Cannot create and attach new volume; no :node specified"))) - (let [new-volume (cond - (and snapshot size) (.createVolumeFromSnapshotInAvailabilityZone ebs zone size snapshot) - snapshot (.createVolumeFromSnapshotInAvailabilityZone ebs zone snapshot) - size (.createVolumeInAvailabilityZone ebs zone size) - :else (throw (IllegalArgumentException. "Must supply :size and/or :snapshot options.")))] - [new-volume (when (:device options) - (attach-volume compute node new-volume (as-string (:device options))))]))) - -(defn delete-volume - "Deletes a volume in the specified region." - ([compute ^Volume volume] - (delete-volume (.getRegion volume) (.getId volume))) - ([compute region volume-id] - (.deleteVolumeInRegion (ebs-service compute) - (get-region region) - (as-string volume-id)))) - -(defn status - "Returns the status of the given entity; works for Volumes and Snapshots." - [k] - (.getStatus k)) - -(defn status-available? - [^Volume v] - (= Volume$Status/AVAILABLE (status v))) - -(defn status-creating? - [^Volume v] - (= Volume$Status/CREATING (status v))) - -(defn status-deleting? - [^Volume v] - (= Volume$Status/DELETING (status v))) - -(defn status-in-use? - [^Volume v] - (= Volume$Status/IN_USE (status v))) - -(defn status-completed? - [^Snapshot s] - (= Snapshot$Status/COMPLETED (status s))) - -(defn status-error? - [^Snapshot s] - (= Snapshot$Status/ERROR (status s))) - -(defn status-pending? - [^Snapshot s] - (= Snapshot$Status/PENDING (status s))) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/apis/ec2/src/main/clojure/org/jclouds/ec2/elastic_ip2.clj ---------------------------------------------------------------------- diff --git a/apis/ec2/src/main/clojure/org/jclouds/ec2/elastic_ip2.clj b/apis/ec2/src/main/clojure/org/jclouds/ec2/elastic_ip2.clj deleted file mode 100644 index 68c372f..0000000 --- a/apis/ec2/src/main/clojure/org/jclouds/ec2/elastic_ip2.clj +++ /dev/null @@ -1,80 +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. -; - -(ns - #^{:author "Chas Emerick, [email protected]" - :doc "A clojure binding for the jclouds AWS elastic IP address interface."} - org.jclouds.ec2.elastic-ip2 - (:require (org.jclouds [compute2 :as compute]) - [org.jclouds.ec2.ebs2 :as ebs]) - (:import org.jclouds.compute.domain.NodeMetadata - (org.jclouds.ec2.domain PublicIpInstanceIdPair))) - -(defn ^org.jclouds.ec2.features.ElasticIPAddressApi - eip-service - "Returns an ElasticIPAddressApi for the given ComputeService" - [compute] - (-> compute - .getContext .getProviderSpecificContext .getApi .getElasticIPAddressApi().get)) - -(defn allocate - "Claims a new elastic IP address within the (optionally) specified region for your account. - Region may be a string, keyword, or a node from which the region - is inferred. Returns the IP address as a string." - ([compute] (allocate compute nil)) - ([compute region] - (.allocateAddressInRegion (eip-service compute) (ebs/get-region region)))) - -(defn associate - "Associates an elastic IP address with a node." - ([compute ^NodeMetadata node public-ip] - (associate node public-ip (.getProviderId node))) - ([compute region public-ip instance-id] - (.associateAddressInRegion (eip-service compute) - (ebs/get-region region) - public-ip - instance-id))) - -(defn addresses - "Returns a map of elastic IP addresses to maps with slots: - - :region - the region (string/keyword/NodeMetadata) the IP address is allocated within - :node-id - the ID of the instance with which the IP address is associated (optional) - - You may optionally specify which IP addresses you would like to query." - ([compute] (addresses compute nil)) - ([compute region & public-ips] - (into {} (for [^PublicIpInstanceIdPair pair (.describeAddressesInRegion (eip-service compute) - (ebs/get-region region) - (into-array String public-ips))] - [(.getPublicIp pair) (merge {:region (.getRegion pair)} - (when (.getInstanceId pair) {:node-id (.getInstanceId pair)}))])))) - -(defn dissociate - "Dissociates an elastic IP address from the node with which it is currently associated." - [compute region public-ip] - (.disassociateAddressInRegion (eip-service compute) - (ebs/get-region region) - public-ip)) - -(defn release - "Disclaims an elastic IP address from your account." - ([compute public-ip] (release compute public-ip nil)) - ([compute public-ip region] - (.releaseAddressInRegion (eip-service compute) - (ebs/get-region region) - public-ip))) http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/apis/ec2/src/main/clojure/org/jclouds/ec2/security_group2.clj ---------------------------------------------------------------------- diff --git a/apis/ec2/src/main/clojure/org/jclouds/ec2/security_group2.clj b/apis/ec2/src/main/clojure/org/jclouds/ec2/security_group2.clj deleted file mode 100644 index a4f33cf..0000000 --- a/apis/ec2/src/main/clojure/org/jclouds/ec2/security_group2.clj +++ /dev/null @@ -1,99 +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. -; - -(ns - #^{:author "Juegen Hoetzel, [email protected]" - :doc "A clojure binding for the jclouds AWS security group interface."} - org.jclouds.ec2.security-group2 - (:require (org.jclouds [compute2 :as compute]) - [org.jclouds.ec2.ebs2 :as ebs]) - (:import org.jclouds.ec2.domain.SecurityGroup - org.jclouds.ec2.features.SecurityGroupApi - org.jclouds.net.domain.IpProtocol)) - -(defn #^SecurityGroupApi - sg-service - "Returns the SecurityGroup Api associated with the specified compute service." - [compute] - (-> compute .getContext .getProviderSpecificContext .getApi .getSecurityGroupApi().get)) - -(defn create-group - "Creates a new security group. - - e.g. (create-group compute \"Database Server\" \"Description for group\" :region :us-west-1)" - [compute name & {:keys [description region]}] - (.createSecurityGroupInRegion (sg-service compute) (ebs/get-region region) name (or description name))) - -(defn delete-group - "Deletes a security group. - - e.g. (delete-group compute \"Database Server\" :region :us-west-1)" - [compute name & {:keys [region]}] - (.deleteSecurityGroupInRegion (sg-service compute) (ebs/get-region region) name)) - -(defn groups - "Returns a map of GroupName -> org.jclouds.ec2.domain.SecurityGroup instances. - - e.g. (groups compute :region :us-east-1)" - [compute & {:keys [region]}] - (into {} (for [#^SecurityGroup group (.describeSecurityGroupsInRegion (sg-service compute) - (ebs/get-region region) - (into-array String '()))] - [(.getName group) group]))) - -(defn get-protocol [v] - "Coerce argument to a IP Protocol." - (cond - (instance? IpProtocol v) v - (keyword? v) (if-let [p (get {:tcp IpProtocol/TCP - :udp IpProtocol/UDP - :icmp IpProtocol/ICMP} - v)] - p - (throw (IllegalArgumentException. - (str "Can't obtain IP protocol from " v " (valid :tcp, :udp and :icmp)")))) - (nil? v) IpProtocol/TCP - :else (throw (IllegalArgumentException. - (str "Can't obtain IP protocol from argument of type " (type v)))))) - -(defn authorize - "Adds permissions to a security group. - - e.g. (authorize compute \"jclouds#webserver#us-east-1\" 80 :ip-range \"0.0.0.0/0\") - (authorize compute \"jclouds#webserver#us-east-1\" [1000,2000] :protocol :udp)" - - [compute group-name port & {:keys [protocol ip-range region]}] - (let [group ((groups compute :region region) group-name) - [from-port to-port] (if (number? port) [port port] port)] - (if group - (.authorizeSecurityGroupIngressInRegion - (sg-service compute) (ebs/get-region region) (.getName group) (get-protocol protocol) from-port to-port (or ip-range "0.0.0.0/0")) - (throw (IllegalArgumentException. - (str "Can't find security group for name " group-name)))))) - -(defn revoke - "Revokes permissions from a security group. - - e.g. (revoke compute 80 \"jclouds#webserver#us-east-1\" :protocol :tcp 80 80 :ip-range \"0.0.0.0/0\")" - [compute group-name port & {:keys [protocol ip-range region]}] - (let [group ((groups compute :region region) group-name) - [from-port to-port] (if (number? port) [port port] port)] - (if group - (.revokeSecurityGroupIngressInRegion - (sg-service compute) (ebs/get-region region) (.getName group) (get-protocol protocol) from-port to-port (or ip-range "0.0.0.0/0")) - (throw (IllegalArgumentException. - (str "Can't find security group for name " group-name)))))) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/blobstore/pom.xml ---------------------------------------------------------------------- diff --git a/blobstore/pom.xml b/blobstore/pom.xml index 783dc0e..e6fa1d9 100644 --- a/blobstore/pom.xml +++ b/blobstore/pom.xml @@ -73,10 +73,6 @@ <build> <plugins> <plugin> - <groupId>com.theoryinpractise</groupId> - <artifactId>clojure-maven-plugin</artifactId> - </plugin> - <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <executions> http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/blobstore/src/main/clojure/org/jclouds/blobstore2.clj ---------------------------------------------------------------------- diff --git a/blobstore/src/main/clojure/org/jclouds/blobstore2.clj b/blobstore/src/main/clojure/org/jclouds/blobstore2.clj deleted file mode 100644 index 35635f4..0000000 --- a/blobstore/src/main/clojure/org/jclouds/blobstore2.clj +++ /dev/null @@ -1,327 +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. -; - -(ns org.jclouds.blobstore2 - "A clojure binding for the jclouds BlobStore. - -Current supported services are: - [transient, filesystem, azureblob, atmos, walrus, scaleup-storage, - ninefold-storage, googlestorage, synaptic, peer1-storage, aws-s3, - eucalyptus-partnercloud-s3, cloudfiles-us, cloudfiles-uk, swift, - scality-rs2, hosteurope-storage, tiscali-storage] - -Here's a quick example of how to view resources in rackspace - - (use 'org.jclouds.blobstore2) - - (def user \"rackspace_username\") - (def password \"rackspace_password\") - (def blobstore-name \"cloudfiles\") - - (def the-blobstore (blobstore blobstore-name user password)) - - (pprint (locations the-blobstore)) - (pprint (containers the-blobstore)) - (pprint (blobs the-blobstore your_container_name)) - -See http://code.google.com/p/jclouds for details." - (:use [org.jclouds.core]) - (:import [java.io File FileOutputStream OutputStream] - java.util.Properties - [org.jclouds ContextBuilder] - [org.jclouds.blobstore - domain.BlobBuilder BlobStore BlobStoreContext - domain.BlobMetadata domain.StorageMetadata domain.PageSet - domain.Blob domain.internal.BlobBuilderImpl options.PutOptions - options.PutOptions$Builder - options.CreateContainerOptions options.ListContainerOptions] - [org.jclouds.io Payload Payloads] - java.util.Arrays - [java.security DigestOutputStream MessageDigest] - com.google.common.collect.ImmutableSet - com.google.common.net.MediaType - com.google.common.io.ByteSource)) - -;; -;; Payload support for creating Blobs. -;; - -(defprotocol PayloadSource - "Various types can have PayloadSource extended onto them so that they are - easily coerced into a Payload." - (^Payload payload [arg] "Coerce arg into a Payload.")) - -(extend-protocol PayloadSource - Payload - (payload [p] p) - java.io.InputStream - (payload [is] (Payloads/newInputStreamPayload is)) - String - (payload [s] (Payloads/newStringPayload s)) - java.io.File - (payload [f] (Payloads/newFilePayload f)) - ByteSource - (payload [bs] (Payloads/newByteSourcePayload bs))) - -;; something in clojure 1.3 (namespaces?) does not like a private type called byte-array-type, -;; so we refer to (class (make-array ...)) directly; and it only parses if it is its own block, -;; hence separating it from the above -(extend-protocol PayloadSource - (class (make-array Byte/TYPE 0)) - (payload [ba] (Payloads/newByteArrayPayload ba))) - -(defn blobstore - "Create a logged in context. -Options can also be specified for extension modules - :log4j :enterprise :ning :apachehc :bouncycastle :joda :gae" - [^String provider ^String provider-identity ^String provider-credential - & options] - (let [module-keys (set (keys module-lookup)) - ext-modules (filter #(module-keys %) options) - opts (apply hash-map (filter #(not (module-keys %)) options))] - (let [^BlobStoreContext - context (.. (ContextBuilder/newBuilder provider) - (credentials provider-identity provider-credential) - (modules (apply modules (concat ext-modules (opts :extensions)))) - (overrides (reduce #(do (.put ^Properties %1 (name (first %2)) (second %2)) %1) - (Properties.) (dissoc opts :extensions))) - (buildView BlobStoreContext))] - (.getBlobStore context)))) - -(defn blobstore-context - "Returns a blobstore context from a blobstore." - [^BlobStore blobstore] - (.getContext ^BlobStore blobstore)) - -(defn blob? - [object] - (instance? Blob)) - -(defn blobstore? - [object] - (instance? BlobStore object)) - -(defn blobstore-context? - [object] - (instance? BlobStoreContext object)) - -(defn containers - "List all containers in a blobstore." - [^BlobStore blobstore] (.list ^BlobStore blobstore)) - -(def ^{:private true} list-option-map - {:after-marker #(.afterMarker ^ListContainerOptions %1 ^String %2) - :in-directory #(.inDirectory ^ListContainerOptions %1 %2) - :max-results #(.maxResults ^ListContainerOptions %1 ^Integer %2) - :with-details #(when %2 (.withDetails ^ListContainerOptions %1)) - :recursive #(when %2 (.recursive ^ListContainerOptions %1))}) - -(defn blobs - "Returns a set of blobs in the given container, as directed by the - query options below. - Options are: - :after-marker string - :in-directory path - :max-results n - :with-details true - :recursive true" - [^BlobStore blobstore container-name & args] - (let [options (apply hash-map args) - list-options (reduce - (fn [lco [k v]] - ((list-option-map k) lco v) - lco) - (ListContainerOptions.) - options)] - (.list blobstore container-name list-options))) - -(defn- container-seq-chunk - [^BlobStore blobstore container prefix marker] - (apply blobs blobstore container - (concat (when prefix - [:in-directory prefix]) - (when (string? marker) - [:after-marker marker])))) - -(defn- container-seq-chunks [^BlobStore blobstore container prefix marker] - (when marker ;; When getNextMarker returns null, there's no more. - (let [chunk (container-seq-chunk blobstore container prefix marker)] - (lazy-seq (cons chunk - (container-seq-chunks blobstore container prefix - (.getNextMarker ^PageSet chunk))))))) - -(defn- concat-elements - "Make a lazy concatenation of the lazy sequences contained in coll. - Lazily evaluates coll. - Note: (apply concat coll) or (lazy-cat coll) are not lazy wrt coll itself." - [coll] - (if-let [s (seq coll)] - (lazy-seq (concat (first s) (concat-elements (next s)))))) - -(defn container-seq - "Returns a lazy seq of all blobs in the given container." - ([^BlobStore blobstore container] - (container-seq blobstore container nil)) - ([^BlobStore blobstore container prefix] - ;; :start has no special meaning, it is just a non-null (null indicates - ;; end), non-string (markers are strings). - (concat-elements (container-seq-chunks blobstore container prefix - :start)))) - -(defn locations - "Retrieve the available container locations for the blobstore context." - [^BlobStore blobstore] - (seq (.listAssignableLocations blobstore))) - -(defn create-container - "Create a container." - [^BlobStore blobstore container-name & {:keys [location public-read?]}] - (let [cco (CreateContainerOptions.) - cco (if public-read? (.publicRead cco) cco)] - (.createContainerInLocation blobstore location container-name cco))) - -(defn clear-container - "Clear a container." - [^BlobStore blobstore container-name] - (.clearContainer blobstore container-name)) - -(defn delete-container - "Delete a container." - [^BlobStore blobstore container-name] - (.deleteContainer blobstore container-name)) - -(defn delete-container-if-empty - "Delete a container if empty." - [^BlobStore blobstore container-name] - (.deleteContainerIfEmpty blobstore container-name)) - -(defn container-exists? - "Predicate to check presence of a container" - [^BlobStore blobstore container-name] - (.containerExists blobstore container-name)) - -(defn directory-exists? - "Predicate to check presence of a directory" - [^BlobStore blobstore container-name path] - (.directoryExists blobstore container-name path)) - -(defn create-directory - "Create a directory path." - [^BlobStore blobstore container-name path] - (.createDirectory blobstore container-name path)) - -(defn delete-directory - "Delete a directory path." - [^BlobStore blobstore container-name path] - (.deleteDirectory blobstore container-name path)) - -(defn blob-exists? - "Predicate to check presence of a blob" - [^BlobStore blobstore container-name path] - (.blobExists blobstore container-name path)) - -(defn put-blob - "Put a blob. Metadata in the blob determines location." - [^BlobStore blobstore container-name blob & {:keys [multipart?]}] - (let [options (if multipart? - (PutOptions$Builder/multipart) - (PutOptions.))] - (.putBlob blobstore container-name blob options))) - -(defn blob-metadata - "Get metadata from given path" - [^BlobStore blobstore container-name path] - (.blobMetadata blobstore container-name path)) - -(defn ^Blob get-blob - "Get blob from given path" - [^BlobStore blobstore container-name path] - (.getBlob blobstore container-name path)) - -(defn sign-get - "Get a signed http GET request for manipulating a blob in another - application, Ex. curl." - [^BlobStore blobstore container-name name] - (.signGetBlob (.. blobstore getContext getSigner) container-name name)) - -(defn sign-put - "Get a signed http PUT request for manipulating a blob in another - application, Ex. curl. A Blob with at least the name and content-length - must be given." - [^BlobStore blobstore container-name ^Blob blob] - (.signPutBlob (.. blobstore getContext getSigner) - container-name - blob)) - -(defn sign-delete - "Get a signed http DELETE request for manipulating a blob in another - application, Ex. curl." - [^BlobStore blobstore container-name name] - (.signRemoveBlob (.. blobstore getContext getSigner) container-name name)) - -(defn get-blob-stream - "Get an inputstream from the blob at a given path" - [^BlobStore blobstore container-name path] - (.getInput ^Payload (.getPayload (get-blob blobstore container-name path)))) - -(defn remove-blob - "Remove blob from given path" - [^BlobStore blobstore container-name path] - (.removeBlob blobstore container-name path)) - -(defn count-blobs - "Count blobs" - [^BlobStore blobstore container-name] - (.countBlobs blobstore container-name)) - -(defn blob - "Create a new blob with the specified payload and options. - - The payload argument can be anything accepted by the PayloadSource protocol." - ([^String name & - {:keys [payload content-type content-length content-md5 - content-disposition content-encoding content-language metadata]}] - (let [blob-builder (.name (BlobBuilderImpl.) name) - blob-builder (if payload - (.payload blob-builder - (org.jclouds.blobstore2/payload payload)) - (.forSigning blob-builder)) - blob-builder (if content-length ;; Special case, arg is prim. - (.contentLength blob-builder content-length) - blob-builder) - blob-builder (if content-type - (.contentType blob-builder content-type) - blob-builder) - blob-builder (if content-md5 - (.contentMD5 blob-builder content-md5) - blob-builder)] - (doto blob-builder - (.contentDisposition content-disposition) - (.contentEncoding content-encoding) - (.contentLanguage content-language) - (.userMetadata metadata)) - (.build blob-builder)))) - -(define-accessors StorageMetadata "blob" type id name - location-id uri last-modified) -(define-accessors BlobMetadata "blob" content-type) - -(defn blob-etag [^Blob blob] - (.getETag blob)) - -(defn blob-md5 [^Blob blob] - (.getContentMD5 blob)) http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/blobstore/src/test/clojure/org/jclouds/blobstore2_test.clj ---------------------------------------------------------------------- diff --git a/blobstore/src/test/clojure/org/jclouds/blobstore2_test.clj b/blobstore/src/test/clojure/org/jclouds/blobstore2_test.clj deleted file mode 100644 index 055e155..0000000 --- a/blobstore/src/test/clojure/org/jclouds/blobstore2_test.clj +++ /dev/null @@ -1,205 +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. -; - -(ns org.jclouds.blobstore2-test - (:use [org.jclouds.blobstore2] :reload-all) - (:use [clojure.test]) - (:import [java.io ByteArrayInputStream ByteArrayOutputStream - StringBufferInputStream] - [org.jclouds.util Strings2] - com.google.common.hash.Hashing - com.google.common.io.ByteSource)) - -(defn clean-stub-fixture - "This should allow basic tests to easily be run with another service." - [blobstore] - (fn [f] - (doseq [container (containers blobstore)] - (delete-container blobstore (.getName container))) - (f))) - -(def blobstore-stub (blobstore "transient" "" "")) - -(use-fixtures :each (clean-stub-fixture blobstore-stub)) - -(deftest blobstore?-test - (is (blobstore? blobstore-stub))) - -(deftest as-blobstore-test - (is (blobstore? (blobstore "transient" "user" "password")))) - -(deftest create-existing-container-test - (is (not (container-exists? blobstore-stub ""))) - (is (create-container blobstore-stub "fred")) - (is (container-exists? blobstore-stub "fred"))) - -(deftest create-container-test - (is (create-container blobstore-stub "fred")) - (is (container-exists? blobstore-stub "fred"))) - -(deftest locations-test - (is (not (empty? (locations blobstore-stub)))) - (is (create-container blobstore-stub "fred" - :location (first (locations blobstore-stub))))) - -(deftest containers-test - (is (empty? (containers blobstore-stub))) - (is (create-container blobstore-stub "fred")) - (is (= 1 (count (containers blobstore-stub))))) - -(deftest blobs-test - (is (create-container blobstore-stub "container")) - (is (empty? (blobs blobstore-stub "container"))) - (is (put-blob blobstore-stub "container" - (blob "blob1" :payload "blob1"))) - (is (put-blob blobstore-stub "container" - (blob "blob2" :payload "blob2"))) - (is (= 2 (count (blobs blobstore-stub "container")))) - (is (= 1 (count (blobs blobstore-stub "container" :max-results 1)))) - (create-directory blobstore-stub "container" "dir") - (is (put-blob blobstore-stub "container" - (blob "dir/blob2" :payload "blob2"))) - (is (put-blob blobstore-stub "container" - (blob "dir/blob3" :payload "blob3"))) - (is (= 4 (count-blobs blobstore-stub "container"))) - (is (= 4 (count (blobs blobstore-stub "container")))) - (is (= 5 (count (blobs blobstore-stub "container" :recursive true)))) - (is (= 4 (count (blobs blobstore-stub "container" :with-details true)))) - ;; jclouds will list dir and dir/ - (is (= 2 (count (blobs blobstore-stub "container" :in-directory "dir"))))) - -(deftest large-container-list-test - (let [container-name "test" - total-blobs 5000] - ;; create a container full of blobs - (create-container blobstore-stub container-name) - (dotimes [i total-blobs] (put-blob blobstore-stub container-name - (blob (str i) - :payload (str i)))) - ;; verify - (is (= total-blobs (count-blobs blobstore-stub container-name))))) - -(deftest container-seq-test - (is (create-container blobstore-stub "container")) - (is (empty? (container-seq blobstore-stub "container"))) - (is (empty? (container-seq blobstore-stub "container" "/a")))) - -(deftest get-blob-test - (is (create-container blobstore-stub "blob")) - (is (put-blob blobstore-stub "blob" - (blob "blob1" :payload "blob1"))) - (is (put-blob blobstore-stub "blob" - (blob "blob2" :payload "blob2"))) - (is (= "blob2" (Strings2/toStringAndClose (get-blob-stream blobstore-stub - "blob" "blob2"))))) - -(deftest put-blob-test - ;; Check multipart works - (is (create-container blobstore-stub "blobs")) - (is (put-blob blobstore-stub "blobs" - (blob "blob1" :payload "blob1") - :multipart? true)) - (is (= 1 (count (blobs blobstore-stub "blobs"))))) - -(deftest sign-get-test - (let [request (sign-get blobstore-stub "container" "path")] - (is (= "http://localhost/container/path" (str (.getEndpoint request)))) - (is (= "GET" (.getMethod request))))) - -(deftest sign-put-test - (let [request (sign-put blobstore-stub "container" - (blob "path" :content-length 10))] - (is (= "http://localhost/container/path" (str (.getEndpoint request)))) - (is (= "PUT" (.getMethod request))) - (is (= "10" (first (.get (.getHeaders request) "Content-Length")))) - (is (= "application/unknown" - (first (.get (.getHeaders request) "Content-Type")))))) - -(deftest sign-put-with-headers-test - (let [request (sign-put blobstore-stub - "container" - (blob "path" - :content-length 10 - :content-type "x" - :content-language "en" - :content-disposition "f" - :content-encoding "g"))] - (is (= "PUT" (.getMethod request))) - (is (= "10" (first (.get (.getHeaders request) "Content-Length")))) - (is (= "x" (first (.get (.getHeaders request) "Content-Type")))) - (is (= "en" (first (.get (.getHeaders request) "Content-Language")))) - (is (= "f" (first (.get (.getHeaders request) "Content-Disposition")))) - (is (= "g" (first (.get (.getHeaders request) "Content-Encoding")))))) - -(deftest sign-delete-test - (let [request (sign-delete blobstore-stub "container" "path")] - (is (= "http://localhost/container/path" (str (.getEndpoint request)))) - (is (= "DELETE" (.getMethod request))))) - -(deftest blob-test - (let [byte-source (ByteSource/wrap (.getBytes "test-payload")) - a-blob (blob "test-name" - :payload byte-source - :content-md5 (.asBytes (.hash byte-source (Hashing/md5))))] - (is (= (seq (.. a-blob (getPayload) (getContentMetadata) (getContentMD5))) - (seq (.digest (doto (java.security.MessageDigest/getInstance "MD5") - (.reset) - (.update (.getBytes "test-payload"))))))))) - -(deftest payload-protocol-test - (is (instance? org.jclouds.io.Payload (payload "test"))) - (is (blob "blob1" :payload (payload "blob1"))) - (is (create-container blobstore-stub "container")) - (is (= "blob1" - (do - (put-blob blobstore-stub "container" - (blob "blob1" - :payload "blob1")) - (Strings2/toStringAndClose (get-blob-stream blobstore-stub - "container" "blob1"))))) - (is (= "blob2" - (do - (put-blob blobstore-stub "container" - (blob "blob2" - :payload (StringBufferInputStream. "blob2"))) - (Strings2/toStringAndClose (get-blob-stream blobstore-stub - "container" "blob2"))))) - (is (= "blob3" - (do - (put-blob blobstore-stub "container" - (blob "blob3" - :payload (.getBytes "blob3"))) - (Strings2/toStringAndClose (get-blob-stream blobstore-stub - "container" "blob3"))))) - - (is (= "blob4" - (do - (put-blob blobstore-stub "container" - (blob "blob4" - :payload (ByteArrayInputStream. (.getBytes "blob4")))) - (Strings2/toStringAndClose (get-blob-stream blobstore-stub - "container" "blob4"))))) - - (is (= "blob5" - (do - (put-blob blobstore-stub "container" - (blob "blob5" - :payload (ByteSource/wrap (.getBytes "blob5")))) - (Strings2/toStringAndClose (get-blob-stream blobstore-stub - "container" "blob5")))))) - -;; TODO: more tests involving blob-specific functions http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/compute/pom.xml ---------------------------------------------------------------------- diff --git a/compute/pom.xml b/compute/pom.xml index 67ae7bb..ccca06e 100644 --- a/compute/pom.xml +++ b/compute/pom.xml @@ -71,13 +71,4 @@ </dependency> </dependencies> - <build> - <plugins> - <plugin> - <groupId>com.theoryinpractise</groupId> - <artifactId>clojure-maven-plugin</artifactId> - </plugin> - </plugins> - </build> - </project> http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/compute/src/main/clojure/org/jclouds/compute2.clj ---------------------------------------------------------------------- diff --git a/compute/src/main/clojure/org/jclouds/compute2.clj b/compute/src/main/clojure/org/jclouds/compute2.clj deleted file mode 100644 index f9653a4..0000000 --- a/compute/src/main/clojure/org/jclouds/compute2.clj +++ /dev/null @@ -1,450 +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. -; - -(ns org.jclouds.compute2 - "A clojure binding to the jclouds ComputeService. - - jclouds supports many compute providers including Amazon EC2 (aws-ec2), - Rackspace Cloud Servers (cloudservers-us), GoGrid (gogrid), - There are over a dozen to choose from. - - Current supported providers are available via the following dependency: - org.jclouds/jclouds-allcompute - - You can inquire about which providers are loaded via the following: - (seq (org.jclouds.providers.Providers/allCompute)) - (seq (org.jclouds.apis.Apis/allCompute)) - -Here's an example of getting some compute configuration from rackspace: - - (use 'org.jclouds.compute2) - (use 'clojure.pprint) - - (def provider \"cloudservers-us\") - (def provider-identity \"username\") - (def provider-credential \"password\") - - ;; create a compute service - (def compute - (compute-service provider provider-identity provider-credential)) - - (pprint (locations compute)) - (pprint (images compute)) - (pprint (nodes compute)) - (pprint (hardware-profiles compute))) - -Here's an example of creating and running a small linux node in the group webserver: - - ;; create a compute service using ssh and log4j extensions - (def compute - (compute-service - provider provider-identity provider-credential :sshj :log4j)) - - (create-node \"webserver\" compute) - - See http://code.google.com/p/jclouds for details. - " - (:use org.jclouds.core - (org.jclouds predicate) [clojure.core.incubator :only (-?>)]) - (:import java.io.File - java.util.Properties - [org.jclouds ContextBuilder] - [org.jclouds.domain Location] - [org.jclouds.compute - ComputeService ComputeServiceContext] - [org.jclouds.compute.domain - Template TemplateBuilder ComputeMetadata NodeMetadata Hardware - OsFamily Image] - [org.jclouds.compute.options TemplateOptions RunScriptOptions - RunScriptOptions$Builder] - [org.jclouds.compute.predicates - NodePredicates] - [com.google.common.collect ImmutableSet]) - ) - -(defn compute-service - "Create a logged in context." - ([#^String provider #^String provider-identity #^String provider-credential - & options] - (let [module-keys (set (keys module-lookup)) - ext-modules (filter #(module-keys %) options) - opts (apply hash-map (filter #(not (module-keys %)) options))] - (.. (ContextBuilder/newBuilder provider) - (credentials provider-identity provider-credential) - (modules (apply modules (concat ext-modules (opts :extensions)))) - (overrides (reduce #(do (.put %1 (name (first %2)) (second %2)) %1) - (Properties.) (dissoc opts :extensions))) - (buildView ComputeServiceContext) - (getComputeService)))) - ([#^ComputeServiceContext compute-context] - (.getComputeService compute-context))) - -(defn compute-context - "Returns a compute context from a compute service." - [compute] - (.getContext compute)) - -(defn compute-service? - [object] - (instance? ComputeService object)) - -(defn compute-context? - [object] - (instance? ComputeServiceContext object)) - -(defn locations - "Retrieve the available compute locations for the compute context." - ([#^ComputeService compute] - (seq (.listAssignableLocations compute)))) - -(defn nodes - "Retrieve the existing nodes for the compute context." - ([#^ComputeService compute] - (seq (.listNodes compute)))) - -(defn nodes-with-details - "Retrieve the existing nodes for the compute context." - ([#^ComputeService compute] - (seq (.listNodesDetailsMatching compute (NodePredicates/all))))) - -(defn nodes-with-details-matching - "List details for all nodes matching fn pred. - pred should be a fn of one argument that takes a ComputeMetadata and returns true or false. - " - ([#^ComputeService compute pred] - (seq (.listNodesDetailsMatching compute (to-predicate pred))))) - -(defn nodes-in-group - "list details of all the nodes in the given group." - ([#^ComputeService compute #^String group] - (filter #(= (.getGroup %) group) (nodes-with-details compute)))) - -(defn images - "Retrieve the available images for the compute context." - ([#^ComputeService compute] - (seq (.listImages compute)))) - -(defn hardware-profiles - "Retrieve the available node hardware profiles for the compute context." - ([#^ComputeService compute] - (seq (.listHardwareProfiles compute)))) - -(defn default-template - ([#^ComputeService compute] - (.. compute (templateBuilder) - (options - (org.jclouds.compute.options.TemplateOptions$Builder/authorizePublicKey - (slurp (str (. System getProperty "user.home") "/.ssh/id_rsa.pub")))) - build))) - -(defn create-nodes - "Create the specified number of nodes using the default or specified - template. - ;; Simplest way to add 2 small linux nodes to the group webserver is to run - (create-nodes \"webserver\" 2 compute) - ;; Note that this will actually add another 2 nodes to the set called - ;; \"webserver\"" - ([group count compute] - (create-nodes - group count (default-template compute) compute)) - ([#^ComputeService compute group count template] - (seq - (.createNodesInGroup compute group count template)))) - -(defn create-node - "Create a node using the default or specified template. - - ;; simplest way to add a small linux node to the group webserver is to run - (create-node \"webserver\" compute) - - ;; Note that this will actually add another node to the set called - ;; \"webserver\"" - ([compute group] - (create-node compute group (default-template compute))) - ([compute group template] - (first (create-nodes compute group 1 template)))) - -(defn #^NodeMetadata node-details - "Retrieve the node metadata, given its id." - ([#^ComputeService compute id] - (.getNodeMetadata compute id))) - -(defn suspend-nodes-matching - "Suspend all nodes matching the fn pred. - pred should be a fn of one argument that takes a ComputeMetadata and returns true or false." - ([#^ComputeService compute pred] - (.suspendNodesMatching compute (to-predicate pred)))) - -(defn suspend-node - "Suspend a node, given its id." - ([#^ComputeService compute id] - (.suspendNode compute id))) - -(defn resume-nodes-matching - "Suspend all the nodes in the fn pred. - pred should be a fn of one argument that takes a ComputeMetadata and returns true or false." - ([#^ComputeService compute pred] - (.resumeNodesMatching compute (to-predicate pred)))) - -(defn resume-node - "Resume a node, given its id." - ([#^ComputeService compute id] - (.resumeNode compute id))) - -(defn reboot-nodes-matching - "Reboot all the nodes in the fn pred. - pred should be a fn of one argument that takes a ComputeMetadata and returns true or false." - ([#^ComputeService compute pred] - (.rebootNodesMatching compute (to-predicate pred)))) - -(defn reboot-node - "Reboot a node, given its id." - ([#^ComputeService compute id] - (.rebootNode compute id))) - -(defn destroy-nodes-matching - "Destroy all the nodes in the fn pred. - pred should be a fn of one argument that takes a ComputeMetadata and returns true or false. - - ;; destroy all nodes - (destroy-nodes-matching compute (constantly true)) - " - ([#^ComputeService compute pred] - (.destroyNodesMatching compute (to-predicate pred)))) - -(defn destroy-node - "Destroy a node, given its id." - ([#^ComputeService compute id] - (.destroyNode compute id))) - -(defn run-script-on-node - "Run a script on a node" - ([#^ComputeService compute id command #^RunScriptOptions options] - (.runScriptOnNode compute id command options))) - -(defn run-script-on-nodes-matching - "Run a script on the nodes matching the given predicate" - ([#^ComputeService compute pred command #^RunScriptOptions options] - (.runScriptOnNodesMatching compute (to-predicate pred) command options))) - -(defmacro status-predicate [node status] - `(= (.getStatus ~node) - (. org.jclouds.compute.domain.NodeMetadata$Status ~status))) - -(defn pending? - "Predicate for the node being in transition" - [#^NodeMetadata node] - (status-predicate node PENDING)) - -(defn running? - "Predicate for the node being available for requests." - [#^NodeMetadata node] - (status-predicate node RUNNING)) - -(defn terminated? - "Predicate for the node being halted." - [#^NodeMetadata node] - (or - (= node nil) - (status-predicate node TERMINATED))) - -(defn suspended? - "Predicate for the node being suspended." - [#^NodeMetadata node] - (status-predicate node SUSPENDED)) - -(defn error-status? - "Predicate for the node being in an error status." - [#^NodeMetadata node] - (status-predicate node ERROR)) - -(defn unrecognized-status? - "Predicate for the node being in an unrecognized status." - [#^NodeMetadata node] - (status-predicate node UNRECOGNIZED)) - -(defn in-group? - "Returns a predicate fn which returns true if the node is in the given group, false otherwise" - [group] - #(= (.getGroup %) group)) - -(defn public-ips - "Returns the node's public ips" - [#^NodeMetadata node] - (.getPublicAddresses node)) - -(defn private-ips - "Returns the node's private ips" - [#^NodeMetadata node] - (.getPrivateAddresses node)) - -(defn group - "Returns a the node's group" - [#^NodeMetadata node] - (.getGroup node)) - -(defn hostname - "Returns the compute node's name" - [#^ComputeMetadata node] - (.getName node)) - -(defn location - "Returns the compute node's location id" - [#^ComputeMetadata node] - (-?> node .getLocation .getId)) - -(defn id - "Returns the compute node's id" - [#^ComputeMetadata node] - (.getId node)) - -(define-accessors Template image hardware location options) -(define-accessors Image version os-family os-description architecture) -(define-accessors Hardware processors ram volumes) -(define-accessors NodeMetadata "node" credentials hardware status group) - -(def - ^{:doc "TemplateBuilder functions" :private true} - template-map - (merge - (make-option-map - kw-memfn-0arg [:smallest :fastest :biggest :any]) - (make-option-map - kw-memfn-1arg - [:from-hardware :from-image :from-template - :os-family :location-id :image-id :hardware-id :hypervisor-matches - :os-name-matches :os-description-matches :os-version-matches - :os-arch-matches :os-64-bit :image-name-matches - :image-version-matches :image-description-matches :image-matches - :min-cores :min-ram :min-disk]))) - -(def - ^{:doc "TemplateOptions functions" :private true} - options-map - (merge - (make-option-map - kw-memfn-0arg - [;; ec2 - :no-key-pair - ;; aws-ec2 - :enable-monitoring :no-placement-group]) - (make-option-map - kw-memfn-1arg - [;; RunScriptOptions - :override-login-credentials - :override-login-user - :override-login-password :override-login-private-key - :override-authenticate-sudo - - :name-task :run-as-root :wrap-in-init-script :block-on-complete - :block-on-port - ;; TemplateOptions - :run-script :install-private-key :authorize-public-key :tags - ;; cloudstack - :security-group-id :network-id :network-ids :setup-static-nat - :ip-on-default-network :ips-to-networks - ;; ec2 - :security-groups :user-data :block-device-mappings - :unmap-device-named - ;; cloudstack ec2 - :key-pair - ;; aws-ec2 - :placement-group :subnet-id :spot-price :spot-options - :iam-instance-profile-name :iam-instance-profile-arn - ;; cloudstack aws-ec2 - :security-group-ids - ;; softlayer - :domain-name]) - (make-option-map - kw-memfn-varargs - [;; from TemplateOptions - :inbound-ports]) - (make-option-map - kw-memfn-2arg - [;; from TemplateOptions - :block-on-port - ;; ec2 options - :map-ephemeral-device-to-device-name]) - {:map-ebs-snapshot-to-device-name - (kw-memfn-apply :map-ebs-snapshot-to-device-name - device-name snapshot-id size-in-gib delete-on-termination) - :map-new-volume-to-device-name - (kw-memfn-apply :map-new-volume-to-device-name - device-name size-in-gib delete-on-termination)})) - -(def - ^{:doc "All receognised options"} - known-template-options - (set (mapcat keys [options-map template-map]))) - -(defn os-families [] - (. OsFamily values)) - -(def enum-map {:os-family (os-families)}) - -(defn translate-enum-value [kword value] - (or (-> (filter #(= (name value) (str %)) (kword enum-map)) first) - value)) - -(defn apply-option [builder option-map option value] - (when-let [f (option-map option)] - (f builder (translate-enum-value option value)))) - -(defn build-template - "Creates a template that can be used to run nodes. - -The :os-family key expects a keyword version of OsFamily, - eg. :os-family :ubuntu. - -The :smallest, :fastest, :biggest, and :any keys expect a -boolean value. - -Options correspond to TemplateBuilder methods." - [#^ComputeService compute - {:keys [from-hardware from-image from-template - os-family location-id image-id hardware-id - os-name-matches os-description-matches os-version-matches - os-arch-matches os-64-bit mage-name-matches - image-version-matches image-description-matches image-matches - min-cores min-ram min-disk smallest fastest biggest any] - :as options}] - (let [builder (.. compute (templateBuilder))] - (doseq [[option value] options] - (when-not (known-template-options option) - (throw (Exception. (format "Invalid template builder option : %s" option)))) - ;; apply template builder options - (try - (apply-option builder template-map option value) - (catch Exception e - (throw (Exception. - (format - "Problem applying template builder %s with value %s: %s" - option (pr-str value) (.getMessage e)) - e))))) - (let [template (.build builder) - template-options (.getOptions template)] - (doseq [[option value] options] - ;; apply template option options - (try - (apply-option template-options options-map option value) - (catch Exception e - (throw (Exception. - (format - "Problem applying template option %s with value %s: %s" - option (pr-str value) (.getMessage e)) - e))))) - template))) http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/compute/src/main/clojure/org/jclouds/modules.clj ---------------------------------------------------------------------- diff --git a/compute/src/main/clojure/org/jclouds/modules.clj b/compute/src/main/clojure/org/jclouds/modules.clj deleted file mode 100644 index 9383090..0000000 --- a/compute/src/main/clojure/org/jclouds/modules.clj +++ /dev/null @@ -1,88 +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. -; - -(defn compute-module - [] - (org.jclouds.compute.config.JCloudsNativeComputeServiceAdapterContextModule - (class ComputeService) - (class ComputeService) - (defrecord ClojureComputeServiceAdapter [] - org.jclouds.compute.JCloudsNativeComputeServiceAdapter - (^NodeMetadata createNodeWithGroupEncodedIntoNameThenStoreCredentials [this ^String group ^String name ^Template template ^Map credentialStore] - ()) - (^Iterable listNodes [this ] - ()) - (^Iterable listImages [this ] - ()) - (^Iterable listHardwareProfiles [this ] - ()) - (^Iterable listLocations [this ] - ()) - (^NodeMetadata getNode [this ^String id] - ()) - (^void destroyNode [this ^String id] - ()) - (^void rebootNode [this ^String id] - ()) - (^void suspendNode [this ^String id] - ()) - (^void resumeNode [this ^String id] - ())))) - -(defn compute-context [^RestContextSpec spec] - (.createContext (ComputeServiceContextFactory.) spec)) - -(^RestContextSpec defn context-spec [^StandaloneComputeServiceContextModule module] - (StandaloneComputeServiceContextSpec. "servermanager", "http://host", "1", "", "identity", "credential", module, (ImmutableSet/of))) - -(defrecord NodeListComputeService - [node-list] - org.jclouds.compute.ComputeService - (listNodes [_] node-list) - (getNodeMetadata - [_ id] - (some #(= (.getId %) id) node-list)) - (listNodesDetailsMatching - [_ predicate] - (filter #(.apply predicate %) node-list))) - -(defn ssh-client-factory - "Pass in a function that reifies org.jclouds.ssh.SshClient" - [ctor] - (reify - org.jclouds.ssh.SshClient$Factory - (^org.jclouds.ssh.SshClient create - [_ ^IPSocket socket ^Credentials credentials] - (ctor socket credentials)) - (^org.jclouds.ssh.SshClient create - [_ ^IPSocket socket ^String username ^String password-or-key] - (ctor socket username password-or-key)) - (^org.jclouds.ssh.SshClient create - [_ ^IPSocket socket ^String username ^bytes password-or-key] - (ctor socket username password-or-key)))) - -(defn ssh-module - "Create a module that specifies the factory for creating an ssh service" - [^org.jclouds.ssh.SshClient$Factory factory] - (let [binder (atom nil)] - (reify - com.google.inject.Module - (configure - [this abinder] - (reset! binder abinder) - (.. @binder (bind org.jclouds.ssh.SshClient$Factory) - (toInstance factory)))))) http://git-wip-us.apache.org/repos/asf/jclouds/blob/0bc935dd/compute/src/main/clojure/org/jclouds/predicate.clj ---------------------------------------------------------------------- diff --git a/compute/src/main/clojure/org/jclouds/predicate.clj b/compute/src/main/clojure/org/jclouds/predicate.clj deleted file mode 100644 index 901a89d..0000000 --- a/compute/src/main/clojure/org/jclouds/predicate.clj +++ /dev/null @@ -1,32 +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. -; - -(ns org.jclouds.predicate) - -(defprotocol Coercions - "Protocol for coercing between predicate-like things, like - Clojure fns and com.google.common.base.Predicate." - (to-predicate [p])) - -(extend-protocol Coercions - clojure.lang.IFn - (to-predicate [p] - (reify com.google.common.base.Predicate - (apply [this input] (p input)))) - - com.google.common.base.Predicate - (to-predicate [p] p)) \ No newline at end of file
