// Copyright 2020 The Prometheus Authors // 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. package digitalocean import ( "fmt" "net/http" "net/http/httptest" "strconv" "testing" ) // SDMock is the interface for the DigitalOcean mock. type SDMock struct { t *testing.T Server *httptest.Server Mux *http.ServeMux } // NewSDMock returns a new SDMock. func NewSDMock(t *testing.T) *SDMock { return &SDMock{ t: t, } } // Endpoint returns the URI to the mock server. func (m *SDMock) Endpoint() string { return m.Server.URL + "/" } // Setup creates the mock server. func (m *SDMock) Setup() { m.Mux = http.NewServeMux() m.Server = httptest.NewServer(m.Mux) } // ShutdownServer creates the mock server. func (m *SDMock) ShutdownServer() { m.Server.Close() } const tokenID = "3c9a75a2-24fd-4508-b4f2-11f18aa97411" // HandleDropletsList mocks droplet list. func (m *SDMock) HandleDropletsList() { m.Mux.HandleFunc("/v2/droplets", func(w http.ResponseWriter, r *http.Request) { if r.Header.Get("Authorization") != fmt.Sprintf("Bearer %s", tokenID) { w.WriteHeader(http.StatusForbidden) return } w.Header().Add("content-type", "application/json; charset=utf-8") w.Header().Add("ratelimit-limit", "1200") w.Header().Add("ratelimit-remaining", "965") w.Header().Add("ratelimit-reset", "1415984218") w.WriteHeader(http.StatusAccepted) page := 1 if pageQuery, ok := r.URL.Query()["page"]; ok { var err error page, err = strconv.Atoi(pageQuery[0]) if err != nil { panic(err) } } fmt.Fprint(w, []string{ ` { "droplets": [ { "id": 3164444, "name": "example.com", "memory": 1024, "vcpus": 1, "disk": 25, "locked": false, "status": "active", "kernel": { "id": 2233, "name": "Ubuntu 14.04 x64 vmlinuz-3.13.0-37-generic", "version": "3.13.0-37-generic" }, "created_at": "2014-11-14T16:29:21Z", "features": [ "backups", "ipv6", "virtio" ], "backup_ids": [ 7938002 ], "snapshot_ids": [ ], "image": { "id": 6918990, "name": "14.04 x64", "distribution": "Ubuntu", "slug": "ubuntu-16-04-x64", "public": true, "regions": [ "nyc1", "ams1", "sfo1", "nyc2", "ams2", "sgp1", "lon1", "nyc3", "ams3", "nyc3" ], "created_at": "2014-10-17T20:24:33Z", "type": "snapshot", "min_disk_size": 20, "size_gigabytes": 2.34 }, "volume_ids": [ ], "size": { }, "size_slug": "s-1vcpu-1gb", "networks": { "v4": [ { "ip_address": "104.236.32.182", "netmask": "255.255.192.0", "gateway": "104.236.0.1", "type": "public" } ], "v6": [ { "ip_address": "2604:A880:0800:0010:0000:0000:02DD:4001", "netmask": 64, "gateway": "2604:A880:0800:0010:0000:0000:0000:0001", "type": "public" } ] }, "region": { "name": "New York 3", "slug": "nyc3", "sizes": [ ], "features": [ "virtio", "private_networking", "backups", "ipv6", "metadata" ], "available": null }, "tags": [ ], "vpc_uuid": "f9b0769c-e118-42fb-a0c4-fed15ef69662" }, { "id": 3164494, "name": "prometheus", "memory": 1024, "vcpus": 1, "disk": 25, "locked": false, "status": "active", "kernel": { "id": 2233, "name": "Ubuntu 14.04 x64 vmlinuz-3.13.0-37-generic", "version": "3.13.0-37-generic" }, "created_at": "2014-11-14T16:36:31Z", "features": [ "virtio" ], "backup_ids": [ ], "snapshot_ids": [ 7938206 ], "image": { "id": 6918990, "name": "14.04 x64", "distribution": "Ubuntu", "slug": "ubuntu-16-04-x64", "public": true, "regions": [ "nyc1", "ams1", "sfo1", "nyc2", "ams2", "sgp1", "lon1", "nyc3", "ams3", "nyc3" ], "created_at": "2014-10-17T20:24:33Z", "type": "snapshot", "min_disk_size": 20, "size_gigabytes": 2.34 }, "volume_ids": [ ], "size": { }, "size_slug": "s-1vcpu-1gb", "networks": { "v4": [ { "ip_address": "104.131.186.241", "netmask": "255.255.240.0", "gateway": "104.131.176.1", "type": "public" } ] }, "region": { "name": "New York 3", "slug": "nyc3", "sizes": [ "s-1vcpu-1gb", "s-1vcpu-2gb", "s-1vcpu-3gb", "s-2vcpu-2gb", "s-3vcpu-1gb", "s-2vcpu-4gb", "s-4vcpu-8gb", "s-6vcpu-16gb", "s-8vcpu-32gb", "s-12vcpu-48gb", "s-16vcpu-64gb", "s-20vcpu-96gb", "s-24vcpu-128gb", "s-32vcpu-192gb" ], "features": [ "virtio", "private_networking", "backups", "ipv6", "metadata" ], "available": true }, "tags": [ "monitor" ], "vpc_uuid": "f9b0769c-e118-42fb-a0c4-fed15ef69662" } ], "links": { "pages": { "next": "https://api.digitalocean.com/v2/droplets?page=2&per_page=2", "last": "https://api.digitalocean.com/v2/droplets?page=2&per_page=2" } }, "meta": { "total": 4 } } `, ` { "droplets": [ { "id": 175072239, "name": "prometheus-demo-old", "memory": 1024, "vcpus": 1, "disk": 25, "locked": false, "status": "off", "kernel": null, "created_at": "2020-01-10T16:47:39Z", "features": [ "ipv6", "private_networking" ], "backup_ids": [], "next_backup_window": null, "snapshot_ids": [], "image": { "id": 53893572, "name": "18.04.3 (LTS) x64", "distribution": "Ubuntu", "slug": "ubuntu-18-04-x64", "public": true, "regions": [ "nyc3", "nyc1", "sfo1", "nyc2", "ams2", "sgp1", "lon1", "nyc3", "ams3", "fra1", "tor1", "sfo2", "blr1", "sfo3" ], "created_at": "2019-10-22T01:38:19Z", "min_disk_size": 20, "type": "base", "size_gigabytes": 2.36, "description": "Ubuntu 18.04 x64 20191022", "tags": [], "status": "available" }, "volume_ids": [], "size": { "slug": "s-1vcpu-1gb", "memory": 1024, "vcpus": 1, "disk": 25, "transfer": 1, "price_monthly": 5, "price_hourly": 0.00744, "regions": [ "ams2", "ams3", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo1", "sfo2", "sfo3", "sgp1", "tor1" ], "available": true }, "size_slug": "s-1vcpu-1gb", "networks": { "v4": [ { "ip_address": "167.172.111.118", "netmask": "255.255.240.0", "gateway": "167.172.176.1", "type": "public" }, { "ip_address": "10.135.64.211", "netmask": "255.255.0.0", "gateway": "10.135.0.1", "type": "private" } ], "v6": [ ] }, "region": { "name": "Frankfurt 1", "slug": "fra1", "features": [ "private_networking", "backups", "ipv6", "metadata", "install_agent", "storage", "image_transfer" ], "available": true, "sizes": [ "s-1vcpu-1gb", "512mb", "s-1vcpu-2gb", "1gb", "s-3vcpu-1gb", "s-2vcpu-2gb", "s-1vcpu-3gb", "s-2vcpu-4gb", "2gb", "s-4vcpu-8gb", "m-1vcpu-8gb", "c-2", "4gb", "g-2vcpu-8gb", "gd-2vcpu-8gb", "m-16gb", "s-6vcpu-16gb", "c-4", "8gb", "m-2vcpu-16gb", "m3-2vcpu-16gb", "g-4vcpu-16gb", "gd-4vcpu-16gb", "m6-2vcpu-16gb", "m-32gb", "s-8vcpu-32gb", "c-8", "16gb", "m-4vcpu-32gb", "m3-4vcpu-32gb", "g-8vcpu-32gb", "s-12vcpu-48gb", "gd-8vcpu-32gb", "m6-4vcpu-32gb", "m-64gb", "s-16vcpu-64gb", "c-16", "32gb", "m-8vcpu-64gb", "m3-8vcpu-64gb", "g-16vcpu-64gb", "s-20vcpu-96gb", "48gb", "gd-16vcpu-64gb", "m6-8vcpu-64gb", "m-128gb", "s-24vcpu-128gb", "c-32", "64gb", "m-16vcpu-128gb", "m3-16vcpu-128gb", "s-32vcpu-192gb", "m-24vcpu-192gb", "m-224gb", "m6-16vcpu-128gb", "m3-24vcpu-192gb", "m6-24vcpu-192gb" ] }, "tags": [], "vpc_uuid": "953d698c-dc84-11e8-80bc-3cfdfea9fba1" }, { "id": 176011507, "name": "prometheus-demo", "memory": 1024, "vcpus": 1, "disk": 25, "locked": false, "status": "active", "kernel": null, "created_at": "2020-01-17T12:06:26Z", "features": [ "ipv6", "private_networking" ], "backup_ids": [], "next_backup_window": null, "snapshot_ids": [], "image": { "id": 53893572, "name": "18.04.3 (LTS) x64", "distribution": "Ubuntu", "slug": "ubuntu-18-04-x64", "public": true, "regions": [ "nyc3", "nyc1", "sfo1", "nyc2", "ams2", "sgp1", "lon1", "nyc3", "ams3", "fra1", "tor1", "sfo2", "blr1", "sfo3" ], "created_at": "2019-10-22T01:38:19Z", "min_disk_size": 20, "type": "base", "size_gigabytes": 2.36, "description": "Ubuntu 18.04 x64 20191022", "tags": [], "status": "available" }, "volume_ids": [], "size": { "slug": "s-1vcpu-1gb", "memory": 1024, "vcpus": 1, "disk": 25, "transfer": 1, "price_monthly": 5, "price_hourly": 0.00744, "regions": [ "ams2", "ams3", "blr1", "fra1", "lon1", "nyc1", "nyc2", "nyc3", "sfo1", "sfo2", "sfo3", "sgp1", "tor1" ], "available": true }, "size_slug": "s-1vcpu-1gb", "networks": { "v4": [ { "ip_address": "138.65.56.69", "netmask": "255.255.240.0", "gateway": "138.65.64.1", "type": "public" }, { "ip_address": "154.245.26.111", "netmask": "255.255.252.0", "gateway": "154.245.24.1", "type": "public" }, { "ip_address": "10.135.64.212", "netmask": "255.255.0.0", "gateway": "10.135.0.1", "type": "private" } ], "v6": [ { "ip_address": "2a03:b0c0:3:f0::cf2:4", "netmask": 64, "gateway": "2a03:b0c0:3:f0::1", "type": "public" } ] }, "region": { "name": "Frankfurt 1", "slug": "fra1", "features": [ "private_networking", "backups", "ipv6", "metadata", "install_agent", "storage", "image_transfer" ], "available": true, "sizes": [ "s-1vcpu-1gb", "512mb", "s-1vcpu-2gb", "1gb", "s-3vcpu-1gb", "s-2vcpu-2gb", "s-1vcpu-3gb", "s-2vcpu-4gb", "2gb", "s-4vcpu-8gb", "m-1vcpu-8gb", "c-2", "4gb", "g-2vcpu-8gb", "gd-2vcpu-8gb", "m-16gb", "s-6vcpu-16gb", "c-4", "8gb", "m-2vcpu-16gb", "m3-2vcpu-16gb", "g-4vcpu-16gb", "gd-4vcpu-16gb", "m6-2vcpu-16gb", "m-32gb", "s-8vcpu-32gb", "c-8", "16gb", "m-4vcpu-32gb", "m3-4vcpu-32gb", "g-8vcpu-32gb", "s-12vcpu-48gb", "gd-8vcpu-32gb", "m6-4vcpu-32gb", "m-64gb", "s-16vcpu-64gb", "c-16", "32gb", "m-8vcpu-64gb", "m3-8vcpu-64gb", "g-16vcpu-64gb", "s-20vcpu-96gb", "48gb", "gd-16vcpu-64gb", "m6-8vcpu-64gb", "m-128gb", "s-24vcpu-128gb", "c-32", "64gb", "m-16vcpu-128gb", "m3-16vcpu-128gb", "s-32vcpu-192gb", "m-24vcpu-192gb", "m-224gb", "m6-16vcpu-128gb", "m3-24vcpu-192gb", "m6-24vcpu-192gb" ] }, "tags": [], "vpc_uuid": "953d698c-dc84-11e8-80bc-3cfdfea9fba1" } ], "links": { "pages": { "first": "https://api.digitalocean.com/v2/droplets?page=1&per_page=2", "prev": "https://api.digitalocean.com/v2/droplets?page=1&per_page=2" } }, "meta": { "total": 4 } } `, }[page-1], ) }) }