Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 46 additions & 8 deletions src/openstack/compute.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,47 @@
[clj-http.client :as http]
[openstack.const :as const]
[openstack.identity :as identity]
[openstack.services :as services]))
[openstack.services :as services]
[openstack.util :as util]))

(defn get-new-server-payload [server-name image-id flavor-id]
(defn -get-data
"Returns data from cloud server based on region and type."
[identity-response url-path region]
(let [base-url (services/get-cloud-servers-region-url
identity-response
region)
url (str base-url url-path)]
(util/parse-json-body
(http/get
url
{:headers
{const/x-auth-token (identity/get-token identity-response)}}))))

(defn -get-list-by-type
"Formats a request based on request-type and region to be used by -get-data."
[identity-response request-type region]
(map
#(hash-map (:name %1) (:id %1))
((keyword request-type) (-get-data
identity-response
(str "/" request-type)
region))))

(defn get-flavors-list
"Returns a list of all available server flavors for a given region."
[identity-response region]
(-get-list-by-type
identity-response "flavors" (keyword region)))

(defn get-images-list
"Returns a list of all available server images for a given region."
[identity-response region]
(-get-list-by-type
identity-response "images" (keyword region)))

(defn get-new-server-payload
"Creates a string representing a JSON create server request."
[server-name image-id flavor-id]
{:body (json/write-str {:server
{:name server-name
:imageRef image-id
Expand All @@ -15,13 +53,13 @@
(defn create-server [identity-response region server-name image-id flavor-id]
(let [base-url (services/get-cloud-servers-region-url identity-response region)]
(http/post
(str base-url const/server-path)
{:content-type :json
:headers {const/x-auth-token (identity/get-token identity-response)}})))
(str base-url const/server-path)
{:content-type :json
:headers {const/x-auth-token (identity/get-token identity-response)}})))

(defn get-server-list [identity-response region]
(let [base-url (services/get-cloud-servers-region-url identity-response region)]
(http/get
(str base-url const/server-detail-path)
{:accept :json
:headers {const/x-auth-token (identity/get-token identity-response)}})))
(str base-url const/server-detail-path)
{:accept :json
:headers {const/x-auth-token (identity/get-token identity-response)}})))
34 changes: 34 additions & 0 deletions src/openstack/testing/payloads/compute.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
(ns openstack.testing.payloads.compute)

(def flavors {
:orig-content-encoding "gzip",
:trace-redirects ["https://identity.api.somedomain.com/v2.0/tokens"],
:request-time 1385,
:status 200,
:headers {"server" "nginx/0.8.55",
"via" "1.0 Repose (Repose/2.3.5)",
"content-type" "application/json",
"date" "Thu, 17 Oct 2013 14:54:36 GMT",
"vary" "Accept, Accept-Encoding, X-Auth-Token",
"front-end-https" "on",
"content-length" "946",
"x-newrelic-app-data" "PxQGUF9aDwETVlhSBQgFVUYdFGQHBDcQUQxLA1tMXV1dORYyVBNFDgFCa04sBkpAVR1BMUdDXggDEWFWAEYiEkAOUQFZTF1dXUcVUR9RH1JKAABXUVsJHwFUWU4VAwZWXFQCV1VQWwYJWg5RDxpp",
"connection" "close"},
:body (slurp "test/payloads/services-flavors-body.json")})


(def images {
:orig-content-encoding "gzip",
:trace-redirects ["https://identity.api.somedomain.com/v2.0/tokens"],
:request-time 1385,
:status 200,
:headers {"server" "nginx/0.8.55",
"via" "1.0 Repose (Repose/2.3.5)",
"content-type" "application/json",
"date" "Thu, 17 Oct 2013 14:54:36 GMT",
"vary" "Accept, Accept-Encoding, X-Auth-Token",
"front-end-https" "on",
"content-length" "946",
"x-newrelic-app-data" "PxQGUF9aDwETVlhSBQgFVUYdFGQHBDcQUQxLA1tMXV1dORYyVBNFDgFCa04sBkpAVR1BMUdDXggDEWFWAEYiEkAOUQFZTF1dXUcVUR9RH1JKAABXUVsJHwFUWU4VAwZWXFQCV1VQWwYJWg5RDxpp",
"connection" "close"},
:body (slurp "test/payloads/services-images-body.json")})
2 changes: 1 addition & 1 deletion src/openstack/util.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@


(defn parse-json-body [response]
(json/read-str (response :body) :key-fn keyword))
(json/read-str (:body response) :key-fn keyword))

(defn create-temp-file
([] (create-temp-file "clj-rax-" ".tmp"))
Expand Down
42 changes: 37 additions & 5 deletions test/openstack/compute_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,39 @@
[clj-http.client :as http]
[openstack.compute :as compute]
[openstack.identity :as identity]
[openstack.services :as services]))
[openstack.services :as services]
[openstack.testing.payloads.compute :as payload]
[openstack.util :as util]))

(defn mock-identity-response [identity-response] "token")

(deftest -get-data-test
"Simply ensures that the response from the GET is returned."
(let [mock-response {:body "{\"mock\": \"response\"}"}]
(with-redefs [http/get (fn [url data] mock-response)
identity/get-token mock-identity-response
services/get-cloud-servers-region-url (fn [identity-response region] "url")]
(let [response (compute/-get-data "auth" "url-path" :dfw)]
(is (not (nil? response)))))))

(deftest -get-list-by-type-test
"Ensures that the response for flavors returns correctly."
(with-redefs [compute/-get-data (fn [identity-response url-path region] payload/flavors)]
(let [response (util/parse-json-body (compute/-get-data "auth" "flavors" :dfw))
response-keys (sort (keys response))]
(is (= response-keys '[:flavors])))))

(deftest get-flavors-list-test
(with-redefs [compute/get-flavors-list (fn [identity-response region] payload/flavors)]
(let [response (util/parse-json-body (compute/get-flavors-list "auth" :dfw))
response-keys (sort (keys response))]
(is (= response-keys '[:flavors])))))

(deftest get-images-list-test
(with-redefs [compute/get-images-list (fn [identity-response region] payload/images)]
(let [response (util/parse-json-body (compute/get-images-list "auth" :dfw))
response-keys (sort (keys response))]
(is (= response-keys '[:images])))))

(deftest get-new-server-payload-test
(let [payload (compute/get-new-server-payload "server-test" "id-test" "flav-test")]
Expand All @@ -12,22 +44,22 @@
(is (= (payload :content-type)
:json))))

;simply ensures that the response from the POST is returned
(deftest create-server-test
"Simply ensures that the response from the POST is returned."
(let [mock-response {:mock "response"}]
(with-redefs [services/get-cloud-servers-region-url (fn [identity-response region] "url")
http/post (fn [url data] mock-response)
identity/get-token (fn [identity-response] "token")]
identity/get-token mock-identity-response]
(let [response (compute/create-server {} :ord "server-name" "image-id" "flavor-id")]
(is = (response
mock-response))))))

;simply ensures that the response from the GET is returned
(deftest get-server-list-test
"Simply ensures that the response from the GET is returned."
(let [mock-response {:mock "response"}]
(with-redefs [services/get-cloud-servers-region-url (fn [identity-response region] "url")
http/get (fn [url data] mock-response)
identity/get-token (fn [identity-response] "token")]
identity/get-token mock-identity-response]
(let [response (compute/get-server-list {} :ord)]
(is = (response
mock-response))))))
Loading