diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0f9b7a37..d48e3f70 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+### Changed
+
+- Support longer node pool names and allow dashes
+
### Fixed
- Fix containerd config that was breaking in newer flatcar versions.
diff --git a/helm/cluster-aws/README.md b/helm/cluster-aws/README.md
index d7ad5c4f..05370991 100644
--- a/helm/cluster-aws/README.md
+++ b/helm/cluster-aws/README.md
@@ -147,29 +147,29 @@ For Giant Swarm internal use only, not stable, or not supported by UIs.
| `internal.migration.etcdExtraArgs` | **Etcd extra arguments**|**Type:** `object`
|
| `internal.migration.etcdExtraArgs.PATTERN` | **argument**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^.+:.+$`
|
| `internal.nodePools` | **Default node pool**|**Type:** `object`
**Default:** `{"def00":{"customNodeLabels":["label=default"],"instanceType":"r6i.xlarge","maxSize":3,"minSize":3}}`|
-| `internal.nodePools.PATTERN` | **Node pool**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.additionalSecurityGroups` | **Machine pool additional security groups** - Additional security groups that will be added to the machine pool nodes.|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.additionalSecurityGroups[*]` | **security group**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.additionalSecurityGroups[*].id` | **Id of the security group** - ID of the security group that will be added to the machine pool nodes. The security group must exist.|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.availabilityZones` | **Availability zones**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.availabilityZones[*]` | **Availability zone**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.customNodeLabels` | **Custom node labels**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.customNodeLabels[*]` | **Label**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.customNodeTaints` | **Custom node taints**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.customNodeTaints[*]` |**None**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.customNodeTaints[*].effect` | **Effect**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.customNodeTaints[*].key` | **Key**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.customNodeTaints[*].value` | **Value**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.instanceType` | **EC2 instance type**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.maxSize` | **Maximum number of nodes**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.minSize` | **Minimum number of nodes**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.rootVolumeSizeGB` | **Root volume size (GB)**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.spotInstances` | **Spot instances** - Compared to on-demand instances, spot instances can help you save cost.|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.spotInstances.enabled` | **Enable**|**Type:** `boolean`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
**Default:** `false`|
-| `internal.nodePools.PATTERN.spotInstances.maxPrice` | **Maximum price to pay per instance per hour, in USD.**|**Type:** `number`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.subnetTags` | **Subnet tags** - Tags to filter which AWS subnets will be used for this node pool.|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.subnetTags[*]` | **Subnet tag**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `internal.nodePools.PATTERN.subnetTags[*].*` | **Tag value**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
**Value pattern:** `^[ a-zA-Z0-9\._:/=+-@]+$`
|
+| `internal.nodePools.PATTERN` | **Node pool**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.additionalSecurityGroups` | **Machine pool additional security groups** - Additional security groups that will be added to the machine pool nodes.|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.additionalSecurityGroups[*]` | **security group**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.additionalSecurityGroups[*].id` | **Id of the security group** - ID of the security group that will be added to the machine pool nodes. The security group must exist.|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.availabilityZones` | **Availability zones**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.availabilityZones[*]` | **Availability zone**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.customNodeLabels` | **Custom node labels**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.customNodeLabels[*]` | **Label**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.customNodeTaints` | **Custom node taints**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.customNodeTaints[*]` |**None**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.customNodeTaints[*].effect` | **Effect**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.customNodeTaints[*].key` | **Key**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.customNodeTaints[*].value` | **Value**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.instanceType` | **EC2 instance type**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.maxSize` | **Maximum number of nodes**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.minSize` | **Minimum number of nodes**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.rootVolumeSizeGB` | **Root volume size (GB)**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.spotInstances` | **Spot instances** - Compared to on-demand instances, spot instances can help you save cost.|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.spotInstances.enabled` | **Enable**|**Type:** `boolean`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
**Default:** `false`|
+| `internal.nodePools.PATTERN.spotInstances.maxPrice` | **Maximum price to pay per instance per hour, in USD.**|**Type:** `number`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.subnetTags` | **Subnet tags** - Tags to filter which AWS subnets will be used for this node pool.|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.subnetTags[*]` | **Subnet tag**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `internal.nodePools.PATTERN.subnetTags[*].*` | **Tag value**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
**Value pattern:** `^[ a-zA-Z0-9\._:/=+-@]+$`
|
| `internal.sandboxContainerImage` | **Kubectl image**|**Type:** `object`
|
| `internal.sandboxContainerImage.name` | **Repository**|**Type:** `string`
**Default:** `"giantswarm/pause"`|
| `internal.sandboxContainerImage.registry` | **Registry**|**Type:** `string`
**Default:** `"quay.io"`|
@@ -205,35 +205,42 @@ Properties within the `.metadata` top-level object
| `metadata.organization` | **Organization**|**Type:** `string`
|
| `metadata.servicePriority` | **Service priority** - The relative importance of this cluster.|**Type:** `string`
**Default:** `"highest"`|
+### Metadata
+Properties within the `.global.metadata` object
+
+| **Property** | **Description** | **More Details** |
+| :----------- | :-------------- | :--------------- |
+| `global.metadata.preventDeletion` | **Prevent cluster deletion**|**Type:** `boolean`
**Default:** `false`|
+
### Node pools
Properties within the `.nodePools` top-level object
Node pools of the cluster. If not specified, this defaults to the value of `internal.nodePools`.
| **Property** | **Description** | **More Details** |
| :----------- | :-------------- | :--------------- |
-| `nodePools.PATTERN` | **Node pool**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.additionalSecurityGroups` | **Machine pool additional security groups** - Additional security groups that will be added to the machine pool nodes.|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.additionalSecurityGroups[*]` | **security group**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.additionalSecurityGroups[*].id` | **Id of the security group** - ID of the security group that will be added to the machine pool nodes. The security group must exist.|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.availabilityZones` | **Availability zones**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.availabilityZones[*]` | **Availability zone**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.customNodeLabels` | **Custom node labels**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.customNodeLabels[*]` | **Label**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.customNodeTaints` | **Custom node taints**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.customNodeTaints[*]` |**None**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.customNodeTaints[*].effect` | **Effect**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.customNodeTaints[*].key` | **Key**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.customNodeTaints[*].value` | **Value**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.instanceType` | **EC2 instance type**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.maxSize` | **Maximum number of nodes**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.minSize` | **Minimum number of nodes**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.rootVolumeSizeGB` | **Root volume size (GB)**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.spotInstances` | **Spot instances** - Compared to on-demand instances, spot instances can help you save cost.|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.spotInstances.enabled` | **Enable**|**Type:** `boolean`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
**Default:** `false`|
-| `nodePools.PATTERN.spotInstances.maxPrice` | **Maximum price to pay per instance per hour, in USD.**|**Type:** `number`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.subnetTags` | **Subnet tags** - Tags to filter which AWS subnets will be used for this node pool.|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.subnetTags[*]` | **Subnet tag**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
|
-| `nodePools.PATTERN.subnetTags[*].*` | **Tag value**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9]{5,10}$`
**Value pattern:** `^[ a-zA-Z0-9\._:/=+-@]+$`
|
+| `nodePools.PATTERN` | **Node pool**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.additionalSecurityGroups` | **Machine pool additional security groups** - Additional security groups that will be added to the machine pool nodes.|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.additionalSecurityGroups[*]` | **security group**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.additionalSecurityGroups[*].id` | **Id of the security group** - ID of the security group that will be added to the machine pool nodes. The security group must exist.|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.availabilityZones` | **Availability zones**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.availabilityZones[*]` | **Availability zone**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.customNodeLabels` | **Custom node labels**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.customNodeLabels[*]` | **Label**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.customNodeTaints` | **Custom node taints**|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.customNodeTaints[*]` |**None**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.customNodeTaints[*].effect` | **Effect**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.customNodeTaints[*].key` | **Key**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.customNodeTaints[*].value` | **Value**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.instanceType` | **EC2 instance type**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.maxSize` | **Maximum number of nodes**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.minSize` | **Minimum number of nodes**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.rootVolumeSizeGB` | **Root volume size (GB)**|**Type:** `integer`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.spotInstances` | **Spot instances** - Compared to on-demand instances, spot instances can help you save cost.|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.spotInstances.enabled` | **Enable**|**Type:** `boolean`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
**Default:** `false`|
+| `nodePools.PATTERN.spotInstances.maxPrice` | **Maximum price to pay per instance per hour, in USD.**|**Type:** `number`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.subnetTags` | **Subnet tags** - Tags to filter which AWS subnets will be used for this node pool.|**Type:** `array`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.subnetTags[*]` | **Subnet tag**|**Type:** `object`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
|
+| `nodePools.PATTERN.subnetTags[*].*` | **Tag value**|**Type:** `string`
**Key pattern:**
`PATTERN`=`^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$`
**Value pattern:** `^[ a-zA-Z0-9\._:/=+-@]+$`
|
### Other
diff --git a/helm/cluster-aws/values.schema.json b/helm/cluster-aws/values.schema.json
index 3b560d8a..679f4fdb 100644
--- a/helm/cluster-aws/values.schema.json
+++ b/helm/cluster-aws/values.schema.json
@@ -817,7 +817,7 @@
"type": "object",
"title": "Default node pool",
"patternProperties": {
- "^[a-z0-9]{5,10}$": {
+ "^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$": {
"$ref": "#/$defs/machinePool"
}
},
@@ -940,7 +940,7 @@
"description": "Node pools of the cluster. If not specified, this defaults to the value of `internal.nodePools`.",
"additionalProperties": false,
"patternProperties": {
- "^[a-z0-9]{5,10}$": {
+ "^[a-z0-9][-a-z0-9]{3,18}[a-z0-9]$": {
"$ref": "#/$defs/machinePool"
}
}