Skip to content

Commit 30362bb

Browse files
authored
Improve SDK, add readme (#1915)
* move configvarresolver into standalone package to lessen ctrl-runtime dependency further * add readme * fix anexia tests
1 parent ed388a8 commit 30362bb

File tree

37 files changed

+522
-441
lines changed

37 files changed

+522
-441
lines changed

pkg/admission/machines.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"k8c.io/machine-controller/sdk/apis/cluster/common"
2929
clusterv1alpha1 "k8c.io/machine-controller/sdk/apis/cluster/v1alpha1"
3030
"k8c.io/machine-controller/sdk/providerconfig"
31+
"k8c.io/machine-controller/sdk/providerconfig/configvar"
3132
"k8c.io/machine-controller/sdk/userdata"
3233

3334
admissionv1 "k8s.io/api/admission/v1"
@@ -129,8 +130,8 @@ func (ad *admissionData) defaultAndValidateMachineSpec(ctx context.Context, spec
129130
}
130131
}
131132

132-
skg := providerconfig.NewConfigVarResolver(ctx, ad.workerClient)
133-
prov, err := cloudprovider.ForProvider(providerConfig.CloudProvider, skg)
133+
configResolver := configvar.NewResolver(ctx, ad.workerClient)
134+
prov, err := cloudprovider.ForProvider(providerConfig.CloudProvider, configResolver)
134135
if err != nil {
135136
return fmt.Errorf("failed to get cloud provider %q: %w", providerConfig.CloudProvider, err)
136137
}

pkg/cloudprovider/provider.go

+25-25
Original file line numberDiff line numberDiff line change
@@ -51,88 +51,88 @@ var (
5151
// ErrProviderNotFound tells that the requested cloud provider was not found.
5252
ErrProviderNotFound = errors.New("cloudprovider not found")
5353

54-
providers = map[providerconfig.CloudProvider]func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider{
55-
providerconfig.CloudProviderDigitalocean: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
54+
providers = map[providerconfig.CloudProvider]func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider{
55+
providerconfig.CloudProviderDigitalocean: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
5656
return digitalocean.New(cvr)
5757
},
58-
providerconfig.CloudProviderAWS: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
58+
providerconfig.CloudProviderAWS: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
5959
return aws.New(cvr)
6060
},
61-
providerconfig.CloudProviderOpenstack: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
61+
providerconfig.CloudProviderOpenstack: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
6262
return openstack.New(cvr)
6363
},
64-
providerconfig.CloudProviderGoogle: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
64+
providerconfig.CloudProviderGoogle: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
6565
return gce.New(cvr)
6666
},
67-
providerconfig.CloudProviderHetzner: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
67+
providerconfig.CloudProviderHetzner: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
6868
return hetzner.New(cvr)
6969
},
70-
providerconfig.CloudProviderVsphere: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
70+
providerconfig.CloudProviderVsphere: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
7171
return vsphere.New(cvr)
7272
},
73-
providerconfig.CloudProviderAzure: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
73+
providerconfig.CloudProviderAzure: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
7474
return azure.New(cvr)
7575
},
76-
providerconfig.CloudProviderEquinixMetal: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
76+
providerconfig.CloudProviderEquinixMetal: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
7777
return equinixmetal.New(cvr)
7878
},
7979
// NB: This is explicitly left to allow old Packet machines to be deleted.
8080
// We can handle those machines in the same way as Equinix Metal machines
8181
// because there are no API changes.
8282
// TODO: Remove this after deprecation period.
83-
providerconfig.CloudProviderPacket: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
83+
providerconfig.CloudProviderPacket: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
8484
return equinixmetal.New(cvr)
8585
},
86-
providerconfig.CloudProviderFake: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
86+
providerconfig.CloudProviderFake: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
8787
return fake.New(cvr)
8888
},
89-
providerconfig.CloudProviderEdge: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
89+
providerconfig.CloudProviderEdge: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
9090
return edge.New(cvr)
9191
},
92-
providerconfig.CloudProviderKubeVirt: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
92+
providerconfig.CloudProviderKubeVirt: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
9393
return kubevirt.New(cvr)
9494
},
95-
providerconfig.CloudProviderAlibaba: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
95+
providerconfig.CloudProviderAlibaba: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
9696
return alibaba.New(cvr)
9797
},
98-
providerconfig.CloudProviderScaleway: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
98+
providerconfig.CloudProviderScaleway: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
9999
return scaleway.New(cvr)
100100
},
101-
providerconfig.CloudProviderAnexia: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
101+
providerconfig.CloudProviderAnexia: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
102102
return anexia.New(cvr)
103103
},
104-
providerconfig.CloudProviderBaremetal: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
104+
providerconfig.CloudProviderBaremetal: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
105105
// TODO(MQ): add a baremetal driver.
106106
return baremetal.New(cvr)
107107
},
108-
providerconfig.CloudProviderNutanix: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
108+
providerconfig.CloudProviderNutanix: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
109109
return nutanix.New(cvr)
110110
},
111-
providerconfig.CloudProviderVMwareCloudDirector: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
111+
providerconfig.CloudProviderVMwareCloudDirector: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
112112
return vcd.New(cvr)
113113
},
114-
providerconfig.CloudProviderExternal: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
114+
providerconfig.CloudProviderExternal: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
115115
return external.New(cvr)
116116
},
117117
}
118118

