mirror of https://github.com/hashicorp/consul
152 lines
4.9 KiB
Go
152 lines
4.9 KiB
Go
|
// Copyright 2016 Circonus, Inc. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
// ProvisionBroker API support - Fetch, Create, and Update
|
||
|
// See: https://login.circonus.com/resources/api/calls/provision_broker
|
||
|
// Note that the provision_broker endpoint does not return standard cid format
|
||
|
// of '/object/item' (e.g. /provision_broker/abc-123) it just returns 'item'
|
||
|
|
||
|
package api
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"regexp"
|
||
|
|
||
|
"github.com/circonus-labs/circonus-gometrics/api/config"
|
||
|
)
|
||
|
|
||
|
// BrokerStratcon defines stratcons for broker
|
||
|
type BrokerStratcon struct {
|
||
|
CN string `json:"cn,omitempty"` // string
|
||
|
Host string `json:"host,omitempty"` // string
|
||
|
Port string `json:"port,omitempty"` // string
|
||
|
}
|
||
|
|
||
|
// ProvisionBroker defines a provision broker [request]. See https://login.circonus.com/resources/api/calls/provision_broker for more details.
|
||
|
type ProvisionBroker struct {
|
||
|
Cert string `json:"_cert,omitempty"` // string
|
||
|
CID string `json:"_cid,omitempty"` // string
|
||
|
CSR string `json:"_csr,omitempty"` // string
|
||
|
ExternalHost string `json:"external_host,omitempty"` // string
|
||
|
ExternalPort string `json:"external_port,omitempty"` // string
|
||
|
IPAddress string `json:"ipaddress,omitempty"` // string
|
||
|
Latitude string `json:"latitude,omitempty"` // string
|
||
|
Longitude string `json:"longitude,omitempty"` // string
|
||
|
Name string `json:"noit_name,omitempty"` // string
|
||
|
Port string `json:"port,omitempty"` // string
|
||
|
PreferReverseConnection bool `json:"prefer_reverse_connection,omitempty"` // boolean
|
||
|
Rebuild bool `json:"rebuild,omitempty"` // boolean
|
||
|
Stratcons []BrokerStratcon `json:"_stratcons,omitempty"` // [] len >= 1
|
||
|
Tags []string `json:"tags,omitempty"` // [] len >= 0
|
||
|
}
|
||
|
|
||
|
// NewProvisionBroker returns a new ProvisionBroker (with defaults, if applicable)
|
||
|
func NewProvisionBroker() *ProvisionBroker {
|
||
|
return &ProvisionBroker{}
|
||
|
}
|
||
|
|
||
|
// FetchProvisionBroker retrieves provision broker [request] with passed cid.
|
||
|
func (a *API) FetchProvisionBroker(cid CIDType) (*ProvisionBroker, error) {
|
||
|
if cid == nil || *cid == "" {
|
||
|
return nil, fmt.Errorf("Invalid provision broker request CID [none]")
|
||
|
}
|
||
|
|
||
|
brokerCID := string(*cid)
|
||
|
|
||
|
matched, err := regexp.MatchString(config.ProvisionBrokerCIDRegex, brokerCID)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
if !matched {
|
||
|
return nil, fmt.Errorf("Invalid provision broker request CID [%s]", brokerCID)
|
||
|
}
|
||
|
|
||
|
result, err := a.Get(brokerCID)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if a.Debug {
|
||
|
a.Log.Printf("[DEBUG] fetch broker provision request, received JSON: %s", string(result))
|
||
|
}
|
||
|
|
||
|
broker := &ProvisionBroker{}
|
||
|
if err := json.Unmarshal(result, broker); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return broker, nil
|
||
|
}
|
||
|
|
||
|
// UpdateProvisionBroker updates a broker definition [request].
|
||
|
func (a *API) UpdateProvisionBroker(cid CIDType, cfg *ProvisionBroker) (*ProvisionBroker, error) {
|
||
|
if cfg == nil {
|
||
|
return nil, fmt.Errorf("Invalid provision broker request config [nil]")
|
||
|
}
|
||
|
|
||
|
if cid == nil || *cid == "" {
|
||
|
return nil, fmt.Errorf("Invalid provision broker request CID [none]")
|
||
|
}
|
||
|
|
||
|
brokerCID := string(*cid)
|
||
|
|
||
|
matched, err := regexp.MatchString(config.ProvisionBrokerCIDRegex, brokerCID)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
if !matched {
|
||
|
return nil, fmt.Errorf("Invalid provision broker request CID [%s]", brokerCID)
|
||
|
}
|
||
|
|
||
|
jsonCfg, err := json.Marshal(cfg)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if a.Debug {
|
||
|
a.Log.Printf("[DEBUG] update broker provision request, sending JSON: %s", string(jsonCfg))
|
||
|
}
|
||
|
|
||
|
result, err := a.Put(brokerCID, jsonCfg)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
broker := &ProvisionBroker{}
|
||
|
if err := json.Unmarshal(result, broker); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return broker, nil
|
||
|
}
|
||
|
|
||
|
// CreateProvisionBroker creates a new provison broker [request].
|
||
|
func (a *API) CreateProvisionBroker(cfg *ProvisionBroker) (*ProvisionBroker, error) {
|
||
|
if cfg == nil {
|
||
|
return nil, fmt.Errorf("Invalid provision broker request config [nil]")
|
||
|
}
|
||
|
|
||
|
jsonCfg, err := json.Marshal(cfg)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if a.Debug {
|
||
|
a.Log.Printf("[DEBUG] create broker provision request, sending JSON: %s", string(jsonCfg))
|
||
|
}
|
||
|
|
||
|
result, err := a.Post(config.ProvisionBrokerPrefix, jsonCfg)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
broker := &ProvisionBroker{}
|
||
|
if err := json.Unmarshal(result, broker); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return broker, nil
|
||
|
}
|