@@ -26,6 +26,7 @@ const (
2626 k8sRocketStorageSupportRelease = "1.26"
2727 k8sMultiNodePoolSupportRelease = "1.30"
2828 k8sTaintKeyValueRegex = `^[a-zA-Z0-9-]+$`
29+ k8sLabelKeyValueRegex = `^[a-zA-Z0-9-]+$`
2930)
3031
3132// ResourceGridscaleK8sModeler struct represents a modeler of the gridscale k8s resource.
@@ -145,6 +146,27 @@ func (rgk8sm *ResourceGridscaleK8sModeler) buildInputSchema() map[string]*schema
145146 },
146147 },
147148 },
149+ "labels" : {
150+ Type : schema .TypeList ,
151+ Optional : true ,
152+ Description : "List of labels to be applied to the nodes of this pool." ,
153+ Elem : & schema.Resource {
154+ Schema : map [string ]* schema.Schema {
155+ "key" : {
156+ Type : schema .TypeString ,
157+ Required : true ,
158+ Description : "The key of the label." ,
159+ ValidateFunc : validation .StringMatch (regexp .MustCompile (k8sLabelKeyValueRegex ), "key must match Kubernetes label key format" ),
160+ },
161+ "value" : {
162+ Type : schema .TypeString ,
163+ Required : true ,
164+ Description : "The value of the label." ,
165+ ValidateFunc : validation .StringMatch (regexp .MustCompile (k8sLabelKeyValueRegex ), "value must match Kubernetes label value format" ),
166+ },
167+ },
168+ },
169+ },
148170 }
149171 return map [string ]* schema.Schema {
150172 "name" : {
@@ -906,6 +928,28 @@ func resourceGridscaleK8sRead(d *schema.ResourceData, meta interface{}) error {
906928 nodePoolRead ["taints" ] = taintsRead
907929 }
908930
931+ // Handle labels
932+ if labels , isLabelsSet := nodePoolSet ["labels" ]; isLabelsSet {
933+ labelsList := labels .([]any )
934+ labelsRead := make ([]map [string ]any , 0 )
935+
936+ for _ , labelInterface := range labelsList {
937+ label := labelInterface .(map [string ]any )
938+ labelRead := make (map [string ]any )
939+
940+ if key , isKeySet := label ["key" ]; isKeySet {
941+ labelRead ["key" ] = key
942+ }
943+ if value , isValueSet := label ["value" ]; isValueSet {
944+ labelRead ["value" ] = value
945+ }
946+
947+ labelsRead = append (labelsRead , labelRead )
948+ }
949+
950+ nodePoolRead ["labels" ] = labelsRead
951+ }
952+
909953 nodePools = append (nodePools , nodePoolRead )
910954 }
911955 }
@@ -1031,6 +1075,28 @@ func resourceGridscaleK8sCreate(d *schema.ResourceData, meta interface{}) error
10311075 nodePool ["taints" ] = taintsRequest
10321076 }
10331077
1078+ // Handle labels
1079+ if labelsInterface , isLabelsSet := d .GetOk (fmt .Sprintf ("node_pool.%d.labels" , index )); isLabelsSet {
1080+ labelsList := labelsInterface .([]any )
1081+ labelsRequest := make ([]map [string ]any , 0 )
1082+
1083+ for _ , labelInterface := range labelsList {
1084+ label := labelInterface .(map [string ]any )
1085+ labelRequest := make (map [string ]any )
1086+
1087+ if key , isKeySet := label ["key" ]; isKeySet {
1088+ labelRequest ["key" ] = key
1089+ }
1090+ if value , isValueSet := label ["value" ]; isValueSet {
1091+ labelRequest ["value" ] = value
1092+ }
1093+
1094+ labelsRequest = append (labelsRequest , labelRequest )
1095+ }
1096+
1097+ nodePool ["labels" ] = labelsRequest
1098+ }
1099+
10341100 nodePools = append (nodePools , nodePool )
10351101 }
10361102 parameters ["pools" ] = nodePools
@@ -1217,6 +1283,28 @@ func resourceGridscaleK8sUpdate(d *schema.ResourceData, meta interface{}) error
12171283 nodePool ["taints" ] = taintsRequest
12181284 }
12191285
1286+ // Handle labels
1287+ if labelsInterface , isLabelsSet := d .GetOk (fmt .Sprintf ("node_pool.%d.labels" , index )); isLabelsSet {
1288+ labelsList := labelsInterface .([]any )
1289+ labelsRequest := make ([]map [string ]any , 0 )
1290+
1291+ for _ , labelInterface := range labelsList {
1292+ label := labelInterface .(map [string ]any )
1293+ labelRequest := make (map [string ]any )
1294+
1295+ if key , isKeySet := label ["key" ]; isKeySet {
1296+ labelRequest ["key" ] = key
1297+ }
1298+ if value , isValueSet := label ["value" ]; isValueSet {
1299+ labelRequest ["value" ] = value
1300+ }
1301+
1302+ labelsRequest = append (labelsRequest , labelRequest )
1303+ }
1304+
1305+ nodePool ["labels" ] = labelsRequest
1306+ }
1307+
12201308 nodePools = append (nodePools , nodePool )
12211309 }
12221310 parameters ["pools" ] = nodePools
@@ -1559,6 +1647,59 @@ func validateK8sParameters(d *schema.ResourceDiff, template gsclient.PaaSTemplat
15591647 }
15601648 }
15611649 }
1650+
1651+ // Validate labels
1652+ nodePoolParameterLabels , labels_ok := templateParameterNodePools .Schema .Schema ["labels" ]
1653+ if labels_ok {
1654+ if labelsInterface , isLabelsSet := d .GetOk (fmt .Sprintf ("node_pool.%d.labels" , index )); isLabelsSet {
1655+ labelsList := labelsInterface .([]any )
1656+
1657+ // Check if labels list is empty when it's allowed to be
1658+ if len (labelsList ) == 0 && ! nodePoolParameterLabels .Empty {
1659+ errorMessages = append (
1660+ errorMessages ,
1661+ fmt .Sprintf ("Invalid 'node_pool.%d.labels' value. Labels list cannot be empty.\n " , index ),
1662+ )
1663+ }
1664+
1665+ // Validate each label
1666+ for _ , labelInterface := range labelsList {
1667+ label := labelInterface .(map [string ]any )
1668+
1669+ // Validate key
1670+ if key , isKeySet := label ["key" ]; isKeySet {
1671+ keyStr := key .(string )
1672+ if ! regexp .MustCompile (k8sLabelKeyValueRegex ).MatchString (keyStr ) {
1673+ errorMessages = append (
1674+ errorMessages ,
1675+ fmt .Sprintf ("Invalid 'node_pool.%d.labels.key' value. Key must match Kubernetes label key format.\n " , index ),
1676+ )
1677+ }
1678+ } else {
1679+ errorMessages = append (
1680+ errorMessages ,
1681+ fmt .Sprintf ("Invalid 'node_pool.%d.labels' value. Key is required.\n " , index ),
1682+ )
1683+ }
1684+
1685+ // Validate value
1686+ if value , isValueSet := label ["value" ]; isValueSet {
1687+ valueStr := value .(string )
1688+ if ! regexp .MustCompile (k8sLabelKeyValueRegex ).MatchString (valueStr ) {
1689+ errorMessages = append (
1690+ errorMessages ,
1691+ fmt .Sprintf ("Invalid 'node_pool.%d.labels.value' value. Value must match Kubernetes label value format.\n " , index ),
1692+ )
1693+ }
1694+ } else {
1695+ errorMessages = append (
1696+ errorMessages ,
1697+ fmt .Sprintf ("Invalid 'node_pool.%d.labels' value. Value is required.\n " , index ),
1698+ )
1699+ }
1700+ }
1701+ }
1702+ }
15621703 }
15631704 }
15641705
0 commit comments