119119
// communityProviders holds a map of cloud providers that have been implemented by community members and
120120
// contributed to machine-controller. They are not end-to-end tested by the machine-controller development team.
121-
communityProviders = map[providerconfig.CloudProvider]func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider{
122-
providerconfig.CloudProviderLinode: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
121+
communityProviders = map[providerconfig.CloudProvider]func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider{
122+
providerconfig.CloudProviderLinode: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
123123
return linode.New(cvr)
124124
},
125-
providerconfig.CloudProviderVultr: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
125+
providerconfig.CloudProviderVultr: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
126126
return vultr.New(cvr)
127127
},
128-
providerconfig.CloudProviderOpenNebula: func(cvr *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
128+
providerconfig.CloudProviderOpenNebula: func(cvr providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
129129
return opennebula.New(cvr)
130130
},
131131
}
132132
)
133133

134134
// ForProvider returns a CloudProvider actuator for the requested provider.
135-
func ForProvider(p providerconfig.CloudProvider, cvr *providerconfig.ConfigVarResolver) (cloudprovidertypes.Provider, error) {
135+
func ForProvider(p providerconfig.CloudProvider, cvr providerconfig.ConfigVarResolver) (cloudprovidertypes.Provider, error) {
136136
if p, found := providers[p]; found {
137137
return NewValidationCacheWrappingCloudProvider(p(cvr)), nil
138138
}

pkg/cloudprovider/provider/alibaba/provider.go

+11-11
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ const (
5656
)
5757

5858
type provider struct {
59-
configVarResolver *providerconfig.ConfigVarResolver
59+
configVarResolver providerconfig.ConfigVarResolver
6060
}
6161

6262
type Config struct {
@@ -104,7 +104,7 @@ func (a *alibabaInstance) Status() instance.Status {
104104
}
105105

106106
// New returns an Alibaba cloud provider.
107-
func New(configVarResolver *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
107+
func New(configVarResolver providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
108108
return &provider{configVarResolver: configVarResolver}
109109
}
110110

@@ -356,40 +356,40 @@ func (p *provider) getConfig(provSpec clusterv1alpha1.ProviderSpec) (*Config, *p
356356
}
357357

358358
c := Config{}
359-
c.AccessKeyID, err = p.configVarResolver.GetConfigVarStringValueOrEnv(rawConfig.AccessKeyID, "ALIBABA_ACCESS_KEY_ID")
359+
c.AccessKeyID, err = p.configVarResolver.GetStringValueOrEnv(rawConfig.AccessKeyID, "ALIBABA_ACCESS_KEY_ID")
360360
if err != nil {
361361
return nil, nil, fmt.Errorf("failed to get the value of \"AccessKeyID\" field, error = %w", err)
362362
}
363-
c.AccessKeySecret, err = p.configVarResolver.GetConfigVarStringValueOrEnv(rawConfig.AccessKeySecret, "ALIBABA_ACCESS_KEY_SECRET")
363+
c.AccessKeySecret, err = p.configVarResolver.GetStringValueOrEnv(rawConfig.AccessKeySecret, "ALIBABA_ACCESS_KEY_SECRET")
364364
if err != nil {
365365
return nil, nil, fmt.Errorf("failed to get the value of \"AccessKeySecret\" field, error = %w", err)
366366
}
367-
c.InstanceType, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.InstanceType)
367+
c.InstanceType, err = p.configVarResolver.GetStringValue(rawConfig.InstanceType)
368368
if err != nil {
369369
return nil, nil, fmt.Errorf("failed to get the value of \"instanceType\" field, error = %w", err)
370370
}
371-
c.RegionID, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.RegionID)
371+
c.RegionID, err = p.configVarResolver.GetStringValue(rawConfig.RegionID)
372372
if err != nil {
373373
return nil, nil, fmt.Errorf("failed to get the value of \"regionID\" field, error = %w", err)
374374
}
375-
c.VSwitchID, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.VSwitchID)
375+
c.VSwitchID, err = p.configVarResolver.GetStringValue(rawConfig.VSwitchID)
376376
if err != nil {
377377
return nil, nil, fmt.Errorf("failed to get the value of \"vSwitchID\" field, error = %w", err)
378378
}
379-
c.ZoneID, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.ZoneID)
379+
c.ZoneID, err = p.configVarResolver.GetStringValue(rawConfig.ZoneID)
380380
if err != nil {
381381
return nil, nil, fmt.Errorf("failed to get the value of \"zoneID\" field, error = %w", err)
382382
}
383-
c.InternetMaxBandwidthOut, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.InternetMaxBandwidthOut)
383+
c.InternetMaxBandwidthOut, err = p.configVarResolver.GetStringValue(rawConfig.InternetMaxBandwidthOut)
384384
if err != nil {
385385
return nil, nil, fmt.Errorf("failed to get the value of \"internetMaxBandwidthOut\" field, error = %w", err)
386386
}
387387
c.Labels = rawConfig.Labels
388-
c.DiskType, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.DiskType)
388+
c.DiskType, err = p.configVarResolver.GetStringValue(rawConfig.DiskType)
389389
if err != nil {
390390
return nil, nil, fmt.Errorf("failed to get the value of \"diskType\" field, error = %w", err)
391391
}
392-
c.DiskSize, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.DiskSize)
392+
c.DiskSize, err = p.configVarResolver.GetStringValue(rawConfig.DiskSize)
393393
if err != nil {
394394
return nil, nil, fmt.Errorf("failed to get the value of \"diskSize\" field, error = %w", err)
395395
}

