From 488da60f1b4a6d03a025d7f264562c0d3099f60a Mon Sep 17 00:00:00 2001 From: Filipe Constantinov Menezes Date: Wed, 1 Sep 2021 17:30:58 +0100 Subject: [PATCH 1/5] CLOUDP-82836: Parse service version --- mongodbatlas/mongodbatlas.go | 37 +++++++++++++++++++++++ mongodbatlas/service_version.go | 44 ++++++++++++++++++++++++++++ mongodbatlas/service_version_test.go | 37 +++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 mongodbatlas/service_version.go create mode 100644 mongodbatlas/service_version_test.go diff --git a/mongodbatlas/mongodbatlas.go b/mongodbatlas/mongodbatlas.go index 48094a77f..6d8c73ad4 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 +} + +// GetServiceVersion parses version information returned in the response +func (r *Response) GetServiceVersion() *ServiceVersion { + return parseVersionInfo(r.Header.Get("X-MongoDB-Service-Version")) +} diff --git a/mongodbatlas/service_version.go b/mongodbatlas/service_version.go new file mode 100644 index 000000000..d07817c72 --- /dev/null +++ b/mongodbatlas/service_version.go @@ -0,0 +1,44 @@ +// 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 interfacing with the version private endpoint of the MongoDB Atlas API. +type ServiceVersionService interface { + Get(context.Context) (*ServiceVersion, *Response, error) +} + +type ServiceVersionServiceOp service + +// Get gets a compressed (.gz) log file that contains a range of log messages for a particular host. +func (s *ServiceVersionServiceOp) Get(ctx context.Context) (*ServiceVersion, *Response, error) { + req, err := s.Client.NewRequest(ctx, http.MethodGet, versionPath, nil) + if err != nil { + return nil, nil, err + } + + resp, err := s.Client.Do(ctx, req, nil) + if err != nil { + return nil, nil, err + } + + return resp.GetServiceVersion(), 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) + } +} From efda2c34d1438953ad74ff34c8bee1bc3c67e06d Mon Sep 17 00:00:00 2001 From: Filipe Constantinov Menezes Date: Wed, 1 Sep 2021 17:34:35 +0100 Subject: [PATCH 2/5] Fix godocs --- mongodbatlas/service_version.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mongodbatlas/service_version.go b/mongodbatlas/service_version.go index d07817c72..ef6b4cb24 100644 --- a/mongodbatlas/service_version.go +++ b/mongodbatlas/service_version.go @@ -21,14 +21,14 @@ import ( const versionPath = "api/private/unauth/version" -// ServiceVersionService is an interface for interfacing with the version private endpoint of the MongoDB Atlas API. +// ServiceVersionService is an interface for the version private endpoint of the MongoDB Atlas API. type ServiceVersionService interface { Get(context.Context) (*ServiceVersion, *Response, error) } type ServiceVersionServiceOp service -// Get gets a compressed (.gz) log file that contains a range of log messages for a particular host. +// Get gets the version information and parses it func (s *ServiceVersionServiceOp) Get(ctx context.Context) (*ServiceVersion, *Response, error) { req, err := s.Client.NewRequest(ctx, http.MethodGet, versionPath, nil) if err != nil { From d05620be0f87b1ee33431e5692f362c36e389252 Mon Sep 17 00:00:00 2001 From: Filipe Constantinov Menezes Date: Wed, 1 Sep 2021 17:39:52 +0100 Subject: [PATCH 3/5] Fix lint --- mongodbatlas/mongodbatlas.go | 10 +++++----- mongodbatlas/service_version.go | 6 ++++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/mongodbatlas/mongodbatlas.go b/mongodbatlas/mongodbatlas.go index 6d8c73ad4..fc5fbe4ef 100644 --- a/mongodbatlas/mongodbatlas.go +++ b/mongodbatlas/mongodbatlas.go @@ -567,13 +567,13 @@ func setListOptions(s string, opt interface{}) (string, error) { return origURL.String(), nil } -// ServiceVersion represents version information +// ServiceVersion represents version information. type ServiceVersion struct { GitHash string Version string } -// String serializes VersionInfo into string +// String serializes VersionInfo into string. func (v *ServiceVersion) String() string { return fmt.Sprintf("gitHash=%s; versionString=%s", v.GitHash, v.Version) } @@ -597,7 +597,7 @@ func parseVersionInfo(s string) *ServiceVersion { return &result } -// GetServiceVersion parses version information returned in the response -func (r *Response) GetServiceVersion() *ServiceVersion { - return parseVersionInfo(r.Header.Get("X-MongoDB-Service-Version")) +// GetServiceVersion parses version information returned in the response. +func (resp *Response) GetServiceVersion() *ServiceVersion { + return parseVersionInfo(resp.Header.Get("X-MongoDB-Service-Version")) } diff --git a/mongodbatlas/service_version.go b/mongodbatlas/service_version.go index ef6b4cb24..09e5d215b 100644 --- a/mongodbatlas/service_version.go +++ b/mongodbatlas/service_version.go @@ -28,7 +28,7 @@ type ServiceVersionService interface { type ServiceVersionServiceOp service -// Get gets the version information and parses it +// Get gets the version information and parses it. func (s *ServiceVersionServiceOp) Get(ctx context.Context) (*ServiceVersion, *Response, error) { req, err := s.Client.NewRequest(ctx, http.MethodGet, versionPath, nil) if err != nil { @@ -40,5 +40,7 @@ func (s *ServiceVersionServiceOp) Get(ctx context.Context) (*ServiceVersion, *Re return nil, nil, err } - return resp.GetServiceVersion(), resp, nil + version := resp.GetServiceVersion() + + return version, resp, nil } From 6938f3cc1c6a0e9ed7bd5f3c625b75192169247e Mon Sep 17 00:00:00 2001 From: Filipe Constantinov Menezes Date: Thu, 2 Sep 2021 12:04:12 +0100 Subject: [PATCH 4/5] PR comments --- mongodbatlas/mongodbatlas.go | 4 ++-- mongodbatlas/service_version.go | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mongodbatlas/mongodbatlas.go b/mongodbatlas/mongodbatlas.go index fc5fbe4ef..105ec462b 100644 --- a/mongodbatlas/mongodbatlas.go +++ b/mongodbatlas/mongodbatlas.go @@ -597,7 +597,7 @@ func parseVersionInfo(s string) *ServiceVersion { return &result } -// GetServiceVersion parses version information returned in the response. -func (resp *Response) GetServiceVersion() *ServiceVersion { +// 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 index 09e5d215b..c4286231e 100644 --- a/mongodbatlas/service_version.go +++ b/mongodbatlas/service_version.go @@ -22,6 +22,9 @@ import ( 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) } @@ -40,7 +43,7 @@ func (s *ServiceVersionServiceOp) Get(ctx context.Context) (*ServiceVersion, *Re return nil, nil, err } - version := resp.GetServiceVersion() + version := resp.ServiceVersion() return version, resp, nil } From 4601dca803c10c176a01e1d5644f0cd8c12ded0c Mon Sep 17 00:00:00 2001 From: Filipe Constantinov Menezes Date: Thu, 2 Sep 2021 12:32:35 +0100 Subject: [PATCH 5/5] Change to plain request --- mongodbatlas/service_version.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mongodbatlas/service_version.go b/mongodbatlas/service_version.go index c4286231e..283378060 100644 --- a/mongodbatlas/service_version.go +++ b/mongodbatlas/service_version.go @@ -29,11 +29,13 @@ type ServiceVersionService interface { Get(context.Context) (*ServiceVersion, *Response, error) } -type ServiceVersionServiceOp service +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.NewRequest(ctx, http.MethodGet, versionPath, nil) + req, err := s.Client.NewPlainRequest(ctx, http.MethodGet, versionPath) if err != nil { return nil, nil, err }