mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-30 07:59:40 -08:00
8f781e411c
* Add openstack service discovery. * Add gophercloud code for openstack service discovery. * first changes for juliusv comments. * add gophercloud code for floatingip. * Add tests to openstack sd. * Add testify suite vendor files. * add copyright and make changes for code climate. * Fixed typos in provider openstack. * Renamed tenant to project in openstack sd. * Change type of password to Secret in openstack sd.
436 lines
12 KiB
Go
436 lines
12 KiB
Go
// Copyright 2017 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 openstack
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
)
|
|
|
|
// SDMock is the interface for the OpenStack 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 = "cbc36478b0bd8e67e89469c7749d4127"
|
|
|
|
func testMethod(t *testing.T, r *http.Request, expected string) {
|
|
if expected != r.Method {
|
|
t.Errorf("Request method = %v, expected %v", r.Method, expected)
|
|
}
|
|
}
|
|
|
|
func testHeader(t *testing.T, r *http.Request, header string, expected string) {
|
|
if actual := r.Header.Get(header); expected != actual {
|
|
t.Errorf("Header %s = %s, expected %s", header, actual, expected)
|
|
}
|
|
}
|
|
|
|
// HandleVersionsSuccessfully mocks version call
|
|
func (m *SDMock) HandleVersionsSuccessfully() {
|
|
m.Mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
fmt.Fprintf(w, `
|
|
{
|
|
"versions": {
|
|
"values": [
|
|
{
|
|
"status": "stable",
|
|
"id": "v3.0",
|
|
"links": [
|
|
{ "href": "%s", "rel": "self" }
|
|
]
|
|
},
|
|
{
|
|
"status": "stable",
|
|
"id": "v2.0",
|
|
"links": [
|
|
{ "href": "%s", "rel": "self" }
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
`, m.Endpoint()+"v3/", m.Endpoint()+"v2.0/")
|
|
})
|
|
}
|
|
|
|
// HandleAuthSuccessfully mocks auth call
|
|
func (m *SDMock) HandleAuthSuccessfully() {
|
|
m.Mux.HandleFunc("/v3/auth/tokens", func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Add("X-Subject-Token", tokenID)
|
|
|
|
w.WriteHeader(http.StatusCreated)
|
|
fmt.Fprintf(w, `
|
|
{
|
|
"token": {
|
|
"audit_ids": ["VcxU2JYqT8OzfUVvrjEITQ", "qNUTIJntTzO1-XUk5STybw"],
|
|
"catalog": [
|
|
{
|
|
"endpoints": [
|
|
{
|
|
"id": "39dc322ce86c4111b4f06c2eeae0841b",
|
|
"interface": "public",
|
|
"region": "RegionOne",
|
|
"url": "http://localhost:5000"
|
|
},
|
|
{
|
|
"id": "ec642f27474842e78bf059f6c48f4e99",
|
|
"interface": "internal",
|
|
"region": "RegionOne",
|
|
"url": "http://localhost:5000"
|
|
},
|
|
{
|
|
"id": "c609fc430175452290b62a4242e8a7e8",
|
|
"interface": "admin",
|
|
"region": "RegionOne",
|
|
"url": "http://localhost:35357"
|
|
}
|
|
],
|
|
"id": "4363ae44bdf34a3981fde3b823cb9aa2",
|
|
"type": "identity",
|
|
"name": "keystone"
|
|
},
|
|
{
|
|
"endpoints": [
|
|
{
|
|
"id": "e2ffee808abc4a60916715b1d4b489dd",
|
|
"interface": "public",
|
|
"region": "RegionOne",
|
|
"region_id": "RegionOne",
|
|
"url": "%s"
|
|
}
|
|
],
|
|
"id": "b7f2a5b1a019459cb956e43a8cb41e31",
|
|
"type": "compute"
|
|
}
|
|
|
|
],
|
|
"expires_at": "2013-02-27T18:30:59.999999Z",
|
|
"is_domain": false,
|
|
"issued_at": "2013-02-27T16:30:59.999999Z",
|
|
"methods": [
|
|
"password"
|
|
],
|
|
"project": {
|
|
"domain": {
|
|
"id": "1789d1",
|
|
"name": "example.com"
|
|
},
|
|
"id": "263fd9",
|
|
"name": "project-x"
|
|
},
|
|
"roles": [
|
|
{
|
|
"id": "76e72a",
|
|
"name": "admin"
|
|
},
|
|
{
|
|
"id": "f4f392",
|
|
"name": "member"
|
|
}
|
|
],
|
|
"user": {
|
|
"domain": {
|
|
"id": "1789d1",
|
|
"name": "example.com"
|
|
},
|
|
"id": "0ca8f6",
|
|
"name": "Joe",
|
|
"password_expires_at": "2016-11-06T15:32:17.000000"
|
|
}
|
|
}
|
|
}
|
|
`, m.Endpoint())
|
|
})
|
|
}
|
|
|
|
const serverListBody = `
|
|
{
|
|
"servers": [
|
|
{
|
|
"status": "ACTIVE",
|
|
"updated": "2014-09-25T13:10:10Z",
|
|
"hostId": "29d3c8c896a45aa4c34e52247875d7fefc3d94bbcc9f622b5d204362",
|
|
"OS-EXT-SRV-ATTR:host": "devstack",
|
|
"addresses": {
|
|
"private": [
|
|
{
|
|
"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:7c:1b:2b",
|
|
"version": 4,
|
|
"addr": "10.0.0.32",
|
|
"OS-EXT-IPS:type": "fixed"
|
|
}
|
|
]
|
|
},
|
|
"links": [
|
|
{
|
|
"href": "http://104.130.131.164:8774/v2/fcad67a6189847c4aecfa3c81a05783b/servers/ef079b0c-e610-4dfb-b1aa-b49f07ac48e5",
|
|
"rel": "self"
|
|
},
|
|
{
|
|
"href": "http://104.130.131.164:8774/fcad67a6189847c4aecfa3c81a05783b/servers/ef079b0c-e610-4dfb-b1aa-b49f07ac48e5",
|
|
"rel": "bookmark"
|
|
}
|
|
],
|
|
"key_name": null,
|
|
"image": {
|
|
"id": "f90f6034-2570-4974-8351-6b49732ef2eb",
|
|
"links": [
|
|
{
|
|
"href": "http://104.130.131.164:8774/fcad67a6189847c4aecfa3c81a05783b/images/f90f6034-2570-4974-8351-6b49732ef2eb",
|
|
"rel": "bookmark"
|
|
}
|
|
]
|
|
},
|
|
"OS-EXT-STS:task_state": null,
|
|
"OS-EXT-STS:vm_state": "active",
|
|
"OS-EXT-SRV-ATTR:instance_name": "instance-0000001e",
|
|
"OS-SRV-USG:launched_at": "2014-09-25T13:10:10.000000",
|
|
"OS-EXT-SRV-ATTR:hypervisor_hostname": "devstack",
|
|
"flavor": {
|
|
"id": "1",
|
|
"links": [
|
|
{
|
|
"href": "http://104.130.131.164:8774/fcad67a6189847c4aecfa3c81a05783b/flavors/1",
|
|
"rel": "bookmark"
|
|
}
|
|
]
|
|
},
|
|
"id": "ef079b0c-e610-4dfb-b1aa-b49f07ac48e5",
|
|
"security_groups": [
|
|
{
|
|
"name": "default"
|
|
}
|
|
],
|
|
"OS-SRV-USG:terminated_at": null,
|
|
"OS-EXT-AZ:availability_zone": "nova",
|
|
"user_id": "9349aff8be7545ac9d2f1d00999a23cd",
|
|
"name": "herp",
|
|
"created": "2014-09-25T13:10:02Z",
|
|
"tenant_id": "fcad67a6189847c4aecfa3c81a05783b",
|
|
"OS-DCF:diskConfig": "MANUAL",
|
|
"os-extended-volumes:volumes_attached": [],
|
|
"accessIPv4": "",
|
|
"accessIPv6": "",
|
|
"progress": 0,
|
|
"OS-EXT-STS:power_state": 1,
|
|
"config_drive": "",
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"status": "ACTIVE",
|
|
"updated": "2014-09-25T13:04:49Z",
|
|
"hostId": "29d3c8c896a45aa4c34e52247875d7fefc3d94bbcc9f622b5d204362",
|
|
"OS-EXT-SRV-ATTR:host": "devstack",
|
|
"addresses": {
|
|
"private": [
|
|
{
|
|
"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:9e:89:be",
|
|
"version": 4,
|
|
"addr": "10.0.0.31",
|
|
"OS-EXT-IPS:type": "fixed"
|
|
}
|
|
]
|
|
},
|
|
"links": [
|
|
{
|
|
"href": "http://104.130.131.164:8774/v2/fcad67a6189847c4aecfa3c81a05783b/servers/9e5476bd-a4ec-4653-93d6-72c93aa682ba",
|
|
"rel": "self"
|
|
},
|
|
{
|
|
"href": "http://104.130.131.164:8774/fcad67a6189847c4aecfa3c81a05783b/servers/9e5476bd-a4ec-4653-93d6-72c93aa682ba",
|
|
"rel": "bookmark"
|
|
}
|
|
],
|
|
"key_name": null,
|
|
"image": {
|
|
"id": "f90f6034-2570-4974-8351-6b49732ef2eb",
|
|
"links": [
|
|
{
|
|
"href": "http://104.130.131.164:8774/fcad67a6189847c4aecfa3c81a05783b/images/f90f6034-2570-4974-8351-6b49732ef2eb",
|
|
"rel": "bookmark"
|
|
}
|
|
]
|
|
},
|
|
"OS-EXT-STS:task_state": null,
|
|
"OS-EXT-STS:vm_state": "active",
|
|
"OS-EXT-SRV-ATTR:instance_name": "instance-0000001d",
|
|
"OS-SRV-USG:launched_at": "2014-09-25T13:04:49.000000",
|
|
"OS-EXT-SRV-ATTR:hypervisor_hostname": "devstack",
|
|
"flavor": {
|
|
"id": "1",
|
|
"links": [
|
|
{
|
|
"href": "http://104.130.131.164:8774/fcad67a6189847c4aecfa3c81a05783b/flavors/1",
|
|
"rel": "bookmark"
|
|
}
|
|
]
|
|
},
|
|
"id": "9e5476bd-a4ec-4653-93d6-72c93aa682ba",
|
|
"security_groups": [
|
|
{
|
|
"name": "default"
|
|
}
|
|
],
|
|
"OS-SRV-USG:terminated_at": null,
|
|
"OS-EXT-AZ:availability_zone": "nova",
|
|
"user_id": "9349aff8be7545ac9d2f1d00999a23cd",
|
|
"name": "derp",
|
|
"created": "2014-09-25T13:04:41Z",
|
|
"tenant_id": "fcad67a6189847c4aecfa3c81a05783b",
|
|
"OS-DCF:diskConfig": "MANUAL",
|
|
"os-extended-volumes:volumes_attached": [],
|
|
"accessIPv4": "",
|
|
"accessIPv6": "",
|
|
"progress": 0,
|
|
"OS-EXT-STS:power_state": 1,
|
|
"config_drive": "",
|
|
"metadata": {}
|
|
},
|
|
{
|
|
"status": "ACTIVE",
|
|
"updated": "2014-09-25T13:04:49Z",
|
|
"hostId": "29d3c8c896a45aa4c34e52247875d7fefc3d94bbcc9f622b5d204362",
|
|
"OS-EXT-SRV-ATTR:host": "devstack",
|
|
"addresses": {
|
|
"private": [
|
|
{
|
|
"OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:9e:89:be",
|
|
"version": 4,
|
|
"addr": "10.0.0.31",
|
|
"OS-EXT-IPS:type": "fixed"
|
|
}
|
|
]
|
|
},
|
|
"links": [
|
|
{
|
|
"href": "http://104.130.131.164:8774/v2/fcad67a6189847c4aecfa3c81a05783b/servers/9e5476bd-a4ec-4653-93d6-72c93aa682ba",
|
|
"rel": "self"
|
|
},
|
|
{
|
|
"href": "http://104.130.131.164:8774/fcad67a6189847c4aecfa3c81a05783b/servers/9e5476bd-a4ec-4653-93d6-72c93aa682ba",
|
|
"rel": "bookmark"
|
|
}
|
|
],
|
|
"key_name": null,
|
|
"image": "",
|
|
"OS-EXT-STS:task_state": null,
|
|
"OS-EXT-STS:vm_state": "active",
|
|
"OS-EXT-SRV-ATTR:instance_name": "instance-0000001d",
|
|
"OS-SRV-USG:launched_at": "2014-09-25T13:04:49.000000",
|
|
"OS-EXT-SRV-ATTR:hypervisor_hostname": "devstack",
|
|
"flavor": {
|
|
"id": "1",
|
|
"links": [
|
|
{
|
|
"href": "http://104.130.131.164:8774/fcad67a6189847c4aecfa3c81a05783b/flavors/1",
|
|
"rel": "bookmark"
|
|
}
|
|
]
|
|
},
|
|
"id": "9e5476bd-a4ec-4653-93d6-72c93aa682bb",
|
|
"security_groups": [
|
|
{
|
|
"name": "default"
|
|
}
|
|
],
|
|
"OS-SRV-USG:terminated_at": null,
|
|
"OS-EXT-AZ:availability_zone": "nova",
|
|
"user_id": "9349aff8be7545ac9d2f1d00999a23cd",
|
|
"name": "merp",
|
|
"created": "2014-09-25T13:04:41Z",
|
|
"tenant_id": "fcad67a6189847c4aecfa3c81a05783b",
|
|
"OS-DCF:diskConfig": "MANUAL",
|
|
"os-extended-volumes:volumes_attached": [],
|
|
"accessIPv4": "",
|
|
"accessIPv6": "",
|
|
"progress": 0,
|
|
"OS-EXT-STS:power_state": 1,
|
|
"config_drive": "",
|
|
"metadata": {}
|
|
}
|
|
]
|
|
}
|
|
`
|
|
|
|
// HandleServerListSuccessfully mocks server detail call
|
|
func (m *SDMock) HandleServerListSuccessfully() {
|
|
m.Mux.HandleFunc("/servers/detail", func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(m.t, r, "GET")
|
|
testHeader(m.t, r, "X-Auth-Token", tokenID)
|
|
|
|
w.Header().Add("Content-Type", "application/json")
|
|
fmt.Fprintf(w, serverListBody)
|
|
})
|
|
}
|
|
|
|
const listOutput = `
|
|
{
|
|
"floating_ips": [
|
|
{
|
|
"fixed_ip": null,
|
|
"id": "1",
|
|
"instance_id": null,
|
|
"ip": "10.10.10.1",
|
|
"pool": "nova"
|
|
},
|
|
{
|
|
"fixed_ip": "166.78.185.201",
|
|
"id": "2",
|
|
"instance_id": "ef079b0c-e610-4dfb-b1aa-b49f07ac48e5",
|
|
"ip": "10.10.10.2",
|
|
"pool": "nova"
|
|
}
|
|
]
|
|
}
|
|
`
|
|
|
|
// HandleFloatingIPListSuccessfully mocks floating ips call
|
|
func (m *SDMock) HandleFloatingIPListSuccessfully() {
|
|
m.Mux.HandleFunc("/os-floating-ips", func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(m.t, r, "GET")
|
|
testHeader(m.t, r, "X-Auth-Token", tokenID)
|
|
|
|
w.Header().Add("Content-Type", "application/json")
|
|
fmt.Fprintf(w, listOutput)
|
|
})
|
|
}
|