pkg/cloudprovider/provider/anexia/provider.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ const (
5555
)
5656

5757
type provider struct {
58-
configVarResolver *providerconfig.ConfigVarResolver
58+
configVarResolver providerconfig.ConfigVarResolver
5959
}
6060

6161
func (p *provider) Create(ctx context.Context, log *zap.SugaredLogger, machine *clusterv1alpha1.Machine, data *cloudprovidertypes.ProviderData, userdata string) (instance instance.Instance, retErr error) {
@@ -249,7 +249,7 @@ func (p *provider) getConfig(ctx context.Context, log *zap.SugaredLogger, provSp
249249
}
250250

251251
// New returns an Anexia provider.
252-
func New(configVarResolver *providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
252+
func New(configVarResolver providerconfig.ConfigVarResolver) cloudprovidertypes.Provider {
253253
return &provider{configVarResolver: configVarResolver}
254254
}
255255

pkg/cloudprovider/provider/anexia/provider_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,14 @@ import (
3939
"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/progress"
4040
"go.anx.io/go-anxcloud/pkg/vsphere/provisioning/vm"
4141
"go.uber.org/zap"
42+
"sigs.k8s.io/controller-runtime/pkg/client/fake"
4243

4344
cloudprovidererrors "k8c.io/machine-controller/pkg/cloudprovider/errors"
4445
cloudprovidertypes "k8c.io/machine-controller/pkg/cloudprovider/types"
4546
clusterv1alpha1 "k8c.io/machine-controller/sdk/apis/cluster/v1alpha1"
4647
anxtypes "k8c.io/machine-controller/sdk/cloudprovider/anexia"
4748
providerconfigtypes "k8c.io/machine-controller/sdk/providerconfig"
49+
"k8c.io/machine-controller/sdk/providerconfig/configvar"
4850

4951
"k8s.io/apimachinery/pkg/api/meta"
5052
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -239,7 +241,7 @@ func TestAnexiaProvider(t *testing.T) {
239241
},
240242
}
241243

242-
provider := New(nil).(*provider)
244+
provider := New(configvar.NewResolver(context.Background(), fake.NewClientBuilder().Build())).(*provider)
243245
for _, testCase := range testCases {
244246
templateID, err := provider.resolveTemplateID(context.Background(), a, testCase.config, "foo")
245247
if testCase.expectedError != "" {
@@ -368,7 +370,7 @@ func TestValidate(t *testing.T) {
368370
},
369371
)
370372

371-
provider := New(nil)
373+
provider := New(configvar.NewResolver(context.Background(), fake.NewClientBuilder().Build()))
372374
for _, testCase := range getSpecsForValidationTest(t, configCases) {
373375
err := provider.Validate(context.Background(), zap.NewNop().Sugar(), testCase.Spec)
374376
if testCase.ExpectedError != nil {

pkg/cloudprovider/provider/anexia/resolve_config.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ type resolvedConfig struct {
6060
}
6161

6262
func (p *provider) resolveTemplateID(ctx context.Context, a api.API, config anxtypes.RawConfig, locationID string) (string, error) {
63-
templateName, err := p.configVarResolver.GetConfigVarStringValue(config.Template)
63+
templateName, err := p.configVarResolver.GetStringValue(config.Template)
6464
if err != nil {
6565
return "", fmt.Errorf("failed to get 'template': %w", err)
6666
}
6767

68-
templateBuild, err := p.configVarResolver.GetConfigVarStringValue(config.TemplateBuild)
68+
templateBuild, err := p.configVarResolver.GetStringValue(config.TemplateBuild)
6969
if err != nil {
7070
return "", fmt.Errorf("failed to get 'templateBuild': %w", err)
7171
}
@@ -87,7 +87,7 @@ func (p *provider) resolveNetworkConfig(log *zap.SugaredLogger, config anxtypes.
8787

8888
log.Info("Configuration uses the deprecated VlanID attribute, please migrate to the Networks array instead.")
8989

90-
vlanID, err := p.configVarResolver.GetConfigVarStringValue(config.VlanID)
90+
vlanID, err := p.configVarResolver.GetStringValue(config.VlanID)
9191
if err != nil {
9292
return nil, fmt.Errorf("failed to get 'vlanID': %w", err)
9393
}
@@ -102,14 +102,14 @@ func (p *provider) resolveNetworkConfig(log *zap.SugaredLogger, config anxtypes.
102102

103103
ret := make([]resolvedNetwork, len(config.Networks))
104104
for netIndex, net := range config.Networks {
105-
vlanID, err := p.configVarResolver.GetConfigVarStringValue(net.VlanID)
105+
vlanID, err := p.configVarResolver.GetStringValue(net.VlanID)
106106
if err != nil {
107107
return nil, fmt.Errorf("failed to get 'vlanID' for network %v: %w", netIndex, err)
108108
}
109109

110110
prefixes := make([]string, len(net.PrefixIDs))
111111
for prefixIndex, prefix := range net.PrefixIDs {
112-
prefixID, err := p.configVarResolver.GetConfigVarStringValue(prefix)
112+
prefixID, err := p.configVarResolver.GetStringValue(prefix)
113113
if err != nil {
114114
return nil, fmt.Errorf("failed to get 'prefixID' for network %v, prefix %v: %w", netIndex, prefixIndex, err)
115115
}
@@ -145,7 +145,7 @@ func (p *provider) resolveDiskConfig(log *zap.SugaredLogger, config anxtypes.Raw
145145
ret := make([]resolvedDisk, len(config.Disks))
146146

147147
for idx, disk := range config.Disks {
148-
performanceType, err := p.configVarResolver.GetConfigVarStringValue(disk.PerformanceType)
148+
performanceType, err := p.configVarResolver.GetStringValue(disk.PerformanceType)
149149
if err != nil {
150150
return nil, fmt.Errorf("failed to get 'performanceType' of disk %v: %w", idx, err)
151151
}
@@ -165,17 +165,17 @@ func (p *provider) resolveConfig(ctx context.Context, log *zap.SugaredLogger, co
165165
RawConfig: config,
166166
}
167167

168-
ret.Token, err = p.configVarResolver.GetConfigVarStringValueOrEnv(config.Token, anxtypes.AnxTokenEnv)
168+
ret.Token, err = p.configVarResolver.GetStringValueOrEnv(config.Token, anxtypes.AnxTokenEnv)
169169
if err != nil {
170170
return nil, fmt.Errorf("failed to get 'token': %w", err)
171171
}
172172

173-
ret.LocationID, err = p.configVarResolver.GetConfigVarStringValue(config.LocationID)
173+
ret.LocationID, err = p.configVarResolver.GetStringValue(config.LocationID)
174174
if err != nil {
175175
return nil, fmt.Errorf("failed to get 'locationID': %w", err)
176176
}
177177

178-
ret.TemplateID, err = p.configVarResolver.GetConfigVarStringValue(config.TemplateID)
178+
ret.TemplateID, err = p.configVarResolver.GetStringValue(config.TemplateID)
179179
if err != nil {
180180
return nil, fmt.Errorf("failed to get 'templateID': %w", err)
181181
}

0 commit comments

Comments
 (0)