blob: 0bb0b5b1672f897453cf848bca9deeb11ff3082b [file] [log] [blame]
;
; Licensed to jclouds, Inc. (jclouds) under one or more
; contributor license agreements. See the NOTICE file
; distributed with this work for additional information
; regarding copyright ownership. jclouds 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, hunter.hutchinson@gmail.com"
:doc "A clojure binding to the jclouds AMI service interface."}
org.jclouds.ec2.ami2
(:use org.jclouds.compute2 [clojure.core.incubator :only (-?>)])
(:import org.jclouds.aws.domain.Region
org.jclouds.ec2.services.AMIClient
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.services.AMIClient
ami-service
""
[compute]
(-> compute
.getContext
.getProviderSpecificContext
.getApi
.getAMIServices))
(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)])))))