From 172336ae19b86f5556d93199fe54b4d3cbd54f34 Mon Sep 17 00:00:00 2001 From: zhengjiajin Date: Tue, 18 Jan 2022 18:31:19 +0800 Subject: [PATCH] support gcp internal vpc peering --- pkg/controller/vpcpeering/peering.go | 46 ++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/pkg/controller/vpcpeering/peering.go b/pkg/controller/vpcpeering/peering.go index 8af3dc1a7..f5f386a60 100644 --- a/pkg/controller/vpcpeering/peering.go +++ b/pkg/controller/vpcpeering/peering.go @@ -1,6 +1,9 @@ package vpcpeering import ( + "fmt" + "strings" + "github.com/crossplane/crossplane-runtime/pkg/event" "github.com/crossplane/crossplane-runtime/pkg/logging" "github.com/crossplane/crossplane-runtime/pkg/ratelimiter" @@ -107,7 +110,24 @@ func (e *external) Create(ctx context.Context, mg resource.Managed) (managed.Ext PeerNetwork: peer.Spec.ForProvider.PeerNetwork, AutoCreateRoutes: true, }).Do() + if err != nil { + return managed.ExternalCreation{}, err + } + project, network, err := parsePeerNetwork(peer.Spec.ForProvider.PeerNetwork) + if err != nil { + return managed.ExternalCreation{}, err + } + if project == peer.Spec.ForProvider.Project { + _, err := e.compute.Networks.AddPeering(project, network, &compute.NetworksAddPeeringRequest{ + Name: peer.Spec.ForProvider.Name, + PeerNetwork: peer.Spec.ForProvider.Network, + AutoCreateRoutes: true, + }).Do() + if err != nil && !gcp.IsErrorAlreadyExists(err) { + return managed.ExternalCreation{}, err + } + } return managed.ExternalCreation{}, errors.Wrap(resource.Ignore(gcp.IsErrorAlreadyExists, err), errCreatePeering) } @@ -137,5 +157,31 @@ func (e *external) Delete(ctx context.Context, mg resource.Managed) error { Name: peer.Spec.ForProvider.Name, }).Do() + project, network, err := parsePeerNetwork(peer.Spec.ForProvider.PeerNetwork) + if err != nil { + return err + } + if project == peer.Spec.ForProvider.Project { + _, err = e.compute.Networks.RemovePeering(project, network, &compute.NetworksRemovePeeringRequest{ + Name: peer.Spec.ForProvider.Name, + }).Do() + if err != nil && !gcp.IsErrorNotFound(err) { + return err + } + } + return errors.Wrap(resource.Ignore(gcp.IsErrorNotFound, err), errDeletePeering) } + +func parsePeerNetwork(peerNetwork string) (project string, Network string, err error) { + res := strings.TrimPrefix(peerNetwork, "https://www.googleapis.com/compute/v1/projects/") + item := strings.Split(res, "/") + if len(item) < 2 { + return "", "", fmt.Errorf("invalid peer network url") + } + + return item[0], item[len(item)-1], nil +} +func newPeerNetwork(project string, network string) string { + return fmt.Sprintf("https://www.googleapis.com/compute/v1/projects/%s/global/networks/%s", project, network) +}