/
provider_types.go
135 lines (115 loc) · 4.49 KB
/
provider_types.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package v1alpha1
import (
"context"
console "github.com/pluralsh/console-client-go"
"github.com/samber/lo"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func init() {
SchemeBuilder.Register(&Provider{}, &ProviderList{})
}
// CloudSettingsGetter is just a helper function that can be implemented to properly
// build Console API attributes
// +kubebuilder:object:generate:=false
type CloudSettingsGetter func(context.Context, Provider) (*console.CloudProviderSettingsAttributes, error)
// Hasher
// +kubebuilder:object:generate:=false
type Hasher func(interface{}) (string, error)
type CloudProvider string
func (c CloudProvider) Attribute() *string {
return lo.ToPtr(string(c))
}
const (
AWS CloudProvider = "aws"
Azure CloudProvider = "azure"
GCP CloudProvider = "gcp"
)
// CloudProviderSettings ...
type CloudProviderSettings struct {
// +kubebuilder:validation:Optional
AWS *v1.SecretReference `json:"aws,omitempty"`
// +kubebuilder:validation:Optional
Azure *v1.SecretReference `json:"azure,omitempty"`
// +kubebuilder:validation:Optional
GCP *v1.SecretReference `json:"gcp,omitempty"`
}
// Provider ...
// +kubebuilder:object:root=true
// +kubebuilder:resource:scope=Cluster
// +kubebuilder:subresource:status
// +kubebuilder:printcolumn:name="ID",type="string",JSONPath=".status.id",description="ID of the provider in the Console API."
// +kubebuilder:printcolumn:name="Name",type="string",JSONPath=".spec.name",description="Human-readable name of the Provider."
// +kubebuilder:printcolumn:name="Cloud",type="string",JSONPath=".spec.cloud",description="Name of the Provider cloud service."
type Provider struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
// +kubebuilder:validation:Required
Spec ProviderSpec `json:"spec"`
// +kubebuilder:validation:Optional
Status Status `json:"status,omitempty"`
}
func (p *Provider) Attributes(ctx context.Context, cloudSettingsGetter CloudSettingsGetter) (console.ClusterProviderAttributes, error) {
cloudSettings, err := cloudSettingsGetter(ctx, *p)
return console.ClusterProviderAttributes{
Name: p.Spec.Name,
Namespace: &p.Spec.Namespace,
Cloud: p.Spec.Cloud.Attribute(),
CloudSettings: cloudSettings,
}, err
}
func (p *Provider) UpdateAttributes(ctx context.Context, cloudSettingsGetter CloudSettingsGetter) (console.ClusterProviderUpdateAttributes, error) {
cloudSettings, err := cloudSettingsGetter(ctx, *p)
return console.ClusterProviderUpdateAttributes{
CloudSettings: cloudSettings,
}, err
}
func (p *Provider) Diff(ctx context.Context, getter CloudSettingsGetter, hasher Hasher) (changed bool, sha string, err error) {
cloudSettings, err := getter(ctx, *p)
if err != nil {
return false, "", err
}
currentSha, err := hasher(cloudSettings)
if err != nil {
return false, "", err
}
return !p.Status.IsSHAEqual(currentSha), currentSha, nil
}
func (p *Provider) SetCondition(condition metav1.Condition) {
meta.SetStatusCondition(&p.Status.Conditions, condition)
}
// ProviderList ...
// +kubebuilder:object:root=true
type ProviderList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []Provider `json:"items"`
}
// ProviderSpec ...
type ProviderSpec struct {
// Cloud is the name of the cloud service for the Provider.
// One of (CloudProvider): [gcp, aws, azure]
// +kubebuilder:example:=aws
// +kubebuilder:validation:Required
// +kubebuilder:validation:Type:=string
// +kubebuilder:validation:Enum:=gcp;aws;azure
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="Cloud is immutable"
Cloud CloudProvider `json:"cloud"`
// CloudSettings reference cloud provider credentials secrets used for provisioning the Cluster.
// Not required when Cloud is set to CloudProvider(BYOK).
// +kubebuilder:validation:Optional
// +kubebuilder:validation:Type:=object
// +structType=atomic
CloudSettings *CloudProviderSettings `json:"cloudSettings"`
// Name is a human-readable name of the Provider.
// +kubebuilder:example:=gcp-provider
// +kubebuilder:validation:Optional
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="Name is immutable"
Name string `json:"name"`
// Namespace is the namespace ClusterAPI resources are deployed into.
// +kubebuilder:example:=capi-gcp
// +kubebuilder:validation:Optional
// +kubebuilder:validation:XValidation:rule="self == oldSelf",message="Namespace is immutable"
Namespace string `json:"namespace,omitempty"`
}