From e5c6c34375b7a78fa9df1dca7aebd8948444b034 Mon Sep 17 00:00:00 2001 From: Philipp Sauter Date: Fri, 26 Jul 2024 18:01:36 +0200 Subject: [PATCH 1/4] nodepools: public ip assignments --- exoscale/datasource_exoscale_sks_nodepool.go | 1 + exoscale/resource_exoscale_sks_nodepool.go | 264 ++++++++++-------- go.mod | 2 +- go.sum | 4 +- .../exoscale/egoscale/v3/operations.go | 22 ++ .../exoscale/egoscale/v3/schemas.go | 11 + vendor/modules.txt | 2 +- 7 files changed, 193 insertions(+), 113 deletions(-) diff --git a/exoscale/datasource_exoscale_sks_nodepool.go b/exoscale/datasource_exoscale_sks_nodepool.go index 6d572d4ff..f804e5e7a 100644 --- a/exoscale/datasource_exoscale_sks_nodepool.go +++ b/exoscale/datasource_exoscale_sks_nodepool.go @@ -64,6 +64,7 @@ func nodepoolToDataMap(nodepool *v2.SKSNodepool) general.TerraformObject { general.Assign(ret, resSKSNodepoolAttrLabels, nodepool.Labels) general.Assign(ret, resSKSNodepoolAttrName, nodepool.Name) general.Assign(ret, resSKSNodepoolAttrPrivateNetworkIDs, nodepool.PrivateNetworkIDs) + // TODO general.Assign(ret, resSKSNodepoolAttrSecurityGroupIDs, nodepool.SecurityGroupIDs) general.Assign(ret, resSKSNodepoolAttrSize, nodepool.Size) general.Assign(ret, resSKSNodepoolAttrState, nodepool.State) diff --git a/exoscale/resource_exoscale_sks_nodepool.go b/exoscale/resource_exoscale_sks_nodepool.go index c6790a649..ed437f71a 100644 --- a/exoscale/resource_exoscale_sks_nodepool.go +++ b/exoscale/resource_exoscale_sks_nodepool.go @@ -12,6 +12,7 @@ import ( egoscale "github.com/exoscale/egoscale/v2" exoapi "github.com/exoscale/egoscale/v2/api" + v3 "github.com/exoscale/egoscale/v3" "github.com/exoscale/terraform-provider-exoscale/pkg/config" "github.com/exoscale/terraform-provider-exoscale/pkg/general" ) @@ -39,6 +40,7 @@ const ( resSKSNodepoolAttrID = "id" resSKSNodepoolAttrName = "name" resSKSNodepoolAttrPrivateNetworkIDs = "private_network_ids" + resSKSNodepoolAttrPublicIPAssignment = "public_ip_assignment" resSKSNodepoolAttrSecurityGroupIDs = "security_group_ids" resSKSNodepoolAttrSize = "size" resSKSNodepoolAttrState = "state" @@ -155,6 +157,13 @@ func resourceSKSNodepool() *schema.Resource { Elem: &schema.Schema{Type: schema.TypeString}, Description: "A list of [exoscale_private_network](./private_network.md) (IDs) to be attached to the managed instances.", }, + resSKSNodepoolAttrPublicIPAssignment: { + Type: schema.TypeString, + Optional: true, + Description: `Configures public IP assignment of the Instances with: + * IPv4 ('inet4') addressing only (default); + * both IPv4 and IPv6 ('dual') addressing.`, + }, resSKSNodepoolAttrSecurityGroupIDs: { Type: schema.TypeSet, Optional: true, @@ -242,6 +251,62 @@ func resourceSKSNodepool() *schema.Resource { } } +func getAAG(set *schema.Set) (v []v3.AntiAffinityGroup) { + if l := set.Len(); l > 0 { + list := make([]v3.AntiAffinityGroup, l) + for i, v := range set.List() { + list[i].ID = v3.UUID(v.(string)) + } + v = list + } + return +} + +func getPNs(set *schema.Set) (v []v3.PrivateNetwork) { + if l := set.Len(); l > 0 { + list := make([]v3.PrivateNetwork, l) + for i, v := range set.List() { + list[i].ID = v3.UUID(v.(string)) + } + v = list + } + return +} + +func getSGs(set *schema.Set) (v []v3.SecurityGroup) { + if l := set.Len(); l > 0 { + list := make([]v3.SecurityGroup, l) + for i, v := range set.List() { + list[i].ID = v3.UUID(v.(string)) + } + v = list + } + return +} + +func getInstanceType(ctx context.Context, client *v3.Client, instanceTypeName string) (*v3.InstanceType, error) { + parts := strings.Split(instanceTypeName, ".") + if len(parts) < 2 { + return nil, fmt.Errorf("invalid instance type: %q", instanceTypeName) + } + + family := parts[0] + size := parts[1] + + instanceTypes, err := client.ListInstanceTypes(ctx) + if err != nil { + return nil, fmt.Errorf("error retrieving instance types: %s", err) + } + + for _, it := range instanceTypes.InstanceTypes { + if it.Family == v3.InstanceTypeFamily(family) && it.Size == v3.InstanceTypeSize(size) { + return client.GetInstanceType(ctx, it.ID) + } + } + + return nil, fmt.Errorf("instance type %q not found", instanceTypeName) +} + func resourceSKSNodepoolCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { tflog.Debug(ctx, "beginning create", map[string]interface{}{ "id": resourceSKSNodepoolIDString(d), @@ -250,81 +315,75 @@ func resourceSKSNodepoolCreate(ctx context.Context, d *schema.ResourceData, meta zone := d.Get(resSKSNodepoolAttrZone).(string) ctx, cancel := context.WithTimeout(ctx, d.Timeout(schema.TimeoutCreate)) - ctx = exoapi.WithEndpoint(ctx, exoapi.NewReqEndpoint(getEnvironment(meta), zone)) defer cancel() - client := getClient(meta) - - sksCluster, err := client.GetSKSCluster(ctx, zone, d.Get(resSKSNodepoolAttrClusterID).(string)) + client, err := config.GetClientV3WithZone(ctx, meta, zone) if err != nil { return diag.FromErr(err) } - sksNodepool := new(egoscale.SKSNodepool) + clusterID := v3.UUID(d.Get(resSKSNodepoolAttrClusterID).(string)) + + sksNodepoolReq := v3.CreateSKSNodepoolRequest{} if set, ok := d.Get(resSKSNodepoolAttrAntiAffinityGroupIDs).(*schema.Set); ok { - sksNodepool.AntiAffinityGroupIDs = func() (v *[]string) { - if l := set.Len(); l > 0 { - list := make([]string, l) - for i, v := range set.List() { - list[i] = v.(string) - } - v = &list - } - return - }() + sksNodepoolReq.AntiAffinityGroups = getAAG(set) } if v, ok := d.GetOk(resSKSNodepoolAttrDeployTargetID); ok { s := v.(string) - sksNodepool.DeployTargetID = &s + sksNodepoolReq.DeployTarget = &v3.DeployTarget{ + ID: v3.UUID(s), + } } if v, ok := d.GetOk(resSKSNodepoolAttrDescription); ok { s := v.(string) - sksNodepool.Description = &s + sksNodepoolReq.Description = s } if v, ok := d.GetOk(resSKSNodepoolAttrDiskSize); ok { i := int64(v.(int)) - sksNodepool.DiskSize = &i + sksNodepoolReq.DiskSize = i } if v, ok := d.GetOk(resSKSNodepoolAttrInstancePrefix); ok { s := v.(string) - sksNodepool.InstancePrefix = &s + sksNodepoolReq.InstancePrefix = s } - instanceType, err := client.FindInstanceType(ctx, zone, d.Get(resSKSNodepoolAttrInstanceType).(string)) + instanceTypeName := d.Get(resSKSNodepoolAttrInstanceType).(string) + instanceType, err := getInstanceType(ctx, client, instanceTypeName) if err != nil { - return diag.Errorf("error retrieving instance type: %s", err) + return diag.Errorf("failed to find instance type: %s", err) } - sksNodepool.InstanceTypeID = instanceType.ID + + sksNodepoolReq.InstanceType = instanceType if k, ok := d.GetOk(resSKSNodepoolAttrKubeletGC); ok { kubeletGc := k.(*schema.Set).List()[0].(map[string]interface{}) - sksNodepoolKubeletGc := new(egoscale.SKSNodepoolKubeletImageGc) + sksNodepoolKubeletGc := new(v3.KubeletImageGC) if val, ok := kubeletGc[resSKSNodepoolAttrKubeletGCMinAge]; ok { sksNodepoolKubeletGcMinAge := val.(string) - sksNodepoolKubeletGc.MinAge = &sksNodepoolKubeletGcMinAge + sksNodepoolKubeletGc.MinAge = sksNodepoolKubeletGcMinAge } if val, ok := kubeletGc[resSKSNodepoolAttrKubeletGCLowThreshold]; ok { sksNodepoolKubeletGcLowThreshold := val.(int) sksNodepoolKubeletGcLowThresholdInt64 := int64(sksNodepoolKubeletGcLowThreshold) - sksNodepoolKubeletGc.LowThreshold = &sksNodepoolKubeletGcLowThresholdInt64 + sksNodepoolKubeletGc.LowThreshold = sksNodepoolKubeletGcLowThresholdInt64 } if val, ok := kubeletGc[resSKSNodepoolAttrKubeletGCHighThreshold]; ok { sksNodepoolKubeletGcHighThreshold := val.(int) sksNodepoolKubeletGcHighThresholdInt64 := int64(sksNodepoolKubeletGcHighThreshold) - sksNodepoolKubeletGc.HighThreshold = &sksNodepoolKubeletGcHighThresholdInt64 + sksNodepoolKubeletGc.HighThreshold = sksNodepoolKubeletGcHighThresholdInt64 } - sksNodepool.KubeletImageGc = sksNodepoolKubeletGc + sksNodepoolReq.KubeletImageGC = sksNodepoolKubeletGc } if l, ok := d.GetOk(resSKSNodepoolAttrLabels); ok { @@ -332,43 +391,29 @@ func resourceSKSNodepoolCreate(ctx context.Context, d *schema.ResourceData, meta for k, v := range l.(map[string]interface{}) { labels[k] = v.(string) } - sksNodepool.Labels = &labels + sksNodepoolReq.Labels = labels } if v, ok := d.GetOk(resSKSNodepoolAttrName); ok { s := v.(string) - sksNodepool.Name = &s + sksNodepoolReq.Name = s + } + + if set, ok := d.Get(resSKSNodepoolAttrPublicIPAssignment).(string); ok { + sksNodepoolReq.PublicIPAssignment = v3.CreateSKSNodepoolRequestPublicIPAssignment(set) } if set, ok := d.Get(resSKSNodepoolAttrPrivateNetworkIDs).(*schema.Set); ok { - sksNodepool.PrivateNetworkIDs = func() (v *[]string) { - if l := set.Len(); l > 0 { - list := make([]string, l) - for i, v := range set.List() { - list[i] = v.(string) - } - v = &list - } - return - }() + sksNodepoolReq.PrivateNetworks = getPNs(set) } if set, ok := d.Get(resSKSNodepoolAttrSecurityGroupIDs).(*schema.Set); ok { - sksNodepool.SecurityGroupIDs = func() (v *[]string) { - if l := set.Len(); l > 0 { - list := make([]string, l) - for i, v := range set.List() { - list[i] = v.(string) - } - v = &list - } - return - }() + sksNodepoolReq.SecurityGroups = getSGs(set) } if v, ok := d.GetOk(resSKSNodepoolAttrSize); ok { i := int64(v.(int)) - sksNodepool.Size = &i + sksNodepoolReq.Size = i } var addOns []string @@ -376,27 +421,32 @@ func resourceSKSNodepoolCreate(ctx context.Context, d *schema.ResourceData, meta addOns = append(addOns, sksNodepoolAddonStorageLVM) } if len(addOns) > 0 { - sksNodepool.AddOns = &addOns + sksNodepoolReq.Addons = addOns } if t, ok := d.GetOk(resSKSNodepoolAttrTaints); ok { - taints := make(map[string]*egoscale.SKSNodepoolTaint) + taints := make(v3.SKSNodepoolTaints) for k, v := range t.(map[string]interface{}) { taint, err := parseSKSNodepoolTaint(v.(string)) if err != nil { return diag.Errorf("invalid taint %q: %s", v.(string), err) } - taints[k] = taint + taints[k] = *taint } - sksNodepool.Taints = &taints + sksNodepoolReq.Taints = taints + } + + op, err := client.CreateSKSNodepool(ctx, clusterID, sksNodepoolReq) + if err != nil { + return diag.FromErr(err) } - sksNodepool, err = client.CreateSKSNodepool(ctx, zone, sksCluster, sksNodepool) + opSuccess, err := client.Wait(ctx, op, v3.OperationStateSuccess) if err != nil { return diag.FromErr(err) } - d.SetId(*sksNodepool.ID) + d.SetId(opSuccess.Reference.ID.String()) tflog.Debug(ctx, "create finished successfully", map[string]interface{}{ "id": resourceSKSNodepoolIDString(d), @@ -456,140 +506,136 @@ func resourceSKSNodepoolUpdate(ctx context.Context, d *schema.ResourceData, meta zone := d.Get(resSKSNodepoolAttrZone).(string) ctx, cancel := context.WithTimeout(ctx, d.Timeout(schema.TimeoutUpdate)) - ctx = exoapi.WithEndpoint(ctx, exoapi.NewReqEndpoint(getEnvironment(meta), zone)) defer cancel() - client := getClient(meta) + client, err := config.GetClientV3WithZone(ctx, meta, zone) + if err != nil { + return diag.FromErr(err) + } - sksCluster, err := client.GetSKSCluster(ctx, zone, d.Get(resSKSNodepoolAttrClusterID).(string)) + nodepoolID := v3.UUID(d.Id()) + + clusterID := v3.UUID(d.Get(resSKSNodepoolAttrClusterID).(string)) + sksCluster, err := client.GetSKSCluster(ctx, clusterID) if err != nil { return diag.FromErr(err) } - var sksNodepool *egoscale.SKSNodepool + found := false for _, np := range sksCluster.Nodepools { - if *np.ID == d.Id() { - sksNodepool = np + if np.ID == nodepoolID { + found = true break } } - if sksNodepool == nil { - return diag.Errorf("SKS Nodepool %q not found", d.Id()) + if !found { + return diag.Errorf("SKS Nodepool %q not found in cluster %q", nodepoolID, clusterID) } + sksNodepoolReq := v3.UpdateSKSNodepoolRequest{} + var updated bool if d.HasChange(resSKSNodepoolAttrAntiAffinityGroupIDs) { set := d.Get(resSKSNodepoolAttrAntiAffinityGroupIDs).(*schema.Set) - sksNodepool.AntiAffinityGroupIDs = func() *[]string { - list := make([]string, set.Len()) - for i, v := range set.List() { - list[i] = v.(string) - } - return &list - }() + sksNodepoolReq.AntiAffinityGroups = getAAG(set) updated = true } if d.HasChange(resSKSNodepoolAttrDeployTargetID) { v := d.Get(resSKSNodepoolAttrDeployTargetID).(string) - sksNodepool.DeployTargetID = &v + sksNodepoolReq.DeployTarget = &v3.DeployTarget{ + ID: v3.UUID(v), + } updated = true } if d.HasChange(resSKSNodepoolAttrDescription) { v := d.Get(resSKSNodepoolAttrDescription).(string) - sksNodepool.Description = &v + sksNodepoolReq.Description = v updated = true } if d.HasChange(resSKSNodepoolAttrDiskSize) { v := int64(d.Get(resSKSNodepoolAttrDiskSize).(int)) - sksNodepool.DiskSize = &v + sksNodepoolReq.DiskSize = v updated = true } if d.HasChange(resSKSNodepoolAttrInstancePrefix) { v := d.Get(resSKSNodepoolAttrInstancePrefix).(string) - sksNodepool.InstancePrefix = &v + sksNodepoolReq.InstancePrefix = v updated = true } if d.HasChange(resSKSNodepoolAttrInstanceType) { - instanceType, err := client.FindInstanceType(ctx, zone, d.Get(resSKSNodepoolAttrInstanceType).(string)) + instanceTypeName := d.Get(resSKSNodepoolAttrInstanceType).(string) + instanceType, err := getInstanceType(ctx, client, instanceTypeName) if err != nil { - return diag.Errorf("error retrieving instance type: %s", err) + return diag.Errorf("failed to find instance type: %s", err) } - sksNodepool.InstanceTypeID = instanceType.ID + + sksNodepoolReq.InstanceType = instanceType updated = true } if d.HasChange(resSKSNodepoolAttrLabels) { - labels := make(map[string]string) + labels := make(v3.Labels) for k, v := range d.Get(resSKSNodepoolAttrLabels).(map[string]interface{}) { labels[k] = v.(string) } - sksNodepool.Labels = &labels + sksNodepoolReq.Labels = labels updated = true } if d.HasChange(resSKSNodepoolAttrName) { v := d.Get(resSKSNodepoolAttrName).(string) - sksNodepool.Name = &v + sksNodepoolReq.Name = v + updated = true + } + + if d.HasChange(resSKSNodepoolAttrPublicIPAssignment) { + set := d.Get(resSKSNodepoolAttrPublicIPAssignment).(string) + sksNodepoolReq.PublicIPAssignment = v3.UpdateSKSNodepoolRequestPublicIPAssignment(set) updated = true } if d.HasChange(resSKSNodepoolAttrPrivateNetworkIDs) { set := d.Get(resSKSNodepoolAttrPrivateNetworkIDs).(*schema.Set) - sksNodepool.PrivateNetworkIDs = func() *[]string { - list := make([]string, set.Len()) - for i, v := range set.List() { - list[i] = v.(string) - } - return &list - }() + sksNodepoolReq.PrivateNetworks = getPNs(set) updated = true } if d.HasChange(resSKSNodepoolAttrSecurityGroupIDs) { set := d.Get(resSKSNodepoolAttrSecurityGroupIDs).(*schema.Set) - sksNodepool.SecurityGroupIDs = func() *[]string { - list := make([]string, set.Len()) - for i, v := range set.List() { - list[i] = v.(string) - } - return &list - }() + sksNodepoolReq.SecurityGroups = getSGs(set) updated = true } if d.HasChange(resSKSNodepoolAttrTaints) { - taints := make(map[string]*egoscale.SKSNodepoolTaint) + taints := make(v3.SKSNodepoolTaints) for k, v := range d.Get(resSKSNodepoolAttrTaints).(map[string]interface{}) { taint, err := parseSKSNodepoolTaint(v.(string)) if err != nil { return diag.Errorf("invalid taint %q: %s", v.(string), err) } - taints[k] = taint + taints[k] = *taint } - sksNodepool.Taints = &taints + sksNodepoolReq.Taints = taints updated = true } if updated { - if err = client.UpdateSKSNodepool(ctx, zone, sksCluster, sksNodepool); err != nil { + err := await(ctx, client)(client.UpdateSKSNodepool(ctx, clusterID, nodepoolID, sksNodepoolReq)) + if err != nil { return diag.FromErr(err) } } if d.HasChange(resSKSNodepoolAttrSize) { - if err = client.ScaleSKSNodepool( - ctx, - zone, - sksCluster, - sksNodepool, - int64(d.Get(resSKSNodepoolAttrSize).(int)), - ); err != nil { + if err := await(ctx, client)(client.ScaleSKSNodepool(ctx, clusterID, nodepoolID, v3.ScaleSKSNodepoolRequest{ + Size: int64(d.Get(resSKSNodepoolAttrSize).(int)), + })); err != nil { return diag.FromErr(err) } } @@ -767,7 +813,7 @@ func resourceSKSNodepoolApply( // description formatted as VALUE:EFFECT, and returns discrete values // for the value/effect as egoscale.SKSNodepoolTaint, or an error if // the input value parsing failed. -func parseSKSNodepoolTaint(v string) (*egoscale.SKSNodepoolTaint, error) { +func parseSKSNodepoolTaint(v string) (*v3.SKSNodepoolTaint, error) { parts := strings.SplitN(v, ":", 2) if len(parts) != 2 { return nil, errors.New("expected format VALUE:EFFECT") @@ -778,8 +824,8 @@ func parseSKSNodepoolTaint(v string) (*egoscale.SKSNodepoolTaint, error) { return nil, errors.New("expected format VALUE:EFFECT") } - return &egoscale.SKSNodepoolTaint{ - Effect: taintEffect, + return &v3.SKSNodepoolTaint{ + Effect: v3.SKSNodepoolTaintEffect(taintEffect), Value: taintValue, }, nil } diff --git a/go.mod b/go.mod index 7a7716e98..8386bb8e7 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/exoscale/terraform-provider-exoscale require ( github.com/exoscale/egoscale v0.102.4 - github.com/exoscale/egoscale/v3 v3.1.1 + github.com/exoscale/egoscale/v3 v3.1.2-0.20240730103829-b3139435e749 github.com/google/go-cmp v0.6.0 github.com/hashicorp/go-cleanhttp v0.5.2 github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320 diff --git a/go.sum b/go.sum index 4f8a26fe2..7126895a1 100644 --- a/go.sum +++ b/go.sum @@ -43,8 +43,8 @@ github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/exoscale/egoscale v0.102.4 h1:GBKsZMIOzwBfSu+4ZmWka3Ejf2JLiaBDHp4CQUgvp2E= github.com/exoscale/egoscale v0.102.4/go.mod h1:ROSmPtle0wvf91iLZb09++N/9BH2Jo9XxIpAEumvocA= -github.com/exoscale/egoscale/v3 v3.1.1 h1:NwTlXE2sKe2kBWm+c3bsHV+aWDFiEJ9JQpS6X3j4wbc= -github.com/exoscale/egoscale/v3 v3.1.1/go.mod h1:lPsza7G+giSxdzvzaHSEcjEAYz/YTiu2bEEha9KVAc4= +github.com/exoscale/egoscale/v3 v3.1.2-0.20240730103829-b3139435e749 h1:seDTV3nraAiE55rtLtySGlEDgAqvSIERMgvXBO/aO3g= +github.com/exoscale/egoscale/v3 v3.1.2-0.20240730103829-b3139435e749/go.mod h1:lPsza7G+giSxdzvzaHSEcjEAYz/YTiu2bEEha9KVAc4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= diff --git a/vendor/github.com/exoscale/egoscale/v3/operations.go b/vendor/github.com/exoscale/egoscale/v3/operations.go index 8a103355b..0295b05ff 100644 --- a/vendor/github.com/exoscale/egoscale/v3/operations.go +++ b/vendor/github.com/exoscale/egoscale/v3/operations.go @@ -12393,6 +12393,13 @@ func (c Client) GetSKSClusterInspection(ctx context.Context, id UUID) (*GetSKSCl return bodyresp, nil } +type CreateSKSNodepoolRequestPublicIPAssignment string + +const ( + CreateSKSNodepoolRequestPublicIPAssignmentInet4 CreateSKSNodepoolRequestPublicIPAssignment = "inet4" + CreateSKSNodepoolRequestPublicIPAssignmentDual CreateSKSNodepoolRequestPublicIPAssignment = "dual" +) + type CreateSKSNodepoolRequest struct { // Nodepool addons Addons []string `json:"addons,omitempty"` @@ -12415,6 +12422,10 @@ type CreateSKSNodepoolRequest struct { Name string `json:"name" validate:"required,gte=1,lte=255"` // Nodepool Private Networks PrivateNetworks []PrivateNetwork `json:"private-networks,omitempty"` + // Configures public IP assignment of the Instances with: + // * both IPv4 and IPv6 (`dual`) addressing. + // * both IPv4 and IPv6 (`dual`) addressing. + PublicIPAssignment CreateSKSNodepoolRequestPublicIPAssignment `json:"public-ip-assignment,omitempty"` // Nodepool Security Groups SecurityGroups []SecurityGroup `json:"security-groups,omitempty"` // Number of instances @@ -12558,6 +12569,13 @@ func (c Client) GetSKSNodepool(ctx context.Context, id UUID, sksNodepoolID UUID) return bodyresp, nil } +type UpdateSKSNodepoolRequestPublicIPAssignment string + +const ( + UpdateSKSNodepoolRequestPublicIPAssignmentInet4 UpdateSKSNodepoolRequestPublicIPAssignment = "inet4" + UpdateSKSNodepoolRequestPublicIPAssignmentDual UpdateSKSNodepoolRequestPublicIPAssignment = "dual" +) + type UpdateSKSNodepoolRequest struct { // Nodepool Anti-affinity Groups AntiAffinityGroups []AntiAffinityGroup `json:"anti-affinity-groups,omitempty"` @@ -12576,6 +12594,10 @@ type UpdateSKSNodepoolRequest struct { Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"` // Nodepool Private Networks PrivateNetworks []PrivateNetwork `json:"private-networks,omitempty"` + // Configures public IP assignment of the Instances with: + // * both IPv4 and IPv6 (`dual`) addressing. + // * both IPv4 and IPv6 (`dual`) addressing. + PublicIPAssignment UpdateSKSNodepoolRequestPublicIPAssignment `json:"public-ip-assignment,omitempty"` // Nodepool Security Groups SecurityGroups []SecurityGroup `json:"security-groups,omitempty"` Taints SKSNodepoolTaints `json:"taints,omitempty"` diff --git a/vendor/github.com/exoscale/egoscale/v3/schemas.go b/vendor/github.com/exoscale/egoscale/v3/schemas.go index 5fee16027..f24e7ecf0 100644 --- a/vendor/github.com/exoscale/egoscale/v3/schemas.go +++ b/vendor/github.com/exoscale/egoscale/v3/schemas.go @@ -2457,6 +2457,13 @@ type SKSKubeconfigRequest struct { User string `json:"user,omitempty"` } +type SKSNodepoolPublicIPAssignment string + +const ( + SKSNodepoolPublicIPAssignmentInet4 SKSNodepoolPublicIPAssignment = "inet4" + SKSNodepoolPublicIPAssignmentDual SKSNodepoolPublicIPAssignment = "dual" +) + type SKSNodepoolState string const ( @@ -2498,6 +2505,10 @@ type SKSNodepool struct { Name string `json:"name,omitempty" validate:"omitempty,gte=1,lte=255"` // Nodepool Private Networks PrivateNetworks []PrivateNetwork `json:"private-networks,omitempty"` + // Nodepool public IP assignment of the Instances: + // * IPv4 and IPv6 (`dual`) addressing. + // * IPv4 and IPv6 (`dual`) addressing. + PublicIPAssignment SKSNodepoolPublicIPAssignment `json:"public-ip-assignment,omitempty"` // Nodepool Security Groups SecurityGroups []SecurityGroup `json:"security-groups,omitempty"` // Number of instances diff --git a/vendor/modules.txt b/vendor/modules.txt index c8bed005d..ee4333a04 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -66,7 +66,7 @@ github.com/exoscale/egoscale/v2 github.com/exoscale/egoscale/v2/api github.com/exoscale/egoscale/v2/oapi github.com/exoscale/egoscale/version -# github.com/exoscale/egoscale/v3 v3.1.1 +# github.com/exoscale/egoscale/v3 v3.1.2-0.20240730103829-b3139435e749 ## explicit; go 1.22 github.com/exoscale/egoscale/v3 github.com/exoscale/egoscale/v3/credentials From cfaa4184ffdc6e2eadc0af661e8633e8838da1e7 Mon Sep 17 00:00:00 2001 From: Philipp Sauter Date: Tue, 30 Jul 2024 16:25:46 +0200 Subject: [PATCH 2/4] convert resource to v3 entirely --- exoscale/resource_exoscale_sks_nodepool.go | 107 +++++++++++---------- 1 file changed, 58 insertions(+), 49 deletions(-) diff --git a/exoscale/resource_exoscale_sks_nodepool.go b/exoscale/resource_exoscale_sks_nodepool.go index ed437f71a..0d6fbd30a 100644 --- a/exoscale/resource_exoscale_sks_nodepool.go +++ b/exoscale/resource_exoscale_sks_nodepool.go @@ -10,8 +10,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - egoscale "github.com/exoscale/egoscale/v2" - exoapi "github.com/exoscale/egoscale/v2/api" v3 "github.com/exoscale/egoscale/v3" "github.com/exoscale/terraform-provider-exoscale/pkg/config" "github.com/exoscale/terraform-provider-exoscale/pkg/general" @@ -463,14 +461,17 @@ func resourceSKSNodepoolRead(ctx context.Context, d *schema.ResourceData, meta i zone := d.Get(resSKSNodepoolAttrZone).(string) ctx, cancel := context.WithTimeout(ctx, d.Timeout(schema.TimeoutRead)) - ctx = exoapi.WithEndpoint(ctx, exoapi.NewReqEndpoint(getEnvironment(meta), zone)) defer cancel() - client := getClient(meta) + client, err := config.GetClientV3WithZone(ctx, meta, zone) + if err != nil { + return diag.FromErr(err) + } - sks, err := client.GetSKSCluster(ctx, zone, d.Get(resSKSNodepoolAttrClusterID).(string)) + clusterID := v3.UUID(d.Get(resSKSNodepoolAttrClusterID).(string)) + sks, err := client.GetSKSCluster(ctx, clusterID) if err != nil { - if errors.Is(err, exoapi.ErrNotFound) { + if errors.Is(err, v3.ErrNotFound) { // Parent SKS cluster doesn't exist anymore, so does the SKS Nodepool. d.SetId("") return nil @@ -478,10 +479,10 @@ func resourceSKSNodepoolRead(ctx context.Context, d *schema.ResourceData, meta i return diag.FromErr(err) } - var sksNodepool *egoscale.SKSNodepool + var sksNodepool *v3.SKSNodepool for _, np := range sks.Nodepools { - if *np.ID == d.Id() { - sksNodepool = np + if np.ID == v3.UUID(d.Id()) { + sksNodepool = &np break } } @@ -655,18 +656,21 @@ func resourceSKSNodepoolDelete(ctx context.Context, d *schema.ResourceData, meta zone := d.Get(resSKSNodepoolAttrZone).(string) ctx, cancel := context.WithTimeout(ctx, d.Timeout(schema.TimeoutDelete)) - ctx = exoapi.WithEndpoint(ctx, exoapi.NewReqEndpoint(getEnvironment(meta), zone)) defer cancel() - client := getClient(meta) + client, err := config.GetClientV3WithZone(ctx, meta, zone) + if err != nil { + return diag.FromErr(err) + } - sksCluster, err := client.GetSKSCluster(ctx, zone, d.Get(resSKSNodepoolAttrClusterID).(string)) + clusterID := v3.UUID(d.Get(resSKSNodepoolAttrClusterID).(string)) + _, err = client.GetSKSCluster(ctx, clusterID) if err != nil { return diag.FromErr(err) } - sksNodepoolID := d.Id() - if err = client.DeleteSKSNodepool(ctx, zone, sksCluster, &egoscale.SKSNodepool{ID: &sksNodepoolID}); err != nil { + sksNodepoolID := v3.UUID(d.Id()) + if err := await(ctx, client)(client.DeleteSKSNodepool(ctx, clusterID, sksNodepoolID)); err != nil { return diag.FromErr(err) } @@ -679,60 +683,61 @@ func resourceSKSNodepoolDelete(ctx context.Context, d *schema.ResourceData, meta func resourceSKSNodepoolApply( ctx context.Context, - client *egoscale.Client, + client *v3.Client, d *schema.ResourceData, - sksNodepool *egoscale.SKSNodepool, + sksNodepool *v3.SKSNodepool, ) error { - if sksNodepool.AntiAffinityGroupIDs != nil { - antiAffinityGroupIDs := make([]string, len(*sksNodepool.AntiAffinityGroupIDs)) - copy(antiAffinityGroupIDs, *sksNodepool.AntiAffinityGroupIDs) + if len(sksNodepool.AntiAffinityGroups) > 0 { + antiAffinityGroupIDs := make([]string, 0, len(sksNodepool.AntiAffinityGroups)) + for _, aag := range sksNodepool.AntiAffinityGroups { + antiAffinityGroupIDs = append(antiAffinityGroupIDs, aag.ID.String()) + } if err := d.Set(resSKSNodepoolAttrAntiAffinityGroupIDs, antiAffinityGroupIDs); err != nil { return err } } - if sksNodepool.AddOns != nil { - if err := d.Set(resSKSNodepoolAttrStorageLVM, in(*sksNodepool.AddOns, sksNodepoolAddonStorageLVM)); err != nil { + if len(sksNodepool.Addons) > 0 { + if err := d.Set(resSKSNodepoolAttrStorageLVM, in(sksNodepool.Addons, sksNodepoolAddonStorageLVM)); err != nil { return err } } - if err := d.Set(resSKSNodepoolAttrCreatedAt, sksNodepool.CreatedAt.String()); err != nil { + if err := d.Set(resSKSNodepoolAttrCreatedAt, sksNodepool.CreatedAT.String()); err != nil { return err } - if err := d.Set(resSKSNodepoolAttrDeployTargetID, defaultString(sksNodepool.DeployTargetID, "")); err != nil { + if err := d.Set(resSKSNodepoolAttrDeployTargetID, sksNodepool.DeployTarget.ID); err != nil { return err } - if err := d.Set(resSKSNodepoolAttrDescription, defaultString(sksNodepool.Description, "")); err != nil { + if err := d.Set(resSKSNodepoolAttrDescription, sksNodepool.Description); err != nil { return err } - if err := d.Set(resSKSNodepoolAttrDiskSize, *sksNodepool.DiskSize); err != nil { + if err := d.Set(resSKSNodepoolAttrDiskSize, sksNodepool.DiskSize); err != nil { return err } - if err := d.Set(resSKSNodepoolAttrInstancePoolID, *sksNodepool.InstancePoolID); err != nil { + if err := d.Set(resSKSNodepoolAttrInstancePoolID, sksNodepool.InstancePool.ID); err != nil { return err } - if err := d.Set(resSKSNodepoolAttrInstancePrefix, defaultString(sksNodepool.InstancePrefix, "")); err != nil { + if err := d.Set(resSKSNodepoolAttrInstancePrefix, sksNodepool.InstancePrefix); err != nil { return err } instanceType, err := client.GetInstanceType( ctx, - d.Get(resSKSNodepoolAttrZone).(string), - *sksNodepool.InstanceTypeID, + sksNodepool.InstanceType.ID, ) if err != nil { return fmt.Errorf("error retrieving instance type: %w", err) } if err := d.Set(resSKSNodepoolAttrInstanceType, fmt.Sprintf( "%s.%s", - strings.ToLower(*instanceType.Family), - strings.ToLower(*instanceType.Size), + strings.ToLower(string(instanceType.Family)), + strings.ToLower(string(instanceType.Size)), )); err != nil { return err } @@ -741,14 +746,14 @@ func resourceSKSNodepoolApply( if err := d.Set(resSKSNodepoolAttrKubeletGC, schema.NewSet(kubeletGc.F, []interface{}{ func() map[string]interface{} { i := map[string]interface{}{} - if sksNodepool.KubeletImageGc.MinAge != nil { - i[resSKSNodepoolAttrKubeletGCMinAge] = *sksNodepool.KubeletImageGc.MinAge + if sksNodepool.KubeletImageGC.MinAge != "" { + i[resSKSNodepoolAttrKubeletGCMinAge] = sksNodepool.KubeletImageGC.MinAge } - if sksNodepool.KubeletImageGc.HighThreshold != nil { - i[resSKSNodepoolAttrKubeletGCHighThreshold] = int(*sksNodepool.KubeletImageGc.HighThreshold) + if sksNodepool.KubeletImageGC.HighThreshold != 0 { + i[resSKSNodepoolAttrKubeletGCHighThreshold] = int(sksNodepool.KubeletImageGC.HighThreshold) } - if sksNodepool.KubeletImageGc.LowThreshold != nil { - i[resSKSNodepoolAttrKubeletGCLowThreshold] = int(*sksNodepool.KubeletImageGc.LowThreshold) + if sksNodepool.KubeletImageGC.LowThreshold != 0 { + i[resSKSNodepoolAttrKubeletGCLowThreshold] = int(sksNodepool.KubeletImageGC.LowThreshold) } return i }(), @@ -760,37 +765,41 @@ func resourceSKSNodepoolApply( return err } - if err := d.Set(resSKSNodepoolAttrName, *sksNodepool.Name); err != nil { + if err := d.Set(resSKSNodepoolAttrName, sksNodepool.Name); err != nil { return err } - if sksNodepool.PrivateNetworkIDs != nil { - privateNetworkIDs := make([]string, len(*sksNodepool.PrivateNetworkIDs)) - copy(privateNetworkIDs, *sksNodepool.PrivateNetworkIDs) + if len(sksNodepool.PrivateNetworks) > 0 { + privateNetworkIDs := make([]string, 0, len(sksNodepool.PrivateNetworks)) + for _, pn := range sksNodepool.PrivateNetworks { + privateNetworkIDs = append(privateNetworkIDs, pn.ID.String()) + } if err := d.Set(resSKSNodepoolAttrPrivateNetworkIDs, privateNetworkIDs); err != nil { return err } } - if sksNodepool.SecurityGroupIDs != nil { - securityGroupIDs := make([]string, len(*sksNodepool.SecurityGroupIDs)) - copy(securityGroupIDs, *sksNodepool.SecurityGroupIDs) + if len(sksNodepool.SecurityGroups) > 0 { + securityGroupIDs := make([]string, 0, len(sksNodepool.SecurityGroups)) + for _, sg := range sksNodepool.SecurityGroups { + securityGroupIDs = append(securityGroupIDs, sg.ID.String()) + } if err := d.Set(resSKSNodepoolAttrSecurityGroupIDs, securityGroupIDs); err != nil { return err } } - if err := d.Set(resSKSNodepoolAttrSize, *sksNodepool.Size); err != nil { + if err := d.Set(resSKSNodepoolAttrSize, sksNodepool.Size); err != nil { return err } - if err := d.Set(resSKSNodepoolAttrState, *sksNodepool.State); err != nil { + if err := d.Set(resSKSNodepoolAttrState, sksNodepool.State); err != nil { return err } if sksNodepool.Taints != nil { taints := make(map[string]string) - for k, v := range *sksNodepool.Taints { + for k, v := range sksNodepool.Taints { taints[k] = fmt.Sprintf("%s:%s", v.Value, v.Effect) } if err := d.Set(resSKSNodepoolAttrTaints, taints); err != nil { @@ -798,11 +807,11 @@ func resourceSKSNodepoolApply( } } - if err := d.Set(resSKSNodepoolAttrTemplateID, *sksNodepool.TemplateID); err != nil { + if err := d.Set(resSKSNodepoolAttrTemplateID, sksNodepool.Template.ID); err != nil { return err } - if err := d.Set(resSKSNodepoolAttrVersion, *sksNodepool.Version); err != nil { + if err := d.Set(resSKSNodepoolAttrVersion, sksNodepool.Version); err != nil { return err } From 7a3f1f68b05f76905d958563869bdf5a32e65a0d Mon Sep 17 00:00:00 2001 From: Philipp Sauter Date: Tue, 30 Jul 2024 16:45:49 +0200 Subject: [PATCH 3/4] convert data source to v3 --- exoscale/datasource_exoscale_sks_nodepool.go | 58 ++++++++++--------- .../datasource_exoscale_sks_nodepool_list.go | 29 +++++++--- 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/exoscale/datasource_exoscale_sks_nodepool.go b/exoscale/datasource_exoscale_sks_nodepool.go index f804e5e7a..ca74077e0 100644 --- a/exoscale/datasource_exoscale_sks_nodepool.go +++ b/exoscale/datasource_exoscale_sks_nodepool.go @@ -8,8 +8,8 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - v2 "github.com/exoscale/egoscale/v2" - exoapi "github.com/exoscale/egoscale/v2/api" + v3 "github.com/exoscale/egoscale/v3" + "github.com/exoscale/terraform-provider-exoscale/pkg/config" "github.com/exoscale/terraform-provider-exoscale/pkg/filter" "github.com/exoscale/terraform-provider-exoscale/pkg/general" ) @@ -50,28 +50,28 @@ func dataSourceSKSNodepool() *schema.Resource { return ret } -func nodepoolToDataMap(nodepool *v2.SKSNodepool) general.TerraformObject { +func nodepoolToDataMap(nodepool *v3.SKSNodepool) general.TerraformObject { ret := make(general.TerraformObject) - general.Assign(ret, resSKSNodepoolAttrAntiAffinityGroupIDs, nodepool.AntiAffinityGroupIDs) - general.AssignTime(ret, resSKSNodepoolAttrCreatedAt, nodepool.CreatedAt) - general.Assign(ret, resSKSNodepoolAttrDeployTargetID, nodepool.DeployTargetID) - general.Assign(ret, resSKSNodepoolAttrDescription, nodepool.Description) - general.Assign(ret, resSKSNodepoolAttrDiskSize, nodepool.DiskSize) - general.Assign(ret, resSKSNodepoolAttrInstancePoolID, nodepool.InstancePoolID) - general.Assign(ret, resSKSNodepoolAttrInstancePrefix, nodepool.InstancePrefix) - general.Assign(ret, resSKSNodepoolAttrInstanceType, nodepool.InstanceTypeID) - general.Assign(ret, resSKSNodepoolAttrLabels, nodepool.Labels) - general.Assign(ret, resSKSNodepoolAttrName, nodepool.Name) - general.Assign(ret, resSKSNodepoolAttrPrivateNetworkIDs, nodepool.PrivateNetworkIDs) - // TODO - general.Assign(ret, resSKSNodepoolAttrSecurityGroupIDs, nodepool.SecurityGroupIDs) - general.Assign(ret, resSKSNodepoolAttrSize, nodepool.Size) - general.Assign(ret, resSKSNodepoolAttrState, nodepool.State) - general.Assign(ret, resSKSNodepoolAttrTaints, nodepool.Taints) - general.Assign(ret, resSKSNodepoolAttrTemplateID, nodepool.TemplateID) - general.Assign(ret, resSKSNodepoolAttrVersion, nodepool.Version) - general.Assign(ret, dsSKSNodepoolID, nodepool.ID) + general.Assign(ret, resSKSNodepoolAttrAntiAffinityGroupIDs, &nodepool.AntiAffinityGroups) + general.AssignTime(ret, resSKSNodepoolAttrCreatedAt, &nodepool.CreatedAT) + general.Assign(ret, resSKSNodepoolAttrDeployTargetID, &nodepool.DeployTarget.ID) + general.Assign(ret, resSKSNodepoolAttrDescription, &nodepool.Description) + general.Assign(ret, resSKSNodepoolAttrDiskSize, &nodepool.DiskSize) + general.Assign(ret, resSKSNodepoolAttrInstancePoolID, &nodepool.InstancePool.ID) + general.Assign(ret, resSKSNodepoolAttrInstancePrefix, &nodepool.InstancePrefix) + general.Assign(ret, resSKSNodepoolAttrInstanceType, &nodepool.InstanceType.ID) + general.Assign(ret, resSKSNodepoolAttrLabels, &nodepool.Labels) + general.Assign(ret, resSKSNodepoolAttrName, &nodepool.Name) + general.Assign(ret, resSKSNodepoolAttrPrivateNetworkIDs, &nodepool.PrivateNetworks) + general.Assign(ret, resSKSNodepoolAttrPublicIPAssignment, &nodepool.PublicIPAssignment) + general.Assign(ret, resSKSNodepoolAttrSecurityGroupIDs, &nodepool.SecurityGroups) + general.Assign(ret, resSKSNodepoolAttrSize, &nodepool.Size) + general.Assign(ret, resSKSNodepoolAttrState, &nodepool.State) + general.Assign(ret, resSKSNodepoolAttrTaints, &nodepool.Taints) + general.Assign(ret, resSKSNodepoolAttrTemplateID, &nodepool.Template.ID) + general.Assign(ret, resSKSNodepoolAttrVersion, &nodepool.Version) + general.Assign(ret, dsSKSNodepoolID, &nodepool.ID) return ret } @@ -84,13 +84,15 @@ func dataSourceSKSNodepoolRead(ctx context.Context, d *schema.ResourceData, meta zone := d.Get(resSKSClusterAttrZone).(string) ctx, cancel := context.WithTimeout(ctx, d.Timeout(schema.TimeoutRead)) - ctx = exoapi.WithEndpoint(ctx, exoapi.NewReqEndpoint(getEnvironment(meta), zone)) defer cancel() - client := getClient(meta) + client, err := config.GetClientV3WithZone(ctx, meta, zone) + if err != nil { + return diag.FromErr(err) + } - clusterID := d.Get(resSKSNodepoolAttrClusterID).(string) - cluster, err := client.GetSKSCluster(ctx, zone, clusterID) + clusterID := v3.UUID(d.Get(resSKSNodepoolAttrClusterID).(string)) + cluster, err := client.GetSKSCluster(ctx, clusterID) if err != nil { return diag.Errorf("error getting cluster %q: %s", clusterID, err) } @@ -104,12 +106,12 @@ func dataSourceSKSNodepoolRead(ctx context.Context, d *schema.ResourceData, meta nMatches := 0 for _, nodepool := range cluster.Nodepools { - nodepoolData := nodepoolToDataMap(nodepool) + nodepoolData := nodepoolToDataMap(&nodepool) nodepoolData[resSKSNodepoolAttrClusterID] = clusterID nodepoolData[resSKSNodepoolAttrZone] = zone if filter.CheckForMatch(nodepoolData, filters) { if nMatches < 1 { - d.SetId(*nodepool.ID) + d.SetId(nodepool.ID.String()) matchingNodePool = nodepoolData diff --git a/exoscale/datasource_exoscale_sks_nodepool_list.go b/exoscale/datasource_exoscale_sks_nodepool_list.go index 034f987ae..46727204d 100644 --- a/exoscale/datasource_exoscale_sks_nodepool_list.go +++ b/exoscale/datasource_exoscale_sks_nodepool_list.go @@ -9,7 +9,8 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - v2 "github.com/exoscale/egoscale/v2" + v3 "github.com/exoscale/egoscale/v3" + "github.com/exoscale/terraform-provider-exoscale/pkg/config" "github.com/exoscale/terraform-provider-exoscale/pkg/general" "github.com/exoscale/terraform-provider-exoscale/pkg/list" ) @@ -27,11 +28,11 @@ func dataSourceSKSNodepoolList() *schema.Resource { return list.FilterableListDataSource(dsSKSNodepoolsListIdentifier, dsSKSNodepoolsListAttributeIdentifier, resSKSNodepoolAttrZone, getNodepoolList, nodepoolToDataMap, generateSKSNodepoolListID, dataSourceSKSNodepoolListGetElementScheme) } -func generateSKSNodepoolListID(nodepools []*v2.SKSNodepool) string { +func generateSKSNodepoolListID(nodepools []*v3.SKSNodepool) string { ids := make([]string, 0, len(nodepools)) for _, cluster := range nodepools { - ids = append(ids, *cluster.ID) + ids = append(ids, cluster.ID.String()) } sort.Strings(ids) @@ -39,16 +40,28 @@ func generateSKSNodepoolListID(nodepools []*v2.SKSNodepool) string { return fmt.Sprintf("%x", md5.Sum([]byte(strings.Join(ids, "")))) } -func getNodepoolList(ctx context.Context, d *schema.ResourceData, meta interface{}) ([]*v2.SKSNodepool, error) { - clusters, err := getClusterList(ctx, d, meta) +func getNodepoolList(ctx context.Context, d *schema.ResourceData, meta interface{}) ([]*v3.SKSNodepool, error) { + zone := d.Get(resSKSClusterAttrZone).(string) + + ctx, cancel := context.WithTimeout(ctx, d.Timeout(schema.TimeoutRead)) + defer cancel() + + client, err := config.GetClientV3WithZone(ctx, meta, zone) if err != nil { return nil, err } - var nodepools []*v2.SKSNodepool + clusters, err := client.ListSKSClusters(ctx) + if err != nil { + return nil, fmt.Errorf("error getting cluster list from zone %q: %s", zone, err) + } + + var nodepools []*v3.SKSNodepool - for _, cluster := range clusters { - nodepools = append(nodepools, cluster.Nodepools...) + for _, cluster := range clusters.SKSClusters { + for _, np := range cluster.Nodepools { + nodepools = append(nodepools, &np) + } } return nodepools, nil From e3e1753c6dea8a2b7c75b53c56695a4ab42d29b8 Mon Sep 17 00:00:00 2001 From: Philipp Sauter Date: Tue, 30 Jul 2024 18:33:45 +0200 Subject: [PATCH 4/4] generate docs --- docs/data-sources/sks_nodepool.md | 3 +++ docs/data-sources/sks_nodepool_list.md | 2 ++ docs/resources/sks_nodepool.md | 3 +++ 3 files changed, 8 insertions(+) diff --git a/docs/data-sources/sks_nodepool.md b/docs/data-sources/sks_nodepool.md index 4e62b8e83..5d0dedbae 100644 --- a/docs/data-sources/sks_nodepool.md +++ b/docs/data-sources/sks_nodepool.md @@ -34,6 +34,9 @@ description: |- - `labels` (Map of String) A map of key/value labels. - `name` (String) - `private_network_ids` (Set of String) A list of [exoscale_private_network](./private_network.md) (IDs) to be attached to the managed instances. +- `public_ip_assignment` (String) Configures public IP assignment of the Instances with: + * IPv4 ('inet4') addressing only (default); + * both IPv4 and IPv6 ('dual') addressing. - `security_group_ids` (Set of String) A list of [exoscale_security_group](./security_group.md) (IDs) to be attached to the managed instances. - `size` (Number) - `state` (String) The current pool state. diff --git a/docs/data-sources/sks_nodepool_list.md b/docs/data-sources/sks_nodepool_list.md index c1cbc8e18..d23d10c17 100644 --- a/docs/data-sources/sks_nodepool_list.md +++ b/docs/data-sources/sks_nodepool_list.md @@ -32,6 +32,7 @@ description: |- - `instance_type` (String) Match against this string. If you supply a string that begins and ends with a "/" it will be matched as a regex. - `labels` (Map of String) Match against key/values. Keys are matched exactly, while values may be matched as a regex if you supply a string that begins and ends with "/" - `name` (String) Match against this string. If you supply a string that begins and ends with a "/" it will be matched as a regex. +- `public_ip_assignment` (String) Match against this string. If you supply a string that begins and ends with a "/" it will be matched as a regex. - `size` (Number) Match against this int - `state` (String) Match against this string. If you supply a string that begins and ends with a "/" it will be matched as a regex. - `storage_lvm` (Boolean) Match against this bool @@ -62,6 +63,7 @@ Read-Only: - `labels` (Map of String) - `name` (String) - `private_network_ids` (Set of String) +- `public_ip_assignment` (String) - `security_group_ids` (Set of String) - `size` (Number) - `state` (String) diff --git a/docs/resources/sks_nodepool.md b/docs/resources/sks_nodepool.md index af864f2a1..73fcfb7ad 100644 --- a/docs/resources/sks_nodepool.md +++ b/docs/resources/sks_nodepool.md @@ -51,6 +51,9 @@ directory for complete configuration examples. - `kubelet_image_gc` (Block Set) Configuration for this nodepool's kubelet image garbage collector (see [below for nested schema](#nestedblock--kubelet_image_gc)) - `labels` (Map of String) A map of key/value labels. - `private_network_ids` (Set of String) A list of [exoscale_private_network](./private_network.md) (IDs) to be attached to the managed instances. +- `public_ip_assignment` (String) Configures public IP assignment of the Instances with: + * IPv4 ('inet4') addressing only (default); + * both IPv4 and IPv6 ('dual') addressing. - `security_group_ids` (Set of String) A list of [exoscale_security_group](./security_group.md) (IDs) to be attached to the managed instances. - `storage_lvm` (Boolean) Create nodes with non-standard partitioning for persistent storage (requires min 100G of disk space) (may only be set at creation time). - `taints` (Map of String) A map of key/value Kubernetes [taints](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) ('taints = { = ":" }').