Skip to content

Commit ad86f8d

Browse files
authored
Merge pull request #282 from cloudamqp/import/go-api
Import Go-API client library with history (https://github.com/84codes/go-api)
2 parents 31df7a7 + aa3ee1c commit ad86f8d

25 files changed

+3193
-0
lines changed

api/account.go

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package api
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"strconv"
7+
)
8+
9+
func (api *API) ListInstances() ([]map[string]interface{}, error) {
10+
var (
11+
data []map[string]interface{}
12+
failed map[string]interface{}
13+
path = "api/instances"
14+
)
15+
16+
response, err := api.sling.New().Path(path).Receive(&data, &failed)
17+
log.Printf("[DEBUG] go-api::account::list_instances data: %v", data)
18+
if err != nil {
19+
return nil, err
20+
}
21+
if response.StatusCode != 200 {
22+
return nil, fmt.Errorf("ListInstances failed, status: %v, message: %s", response.StatusCode, failed)
23+
}
24+
return data, nil
25+
}
26+
27+
func (api *API) ListVpcs() ([]map[string]interface{}, error) {
28+
var (
29+
data []map[string]interface{}
30+
failed map[string]interface{}
31+
path = "/api/vpcs"
32+
)
33+
34+
response, err := api.sling.New().Path(path).Receive(&data, &failed)
35+
log.Printf("[DEBUG] go-api::vpc::list data: %v", data)
36+
37+
if err != nil {
38+
return nil, err
39+
}
40+
if response.StatusCode != 200 {
41+
return nil, fmt.Errorf("ListVpcs failed, status: %v, message: %v", response.StatusCode, failed)
42+
}
43+
44+
for k := range data {
45+
vpcID := strconv.FormatFloat(data[k]["id"].(float64), 'f', 0, 64)
46+
data_temp, _ := api.readVpcName(vpcID)
47+
data[k]["vpc_name"] = data_temp["name"]
48+
}
49+
50+
return data, nil
51+
}
52+
53+
func (api *API) RotatePassword(instanceID int) error {
54+
var (
55+
failed map[string]interface{}
56+
path = fmt.Sprintf("api/instances/%d/account/rotate-password", instanceID)
57+
)
58+
59+
response, err := api.sling.New().Post(path).Receive(nil, &failed)
60+
if err != nil {
61+
return err
62+
}
63+
64+
switch response.StatusCode {
65+
case 200:
66+
return nil
67+
case 204:
68+
return nil
69+
default:
70+
return fmt.Errorf("failed to rotate api key, statusCode: %v, failed: %v",
71+
response.StatusCode, failed)
72+
}
73+
}
74+
75+
func (api *API) RotateApiKey(instanceID int) error {
76+
var (
77+
failed map[string]interface{}
78+
path = fmt.Sprintf("api/instances/%d/account/rotate-apikey", instanceID)
79+
)
80+
81+
response, err := api.sling.New().Post(path).Receive(nil, &failed)
82+
if err != nil {
83+
return err
84+
}
85+
86+
switch response.StatusCode {
87+
case 200:
88+
return nil
89+
case 204:
90+
return nil
91+
default:
92+
return fmt.Errorf("failed to rotate api key, statusCode: %v, failed: %v",
93+
response.StatusCode, failed)
94+
}
95+
}

