| ;; |
| ;; Copyright (C) 2010 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 |
| #^{:author "Chas Emerick, cemerick@snowtide.com" |
| :doc "A clojure binding for the jclouds AWS elastic IP address interface."} |
| org.jclouds.aws.elastic-ip |
| (:require (org.jclouds [compute :as compute]) |
| [org.jclouds.aws.ebs :as ebs]) |
| (:use (clojure.contrib def core)) |
| (:import org.jclouds.compute.domain.NodeMetadata |
| (org.jclouds.aws.ec2.domain PublicIpInstanceIdPair))) |
| |
| (defn #^org.jclouds.aws.ec2.services.ElasticIPAddressClient |
| eip-service |
| "Returns the synchronous ElasticIPAddressClient associated with |
| the specified compute service, or compute/*compute* as bound by with-compute-service." |
| [& [compute]] |
| (-> (or compute compute/*compute*) |
| .getContext .getProviderSpecificContext .getApi .getElasticIPAddressServices)) |
| |
| (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." |
| ([] (allocate nil)) |
| ([region] |
| (.allocateAddressInRegion (eip-service) (ebs/get-region region)))) |
| |
| (defn associate |
| "Associates an elastic IP address with a node." |
| ([#^NodeMetadata node public-ip] |
| (associate node public-ip (.getProviderId node))) |
| ([region public-ip instance-id] |
| (.associateAddressInRegion (eip-service) |
| (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." |
| ([] (addresses nil)) |
| ([region & public-ips] |
| (into {} (for [#^PublicIpInstanceIdPair pair (.describeAddressesInRegion (eip-service) |
| (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." |
| [region public-ip] |
| (.disassociateAddressInRegion (eip-service) |
| (ebs/get-region region) |
| public-ip)) |
| |
| (defn release |
| "Disclaims an elastic IP address from your account." |
| ([public-ip] (release nil public-ip)) |
| ([region public-ip] |
| (.releaseAddressInRegion (eip-service) |
| (ebs/get-region region) |
| public-ip))) |