Skip to content

Commit a2ea740

Browse files
alvaroalemankubermatic-bot
authored andcommitted
Improve AWS defaulting and validation (#438)
* AWS: Add defaulting for DiskType * AWS: Verify instanceType and diskSize were specified
1 parent 6e69fc9 commit a2ea740

File tree

1 file changed

+65
-24
lines changed

1 file changed

+65
-24
lines changed

pkg/cloudprovider/provider/aws/provider.go

Lines changed: 65 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/kubermatic/machine-controller/pkg/providerconfig"
1515
"github.com/kubermatic/machine-controller/pkg/userdata/convert"
1616

17+
"k8s.io/apimachinery/pkg/runtime"
1718
"k8s.io/apimachinery/pkg/types"
1819
"k8s.io/apimachinery/pkg/util/sets"
1920

@@ -190,71 +191,71 @@ func getDefaultRootDevicePath(os providerconfig.OperatingSystem) (string, error)
190191
return "", fmt.Errorf("no default root path found for %s operating system", os)
191192
}
192193

193-
func (p *provider) getConfig(s v1alpha1.ProviderConfig) (*Config, *providerconfig.Config, error) {
194+
func (p *provider) getConfig(s v1alpha1.ProviderConfig) (*Config, *providerconfig.Config, *RawConfig, error) {
194195
if s.Value == nil {
195-
return nil, nil, fmt.Errorf("machine.spec.providerconfig.value is nil")
196+
return nil, nil, nil, fmt.Errorf("machine.spec.providerconfig.value is nil")
196197
}
197198
pconfig := providerconfig.Config{}
198199
err := json.Unmarshal(s.Value.Raw, &pconfig)
199200
if err != nil {
200-
return nil, nil, err
201+
return nil, nil, nil, err
201202
}
202203
rawConfig := RawConfig{}
203204
if err := json.Unmarshal(pconfig.CloudProviderSpec.Raw, &rawConfig); err != nil {
204-
return nil, nil, fmt.Errorf("failed to unmarshal: %v", err)
205+
return nil, nil, nil, fmt.Errorf("failed to unmarshal: %v", err)
205206
}
206207
c := Config{}
207208
c.AccessKeyID, err = p.configVarResolver.GetConfigVarStringValueOrEnv(rawConfig.AccessKeyID, "AWS_ACCESS_KEY_ID")
208209
if err != nil {
209-
return nil, nil, fmt.Errorf("failed to get the value of \"accessKeyId\" field, error = %v", err)
210+
return nil, nil, nil, fmt.Errorf("failed to get the value of \"accessKeyId\" field, error = %v", err)
210211
}
211212
c.SecretAccessKey, err = p.configVarResolver.GetConfigVarStringValueOrEnv(rawConfig.SecretAccessKey, "AWS_SECRET_ACCESS_KEY")
212213
if err != nil {
213-
return nil, nil, fmt.Errorf("failed to get the value of \"secretAccessKey\" field, error = %v", err)
214+
return nil, nil, nil, fmt.Errorf("failed to get the value of \"secretAccessKey\" field, error = %v", err)
214215
}
215216
c.Region, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.Region)
216217
if err != nil {
217-
return nil, nil, err
218+
return nil, nil, nil, err
218219
}
219220
c.VpcID, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.VpcID)
220221
if err != nil {
221-
return nil, nil, err
222+
return nil, nil, nil, err
222223
}
223224
c.SubnetID, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.SubnetID)
224225
if err != nil {
225-
return nil, nil, err
226+
return nil, nil, nil, err
226227
}
227228
c.AvailabilityZone, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.AvailabilityZone)
228229
if err != nil {
229-
return nil, nil, err
230+
return nil, nil, nil, err
230231
}
231232
for _, securityGroupIDRaw := range rawConfig.SecurityGroupIDs {
232233
securityGroupID, err := p.configVarResolver.GetConfigVarStringValue(securityGroupIDRaw)
233234
if err != nil {
234-
return nil, nil, err
235+
return nil, nil, nil, err
235236
}
236237
c.SecurityGroupIDs = append(c.SecurityGroupIDs, securityGroupID)
237238
}
238239
c.InstanceProfile, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.InstanceProfile)
239240
if err != nil {
240-
return nil, nil, err
241+
return nil, nil, nil, err
241242
}
242243
c.InstanceType, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.InstanceType)
243244
if err != nil {
244-
return nil, nil, err
245+
return nil, nil, nil, err
245246
}
246247
c.AMI, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.AMI)
247248
if err != nil {
248-
return nil, nil, err
249+
return nil, nil, nil, err
249250
}
250251
c.DiskSize = rawConfig.DiskSize
251252
c.DiskType, err = p.configVarResolver.GetConfigVarStringValue(rawConfig.DiskType)
252253
if err != nil {
253-
return nil, nil, err
254+
return nil, nil, nil, err
254255
}
255256
c.Tags = rawConfig.Tags
256257

257-
return &c, &pconfig, err
258+
return &c, &pconfig, &rawConfig, err
258259
}
259260