api/alarms.go

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package api
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"log"
7+
"strconv"
8+
"time"
9+
)
10+
11+
func (api *API) CreateAlarm(instanceID int, params map[string]interface{}) (map[string]interface{}, error) {
12+
data := make(map[string]interface{})
13+
failed := make(map[string]interface{})
14+
log.Printf("[DEBUG] go-api::alarm::create instance ID: %v, params: %v", instanceID, params)
15+
path := fmt.Sprintf("/api/instances/%d/alarms", instanceID)
16+
response, err := api.sling.New().Post(path).BodyJSON(params).Receive(&data, &failed)
17+
log.Printf("[DEBUG] go-api::alarm::create data: %v", data)
18+
19+
if err != nil {
20+
return nil, err
21+
}
22+
if response.StatusCode != 201 {
23+
return nil, fmt.Errorf("CreateAlarm failed, status: %v, message: %s", response.StatusCode, failed)
24+
}
25+
26+
if id, ok := data["id"]; ok {
27+
data["id"] = strconv.FormatFloat(id.(float64), 'f', 0, 64)
28+
log.Printf("[DEBUG] go-api::alarm::create id set: %v", data["id"])
29+
} else {
30+
msg := fmt.Sprintf("go-api::instance::create Invalid alarm identifier: %v", data["id"])
31+
log.Printf("[ERROR] %s", msg)
32+
return nil, errors.New(msg)
33+
}
34+
35+
return data, err
36+
}
37+
38+
func (api *API) ReadAlarm(instanceID int, alarmID string) (map[string]interface{}, error) {
39+
data := make(map[string]interface{})
40+
failed := make(map[string]interface{})
41+
log.Printf("[DEBUG] go-api::alarm::read instance ID: %v, alarm ID: %v", instanceID, alarmID)
42+
path := fmt.Sprintf("/api/instances/%v/alarms/%v", instanceID, alarmID)
43+
response, err := api.sling.New().Get(path).Receive(&data, &failed)
44+
log.Printf("[DEBUG] go-api::alarm::read data : %v", data)
45+
46+
if err != nil {
47+
return nil, err
48+
}
49+
if response.StatusCode != 200 {
50+
return nil, fmt.Errorf("ReadAlarm failed, status: %v, message: %s", response.StatusCode, failed)
51+
}
52+
53+
return data, err
54+
}
55+
56+
func (api *API) ReadAlarms(instanceID int) ([]map[string]interface{}, error) {
57+
var data []map[string]interface{}
58+
failed := make(map[string]interface{})
59+
log.Printf("[DEBUG] go-api::alarm::read instance ID: %v", instanceID)
60+
path := fmt.Sprintf("/api/instances/%d/alarms", instanceID)
61+
response, err := api.sling.New().Get(path).Receive(&data, &failed)
62+
log.Printf("[DEBUG] go-api::alarm::read data: %v", data)
63+
64+
if err != nil {
65+
return nil, err
66+
}
67+
if response.StatusCode != 200 {
68+
return nil, fmt.Errorf("Alarms::ReadAlarms failed, status: %v, message: %s", response.StatusCode, failed)
69+
}
70+
71+
return data, err
72+
}
73+
74+
func (api *API) UpdateAlarm(instanceID int, params map[string]interface{}) error {
75+
failed := make(map[string]interface{})
76+
log.Printf("[DEBUG] go-api::alarm::update instance ID: %v, params: %v", instanceID, params)
77+
path := fmt.Sprintf("/api/instances/%v/alarms/%v", instanceID, params["id"])
78+
response, err := api.sling.New().Put(path).BodyJSON(params).Receive(nil, &failed)
79+
80+
if err != nil {
81+
return err
82+
}
83+
if response.StatusCode != 201 {
84+
return fmt.Errorf("Alarms::UpdateAlarm failed, status: %v, message: %s", response.StatusCode, failed)
85+
}
86+
87+
return err
88+
}
89+
90+
func (api *API) DeleteAlarm(instanceID int, params map[string]interface{}) error {
91+
failed := make(map[string]interface{})
92+
log.Printf("[DEBUG] go-api::alarm::delete instance id: %v, params: %v", instanceID, params)
93+
path := fmt.Sprintf("/api/instances/%v/alarms/%v", instanceID, params["id"])
94+
response, _ := api.sling.New().Delete(path).BodyJSON(params).Receive(nil, &failed)
95+
96+
if response.StatusCode != 204 {
97+
return fmt.Errorf("Alarm::DeleteAlarm failed, status: %v, message: %s", response.StatusCode, failed)
98+
}
99+
100+
return api.waitUntilAlarmDeletion(instanceID, params["id"].(string))
101+
}
102+
103+
func (api *API) waitUntilAlarmDeletion(instanceID int, id string) error {
104+
log.Printf("[DEBUG] go-api::alarm::waitUntilAlarmDeletion waiting")
105+
data := make(map[string]interface{})
106+
failed := make(map[string]interface{})
107+
for {
108+
path := fmt.Sprintf("/api/instances/%v/alarms/%v", instanceID, id)
109+
response, err := api.sling.New().Path(path).Receive(&data, &failed)
110+
111+
if err != nil {
112+
log.Printf("[DEBUG] go-api::alarm::waitUntilAlarmDeletion error: %v", err)
113+
return err
114+
}
115+
if response.StatusCode == 404 {
116+
log.Print("[DEBUG] go-api::alarm::waitUntilAlarmDeletion deleted")
117+
return nil
118+
}
119+
120+
time.Sleep(10 * time.Second)
121+
}
122+
}

api/api.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package api
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/dghubble/sling"
7+
)
8+
9+
type API struct {
10+
sling *sling.Sling
11+
client *http.Client
12+
}
13+
14+
func (api *API) DefaultRmqVersion() (map[string]interface{}, error) {
15+
data := make(map[string]interface{})
16+
failed := make(map[string]interface{})
17+
_, err := api.sling.New().Get("/api/default_rabbitmq_version").Receive(&data, &failed)
18+
if err != nil {
19+
return nil, err
20+
}
21+
return data, nil
22+
}
23+
24+
func New(baseUrl, apiKey string, useragent string, client *http.Client) *API {
25+
if len(useragent) == 0 {
26+
useragent = "84codes go-api"
27+
}
28+
return &API{
29+
sling: sling.New().
30+
Client(client).
31+
Base(baseUrl).
32+
SetBasicAuth("", apiKey).
33+
Set("User-Agent", useragent),
34+
client: client,
35+
}
36+
}

