Skip to content

Commit 67e65cf

Browse files
authored
Unmarshal provider configs in strict mode (#1186)
* GetConfig in strict mode Signed-off-by: Artiom Diomin <[email protected]> * Alias alpha1 to clusterv1alpha1 Signed-off-by: Artiom Diomin <[email protected]> * Rename s to provSpec Signed-off-by: Artiom Diomin <[email protected]> * Unmarshal providerSpec and cloudprovider.Config strictly Signed-off-by: Artiom Diomin <[email protected]> * Fix testdata Signed-off-by: Artiom Diomin <[email protected]>
1 parent a8c2066 commit 67e65cf

File tree

40 files changed

+481
-341
lines changed

40 files changed

+481
-341
lines changed

cmd/machine-controller/main.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ import (
4242
machinesv1alpha1 "github.com/kubermatic/machine-controller/pkg/machines/v1alpha1"
4343
"github.com/kubermatic/machine-controller/pkg/node"
4444
"github.com/kubermatic/machine-controller/pkg/signals"
45-
4645
osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1"
4746

4847
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"

examples/openstack-machinedeployment.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ spec:
131131
# UUID of the server group
132132
# used to configure affinity or anti-affinity of the VM instaces relative to hypervisor
133133
serverGroup: ""
134-
rhsmOfflineToken: "<< REDHAT_SUBSCRIPTIONS_OFFLINE_TOKEN >>"
135134
securityGroups:
136135
- configMapKeyRef:
137136
namespace: kube-system

pkg/cloudprovider/provider/alibaba/provider.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package alibaba
1818

1919
import (
2020
"encoding/base64"
21-
"encoding/json"
2221
"errors"
2322
"fmt"
2423
"net/http"
@@ -27,7 +26,7 @@ import (
2726
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
2827

2928
"github.com/kubermatic/machine-controller/pkg/apis/cluster/common"
30-
"github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1"
29+
clusterv1alpha1 "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1"
3130
cloudprovidererrors "github.com/kubermatic/machine-controller/pkg/cloudprovider/errors"
3231
"github.com/kubermatic/machine-controller/pkg/cloudprovider/instance"
3332
alibabatypes "github.com/kubermatic/machine-controller/pkg/cloudprovider/provider/alibaba/types"
@@ -104,11 +103,11 @@ func New(configVarResolver *providerconfig.ConfigVarResolver) cloudprovidertypes
104103
return &provider{configVarResolver: configVarResolver}
105104
}
106105

107-
func (p *provider) AddDefaults(spec v1alpha1.MachineSpec) (v1alpha1.MachineSpec, error) {
106+
func (p *provider) AddDefaults(spec clusterv1alpha1.MachineSpec) (clusterv1alpha1.MachineSpec, error) {
108107
return spec, nil
109108
}
110109

111-
func (p *provider) Validate(machineSpec v1alpha1.MachineSpec) error {
110+
func (p *provider) Validate(machineSpec clusterv1alpha1.MachineSpec) error {
112111
c, pc, err := p.getConfig(machineSpec.ProviderSpec)
113112
if err != nil {
114113
return fmt.Errorf("failed to parse config: %v", err)
@@ -149,7 +148,7 @@ func (p *provider) Validate(machineSpec v1alpha1.MachineSpec) error {
149148
return nil
150149
}
151150

152-
func (p *provider) Get(machine *v1alpha1.Machine, data *cloudprovidertypes.ProviderData) (instance.Instance, error) {
151+
func (p *provider) Get(machine *clusterv1alpha1.Machine, data *cloudprovidertypes.ProviderData) (instance.Instance, error) {
153152
c, _, err := p.getConfig(machine.Spec.ProviderSpec)
154153
if err != nil {
155154
return nil, cloudprovidererrors.TerminalError{
@@ -195,11 +194,11 @@ func (p *provider) Get(machine *v1alpha1.Machine, data *cloudprovidertypes.Provi
195194
return nil, fmt.Errorf("instance %v is not ready", foundInstance.InstanceId)
196195
}
197196

198-
func (p *provider) GetCloudConfig(spec v1alpha1.MachineSpec) (config string, name string, err error) {
197+
func (p *provider) GetCloudConfig(spec clusterv1alpha1.MachineSpec) (config string, name string, err error) {
199198
return "", "", nil
200199
}
201200

202-
func (p *provider) Create(machine *v1alpha1.Machine, data *cloudprovidertypes.ProviderData, userdata string) (instance.Instance, error) {
201+
func (p *provider) Create(machine *clusterv1alpha1.Machine, data *cloudprovidertypes.ProviderData, userdata string) (instance.Instance, error) {
203202
c, pc, err := p.getConfig(machine.Spec.ProviderSpec)
204203
if err != nil {
205204
return nil, cloudprovidererrors.TerminalError{
@@ -243,7 +242,7 @@ func (p *provider) Create(machine *v1alpha1.Machine, data *cloudprovidertypes.Pr
243242
return nil, fmt.Errorf("failed to create instance at Alibaba cloud: %v", err)
244243
}
245244

246-
if err = data.Update(machine, func(updatedMachine *v1alpha1.Machine) {
245+
if err = data.Update(machine, func(updatedMachine *clusterv1alpha1.Machine) {
247246
if !kuberneteshelper.HasFinalizer(updatedMachine, finalizerInstance) {
248247
updatedMachine.Finalizers = append(updatedMachine.Finalizers, finalizerInstance)
249248
}
@@ -259,7 +258,7 @@ func (p *provider) Create(machine *v1alpha1.Machine, data *cloudprovidertypes.Pr
259258
return &alibabaInstance{instance: foundInstance}, nil
260259
}
261260

262-
func (p *provider) Cleanup(machine *v1alpha1.Machine, data *cloudprovidertypes.ProviderData) (bool, error) {
261+
func (p *provider) Cleanup(machine *clusterv1alpha1.Machine, data *cloudprovidertypes.ProviderData) (bool, error) {
263262
foundInstance, err := p.Get(machine, data)
264263
if err != nil {
265264
if err == cloudprovidererrors.ErrInstanceNotFound {
@@ -292,7 +291,7 @@ func (p *provider) Cleanup(machine *v1alpha1.Machine, data *cloudprovidertypes.P
292291
return false, nil
293292
}
294293

295-
func (p *provider) MachineMetricsLabels(machine *v1alpha1.Machine) (map[string]string, error) {
294+
func (p *provider) MachineMetricsLabels(machine *clusterv1alpha1.Machine) (map[string]string, error) {
296295
labels := make(map[string]string)
297296

298297
c, _, err := p.getConfig(machine.Spec.ProviderSpec)
@@ -304,7 +303,7 @@ func (p *provider) MachineMetricsLabels(machine *v1alpha1.Machine) (map[string]s
304303
return labels, err
305304
}
306305

307-
func (p *provider) MigrateUID(machine *v1alpha1.Machine, new types.UID) error {
306+
func (p *provider) MigrateUID(machine *clusterv1alpha1.Machine, new types.UID) error {
308307
c, _, err := p.getConfig(machine.Spec.ProviderSpec)
309308
if err != nil {
310309
return fmt.Errorf("failed to decode providerconfig: %v", err)
@@ -337,16 +336,16 @@ func (p *provider) MigrateUID(machine *v1alpha1.Machine, new types.UID) error {
337336
return nil
338337
}
339338

340-
func (p *provider) SetMetricsForMachines(machines v1alpha1.MachineList) error {
339+
func (p *provider) SetMetricsForMachines(machines clusterv1alpha1.MachineList) error {
341340
return nil
342341
}
343342

344-
func (p *provider) getConfig(s v1alpha1.ProviderSpec) (*Config, *providerconfigtypes.Config, error) {
345-
if s.Value == nil {
343+
func (p *provider) getConfig(provSpec clusterv1alpha1.ProviderSpec) (*Config, *providerconfigtypes.Config, error) {
344+
if provSpec.Value == nil {
346345
return nil, nil, errors.New("machine.spec.providerconfig.value is nil")
347346
}
348-
pconfig := providerconfigtypes.Config{}
349-
err := json.Unmarshal(s.Value.Raw, &pconfig)
347+
348+
pconfig, err := providerconfigtypes.GetConfig(provSpec)
350349
if err != nil {
351350
return nil, nil, fmt.Errorf("failed to decode providers config: %v", err)
352351
}
@@ -355,8 +354,8 @@ func (p *provider) getConfig(s v1alpha1.ProviderSpec) (*Config, *providerconfigt
355354
return nil, nil, errors.New("operatingSystemSpec in the MachineDeployment cannot be empty")
356355
}
357356

358-
rawConfig := alibabatypes.RawConfig{}
359-
if err = json.Unmarshal(pconfig.CloudProviderSpec.Raw, &rawConfig); err != nil {
357+
rawConfig, err := alibabatypes.GetConfig(*pconfig)
358+
if err != nil {
360359
return nil, nil, fmt.Errorf("failed to decode alibaba providers config: %v", err)
361360
}
362361

@@ -398,7 +397,8 @@ func (p *provider) getConfig(s v1alpha1.ProviderSpec) (*Config, *providerconfigt
398397
if err != nil {
399398
return nil, nil, fmt.Errorf("failed to get the value of \"diskSize\" field, error = %v", err)
400399
}
401-
return &c, &pconfig, err
400+
401+
return &c, pconfig, err
402402
}
403403

404404
func getClient(regionID, accessKeyID, accessKeySecret string) (*ecs.Client, error) {
@@ -434,7 +434,7 @@ func getInstance(client *ecs.Client, instanceName string, uid string) (*ecs.Inst
434434
return &response.Instances.Instance[0], nil
435435
}
436436

437-
func (p *provider) getImageIDForOS(machineSpec v1alpha1.MachineSpec, os providerconfigtypes.OperatingSystem) (string, error) {
437+
func (p *provider) getImageIDForOS(machineSpec clusterv1alpha1.MachineSpec, os providerconfigtypes.OperatingSystem) (string, error) {
438438
c, _, err := p.getConfig(machineSpec.ProviderSpec)
439439
if err != nil {
440440
return "", fmt.Errorf("failed to get alibaba client: %v", err)

pkg/cloudprovider/provider/alibaba/types/types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package types
1818

1919
import (
20+
"github.com/kubermatic/machine-controller/pkg/jsonutil"
2021
providerconfigtypes "github.com/kubermatic/machine-controller/pkg/providerconfig/types"
2122
)
2223

@@ -33,3 +34,9 @@ type RawConfig struct {
3334
DiskType providerconfigtypes.ConfigVarString `json:"diskType,omitempty"`
3435
DiskSize providerconfigtypes.ConfigVarString `json:"diskSize,omitempty"`
3536
}
37+
38+
func GetConfig(pconfig providerconfigtypes.Config) (*RawConfig, error) {
39+
rawConfig := &RawConfig{}
40+
41+
return rawConfig, jsonutil.StrictUnmarshal(pconfig.CloudProviderSpec.Raw, rawConfig)
42+
}

pkg/cloudprovider/provider/anexia/provider.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import (
3030
anxvm "github.com/anexia-it/go-anxcloud/pkg/vsphere/provisioning/vm"
3131

3232
"github.com/kubermatic/machine-controller/pkg/apis/cluster/common"
33-
"github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1"
33+
clusterv1alpha1 "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1"
3434
"github.com/kubermatic/machine-controller/pkg/cloudprovider/common/ssh"
3535
cloudprovidererrors "github.com/kubermatic/machine-controller/pkg/cloudprovider/errors"
3636
"github.com/kubermatic/machine-controller/pkg/cloudprovider/instance"
@@ -57,22 +57,22 @@ type provider struct {
5757
configVarResolver *providerconfig.ConfigVarResolver
5858
}
5959

60-
func (p *provider) getConfig(s v1alpha1.ProviderSpec) (*Config, *providerconfigtypes.Config, error) {
61-
if s.Value == nil {
60+
func (p *provider) getConfig(provSpec clusterv1alpha1.ProviderSpec) (*Config, *providerconfigtypes.Config, error) {
61+
if provSpec.Value == nil {
6262
return nil, nil, fmt.Errorf("machine.spec.providerSpec.value is nil")
6363
}
64-
pConfig := providerconfigtypes.Config{}
65-
err := json.Unmarshal(s.Value.Raw, &pConfig)
64+
65+
pconfig, err := providerconfigtypes.GetConfig(provSpec)
6666
if err != nil {
6767
return nil, nil, err
6868
}
6969

70-
if pConfig.OperatingSystemSpec.Raw == nil {
70+
if pconfig.OperatingSystemSpec.Raw == nil {
7171
return nil, nil, errors.New("operatingSystemSpec in the MachineDeployment cannot be empty")
7272
}
7373

74-
rawConfig := anxtypes.RawConfig{}
75-
if err = json.Unmarshal(pConfig.CloudProviderSpec.Raw, &rawConfig); err != nil {
74+
rawConfig, err := anxtypes.GetConfig(*pconfig)
75+
if err != nil {
7676
return nil, nil, err
7777
}
7878

@@ -101,7 +101,7 @@ func (p *provider) getConfig(s v1alpha1.ProviderSpec) (*Config, *providerconfigt
101101
return nil, nil, fmt.Errorf("failed to get 'vlanID': %v", err)
102102
}
103103

104-
return &c, &pConfig, nil
104+
return &c, pconfig, nil
105105
}
106106

107107
// New returns an Anexia provider
@@ -110,12 +110,12 @@ func New(configVarResolver *providerconfig.ConfigVarResolver) cloudprovidertypes
110110
}
111111

112112
// AddDefaults adds omitted optional values to the given MachineSpec
113-
func (p *provider) AddDefaults(spec v1alpha1.MachineSpec) (v1alpha1.MachineSpec, error) {
113+
func (p *provider) AddDefaults(spec clusterv1alpha1.MachineSpec) (clusterv1alpha1.MachineSpec, error) {
114114
return spec, nil
115115
}
116116

117117
// Validate returns success or failure based according to its ProviderSpec
118-
func (p *provider) Validate(machinespec v1alpha1.MachineSpec) error {
118+
func (p *provider) Validate(machinespec clusterv1alpha1.MachineSpec) error {
119119
config, _, err := p.getConfig(machinespec.ProviderSpec)
120120
if err != nil {
121121
return fmt.Errorf("failed to parse config: %w", err)
@@ -152,7 +152,7 @@ func (p *provider) Validate(machinespec v1alpha1.MachineSpec) error {
152152
return nil
153153
}
154154

155-
func (p *provider) Get(machine *v1alpha1.Machine, _ *cloudprovidertypes.ProviderData) (instance.Instance, error) {
155+
func (p *provider) Get(machine *clusterv1alpha1.Machine, _ *cloudprovidertypes.ProviderData) (instance.Instance, error) {
156156
config, _, err := p.getConfig(machine.Spec.ProviderSpec)
157157
if err != nil {
158158
return nil, newError(common.InvalidConfigurationMachineError, "failed to parse MachineSpec: %v", err)
@@ -185,12 +185,12 @@ func (p *provider) Get(machine *v1alpha1.Machine, _ *cloudprovidertypes.Provider
185185
}, nil
186186
}
187187

188-
func (p *provider) GetCloudConfig(spec v1alpha1.MachineSpec) (string, string, error) {
188+
func (p *provider) GetCloudConfig(spec clusterv1alpha1.MachineSpec) (string, string, error) {
189189
return "", "", nil
190190
}
191191

192192
// Create creates a cloud instance according to the given machine
193-
func (p *provider) Create(machine *v1alpha1.Machine, providerData *cloudprovidertypes.ProviderData, userdata string) (instance.Instance, error) {
193+
func (p *provider) Create(machine *clusterv1alpha1.Machine, providerData *cloudprovidertypes.ProviderData, userdata string) (instance.Instance, error) {
194194
config, _, err := p.getConfig(machine.Spec.ProviderSpec)
195195
if err != nil {
196196
return nil, newError(common.InvalidConfigurationMachineError, "failed to parse MachineSpec: %v", err)
@@ -273,7 +273,7 @@ func (p *provider) Create(machine *v1alpha1.Machine, providerData *cloudprovider
273273
return p.Get(machine, providerData)
274274
}
275275

276-
func (p *provider) Cleanup(machine *v1alpha1.Machine, _ *cloudprovidertypes.ProviderData) (bool, error) {
276+
func (p *provider) Cleanup(machine *clusterv1alpha1.Machine, _ *cloudprovidertypes.ProviderData) (bool, error) {
277277
config, _, err := p.getConfig(machine.Spec.ProviderSpec)
278278
if err != nil {
279279
return false, newError(common.InvalidConfigurationMachineError, "failed to parse MachineSpec: %v", err)
@@ -305,15 +305,15 @@ func (p *provider) Cleanup(machine *v1alpha1.Machine, _ *cloudprovidertypes.Prov
305305
return true, nil
306306
}
307307

308-
func (p *provider) MigrateUID(_ *v1alpha1.Machine, _ k8stypes.UID) error {
308+
func (p *provider) MigrateUID(_ *clusterv1alpha1.Machine, _ k8stypes.UID) error {
309309
return nil
310310
}
311311

312-
func (p *provider) MachineMetricsLabels(machine *v1alpha1.Machine) (map[string]string, error) {
312+
func (p *provider) MachineMetricsLabels(machine *clusterv1alpha1.Machine) (map[string]string, error) {
313313
return map[string]string{}, nil
314314
}
315315

316-
func (p *provider) SetMetricsForMachines(machine v1alpha1.MachineList) error {
316+
func (p *provider) SetMetricsForMachines(machine clusterv1alpha1.MachineList) error {
317317
return nil
318318
}
319319

@@ -340,12 +340,12 @@ func newError(reason common.MachineStatusError, msg string, args ...interface{})
340340
}
341341
}
342342

343-
func updateStatus(machine *v1alpha1.Machine, status *anxtypes.ProviderStatus, updater cloudprovidertypes.MachineUpdater) error {
343+
func updateStatus(machine *clusterv1alpha1.Machine, status *anxtypes.ProviderStatus, updater cloudprovidertypes.MachineUpdater) error {
344344
rawStatus, err := json.Marshal(status)
345345
if err != nil {
346346
return err
347347
}
348-
err = updater(machine, func(machine *v1alpha1.Machine) {
348+
err = updater(machine, func(machine *clusterv1alpha1.Machine) {
349349
machine.Status.ProviderStatus = &runtime.RawExtension{
350350
Raw: rawStatus,
351351
}

pkg/cloudprovider/provider/anexia/types/types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package types
1919
import (
2020
"time"
2121

22+
"github.com/kubermatic/machine-controller/pkg/jsonutil"
2223
providerconfigtypes "github.com/kubermatic/machine-controller/pkg/providerconfig/types"
2324
)
2425

@@ -48,3 +49,9 @@ type ProviderStatus struct {
4849
ProvisioningID string `json:"provisioningID"`
4950
// TODO: add conditions to track progress on the provider side
5051
}
52+
53+
func GetConfig(pconfig providerconfigtypes.Config) (*RawConfig, error) {
54+
rawConfig := &RawConfig{}
55+
56+
return rawConfig, jsonutil.StrictUnmarshal(pconfig.CloudProviderSpec.Raw, rawConfig)
57+
}

0 commit comments

Comments
 (0)