@@ -2,28 +2,97 @@ package cloud
22
33import (
44 "fmt"
5+ "time"
56
7+ v1 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1"
68 "github.com/mongodb/mongodb-atlas-kubernetes/pkg/api/v1/status"
9+ "github.com/mongodb/mongodb-atlas-kubernetes/test/e2e/api/gcp"
710)
811
912type gcpAction struct {}
1013
11- func (gcpAction * gcpAction ) createPrivateEndpoint (pe status.ProjectPrivateEndpoint , privatelinkName string ) (string , string , error ) {
12- fmt .Print ("NOT IMPLEMENTED create GCP LINK" )
13- return "some test" , "IP if req" , nil
14+ var (
15+ // TODO get from GCP
16+ googleProjectID = "atlasoperator" // Google Cloud Project ID
17+ googleVPC = "atlas-operator-test" // VPC Name
18+ googleSubnetName = "atlas-operator-subnet-leo" // Subnet Name
19+ googleConnectPrefix = "ao" // Private Service Connect Endpoint Prefix
20+ )
21+
22+ func (gcpAction * gcpAction ) createPrivateEndpoint (pe status.ProjectPrivateEndpoint , privatelinkName string ) (v1.PrivateEndpoint , error ) {
23+ session , err := gcp .SessionGCP (googleProjectID )
24+ if err != nil {
25+ return v1.PrivateEndpoint {}, err
26+ }
27+ var cResponse v1.PrivateEndpoint
28+ for i , target := range pe .ServiceAttachmentNames {
29+ addressName := formAddressName (privatelinkName , i )
30+ ruleName := formRuleName (privatelinkName , i )
31+ ip , err := session .AddIPAdress (pe .Region , addressName , googleSubnetName )
32+ if err != nil {
33+ return v1.PrivateEndpoint {}, err
34+ }
35+
36+ cResponse .Endpoints = append (cResponse .Endpoints , v1.GCPEndpoint {
37+ EndpointName : ruleName ,
38+ IPAddress : ip ,
39+ })
40+ cResponse .EndpointGroupName = googleVPC
41+ cResponse .Region = pe .Region
42+ cResponse .Provider = pe .Provider
43+ cResponse .GCPProjectID = googleProjectID
44+
45+ session .AddForwardRule (pe .Region , ruleName , addressName , googleVPC , googleSubnetName , target )
46+ }
47+ return cResponse , nil
1448}
1549
1650func (gcpAction * gcpAction ) deletePrivateEndpoint (pe status.ProjectPrivateEndpoint , privatelinkName string ) error {
17- fmt .Print ("NOT IMPLEMENTED delete GCP LINK" )
51+ session , err := gcp .SessionGCP (googleProjectID )
52+ if err != nil {
53+ return err
54+ }
55+ for i := range pe .Endpoints {
56+ session .DeleteForwardRule (pe .Region , formRuleName (privatelinkName , i ), 10 , 20 * time .Second )
57+ session .DeleteIPAdress (pe .Region , formAddressName (privatelinkName , i ))
58+ }
1859 return nil
1960}
2061
2162func (gcpAction * gcpAction ) statusPrivateEndpointPending (region , privateID string ) bool {
22- fmt .Print ("NOT IMPLEMENTED delete GCP LINK" )
23- return true
63+ session , err := gcp .SessionGCP (googleProjectID )
64+ if err != nil {
65+ fmt .Print (err )
66+ return false
67+ }
68+ ruleName := formRuleName (privateID , 1 )
69+ result , err := session .DescribePrivateLinkStatus (region , ruleName )
70+ if err != nil {
71+ fmt .Print (err )
72+ return false
73+ }
74+ return (result == "PENDING" )
2475}
2576
2677func (gcpAction * gcpAction ) statusPrivateEndpointAvailable (region , privateID string ) bool {
27- fmt .Print ("NOT IMPLEMENTED delete GCP LINK" )
28- return true
78+ session , err := gcp .SessionGCP (googleProjectID )
79+ if err != nil {
80+ fmt .Print (err )
81+ return false
82+ }
83+ ruleName := formRuleName (privateID , 1 )
84+ result , err := session .DescribePrivateLinkStatus (region , ruleName )
85+ if err != nil {
86+ fmt .Print (err )
87+ return false
88+ }
89+ return (result == "ACCEPTED" )
90+ }
91+
92+ func formAddressName (name string , i int ) string {
93+ return fmt .Sprintf ("%s%s-ip-%d" , googleConnectPrefix , name , i )
94+ }
95+
96+ func formRuleName (name string , i int ) string {
97+ return fmt .Sprintf ("%s%s-%d" , googleConnectPrefix , name , i )
2998}
0 commit comments