api/aws_eventbridge.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package api
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"strconv"
7+
)
8+
9+
func (api *API) CreateAwsEventBridge(instanceID int, params map[string]interface{}) (map[string]interface{}, error) {
10+
var (
11+
data map[string]interface{}
12+
failed map[string]interface{}
13+
path = fmt.Sprintf("/api/instances/%d/eventbridges", instanceID)
14+
)
15+
16+
log.Printf("[DEBUG] go-api::aws-eventbridge::create instance ID: %d, params: %v", instanceID, params)
17+
response, err := api.sling.New().Post(path).BodyJSON(params).Receive(&data, &failed)
18+
if err != nil {
19+
return nil, err
20+
}
21+
if response.StatusCode != 201 {
22+
return nil, fmt.Errorf("failed to create AWS EventBridge, status: %v, message: %s",
23+
response.StatusCode, failed)
24+
}
25+
if id, ok := data["id"]; ok {
26+
data["id"] = strconv.FormatFloat(id.(float64), 'f', 0, 64)
27+
log.Printf("[DEBUG] go-api::aws-eventbridge::create EventBridge identifier: %v", data["id"])
28+
} else {
29+
return nil, fmt.Errorf("go-api::aws-eventbridge::create Invalid identifier: %v", data["id"])
30+
}
31+
32+
return data, nil
33+
}
34+
35+
func (api *API) ReadAwsEventBridge(instanceID int, eventbridgeID string) (map[string]interface{}, error) {
36+
var (
37+
data map[string]interface{}
38+
failed map[string]interface{}
39+
path = fmt.Sprintf("/api/instances/%d/eventbridges/%s", instanceID, eventbridgeID)
40+
)
41+
42+
response, err := api.sling.New().Get(path).Receive(&data, &failed)
43+
if err != nil {
44+
return nil, err
45+
}
46+
if response.StatusCode != 200 {
47+
return nil, fmt.Errorf("failed to read AWS EventBridge, status: %v, message: %s",
48+
response.StatusCode, failed)
49+
}
50+
51+
return data, nil
52+
}
53+
54+
func (api *API) ReadAwsEventBridges(instanceID int) (map[string]interface{}, error) {
55+
var (
56+
data map[string]interface{}
57+
failed map[string]interface{}
58+
path = fmt.Sprintf("/api/instances/%d/eventbridges", instanceID)
59+
)
60+
61+
response, err := api.sling.New().Get(path).Receive(&data, &failed)
62+
if err != nil {
63+
return nil, err
64+
}
65+
if response.StatusCode != 200 {
66+
return nil, fmt.Errorf("failed to read AWS EventBridges, status: %v, message: %s",
67+
response.StatusCode, failed)
68+
}
69+
70+
return data, nil
71+
}
72+
73+
func (api *API) DeleteAwsEventBridge(instanceID int, eventbridgeID string) error {
74+
var (
75+
failed map[string]interface{}
76+
path = fmt.Sprintf("/api/instances/%d/eventbridges/%s", instanceID, eventbridgeID)
77+
)
78+
79+
log.Printf("[DEBUG] go-api::aws-eventbridge::delete instance id: %d, eventbridge id: %s", instanceID, eventbridgeID)
80+
response, err := api.sling.New().Delete(path).Receive(nil, &failed)
81+
if err != nil {
82+
return err
83+
}
84+
85+
switch response.StatusCode {
86+
case 204:
87+
return nil
88+
case 404:
89+
// AWS EventBridge not found in the backend. Silent let the resource be deleted.
90+
return nil
91+
}
92+
93+
return fmt.Errorf("failed to delete AWS EventBridge, status: %v, message: %s", response.StatusCode, failed)
94+
}

api/credentials.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package api
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"regexp"
7+
"strconv"
8+
)
9+
10+
func (api *API) ReadCredentials(id int) (map[string]interface{}, error) {
11+
data := make(map[string]interface{})
12+
failed := make(map[string]interface{})
13+
instanceID := strconv.Itoa(id)
14+
log.Printf("[DEBUG] go-api::credentials::read instance ID: %v", instanceID)
15+
response, err := api.sling.New().Path("/api/instances/").Get(instanceID).Receive(&data, &failed)
16+
if err != nil {
17+
return nil, err
18+
}
19+
if response.StatusCode != 200 {
20+
return nil, fmt.Errorf("ReadCredentials failed, status: %v, message: %s", response.StatusCode, failed)
21+
}
22+
23+
return extractInfo(data["url"].(string)), nil
24+
}
25+
26+
func extractInfo(url string) map[string]interface{} {
27+
paramsMap := make(map[string]interface{})
28+
r := regexp.MustCompile(`^.*:\/\/(?P<username>(.*)):(?P<password>(.*))@`)
29+
match := r.FindStringSubmatch(url)
30+
31+
for i, name := range r.SubexpNames() {
32+
if name == "username" {
33+
paramsMap["username"] = match[i]
34+
}
35+
if name == "password" {
36+
paramsMap["password"] = match[i]
37+
}
38+
}
39+
40+
return paramsMap
41+
}

0 commit comments

Comments
 (0)