@@ -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
260261func getSession (id , secret , token , region string ) (* session.Session , error ) {
@@ -282,11 +283,19 @@ func getEC2client(id, secret, region string) (*ec2.EC2, error) {
282283}
283284
284285func (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
288297func (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
372391func (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
527546func (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
574593func (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
597616func (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