bd79fbafb3
Updated the `Serve` function so these can be added back into Vault
370 lines
13 KiB
Go
370 lines
13 KiB
Go
package mongodbatlas
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"net/http"
|
||
"net/url"
|
||
)
|
||
|
||
const clustersPath = "groups/%s/clusters"
|
||
|
||
// ClustersService is an interface for interfacing with the Clusters
|
||
// endpoints of the MongoDB Atlas API.
|
||
// See more: https://docs.atlas.mongodb.com/reference/api/clusters/
|
||
type ClustersService interface {
|
||
List(context.Context, string, *ListOptions) ([]Cluster, *Response, error)
|
||
Get(context.Context, string, string) (*Cluster, *Response, error)
|
||
Create(context.Context, string, *Cluster) (*Cluster, *Response, error)
|
||
Update(context.Context, string, string, *Cluster) (*Cluster, *Response, error)
|
||
Delete(context.Context, string, string) (*Response, error)
|
||
UpdateProcessArgs(context.Context, string, string, *ProcessArgs) (*ProcessArgs, *Response, error)
|
||
GetProcessArgs(context.Context, string, string) (*ProcessArgs, *Response, error)
|
||
}
|
||
|
||
// ClustersServiceOp handles communication with the Cluster related methods
|
||
// of the MongoDB Atlas API
|
||
type ClustersServiceOp service
|
||
|
||
var _ ClustersService = &ClustersServiceOp{}
|
||
|
||
// AutoScaling configures your cluster to automatically scale its storage
|
||
type AutoScaling struct {
|
||
DiskGBEnabled *bool `json:"diskGBEnabled,omitempty"`
|
||
Compute *Compute `json:"compute,omitempty"`
|
||
}
|
||
|
||
// Compute Specifies whether the cluster automatically scales its cluster tier and whether the cluster can scale down.
|
||
type Compute struct {
|
||
Enabled *bool `json:"enabled,omitempty"`
|
||
ScaleDownEnabled *bool `json:"scaleDownEnabled,omitempty"`
|
||
MinInstanceSize string `json:"minInstanceSize,omitempty"`
|
||
MaxInstanceSize string `json:"maxInstanceSize,omitempty"`
|
||
}
|
||
|
||
// BiConnector specifies BI Connector for Atlas configuration on this cluster
|
||
type BiConnector struct {
|
||
Enabled *bool `json:"enabled,omitempty"`
|
||
ReadPreference string `json:"readPreference,omitempty"`
|
||
}
|
||
|
||
// ProviderSettings configuration for the provisioned servers on which MongoDB runs. The available options are specific to the cloud service provider.
|
||
type ProviderSettings struct {
|
||
BackingProviderName string `json:"backingProviderName,omitempty"`
|
||
DiskIOPS *int64 `json:"diskIOPS,omitempty"`
|
||
DiskTypeName string `json:"diskTypeName,omitempty"`
|
||
EncryptEBSVolume *bool `json:"encryptEBSVolume,omitempty"`
|
||
InstanceSizeName string `json:"instanceSizeName,omitempty"`
|
||
ProviderName string `json:"providerName,omitempty"`
|
||
RegionName string `json:"regionName,omitempty"`
|
||
VolumeType string `json:"volumeType,omitempty"`
|
||
AutoScaling *AutoScaling `json:"autoScaling,omitempty"`
|
||
}
|
||
|
||
// RegionsConfig describes the region’s priority in elections and the number and type of MongoDB nodes Atlas deploys to the region.
|
||
type RegionsConfig struct {
|
||
AnalyticsNodes *int64 `json:"analyticsNodes,omitempty"`
|
||
ElectableNodes *int64 `json:"electableNodes,omitempty"`
|
||
Priority *int64 `json:"priority,omitempty"`
|
||
ReadOnlyNodes *int64 `json:"readOnlyNodes,omitempty"`
|
||
}
|
||
|
||
// ReplicationSpec represents a configuration for cluster regions
|
||
type ReplicationSpec struct {
|
||
ID string `json:"id,omitempty"`
|
||
NumShards *int64 `json:"numShards,omitempty"`
|
||
ZoneName string `json:"zoneName,omitempty"`
|
||
RegionsConfig map[string]RegionsConfig `json:"regionsConfig,omitempty"`
|
||
}
|
||
|
||
// ConnectionStrings configuration for applications use to connect to this cluster
|
||
type ConnectionStrings struct {
|
||
Standard string `json:"standard,omitempty"`
|
||
StandardSrv string `json:"standardSrv,omitempty"`
|
||
AwsPrivateLink map[string]string `json:"awsPrivateLink,omitempty"`
|
||
AwsPrivateLinkSrv map[string]string `json:"awsPrivateLinkSrv,omitempty"`
|
||
Private string `json:"private,omitempty"`
|
||
PrivateSrv string `json:"privateSrv,omitempty"`
|
||
}
|
||
|
||
// Cluster represents MongoDB cluster.
|
||
type Cluster struct {
|
||
AutoScaling *AutoScaling `json:"autoScaling,omitempty"`
|
||
BackupEnabled *bool `json:"backupEnabled,omitempty"`
|
||
BiConnector *BiConnector `json:"biConnector,omitempty"`
|
||
ClusterType string `json:"clusterType,omitempty"`
|
||
DiskSizeGB *float64 `json:"diskSizeGB,omitempty"`
|
||
EncryptionAtRestProvider string `json:"encryptionAtRestProvider,omitempty"`
|
||
Labels []Label `json:"labels,omitempty"`
|
||
ID string `json:"id,omitempty"`
|
||
GroupID string `json:"groupId,omitempty"`
|
||
MongoDBVersion string `json:"mongoDBVersion,omitempty"`
|
||
MongoDBMajorVersion string `json:"mongoDBMajorVersion,omitempty"`
|
||
MongoURI string `json:"mongoURI,omitempty"`
|
||
MongoURIUpdated string `json:"mongoURIUpdated,omitempty"`
|
||
MongoURIWithOptions string `json:"mongoURIWithOptions,omitempty"`
|
||
Name string `json:"name,omitempty"`
|
||
NumShards *int64 `json:"numShards,omitempty"`
|
||
Paused *bool `json:"paused,omitempty"`
|
||
PitEnabled *bool `json:"pitEnabled,omitempty"`
|
||
ProviderBackupEnabled *bool `json:"providerBackupEnabled,omitempty"`
|
||
ProviderSettings *ProviderSettings `json:"providerSettings,omitempty"`
|
||
ReplicationFactor *int64 `json:"replicationFactor,omitempty"`
|
||
ReplicationSpec map[string]RegionsConfig `json:"replicationSpec,omitempty"`
|
||
ReplicationSpecs []ReplicationSpec `json:"replicationSpecs,omitempty"`
|
||
SrvAddress string `json:"srvAddress,omitempty"`
|
||
StateName string `json:"stateName,omitempty"`
|
||
ConnectionStrings *ConnectionStrings `json:"connectionStrings,omitempty"`
|
||
}
|
||
|
||
// ProcessArgs represents the advanced configuration options for the cluster
|
||
type ProcessArgs struct {
|
||
FailIndexKeyTooLong *bool `json:"failIndexKeyTooLong,omitempty"`
|
||
JavascriptEnabled *bool `json:"javascriptEnabled,omitempty"`
|
||
MinimumEnabledTLSProtocol string `json:"minimumEnabledTlsProtocol,omitempty"`
|
||
NoTableScan *bool `json:"noTableScan,omitempty"`
|
||
OplogSizeMB *int64 `json:"oplogSizeMB,omitempty"`
|
||
SampleSizeBIConnector *int64 `json:"sampleSizeBIConnector,omitempty"`
|
||
SampleRefreshIntervalBIConnector *int64 `json:"sampleRefreshIntervalBIConnector,omitempty"`
|
||
}
|
||
|
||
// clustersResponse is the response from the ClustersService.List.
|
||
type clustersResponse struct {
|
||
Links []*Link `json:"links,omitempty"`
|
||
Results []Cluster `json:"results,omitempty"`
|
||
TotalCount int `json:"totalCount,omitempty"`
|
||
}
|
||
|
||
// DefaultDiskSizeGB represents the Tier and the default disk size for each one
|
||
// it can be use like: DefaultDiskSizeGB["AWS"]["M10"]
|
||
var DefaultDiskSizeGB = map[string]map[string]float64{
|
||
"TENANT": {
|
||
"M2": 2,
|
||
"M5": 5,
|
||
},
|
||
"AWS": {
|
||
"M10": 10,
|
||
"M20": 20,
|
||
"M30": 40,
|
||
"M40": 80,
|
||
"R40": 80,
|
||
"M40_NVME": 380,
|
||
"M50": 160,
|
||
"R50": 160,
|
||
"M50_NVME": 760,
|
||
"M60": 320,
|
||
"R60": 320,
|
||
"M60_NVME": 1600,
|
||
"M80": 750,
|
||
"R80": 750,
|
||
"M80_NVME": 1600,
|
||
"M140": 1000,
|
||
"M200": 1500,
|
||
"R200": 1500,
|
||
"M200_NVME": 3100,
|
||
"M300": 2000,
|
||
"R300": 2000,
|
||
"R400": 3000,
|
||
"M400_NVME": 4000,
|
||
},
|
||
"GCP": {
|
||
"M10": 10,
|
||
"M20": 20,
|
||
"M30": 40,
|
||
"M40": 80,
|
||
"M50": 160,
|
||
"M60": 320,
|
||
"M80": 750,
|
||
"M200": 1500,
|
||
"M300": 2200,
|
||
},
|
||
"AZURE": {
|
||
"M10": 32,
|
||
"M20": 32,
|
||
"M30": 32,
|
||
"M40": 128,
|
||
"M50": 128,
|
||
"M60": 128,
|
||
"M80": 256,
|
||
"M200": 256,
|
||
},
|
||
}
|
||
|
||
// List all clusters in the project associated to {GROUP-ID}.
|
||
// See more: https://docs.atlas.mongodb.com/reference/api/clusters-get-all/
|
||
func (s *ClustersServiceOp) List(ctx context.Context, groupID string, listOptions *ListOptions) ([]Cluster, *Response, error) {
|
||
path := fmt.Sprintf(clustersPath, groupID)
|
||
|
||
// Add query params from listOptions
|
||
path, err := setListOptions(path, listOptions)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
req, err := s.Client.NewRequest(ctx, http.MethodGet, path, nil)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
root := new(clustersResponse)
|
||
resp, err := s.Client.Do(ctx, req, root)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
if l := root.Links; l != nil {
|
||
resp.Links = l
|
||
}
|
||
|
||
return root.Results, resp, nil
|
||
}
|
||
|
||
// Get gets the cluster specified to {ClUSTER-NAME} from the project associated to {GROUP-ID}.
|
||
// See more: https://docs.atlas.mongodb.com/reference/api/clusters-get-one/
|
||
func (s *ClustersServiceOp) Get(ctx context.Context, groupID, clusterName string) (*Cluster, *Response, error) {
|
||
if err := checkClusterNameParam(clusterName); err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
basePath := fmt.Sprintf(clustersPath, groupID)
|
||
escapedEntry := url.PathEscape(clusterName)
|
||
path := fmt.Sprintf("%s/%s", basePath, escapedEntry)
|
||
|
||
req, err := s.Client.NewRequest(ctx, http.MethodGet, path, nil)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
root := new(Cluster)
|
||
resp, err := s.Client.Do(ctx, req, root)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return root, resp, err
|
||
}
|
||
|
||
// Create adds a cluster to the project associated to {GROUP-ID}.
|
||
// See more: https://docs.atlas.mongodb.com/reference/api/clusters-create-one/
|
||
func (s *ClustersServiceOp) Create(ctx context.Context, groupID string, createRequest *Cluster) (*Cluster, *Response, error) {
|
||
if createRequest == nil {
|
||
return nil, nil, NewArgError("createRequest", "cannot be nil")
|
||
}
|
||
|
||
path := fmt.Sprintf(clustersPath, groupID)
|
||
|
||
req, err := s.Client.NewRequest(ctx, http.MethodPost, path, createRequest)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
root := new(Cluster)
|
||
resp, err := s.Client.Do(ctx, req, root)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return root, resp, err
|
||
}
|
||
|
||
// Update a cluster in the project associated to {GROUP-ID}
|
||
// See more: https://docs.atlas.mongodb.com/reference/api/clusters-modify-one/
|
||
func (s *ClustersServiceOp) Update(ctx context.Context, groupID, clusterName string, updateRequest *Cluster) (*Cluster, *Response, error) {
|
||
if updateRequest == nil {
|
||
return nil, nil, NewArgError("updateRequest", "cannot be nil")
|
||
}
|
||
|
||
basePath := fmt.Sprintf(clustersPath, groupID)
|
||
path := fmt.Sprintf("%s/%s", basePath, clusterName)
|
||
|
||
req, err := s.Client.NewRequest(ctx, http.MethodPatch, path, updateRequest)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
root := new(Cluster)
|
||
resp, err := s.Client.Do(ctx, req, root)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return root, resp, err
|
||
}
|
||
|
||
// Delete the cluster specified to {CLUSTER-NAME} from the project associated to {GROUP-ID}.
|
||
// See more: https://docs.atlas.mongodb.com/reference/api/clusters-delete-one/
|
||
func (s *ClustersServiceOp) Delete(ctx context.Context, groupID, clusterName string) (*Response, error) {
|
||
if clusterName == "" {
|
||
return nil, NewArgError("clusterName", "must be set")
|
||
}
|
||
|
||
basePath := fmt.Sprintf(clustersPath, groupID)
|
||
escapedEntry := url.PathEscape(clusterName)
|
||
path := fmt.Sprintf("%s/%s", basePath, escapedEntry)
|
||
|
||
req, err := s.Client.NewRequest(ctx, http.MethodDelete, path, nil)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
resp, err := s.Client.Do(ctx, req, nil)
|
||
|
||
return resp, err
|
||
}
|
||
|
||
// UpdateProcessArgs Modifies Advanced Configuration Options for One Cluster
|
||
// See more: https://docs.atlas.mongodb.com/reference/api/clusters-modify-advanced-configuration-options/
|
||
func (s *ClustersServiceOp) UpdateProcessArgs(ctx context.Context, groupID, clusterName string, updateRequest *ProcessArgs) (*ProcessArgs, *Response, error) {
|
||
if updateRequest == nil {
|
||
return nil, nil, NewArgError("updateRequest", "cannot be nil")
|
||
}
|
||
|
||
basePath := fmt.Sprintf(clustersPath, groupID)
|
||
path := fmt.Sprintf("%s/%s/processArgs", basePath, clusterName)
|
||
|
||
req, err := s.Client.NewRequest(ctx, http.MethodPatch, path, updateRequest)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
root := new(ProcessArgs)
|
||
resp, err := s.Client.Do(ctx, req, root)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return root, resp, err
|
||
}
|
||
|
||
// GetProcessArgs gets the Advanced Configuration Options for One Cluster
|
||
// See more: https://docs.atlas.mongodb.com/reference/api/clusters-get-advanced-configuration-options/#get-advanced-configuration-options-for-one-cluster
|
||
func (s *ClustersServiceOp) GetProcessArgs(ctx context.Context, groupID, clusterName string) (*ProcessArgs, *Response, error) {
|
||
if err := checkClusterNameParam(clusterName); err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
basePath := fmt.Sprintf(clustersPath, groupID)
|
||
escapedEntry := url.PathEscape(clusterName)
|
||
path := fmt.Sprintf("%s/%s/processArgs", basePath, escapedEntry)
|
||
|
||
req, err := s.Client.NewRequest(ctx, http.MethodGet, path, nil)
|
||
if err != nil {
|
||
return nil, nil, err
|
||
}
|
||
|
||
root := new(ProcessArgs)
|
||
resp, err := s.Client.Do(ctx, req, root)
|
||
if err != nil {
|
||
return nil, resp, err
|
||
}
|
||
|
||
return root, resp, err
|
||
}
|
||
|
||
func checkClusterNameParam(clusterName string) error {
|
||
if clusterName == "" {
|
||
return NewArgError("name", "must be set")
|
||
}
|
||
return nil
|
||
}
|