/
setup.go
83 lines (72 loc) · 3.15 KB
/
setup.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package loadbalancer
import (
"context"
"github.com/aws/aws-sdk-go/aws"
svcsdk "github.com/aws/aws-sdk-go/service/elbv2"
ctrl "sigs.k8s.io/controller-runtime"
xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1"
"github.com/crossplane/crossplane-runtime/pkg/connection"
"github.com/crossplane/crossplane-runtime/pkg/controller"
"github.com/crossplane/crossplane-runtime/pkg/event"
"github.com/crossplane/crossplane-runtime/pkg/meta"
"github.com/crossplane/crossplane-runtime/pkg/reconciler/managed"
"github.com/crossplane/crossplane-runtime/pkg/resource"
svcapitypes "github.com/crossplane/provider-aws/apis/elbv2/v1alpha1"
"github.com/crossplane/provider-aws/apis/v1alpha1"
"github.com/crossplane/provider-aws/pkg/features"
)
// SetupLoadBalancer adds a controller that reconciles LoadBalancer.
func SetupLoadBalancer(mgr ctrl.Manager, o controller.Options) error {
name := managed.ControllerName(svcapitypes.LoadBalancerGroupKind)
opts := []option{
func(e *external) {
e.postObserve = postObserve
e.postCreate = postCreate
e.preDelete = preDelete
e.preCreate = preCreate
},
}
cps := []managed.ConnectionPublisher{managed.NewAPISecretPublisher(mgr.GetClient(), mgr.GetScheme())}
if o.Features.Enabled(features.EnableAlphaExternalSecretStores) {
cps = append(cps, connection.NewDetailsManager(mgr.GetClient(), v1alpha1.StoreConfigGroupVersionKind))
}
return ctrl.NewControllerManagedBy(mgr).
Named(name).
WithOptions(o.ForControllerRuntime()).
For(&svcapitypes.LoadBalancer{}).
Complete(managed.NewReconciler(mgr,
resource.ManagedKind(svcapitypes.LoadBalancerGroupVersionKind),
managed.WithExternalConnecter(&connector{kube: mgr.GetClient(), opts: opts}),
managed.WithInitializers(),
managed.WithPollInterval(o.PollInterval),
managed.WithLogger(o.Logger.WithValues("controller", name)),
managed.WithRecorder(event.NewAPIRecorder(mgr.GetEventRecorderFor(name))),
managed.WithConnectionPublishers(cps...)))
}
func postObserve(_ context.Context, cr *svcapitypes.LoadBalancer, resp *svcsdk.DescribeLoadBalancersOutput, obs managed.ExternalObservation, err error) (managed.ExternalObservation, error) {
if err != nil {
return managed.ExternalObservation{}, err
}
switch aws.StringValue(resp.LoadBalancers[0].State.Code) {
case string(svcapitypes.LoadBalancerStateEnum_active):
cr.SetConditions(xpv1.Available())
case string(svcapitypes.LoadBalancerStateEnum_provisioning):
cr.SetConditions(xpv1.Creating())
}
return obs, nil
}
func postCreate(_ context.Context, cr *svcapitypes.LoadBalancer, resp *svcsdk.CreateLoadBalancerOutput, cre managed.ExternalCreation, err error) (managed.ExternalCreation, error) {
if err != nil {
return managed.ExternalCreation{}, err
}
meta.SetExternalName(cr, aws.StringValue(resp.LoadBalancers[0].LoadBalancerArn))
return cre, nil
}
func preDelete(_ context.Context, cr *svcapitypes.LoadBalancer, obj *svcsdk.DeleteLoadBalancerInput) (bool, error) {
obj.LoadBalancerArn = aws.String(meta.GetExternalName(cr))
return false, nil
}
func preCreate(_ context.Context, cr *svcapitypes.LoadBalancer, obj *svcsdk.CreateLoadBalancerInput) error {
obj.Type = cr.Spec.ForProvider.Type
return nil
}