diff --git a/src/openstack/compute.clj b/src/openstack/compute.clj index 88d43f7..5633b3b 100644 --- a/src/openstack/compute.clj +++ b/src/openstack/compute.clj @@ -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 @@ -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)}}))) diff --git a/src/openstack/testing/payloads/compute.clj b/src/openstack/testing/payloads/compute.clj new file mode 100644 index 0000000..ab540d2 --- /dev/null +++ b/src/openstack/testing/payloads/compute.clj @@ -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")}) diff --git a/src/openstack/util.clj b/src/openstack/util.clj index 1549e53..f285f23 100644 --- a/src/openstack/util.clj +++ b/src/openstack/util.clj @@ -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")) diff --git a/test/openstack/compute_test.clj b/test/openstack/compute_test.clj index f6e172e..82a87eb 100644 --- a/test/openstack/compute_test.clj +++ b/test/openstack/compute_test.clj @@ -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")] @@ -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)))))) diff --git a/test/payloads/services-flavors-body.json b/test/payloads/services-flavors-body.json new file mode 100644 index 0000000..d3140aa --- /dev/null +++ b/test/payloads/services-flavors-body.json @@ -0,0 +1,413 @@ +{ + "flavors": [ + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "class": "standard1", + "disk_io_index": "2", + "number_of_data_disks": "0" + }, + "name": "512MB Standard Instance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/2", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/2", + "rel": "bookmark" + } + ], + "ram": 512, + "vcpus": 1, + "swap": 512, + "rxtx_factor": 80, + "OS-FLV-EXT-DATA:ephemeral": 0, + "disk": 20, + "id": "2" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "class": "standard1", + "disk_io_index": "2", + "number_of_data_disks": "0" + }, + "name": "1GB Standard Instance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/3", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/3", + "rel": "bookmark" + } + ], + "ram": 1024, + "vcpus": 1, + "swap": 1024, + "rxtx_factor": 120, + "OS-FLV-EXT-DATA:ephemeral": 0, + "disk": 40, + "id": "3" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "class": "standard1", + "disk_io_Index": "2", + "number_of_data_disks": "0" + }, + "name": "2GB Standard Instance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/4", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/4", + "rel": "bookmark" + } + ], + "ram": 2048, + "vcpus": 2, + "swap": 2048, + "rxtx_factor": 240, + "OS-FLV-EXT-DATA:ephemeral": 0, + "disk": 80, + "id": "4" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "class": "standard1", + "disk_io_index": "2", + "number_of_data_disks": "0" + }, + "name": "4GB Standard Instance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/5", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/5", + "rel": "bookmark" + } + ], + "ram": 4096, + "vcpus": 2, + "swap": 2048, + "rxtx_factor": 400, + "OS-FLV-EXT-DATA:ephemeral": 0, + "disk": 160, + "id": "5" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "class": "standard1", + "disk_io_index": "2", + "number_of_data_disks": "0" + }, + "name": "8GB Standard Instance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/6", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/6", + "rel": "bookmark" + } + ], + "ram": 8192, + "vcpus": 4, + "swap": 2048, + "rxtx_factor": 600, + "OS-FLV-EXT-DATA:ephemeral": 0, + "disk": 320, + "id": "6" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "class": "standard1", + "disk_io_index": "2", + "number_of_data_disks": "0" + }, + "name": "15GB Standard Instance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/7", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/7", + "rel": "bookmark" + } + ], + "ram": 15360, + "vcpus": 6, + "swap": 2048, + "rxtx_factor": 800, + "OS-FLV-EXT-DATA:ephemeral": 0, + "disk": 620, + "id": "7" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "class": "standard1", + "disk_io_index": "2", + "number_of_data_disks": "0" + }, + "name": "30GB Standard Instance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/8", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/8", + "rel": "bookmark" + } + ], + "ram": 30720, + "vcpus": 8, + "swap": 2048, + "rxtx_factor": 1200, + "OS-FLV-EXT-DATA:ephemeral": 0, + "disk": 1200, + "id": "8" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "resize_policy_class": "performance_flavor", + "class": "performance1", + "disk_io_index": "40", + "number_of_data_disks": "0" + }, + "name": "1 GB Performance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/performance1-1", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/performance1-1", + "rel": "bookmark" + } + ], + "ram": 1024, + "vcpus": 1, + "swap": "", + "rxtx_factor": 200, + "OS-FLV-EXT-DATA:ephemeral": 0, + "disk": 20, + "id": "performance1-1" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "resize_policy_class": "performance_flavor", + "class": "performance1", + "disk_io_index": "40", + "number_of_data_disks": "1" + }, + "name": "2 GB Performance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/performance1-2", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/performance1-2", + "rel": "bookmark" + } + ], + "ram": 2048, + "vcpus": 2, + "swap": "", + "rxtx_factor": 400, + "OS-FLV-EXT-DATA:ephemeral": 20, + "disk": 40, + "id": "performance1-2" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "resize_policy_class": "performance_flavor", + "class": "performance1", + "disk_io_index": "40", + "number_of_data_disks": "1" + }, + "name": "4 GB Performance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/performance1-4", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/performance1-4", + "rel": "bookmark" + } + ], + "ram": 4096, + "vcpus": 4, + "swap": "", + "rxtx_factor": 800, + "OS-FLV-EXT-DATA:ephemeral": 40, + "disk": 40, + "id": "performance1-4" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "resize_policy_class": "performance_flavor", + "class": "performance1", + "disk_io_index": "40", + "number_of_data_disks": "1" + }, + "name": "8 GB Performance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/performance1-8", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/performance1-8", + "rel": "bookmark" + } + ], + "ram": 8192, + "vcpus": 8, + "swap": "", + "rxtx_factor": 1600, + "OS-FLV-EXT-DATA:ephemeral": 80, + "disk": 40, + "id": "performance1-8" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "resize_policy_class": "performance_flavor", + "class": "performance2", + "disk_io_index": "80", + "number_of_data_disks": "4" + }, + "name": "120 GB Performance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/performance2-120", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/performance2-120", + "rel": "bookmark" + } + ], + "ram": 122880, + "vcpus": 32, + "swap": "", + "rxtx_factor": 10000, + "OS-FLV-EXT-DATA:ephemeral": 1200, + "disk": 40, + "id": "performance2-120" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "resize_policy_class": "performance_flavor", + "class": "performance2", + "disk_io_index": "40", + "number_of_data_disks": "1" + }, + "name": "15 GB Performance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/performance2-15", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/performance2-15", + "rel": "bookmark" + } + ], + "ram": 15360, + "vcpus": 4, + "swap": "", + "rxtx_factor": 1250, + "OS-FLV-EXT-DATA:ephemeral": 150, + "disk": 40, + "id": "performance2-15" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "resize_policy_class": "performance_flavor", + "class": "performance2", + "disk_io_index": "40", + "number_of_data_disks": "1" + }, + "name": "30 GB Performance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/performance2-30", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/performance2-30", + "rel": "bookmark" + } + ], + "ram": 30720, + "vcpus": 8, + "swap": "", + "rxtx_factor": 2500, + "OS-FLV-EXT-DATA:ephemeral": 300, + "disk": 40, + "id": "performance2-30" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "resize_policy_class": "performance_flavor", + "class": "performance2", + "disk_io_index": "60", + "number_of_data_disks": "2" + }, + "name": "60 GB Performance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/performance2-60", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/performance2-60", + "rel": "bookmark" + } + ], + "ram": 61440, + "vcpus": 16, + "swap": "", + "rxtx_factor": 5000, + "OS-FLV-EXT-DATA:ephemeral": 600, + "disk": 40, + "id": "performance2-60" + }, + { + "OS-FLV-WITH-EXT-SPECS:extra_specs": { + "resize_policy_class": "performance_flavor", + "class": "performance2", + "disk_io_index": "70", + "number_of_data_disks": "3" + }, + "name": "90 GB Performance", + "links": [ + { + "href": "https://iad.servers.api.rackspacecloud.com/v2/010101/flavors/performance2-90", + "rel": "self" + }, + { + "href": "https://iad.servers.api.rackspacecloud.com/010101/flavors/performance2-90", + "rel": "bookmark" + } + ], + "ram": 92160, + "vcpus": 24, + "swap": "", + "rxtx_factor": 7500, + "OS-FLV-EXT-DATA:ephemeral": 900, + "disk": 40, + "id": "performance2-90" + } + ] +} diff --git a/test/payloads/services-images-body.json b/test/payloads/services-images-body.json new file mode 100644 index 0000000..dab3fe7 --- /dev/null +++ b/test/payloads/services-images-body.json @@ -0,0 +1,50 @@ +{ + "images": [ + { + "OS-DCF:diskConfig": "AUTO", + "created": "2012-10-13T16:53:56Z", + "id": "a3a2c42f-575f-4381-9c6d-fcd3b7d07d17", + "links": [ + { + "href": "https://dfw.servers.api.rackspacecloud.com/v2/658405/images/a3a2c42f-575f-4381-9c6d-fcd3b7d07d17", + "rel": "self" + }, + { + "href": "https://dfw.servers.api.rackspacecloud.com/658405/images/a3a2c42f-575f-4381-9c6d-fcd3b7d07d17", + "rel": "bookmark" + }, + { + "href": "https://dfw.servers.api.rackspacecloud.com/658405/images/a3a2c42f-575f-4381-9c6d-fcd3b7d07d17", + "rel": "alternate", + "type": "application/vnd.openstack.image" + } + ], + "metadata": { + "arch": "x86-64", + "auto_disk_config": "True", + "com.rackspace__1__build_core": "1", + "com.rackspace__1__build_managed": "0", + "com.rackspace__1__build_rackconnect": "1", + "com.rackspace__1__options": "0", + "com.rackspace__1__visible_core": "1", + "com.rackspace__1__visible_managed": "0", + "com.rackspace__1__visible_rackconnect": "1", + "image_type": "base", + "org.openstack__1__architecture": "x64", + "org.openstack__1__os_distro": "org.centos", + "org.openstack__1__os_version": "6.0", + "os_distro": "centos", + "os_type": "linux", + "os_version": "6.0", + "rax_managed": "false", + "rax_options": "0" + }, + "minDisk": 10, + "minRam": 256, + "name": "CentOS 6.0", + "progress": 100, + "status": "ACTIVE", + "updated": "2012-10-13T16:54:55Z" + } + ] +}