@@ -388,12 +388,19 @@ func deriveK8sTemplateFromResourceDiff(client *gsclient.Client, d *schema.Resour
388388 if derivationTypesRequested > 1 {
389389 return nil , errors .New ("\" release\" and \" gsk_version\" are not intended to be set at once." )
390390 }
391+
392+ // When deriving the template, we want to validate it's active state only if the gsk version is changed.
393+ // That is to prevent errors for users, where an old version is still in use and they just want to do some
394+ // operation like scaling, enabling huddle etc.
395+ checkActive := d .HasChange ("gsk_version" ) || d .HasChange ("release" ) || d .HasChange ("service_template_uuid" )
396+
397+ // Derive the template based on our chosen strategy
391398 switch derivationType {
392399 case "version" :
393- return deriveK8sTemplateFromGSKVersion (client , version )
400+ return deriveK8sTemplateFromGSKVersion (client , version , checkActive )
394401 case "release" :
395402 currenTemplateUUID := d .Get ("service_template_uuid" ).(string )
396- return deriveK8sTemplateFromRelease (client , release , currenTemplateUUID )
403+ return deriveK8sTemplateFromRelease (client , release , currenTemplateUUID , checkActive )
397404 }
398405 return nil , nil
399406}
@@ -441,12 +448,19 @@ func deriveK8sTemplateFromResourceData(client *gsclient.Client, d *schema.Resour
441448 if derivationTypesRequested > 1 {
442449 return nil , errors .New ("\" release\" and/or \" gsk_version\" are not intended to be set at once." )
443450 }
451+
452+ // When deriving the template, we want to validate it's active state only if the gsk version is changed.
453+ // That is to prevent errors for users, where an old version is still in use and they just want to do some
454+ // operation like scaling, enabling huddle etc.
455+ checkActive := d .HasChange ("gsk_version" ) || d .HasChange ("release" ) || d .HasChange ("service_template_uuid" )
456+
457+ // Derive the template based on our chosen strategy
444458 switch derivationType {
445459 case "version" :
446- return deriveK8sTemplateFromGSKVersion (client , version )
460+ return deriveK8sTemplateFromGSKVersion (client , version , checkActive )
447461 case "release" :
448462 currenTemplateUUID := d .Get ("service_template_uuid" ).(string )
449- return deriveK8sTemplateFromRelease (client , release , currenTemplateUUID )
463+ return deriveK8sTemplateFromRelease (client , release , currenTemplateUUID , checkActive )
450464 }
451465 currentTemplateUUID := d .Get ("service_template_uuid" ).(string )
452466 return deriveK8sTemplateFromUUID (client , currentTemplateUUID )
@@ -480,7 +494,11 @@ func deriveK8sTemplateFromUUID(client *gsclient.Client, templateUUID string) (*g
480494}
481495
482496// deriveK8sTemplateFromGSKVersion derives the k8s service template from given GSK version.
483- func deriveK8sTemplateFromGSKVersion (client * gsclient.Client , version string ) (* gsclient.PaaSTemplate , error ) {
497+ //
498+ // The checkActive parameter defines if the active state of the template should be checked. If true,
499+ // the function will return an error if the matched template is not active. If false, it will not check that
500+ // and return even on inactive templates.
501+ func deriveK8sTemplateFromGSKVersion (client * gsclient.Client , version string , checkActive bool ) (* gsclient.PaaSTemplate , error ) {
484502 paasTemplates , err := client .GetPaaSTemplateList (context .Background ())
485503
486504 if err != nil {
@@ -492,32 +510,37 @@ func deriveK8sTemplateFromGSKVersion(client *gsclient.Client, version string) (*
492510 var versions []string
493511 var template gsclient.PaaSTemplate
494512
513+ // This loop does two things: Gather all valid verions and find the one which matches the requested version
495514 for _ , paasTemplate := range paasTemplates {
496515 if paasTemplate .Properties .Flavour == k8sTemplateFlavourName {
497516 if paasTemplate .Properties .Active {
498517 versions = append (versions , paasTemplate .Properties .Version )
499518 }
500519
501- if paasTemplate .Properties .Version == version {
520+ // Check if the version matches and we haven't derived a template yet
521+ if ! derived && paasTemplate .Properties .Version == version {
502522 isActive = paasTemplate .Properties .Active
503523 derived = true
504524 template = paasTemplate
505- break
506525 }
507526 }
508527 }
509528
510529 if ! derived {
511530 return nil , fmt .Errorf ("%v is an invalid gridscale Kubernetes (GSK) version. Valid GSK versions are: %v" , version , strings .Join (versions , ", " ))
512531 }
513- if ! isActive {
532+ if checkActive && ! isActive {
514533 return nil , fmt .Errorf ("%v is a deprecated gridscale Kubernetes (GSK) version. Valid GSK versions are: %v" , version , strings .Join (versions , ", " ))
515534 }
516535 return & template , nil
517536}
518537
519538// deriveK8sTemplateFromRelease derives the k8s service template from given release.
520- func deriveK8sTemplateFromRelease (client * gsclient.Client , release , currenTemplateUUID string ) (* gsclient.PaaSTemplate , error ) {
539+ //
540+ // The checkActive parameter defines if the active state of the template should be checked. If true,
541+ // the function will return an error if the matched template is not active. If false, it will not check that
542+ // and return even on inactive templates.
543+ func deriveK8sTemplateFromRelease (client * gsclient.Client , release , currenTemplateUUID string , checkActive bool ) (* gsclient.PaaSTemplate , error ) {
521544 paasTemplates , err := client .GetPaaSTemplateList (context .Background ())
522545 if err != nil {
523546 return nil , err
@@ -542,14 +565,18 @@ func deriveK8sTemplateFromRelease(client *gsclient.Client, release, currenTempla
542565 }
543566
544567 var derived bool
568+ var isActive bool
545569 var releases []string
546570 var template gsclient.PaaSTemplate
547571
572+ // This loop does two things: Gather all valid releases and find the one which matches the requested release
548573 for _ , paasTemplate := range paasTemplates {
549- if paasTemplate .Properties .Flavour == k8sTemplateFlavourName && paasTemplate . Properties . Active {
574+ if paasTemplate .Properties .Flavour == k8sTemplateFlavourName {
550575 releases = append (releases , paasTemplate .Properties .Release )
551576
577+ // Check if the release matches and we haven't derived a template yet
552578 if paasTemplate .Properties .Release == release {
579+ isActive = paasTemplate .Properties .Active
553580 derived = true
554581 template = paasTemplate
555582 }
@@ -558,6 +585,9 @@ func deriveK8sTemplateFromRelease(client *gsclient.Client, release, currenTempla
558585 if ! derived {
559586 return nil , fmt .Errorf ("%v is an invalid Kubernetes release. Valid releases are: %v" , release , strings .Join (releases , ", " ))
560587 }
588+ if checkActive && ! isActive {
589+ return nil , fmt .Errorf ("%v is a deprecated gridscale Kubernetes (GSK) release. Valid GSK releases are: %v" , version , strings .Join (releases , ", " ))
590+ }
561591
562592 return & template , nil
563593}
0 commit comments