260261
func getSession(id, secret, token, region string) (*session.Session, error) {
@@ -282,11 +283,19 @@ func getEC2client(id, secret, region string) (*ec2.EC2, error) {
282283
}
283284

284285
func (p *provider) AddDefaults(spec v1alpha1.MachineSpec) (v1alpha1.MachineSpec, error) {
285-
return spec, nil
286+
_, _, rawConfig, err := p.getConfig(spec.ProviderConfig)
287+
if err != nil {
288+
return spec, err
289+
}
290+
if rawConfig.DiskType.Value == "" {
291+
rawConfig.DiskType.Value = ec2.VolumeTypeStandard
292+
}
293+
spec.ProviderConfig.Value, err = setProviderConfig(*rawConfig, spec.ProviderConfig)
294+
return spec, err
286295
}
287296

288297
func (p *provider) Validate(spec v1alpha1.MachineSpec) error {
289-
config, pc, err := p.getConfig(spec.ProviderConfig)
298+
config, pc, _, err := p.getConfig(spec.ProviderConfig)
290299
if err != nil {
291300
return fmt.Errorf("failed to parse config: %v", err)
292301
}
@@ -299,6 +308,16 @@ func (p *provider) Validate(spec v1alpha1.MachineSpec) error {
299308
return fmt.Errorf("invalid volume type %s specified. Supported: %s", config.DiskType, volumeTypes)
300309
}
301310

311+
if config.InstanceType == "" {
312+
return fmt.Errorf("instanceType must be specified")
313+
}
314+
315+
// Not the best test as the minimum disk size depends on the AMI
316+
// but the best we can do here
317+
if config.DiskSize == 0 {
318+
return fmt.Errorf("diskSize must be specified and > 0")
319+
}
320+
302321
ec2Client, err := getEC2client(config.AccessKeyID, config.SecretAccessKey, config.Region)
303322
if err != nil {
304323
return fmt.Errorf("failed to create ec2 client: %v", err)
@@ -370,7 +389,7 @@ func getVpc(client *ec2.EC2, id string) (*ec2.Vpc, error) {
370389
}
371390

372391
func (p *provider) Create(machine *v1alpha1.Machine, data *cloud.MachineCreateDeleteData, userdata string) (instance.Instance, error) {
373-
config, pc, err := p.getConfig(machine.Spec.ProviderConfig)
392+
config, pc, _, err := p.getConfig(machine.Spec.ProviderConfig)
374393
if err != nil {
375394
return nil, cloudprovidererrors.TerminalError{
376395
Reason: common.InvalidConfigurationMachineError,
@@ -497,7 +516,7 @@ func (p *provider) Cleanup(machine *v1alpha1.Machine, _ *cloud.MachineCreateDele
497516
return false, err
498517
}
499518

500-
config, _, err := p.getConfig(machine.Spec.ProviderConfig)
519+
config, _, _, err := p.getConfig(machine.Spec.ProviderConfig)
501520
if err != nil {
502521
return false, cloudprovidererrors.TerminalError{
503522
Reason: common.InvalidConfigurationMachineError,
@@ -525,7 +544,7 @@ func (p *provider) Cleanup(machine *v1alpha1.Machine, _ *cloud.MachineCreateDele
525544
}
526545

527546
func (p *provider) Get(machine *v1alpha1.Machine) (instance.Instance, error) {
528-
config, _, err := p.getConfig(machine.Spec.ProviderConfig)
547+
config, _, _, err := p.getConfig(machine.Spec.ProviderConfig)
529548
if err != nil {
530549
return nil, cloudprovidererrors.TerminalError{
531550
Reason: common.InvalidConfigurationMachineError,
@@ -572,7 +591,7 @@ func (p *provider) Get(machine *v1alpha1.Machine) (instance.Instance, error) {
572591
}
573592

574593
func (p *provider) GetCloudConfig(spec v1alpha1.MachineSpec) (config string, name string, err error) {
575-
c, _, err := p.getConfig(spec.ProviderConfig)
594+
c, _, _, err := p.getConfig(spec.ProviderConfig)
576595
if err != nil {
577596
return "", "", fmt.Errorf("failed to parse config: %v", err)
578597
}
@@ -597,7 +616,7 @@ func (p *provider) GetCloudConfig(spec v1alpha1.MachineSpec) (config string, nam
597616
func (p *provider) MachineMetricsLabels(machine *v1alpha1.Machine) (map[string]string, error) {
598617
labels := make(map[string]string)
599618

600-
c, _, err := p.getConfig(machine.Spec.ProviderConfig)
619+
c, _, _, err := p.getConfig(machine.Spec.ProviderConfig)
601620
if err == nil {
602621
labels["size"] = c.InstanceType
603622
labels["region"] = c.Region
@@ -617,7 +636,7 @@ func (p *provider) MigrateUID(machine *v1alpha1.Machine, new types.UID) error {
617636
return fmt.Errorf("failed to get instance: %v", err)
618637
}
619638

620-
config, _, err := p.getConfig(machine.Spec.ProviderConfig)
639+
config, _, _, err := p.getConfig(machine.Spec.ProviderConfig)
621640
if err != nil {
622641
return cloudprovidererrors.TerminalError{
623642
Reason: common.InvalidConfigurationMachineError,
@@ -719,3 +738,25 @@ func awsErrorToTerminalError(err error, msg string) error {
719738
}
720739
return nil
721740
}
741+
742+
func setProviderConfig(rawConfig RawConfig, s v1alpha1.ProviderConfig) (*runtime.RawExtension, error) {
743+
if s.Value == nil {
744+
return nil, fmt.Errorf("machine.spec.providerconfig.value is nil")
745+
}
746+
pconfig := providerconfig.Config{}
747+
err := json.Unmarshal(s.Value.Raw, &pconfig)
748+
if err != nil {
749+
return nil, err
750+
}
751+
rawCloudProviderSpec, err := json.Marshal(rawConfig)
752+
if err != nil {
753+
return nil, err
754+
}
755+
pconfig.CloudProviderSpec = runtime.RawExtension{Raw: rawCloudProviderSpec}
756+
rawPconfig, err := json.Marshal(pconfig)
757+
if err != nil {
758+
return nil, err
759+
}
760+
761+
return &runtime.RawExtension{Raw: rawPconfig}, nil
762+
}

0 commit comments

Comments
 (0)