Skip to content

Commit 210b54c

Browse files
authored
INTMDB-263: Added Private_link_endpoint_adl resource to go-client (#271)
1 parent cb00594 commit 210b54c

File tree

4 files changed

+614
-2
lines changed

4 files changed

+614
-2
lines changed

mongodbatlas/data_lakes.go

Lines changed: 126 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ import (
2020
"net/http"
2121
)
2222

23-
const dataLakesBasePath = "api/atlas/v1.0/groups"
23+
const (
24+
dataLakesBasePath = "api/atlas/v1.0/groups"
25+
privateLinkEndpointsDataLakePath = "api/atlas/v1.0/groups/%s/privateNetworkSettings/endpointIds"
26+
)
2427

2528
// DataLakeService is an interface for interfacing with the Data Lake endpoints of the MongoDB Atlas API.
2629
//
@@ -31,12 +34,18 @@ type DataLakeService interface {
3134
Create(context.Context, string, *DataLakeCreateRequest) (*DataLake, *Response, error)
3235
Update(context.Context, string, string, *DataLakeUpdateRequest) (*DataLake, *Response, error)
3336
Delete(context.Context, string, string) (*Response, error)
37+
CreatePrivateLinkEndpoint(context.Context, string, *PrivateLinkEndpointDataLake) (*PrivateLinkEndpointDataLakeResponse, *Response, error)
38+
GetPrivateLinkEndpoint(context.Context, string, string) (*PrivateLinkEndpointDataLake, *Response, error)
39+
ListPrivateLinkEndpoint(context.Context, string) (*PrivateLinkEndpointDataLakeResponse, *Response, error)
40+
DeletePrivateLinkEndpoint(context.Context, string, string) (*Response, error)
3441
}
3542

3643
// DataLakeServiceOp handles communication with the DataLakeService related methods of the
3744
// MongoDB Atlas API.
3845
type DataLakeServiceOp service
3946

47+
var _ DataLakeService = &DataLakeServiceOp{}
48+
4049
// AwsCloudProviderConfig is the data lake configuration for AWS.
4150
type AwsCloudProviderConfig struct {
4251
ExternalID string `json:"externalId,omitempty"`
@@ -126,6 +135,21 @@ type DataLakeCreateRequest struct {
126135
CloudProviderConfig *CloudProviderConfig `json:"cloudProviderConfig,omitempty"`
127136
}
128137

138+
// PrivateLinkEndpointDataLakeResponse represents MongoDB Private Endpoint Connection to DataLake.
139+
type PrivateLinkEndpointDataLakeResponse struct {
140+
Links []*Link `json:"links,omitempty"`
141+
Results []*PrivateLinkEndpointDataLake `json:"results"`
142+
TotalCount int `json:"totalCount"`
143+
}
144+
145+
// PrivateLinkEndpointDataLake represents the private link result for data lake.
146+
type PrivateLinkEndpointDataLake struct {
147+
Comment string `json:"comment,omitempty"`
148+
EndpointID string `json:"endpointId,omitempty"`
149+
Provider string `json:"provider,omitempty"`
150+
Type string `json:"type,omitempty"`
151+
}
152+
129153
// List gets all data lakes for the specified group.
130154
//
131155
// See more: https://docs.mongodb.com/datalake/reference/api/dataLakes-get-all-tenants
@@ -256,3 +280,104 @@ func (s *DataLakeServiceOp) Delete(ctx context.Context, groupID, name string) (*
256280

257281
return resp, err
258282
}
283+
284+
// CreatePrivateLinkEndpoint creates one private link endpoint in Data Lake Atlas project.
285+
//
286+
// See more: https://docs.mongodb.com/datalake/reference/api/dataLakes-private-link-create-one/#std-label-api-pvt-link-create-one
287+
func (s *DataLakeServiceOp) CreatePrivateLinkEndpoint(ctx context.Context, groupID string, createRequest *PrivateLinkEndpointDataLake) (*PrivateLinkEndpointDataLakeResponse, *Response, error) {
288+
if groupID == "" {
289+
return nil, nil, NewArgError("groupID", "must be set")
290+
}
291+
if createRequest == nil {
292+
return nil, nil, NewArgError("createRequest", "must be set")
293+
}
294+
295+
path := fmt.Sprintf(privateLinkEndpointsDataLakePath, groupID)
296+
297+
req, err := s.Client.NewRequest(ctx, http.MethodPost, path, createRequest)
298+
if err != nil {
299+
return nil, nil, err
300+
}
301+
302+
root := new(PrivateLinkEndpointDataLakeResponse)
303+
resp, err := s.Client.Do(ctx, req, root)
304+
if err != nil {
305+
return nil, resp, err
306+
}
307+
308+
return root, resp, err
309+
}
310+
311+
// DeletePrivateLinkEndpoint deletes the Data Lake private link endpoint with a given endpoint id.
312+
//
313+
// See more: https://docs.mongodb.com/datalake/reference/api/dataLakes-private-link-delete-one/#std-label-api-pvt-link-delete-one
314+
func (s *DataLakeServiceOp) DeletePrivateLinkEndpoint(ctx context.Context, groupID, endpointID string) (*Response, error) {
315+
if groupID == "" {
316+
return nil, NewArgError("groupId", "must be set")
317+
}
318+
if endpointID == "" {
319+
return nil, NewArgError("endpointID", "must be set")
320+
}
321+
322+
path := fmt.Sprintf("%s/%s", fmt.Sprintf(privateLinkEndpointsDataLakePath, groupID), endpointID)
323+
324+
req, err := s.Client.NewRequest(ctx, http.MethodDelete, path, nil)
325+
if err != nil {
326+
return nil, err
327+
}
328+
329+
resp, err := s.Client.Do(ctx, req, nil)
330+
331+
return resp, err
332+
}
333+
334+
// ListPrivateLinkEndpoint gets all private link endpoints for data lake for the specified group.
335+
//
336+
// See more: https://docs.atlas.mongodb.com/reference/api/online-archive-private-link-get-all/#std-label-api-online-archive-pvt-link-get-all
337+
func (s *DataLakeServiceOp) ListPrivateLinkEndpoint(ctx context.Context, groupID string) (*PrivateLinkEndpointDataLakeResponse, *Response, error) {
338+
if groupID == "" {
339+
return nil, nil, NewArgError("groupID", "must be set")
340+
}
341+
342+
path := fmt.Sprintf(privateLinkEndpointsDataLakePath, groupID)
343+
344+
req, err := s.Client.NewRequest(ctx, http.MethodGet, path, nil)
345+
if err != nil {
346+
return nil, nil, err
347+
}
348+
349+
var root = new(PrivateLinkEndpointDataLakeResponse)
350+
resp, err := s.Client.Do(ctx, req, root)
351+
if err != nil {
352+
return root, resp, err
353+
}
354+
355+
return root, resp, nil
356+
}
357+
358+
// GetPrivateLinkEndpoint gets the data lake private link endpoint associated with a specific group and endpointID.
359+
//
360+
// See more: https://docs.mongodb.com/datalake/reference/api/dataLakes-private-link-get-one/#std-label-api-pvt-link-get-one
361+
func (s *DataLakeServiceOp) GetPrivateLinkEndpoint(ctx context.Context, groupID, endpointID string) (*PrivateLinkEndpointDataLake, *Response, error) {
362+
if groupID == "" {
363+
return nil, nil, NewArgError("groupID", "must be set")
364+
}
365+
if endpointID == "" {
366+
return nil, nil, NewArgError("endpointID", "must be set")
367+
}
368+
369+
path := fmt.Sprintf("%s/%s", fmt.Sprintf(privateLinkEndpointsDataLakePath, groupID), endpointID)
370+
371+
req, err := s.Client.NewRequest(ctx, http.MethodGet, path, nil)
372+
if err != nil {
373+
return nil, nil, err
374+
}
375+
376+
root := new(PrivateLinkEndpointDataLake)
377+
resp, err := s.Client.Do(ctx, req, root)
378+
if err != nil {
379+
return nil, resp, err
380+
}
381+
382+
return root, resp, err
383+
}

mongodbatlas/data_lakes_test.go

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"encoding/json"
1919
"fmt"
2020
"net/http"
21+
"reflect"
2122
"testing"
2223

2324
"github.com/go-test/deep"
@@ -437,3 +438,185 @@ func TestDataLake_Delete(t *testing.T) {
437438
t.Fatalf("DataLakes.Delete returned error: %v", err)
438439
}
439440
}
441+
442+
func TestDataLake_CreatePrivateLinkEndpoint(t *testing.T) {
443+
client, mux, teardown := setup()
444+
defer teardown()
445+
446+
groupID := "6c7498dg87d9e6526801572b"
447+
448+
path := fmt.Sprintf("/api/atlas/v1.0/groups/%s/privateNetworkSettings/endpointIds", groupID)
449+
450+
createRequest := &PrivateLinkEndpointDataLake{
451+
EndpointID: "vpce-jjg5e24qp93513h03",
452+
Type: "DATA_LAKE",
453+
Provider: "AWS",
454+
Comment: "Private endpoint for Application Server A",
455+
}
456+
457+
mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
458+
expected := map[string]interface{}{
459+
"endpointId": "vpce-jjg5e24qp93513h03",
460+
"type": "DATA_LAKE",
461+
"provider": "AWS",
462+
"comment": "Private endpoint for Application Server A",
463+
}
464+
465+
var v map[string]interface{}
466+
err := json.NewDecoder(r.Body).Decode(&v)
467+
if err != nil {
468+
t.Fatalf("decode json: %v", err)
469+
}
470+
471+
if diff := deep.Equal(v, expected); diff != nil {
472+
t.Errorf("Request body\n got=%#v\nwant=%#v \n\ndiff=%#v", v, expected, diff)
473+
}
474+
475+
fmt.Fprint(w, `{
476+
"links" : [ {
477+
"href" : "https://cloud.mongodb.com/api/atlas/v1.0/groups/6c7498dg87d9e6526801572b/privateNetworkSettings/endpointIds?pretty=true&pageNum=1&itemsPerPage=100",
478+
"rel" : "self"
479+
} ],
480+
"results" : [ {
481+
"comment" : "Private endpoint for Application Server A",
482+
"endpointId" : "vpce-jjg5e24qp93513h03",
483+
"provider" : "AWS",
484+
"type" : "DATA_LAKE"
485+
} ],
486+
"totalCount" : 1
487+
}`)
488+
})
489+
490+
privateEndpointConnection, _, err := client.DataLakes.CreatePrivateLinkEndpoint(ctx, groupID, createRequest)
491+
if err != nil {
492+
t.Errorf("DataLakes.CreatePrivateLinkEndpoint returned error: %v", err)
493+
return
494+
}
495+
496+
expected := &PrivateLinkEndpointDataLakeResponse{
497+
Results: []*PrivateLinkEndpointDataLake{
498+
{
499+
EndpointID: "vpce-jjg5e24qp93513h03",
500+
Type: "DATA_LAKE",
501+
Provider: "AWS",
502+
Comment: "Private endpoint for Application Server A",
503+
},
504+
},
505+
Links: []*Link{
506+
{
507+
Href: "https://cloud.mongodb.com/api/atlas/v1.0/groups/6c7498dg87d9e6526801572b/privateNetworkSettings/endpointIds?pretty=true&pageNum=1&itemsPerPage=100",
508+
Rel: "self",
509+
},
510+
},
511+
TotalCount: 1,
512+
}
513+
514+
if !reflect.DeepEqual(privateEndpointConnection, expected) {
515+
t.Errorf("DataLakes.CreatePrivateLinkEndpoint\n got=%#v\nwant=%#v", privateEndpointConnection, expected)
516+
}
517+
}
518+
519+
func TestDataLake_GetPrivateLinkEndpoint(t *testing.T) {
520+
client, mux, teardown := setup()
521+
defer teardown()
522+
523+
groupID := "6c7498dg87d9e6526801572b"
524+
path := fmt.Sprintf("/api/atlas/v1.0/groups/%s/privateNetworkSettings/endpointIds/1", groupID)
525+
526+
mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
527+
testMethod(t, r, http.MethodGet)
528+
fmt.Fprint(w, `{
529+
"comment" : "Private endpoint for Application Server A",
530+
"endpointId" : "vpce-jjg5e24qp93513h03",
531+
"provider" : "AWS",
532+
"type" : "DATA_LAKE"
533+
}`)
534+
})
535+
536+
privateLinkEndpointADL, _, err := client.DataLakes.GetPrivateLinkEndpoint(ctx, groupID, "1")
537+
if err != nil {
538+
t.Fatalf("DataLakes.GetPrivateLinkEndpoint returned error: %v", err)
539+
}
540+
541+
expected := PrivateLinkEndpointDataLake{
542+
Comment: "Private endpoint for Application Server A",
543+
EndpointID: "vpce-jjg5e24qp93513h03",
544+
Provider: "AWS",
545+
Type: "DATA_LAKE",
546+
}
547+
548+
if diff := deep.Equal(privateLinkEndpointADL, &expected); diff != nil {
549+
t.Error(diff)
550+
}
551+
}
552+
553+
func TestDataLake_ListPrivateLinkEndpoint(t *testing.T) {
554+
client, mux, teardown := setup()
555+
defer teardown()
556+
557+
groupID := "6c7498dg87d9e6526801572b"
558+
559+
path := fmt.Sprintf("/api/atlas/v1.0/groups/%s/privateNetworkSettings/endpointIds", groupID)
560+
561+
mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
562+
testMethod(t, r, http.MethodGet)
563+
fmt.Fprint(w, `{
564+
"links" : [ {
565+
"href" : "https://cloud.mongodb.com/api/atlas/v1.0/groups/6c7498dg87d9e6526801572b/privateNetworkSettings/endpointIds?pretty=true&pageNum=1&itemsPerPage=100",
566+
"rel" : "self"
567+
} ],
568+
"results" : [ {
569+
"comment" : "Private endpoint for Application Server A",
570+
"endpointId" : "vpce-jjg5e24qp93513h03",
571+
"provider" : "AWS",
572+
"type" : "DATA_LAKE"
573+
} ],
574+
"totalCount" : 1
575+
}`)
576+
})
577+
578+
privateLinkEndpoints, _, err := client.DataLakes.ListPrivateLinkEndpoint(ctx, groupID)
579+
if err != nil {
580+
t.Fatalf("DataLakes.ListPrivateLinkEndpoint returned error: %v", err)
581+
}
582+
583+
expected := &PrivateLinkEndpointDataLakeResponse{
584+
Results: []*PrivateLinkEndpointDataLake{
585+
{
586+
EndpointID: "vpce-jjg5e24qp93513h03",
587+
Type: "DATA_LAKE",
588+
Provider: "AWS",
589+
Comment: "Private endpoint for Application Server A",
590+
},
591+
},
592+
Links: []*Link{
593+
{
594+
Href: "https://cloud.mongodb.com/api/atlas/v1.0/groups/6c7498dg87d9e6526801572b/privateNetworkSettings/endpointIds?pretty=true&pageNum=1&itemsPerPage=100",
595+
Rel: "self",
596+
},
597+
},
598+
TotalCount: 1,
599+
}
600+
601+
if !reflect.DeepEqual(privateLinkEndpoints, expected) {
602+
t.Errorf("DataLakes.ListPrivateLinkEndpoint\n got=%#v\nwant=%#v", privateLinkEndpoints, expected)
603+
}
604+
}
605+
606+
func TestDataLake_DeletePrivateLinkEndpoint(t *testing.T) {
607+
client, mux, teardown := setup()
608+
defer teardown()
609+
610+
groupID := "6c7498dg87d9e6526801572b"
611+
612+
path := fmt.Sprintf("/api/atlas/v1.0/groups/%s/privateNetworkSettings/endpointIds/1", groupID)
613+
614+
mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) {
615+
testMethod(t, r, http.MethodDelete)
616+
})
617+
618+
_, err := client.DataLakes.DeletePrivateLinkEndpoint(ctx, groupID, "1")
619+
if err != nil {
620+
t.Errorf("DataLakes.DeletePrivateLinkEndpoint returned error: %v", err)
621+
}
622+
}

0 commit comments

Comments
 (0)