diff --git a/mongodbatlas/mongodbatlas.go b/mongodbatlas/mongodbatlas.go index 48094a77f..105ec462b 100644 --- a/mongodbatlas/mongodbatlas.go +++ b/mongodbatlas/mongodbatlas.go @@ -140,6 +140,7 @@ type Client struct { ServerlessInstances ServerlessInstancesService LiveMigration LiveMigrationService AccessTracking AccessTrackingService + ServiceVersion ServiceVersionService onRequestCompleted RequestCompletionCallback } @@ -279,6 +280,7 @@ func NewClient(httpClient *http.Client) *Client { c.ServerlessInstances = &ServerlessInstancesServiceOp{Client: c} c.LiveMigration = &LiveMigrationServiceOp{Client: c} c.AccessTracking = &AccessTrackingServiceOp{Client: c} + c.ServiceVersion = &ServiceVersionServiceOp{Client: c} return c } @@ -564,3 +566,38 @@ func setListOptions(s string, opt interface{}) (string, error) { origURL.RawQuery = origValues.Encode() return origURL.String(), nil } + +// ServiceVersion represents version information. +type ServiceVersion struct { + GitHash string + Version string +} + +// String serializes VersionInfo into string. +func (v *ServiceVersion) String() string { + return fmt.Sprintf("gitHash=%s; versionString=%s", v.GitHash, v.Version) +} + +func parseVersionInfo(s string) *ServiceVersion { + if s == "" { + return nil + } + + var result ServiceVersion + pairs := strings.Split(s, ";") + for _, pair := range pairs { + keyvalue := strings.Split(strings.TrimSpace(pair), "=") + switch keyvalue[0] { + case "gitHash": + result.GitHash = keyvalue[1] + case "versionString": + result.Version = keyvalue[1] + } + } + return &result +} + +// ServiceVersion parses version information returned in the response. +func (resp *Response) ServiceVersion() *ServiceVersion { + return parseVersionInfo(resp.Header.Get("X-MongoDB-Service-Version")) +} diff --git a/mongodbatlas/service_version.go b/mongodbatlas/service_version.go new file mode 100644 index 000000000..283378060 --- /dev/null +++ b/mongodbatlas/service_version.go @@ -0,0 +1,51 @@ +// Copyright 2021 MongoDB Inc +// +// 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 mongodbatlas + +import ( + "context" + "net/http" +) + +const versionPath = "api/private/unauth/version" + +// ServiceVersionService is an interface for the version private endpoint of the MongoDB Atlas API. +// +// We currently make no promise to support or document this service or endpoint +// beyond what can be seen here. +type ServiceVersionService interface { + Get(context.Context) (*ServiceVersion, *Response, error) +} + +type ServiceVersionServiceOp struct { + Client PlainRequestDoer +} + +// Get gets the version information and parses it. +func (s *ServiceVersionServiceOp) Get(ctx context.Context) (*ServiceVersion, *Response, error) { + req, err := s.Client.NewPlainRequest(ctx, http.MethodGet, versionPath) + if err != nil { + return nil, nil, err + } + + resp, err := s.Client.Do(ctx, req, nil) + if err != nil { + return nil, nil, err + } + + version := resp.ServiceVersion() + + return version, resp, nil +} diff --git a/mongodbatlas/service_version_test.go b/mongodbatlas/service_version_test.go new file mode 100644 index 000000000..bb64711ea --- /dev/null +++ b/mongodbatlas/service_version_test.go @@ -0,0 +1,37 @@ +// Copyright 2021 MongoDB Inc +// +// 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 mongodbatlas + +import ( + "fmt" + "net/http" + "testing" +) + +func TestServiceVersionService_Get(t *testing.T) { + client, mux, teardown := setup() + defer teardown() + + mux.HandleFunc("/api/private/unauth/version", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, http.MethodGet) + fmt.Fprint(w, "someGitHash") + }) + + _, _, err := client.ServiceVersion.Get(ctx) + + if err != nil { + t.Fatalf("ServiceVersion.Get returned error: %v", err) + } +}