Skip to content

Commit 251b862

Browse files
authored
Merge pull request #464 from gridscale/fix/inactive-templates-on-update
Fix inactive GSK versions breaking commands for existing clusters
2 parents 18178cf + 7c5dfc9 commit 251b862

File tree

2 files changed

+48
-10
lines changed

2 files changed

+48
-10
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## 2.2.2 (Sept 29, 2025)
4+
5+
IMPROVEMENTS:
6+
- Upgrade various go dependencies.
7+
8+
BUG FIXES:
9+
- Fix inactive GSK versions breaking commands for existing clusters. [PR #464](https://github.com/gridscale/terraform-provider-gridscale/pull/464)
10+
311
## 2.2.1 (July 10, 2025)
412

513
IMPROVEMENTS:

gridscale/resource_gridscale_k8s.go

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)