Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(ec2): vpcpeeringconnection fixed fields for resolvers, change tagger #1035

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions apis/ec2/generator-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,14 @@ ignore:
- DeleteVpcPeeringConnectionInput.DryRun
- RejectVpcPeeringConnectionInput.DryRun
- AcceptVpcPeeringConnectionInput.DryRun
- CreateVpcPeeringConnectionInput.VPCID
- DeleteVpcPeeringConnectionInput.VPCID
- RejectVpcPeeringConnectionInput.VPCID
- AcceptVpcPeeringConnectionInput.VPCID
- CreateVpcPeeringConnectionInput.PeerVPCID
- DeleteVpcPeeringConnectionInput.PeerVPCID
- RejectVpcPeeringConnectionInput.PeerVPCID
- AcceptVpcPeeringConnectionInput.PeerVPCID
- CreateVpcPeeringConnectionInput.VpcId
- DeleteVpcPeeringConnectionInput.VpcId
- RejectVpcPeeringConnectionInput.VpcId
- AcceptVpcPeeringConnectionInput.VpcId
- CreateVpcPeeringConnectionInput.PeerVpcId
- DeleteVpcPeeringConnectionInput.PeerVpcId
- RejectVpcPeeringConnectionInput.PeerVpcId
- AcceptVpcPeeringConnectionInput.PeerVpcId
- CreateVolumeInput.DryRun
- CreateVolumeInput.KmsKeyId
- CreateTransitGatewayInput.DryRun
Expand Down
4 changes: 4 additions & 0 deletions apis/ec2/v1alpha1/custom_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ type CustomVPCPeeringConnectionParameters struct {
// will be created, but will be in pending-acceptance state. This will only lead to an active
// connection if both VPCs are in the same tenant.
AcceptRequest bool `json:"acceptRequest,omitempty"`

// Metadata tagging key value pairs
// +optional
Tags []Tag `json:"tags,omitempty"`
}

// CustomTransitGatewayParameters are custom parameters for TransitGateway
Expand Down
27 changes: 7 additions & 20 deletions apis/ec2/v1alpha1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 0 additions & 4 deletions apis/ec2/v1alpha1/zz_types.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 1 addition & 6 deletions apis/ec2/v1alpha1/zz_vpc_peering_connection.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions package/crds/ec2.aws.crossplane.io_vpcpeeringconnections.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,16 @@ spec:
type: array
type: object
type: array
tags:
description: Metadata tagging key value pairs
items:
properties:
key:
type: string
value:
type: string
type: object
type: array
vpcID:
description: The ID of the requester VPC. You must specify this
parameter in the request.
Expand Down
65 changes: 49 additions & 16 deletions pkg/controller/ec2/vpcpeeringconnection/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package vpcpeeringconnection

import (
"context"
"sort"
"time"

"github.com/aws/aws-sdk-go/aws"
Expand All @@ -14,6 +15,7 @@ import (
"github.com/crossplane/crossplane-runtime/pkg/ratelimiter"
"github.com/crossplane/crossplane-runtime/pkg/reconciler/managed"
"github.com/crossplane/crossplane-runtime/pkg/resource"
"github.com/pkg/errors"

svcapitypes "github.com/crossplane/provider-aws/apis/ec2/v1alpha1"
awsclients "github.com/crossplane/provider-aws/pkg/clients"
Expand All @@ -24,6 +26,10 @@ import (
"sigs.k8s.io/controller-runtime/pkg/controller"
)

const (
errKubeUpdateFailed = "cannot update VPCPeeringConnection"
)

// SetupVPCPeeringConnection adds a controller that reconciles VPCPeeringConnection.
func SetupVPCPeeringConnection(mgr ctrl.Manager, l logging.Logger, rl workqueue.RateLimiter, poll time.Duration) error {
name := managed.ControllerName(svcapitypes.VPCPeeringConnectionGroupKind)
Expand All @@ -48,6 +54,7 @@ func SetupVPCPeeringConnection(mgr ctrl.Manager, l logging.Logger, rl workqueue.
managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}),
managed.WithCreationGracePeriod(3*time.Minute),
managed.WithLogger(l.WithValues("controller", name)),
managed.WithInitializers(&tagger{kube: mgr.GetClient()}),
managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name)))))
}

Expand Down Expand Up @@ -115,21 +122,8 @@ func (e *custom) isUpToDate(cr *svcapitypes.VPCPeeringConnection, obj *svcsdk.De
}

func preCreate(ctx context.Context, cr *svcapitypes.VPCPeeringConnection, obj *svcsdk.CreateVpcPeeringConnectionInput) error {
// set external name as tag on the vpc peering connection
resType := "vpc-peering-connection"
key := "crossplane-claim-name"
value := cr.ObjectMeta.Name

spec := svcsdk.TagSpecification{
ResourceType: &resType,
Tags: []*svcsdk.Tag{
{
Key: &key,
Value: &value,
},
},
}
obj.TagSpecifications = append(obj.TagSpecifications, &spec)
obj.PeerVpcId = cr.Spec.ForProvider.PeerVPCID
obj.VpcId = cr.Spec.ForProvider.VPCID

return nil
}
Expand All @@ -138,8 +132,47 @@ func (e *custom) postCreate(ctx context.Context, cr *svcapitypes.VPCPeeringConne
if err != nil {
return managed.ExternalCreation{}, err
}
// set peering connection id as external name annotation on k8s object after creation

// set peering connection id as external name annotation on k8s object after creation
meta.SetExternalName(cr, aws.StringValue(obj.VpcPeeringConnection.VpcPeeringConnectionId))
return cre, nil
}

type tagger struct {
kube client.Client
}

func (t *tagger) Initialize(ctx context.Context, mgd resource.Managed) error {
cr, ok := mgd.(*svcapitypes.VPCPeeringConnection)
if !ok {
return errors.New(errUnexpectedObject)
}
var vpcPeeringConnectionTags svcapitypes.TagSpecification
for _, tagSpecification := range cr.Spec.ForProvider.TagSpecifications {
if aws.StringValue(tagSpecification.ResourceType) == "vpc-peering-connection" {
vpcPeeringConnectionTags = *tagSpecification
}
}

tagMap := map[string]string{}
tagMap["Name"] = cr.Name
for _, t := range vpcPeeringConnectionTags.Tags {
tagMap[aws.StringValue(t.Key)] = aws.StringValue(t.Value)
}
for k, v := range resource.GetExternalTags(mgd) {
tagMap[k] = v
}
vpcPeeringConnectionTags.Tags = make([]*svcapitypes.Tag, len(tagMap))
vpcPeeringConnectionTags.ResourceType = aws.String("vpc-peering-connection")
i := 0
for k, v := range tagMap {
vpcPeeringConnectionTags.Tags[i] = &svcapitypes.Tag{Key: aws.String(k), Value: aws.String(v)}
i++
}
sort.Slice(vpcPeeringConnectionTags.Tags, func(i, j int) bool {
return aws.StringValue(vpcPeeringConnectionTags.Tags[i].Key) < aws.StringValue(vpcPeeringConnectionTags.Tags[j].Key)
})

cr.Spec.ForProvider.TagSpecifications = []*svcapitypes.TagSpecification{&vpcPeeringConnectionTags}
return errors.Wrap(t.kube.Update(ctx, cr), errKubeUpdateFailed)
}
40 changes: 17 additions & 23 deletions pkg/controller/ec2/vpcpeeringconnection/zz_conversions.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.