Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package eksctl for openSUSE:Factory checked in at 2026-07-02 20:10:39 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/eksctl (Old) and /work/SRC/openSUSE:Factory/.eksctl.new.1982 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "eksctl" Thu Jul 2 20:10:39 2026 rev:73 rq:1363087 version:0.229.0 Changes: -------- --- /work/SRC/openSUSE:Factory/eksctl/eksctl.changes 2026-06-28 21:09:42.680504434 +0200 +++ /work/SRC/openSUSE:Factory/.eksctl.new.1982/eksctl.changes 2026-07-02 20:14:28.443813072 +0200 @@ -1,0 +2,10 @@ +Thu Jul 02 05:31:41 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 0.229.0: + * Features + - Add cluster version rollback support with rollbackConfig + (#8780) + - Add support for EKS on Outposts with EC2 instance store + (#8774) + +------------------------------------------------------------------- Old: ---- eksctl-0.228.0.obscpio New: ---- eksctl-0.229.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ eksctl.spec ++++++ --- /var/tmp/diff_new_pack.OBYpkU/_old 2026-07-02 20:14:31.187907952 +0200 +++ /var/tmp/diff_new_pack.OBYpkU/_new 2026-07-02 20:14:31.211908782 +0200 @@ -17,7 +17,7 @@ Name: eksctl -Version: 0.228.0 +Version: 0.229.0 Release: 0 Summary: The official CLI for Amazon EKS License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.OBYpkU/_old 2026-07-02 20:14:31.595922057 +0200 +++ /var/tmp/diff_new_pack.OBYpkU/_new 2026-07-02 20:14:31.631923302 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/eksctl-io/eksctl.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">refs/tags/v0.228.0</param> + <param name="revision">refs/tags/v0.229.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.OBYpkU/_old 2026-07-02 20:14:31.851930907 +0200 +++ /var/tmp/diff_new_pack.OBYpkU/_new 2026-07-02 20:14:31.923933396 +0200 @@ -5,6 +5,6 @@ <param name="url">https://github.com/eksctl-io/eksctl</param> <param name="changesrevision">9c634ace6d66f43272fb82e73c4e658f7ac7c778</param></service><service name="tar_scm"> <param name="url">https://github.com/eksctl-io/eksctl.git</param> - <param name="changesrevision">ab26c5b38e42a8143f9f110c1ba4bf745ba07d5e</param></service></servicedata> + <param name="changesrevision">489531af5b30af332357bac5688592fb20c22644</param></service></servicedata> (No newline at EOF) ++++++ eksctl-0.228.0.obscpio -> eksctl-0.229.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/docs/release_notes/0.229.0.md new/eksctl-0.229.0/docs/release_notes/0.229.0.md --- old/eksctl-0.228.0/docs/release_notes/0.229.0.md 1970-01-01 01:00:00.000000000 +0100 +++ new/eksctl-0.229.0/docs/release_notes/0.229.0.md 2026-07-02 00:20:24.000000000 +0200 @@ -0,0 +1,11 @@ +# Release v0.229.0 + +## 🚀 Features + +- Add cluster version rollback support with rollbackConfig (#8780) +- Add support for EKS on Outposts with EC2 instance store (#8774) + +## Acknowledgments + +The eksctl maintainers would like to sincerely thank @DimitriPL5 and @michaelhtm. + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/go.mod new/eksctl-0.229.0/go.mod --- old/eksctl-0.228.0/go.mod 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/go.mod 2026-07-02 00:20:24.000000000 +0200 @@ -10,19 +10,19 @@ github.com/aws/aws-sdk-go-v2 v1.42.0 github.com/aws/aws-sdk-go-v2/config v1.32.16 github.com/aws/aws-sdk-go-v2/credentials v1.19.15 - github.com/aws/aws-sdk-go-v2/service/autoscaling v1.64.2 + github.com/aws/aws-sdk-go-v2/service/autoscaling v1.66.2 github.com/aws/aws-sdk-go-v2/service/cloudformation v1.71.11 - github.com/aws/aws-sdk-go-v2/service/cloudtrail v1.55.7 - github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.64.0 + github.com/aws/aws-sdk-go-v2/service/cloudtrail v1.55.11 + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.73.0 github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.60.2 - github.com/aws/aws-sdk-go-v2/service/ec2 v1.294.0 - github.com/aws/aws-sdk-go-v2/service/eks v1.87.0 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.33.21 - github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.54.8 - github.com/aws/aws-sdk-go-v2/service/iam v1.53.9 + github.com/aws/aws-sdk-go-v2/service/ec2 v1.302.0 + github.com/aws/aws-sdk-go-v2/service/eks v1.88.0 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.33.25 + github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.54.12 + github.com/aws/aws-sdk-go-v2/service/iam v1.53.10 github.com/aws/aws-sdk-go-v2/service/kms v1.51.0 github.com/aws/aws-sdk-go-v2/service/outposts v1.59.2 - github.com/aws/aws-sdk-go-v2/service/ssm v1.68.2 + github.com/aws/aws-sdk-go-v2/service/ssm v1.68.6 github.com/aws/aws-sdk-go-v2/service/sts v1.42.0 github.com/aws/smithy-go v1.27.1 github.com/awslabs/amazon-eks-ami/nodeadm v0.0.0-20260213141146-147b13ea3f4a @@ -134,15 +134,15 @@ github.com/ashanbrown/forbidigo/v2 v2.3.0 // indirect github.com/ashanbrown/makezero/v2 v2.1.0 // indirect github.com/atotto/clipboard v0.1.4 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.22 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23 // indirect github.com/aws/aws-sdk-go-v2/service/eventbridge v1.45.17 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 // indirect github.com/aws/aws-sdk-go-v2/service/pricing v1.34.3 // indirect github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/go.sum new/eksctl-0.229.0/go.sum --- old/eksctl-0.228.0/go.sum 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/go.sum 2026-07-02 00:20:24.000000000 +0200 @@ -110,8 +110,8 @@ github.com/aws/amazon-ec2-instance-selector/v3 v3.1.2/go.mod h1:wdlMRtz9G4IO6H1yZPsqfGBxR8E6B/bdxHlGkls4kGQ= github.com/aws/aws-sdk-go-v2 v1.42.0 h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA= github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 h1:N4lRUXZpZ1KVEUn6hxtco/1d2lgYhNn1fHkkl8WhlyQ= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10 h1:gx1AwW1Iyk9Z9dD9F4akX5gnN3QZwUB20GGKH/I+Rho= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.10/go.mod h1:qqY157uZoqm5OXq/amuaBJyC9hgBCBQnsaWnPe905GY= github.com/aws/aws-sdk-go-v2/config v1.32.16 h1:Q0iQ7quUgJP0F/SCRTieScnaMdXr9h/2+wze1u3cNeM= github.com/aws/aws-sdk-go-v2/config v1.32.16/go.mod h1:duCCnJEFqpt2RC6no1iK6q+8HpwOAkiUua0pY507dQc= github.com/aws/aws-sdk-go-v2/credentials v1.19.15 h1:fyvgWTszojq8hEnMi8PPBTvZdTtEVmAVyo+NFLHBhH4= @@ -124,34 +124,34 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29/go.mod h1:71wt8W2EgswdZy9Mf9KNnzxZ3TiZlv4caKghPktDOkA= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23 h1:FPXsW9+gMuIeKmz7j6ENWcWtBGTe1kH8r9thNt5Uxx4= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23/go.mod h1:7J8iGMdRKk6lw2C+cMIphgAnT8uTwBwNOsGkyOCm80U= -github.com/aws/aws-sdk-go-v2/service/autoscaling v1.64.2 h1:pzFtdV2DArJul6aM3+WiWjUQ63IzrSnSbvBr8FAokt4= -github.com/aws/aws-sdk-go-v2/service/autoscaling v1.64.2/go.mod h1:8xQlcle6cf4R66HrXbiahORXakWpLlvJXoiGae5BlIc= +github.com/aws/aws-sdk-go-v2/service/autoscaling v1.66.2 h1:pPd+/Ujqf2+DmPOdB47EN7ox1iC21lu2zlOccUlfHeo= +github.com/aws/aws-sdk-go-v2/service/autoscaling v1.66.2/go.mod h1:b3XHAIEe5I9cmeZ9MLvUqj5DRWcBuh1/hpKDPb7T6KE= github.com/aws/aws-sdk-go-v2/service/cloudformation v1.71.11 h1:gIRdzLv98ugE0nvMkub5yp4uziPFHF66ERrQ9JN+D54= github.com/aws/aws-sdk-go-v2/service/cloudformation v1.71.11/go.mod h1:BMpnKVWK+343lUuI2ZM5bm282z+p61ZK9kwRg6/wBm4= -github.com/aws/aws-sdk-go-v2/service/cloudtrail v1.55.7 h1:yd6F0NesTmsJVOCINfKXBcGXx9J7k4hZQU/njcUlC7w= -github.com/aws/aws-sdk-go-v2/service/cloudtrail v1.55.7/go.mod h1:t6XfFh0GZGngXjAlsmFedoylELOo9t/XetRCeTEfZEc= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.64.0 h1:6QLwTAIR2z3QmYxuHM8nfZkW/C/qn4cvhesHIE98/CE= -github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.64.0/go.mod h1:RCkMRCGlsyFwF9Accj7GsHQFCIR9s8iRbv4LPYOT9wY= +github.com/aws/aws-sdk-go-v2/service/cloudtrail v1.55.11 h1:3IDx7ybn7pyrLgVShEfGmEXec1xsqgoD1ADI1SxqKT0= +github.com/aws/aws-sdk-go-v2/service/cloudtrail v1.55.11/go.mod h1:iSArc5uhvz1S3EICNNvRzPksb6HPAUhltzMvoCrGyfM= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.73.0 h1:JmrHkELR2Q0O28swrFMm0hZNwpQrV8qmbhnb7suKIfc= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.73.0/go.mod h1:MLJu3PUd8fp5Qvj4CiLvyY5H8y7kxHKlTp060Wsd+Vc= github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.60.2 h1:pZxE29WAHgnk0jGj1P4UOOJnNPHXfltkfnK4F1Tg8jU= github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider v1.60.2/go.mod h1:nbe4Nf/HOY+e54Dl+yjv04scYTGTC+4ZthbfOuPTXQs= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.294.0 h1:776KnBqePBBR6zEDi0bUIHXzUBOISa2WgAKEgckUF8M= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.294.0/go.mod h1:rB577GvkmJADVOFGY8/j9sPv/ewcsEtQNsd9Lrn7Zx0= -github.com/aws/aws-sdk-go-v2/service/eks v1.87.0 h1:bftLltXNWmNr9ed3CaQnVlzNPTNTFdHguNhIsZF6DxM= -github.com/aws/aws-sdk-go-v2/service/eks v1.87.0/go.mod h1:rbIASs+SfCDUXx2EdfMkNpDGptlW8hvMZ9AawRiUBqE= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.33.21 h1:VriOdPKF8YrkMpnT76ZwA2LXk5aBInOfuzN14QGTOJc= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.33.21/go.mod h1:sp4Mz5YUnYCvIkGNEcdEPp+DuHqquEZYXyIuKXuHzig= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.54.8 h1:xUwbqWhKASQsigeQfeBjhbm6dAP1EeTulHnNSYv5Xfc= -github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.54.8/go.mod h1:sQoz/dTooY3kCkNNGxVLTS7EacLA0qXUaK4BkpMjGOc= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.302.0 h1:7c0jQaj+QKYUo3pgtEm9fQIePJH6QJA3bVKIgCCLdvM= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.302.0/go.mod h1:Y95W0Hm6FYLPa6o0hbnJ+sWgmdc4ifcLFjGkdobWVhY= +github.com/aws/aws-sdk-go-v2/service/eks v1.88.0 h1:dP/bd/5AG73UJGXyZh6gQSafVS9T+mBQgIULtJvzEnE= +github.com/aws/aws-sdk-go-v2/service/eks v1.88.0/go.mod h1:rbIASs+SfCDUXx2EdfMkNpDGptlW8hvMZ9AawRiUBqE= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.33.25 h1:VzmoYPRbNSUqk3pA04ZyGZUg52yfX259XXRqwr1lns4= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancing v1.33.25/go.mod h1:r7chQGimOmFs4oqawhO+i+o3ez2l69rzAco5KTb7bjY= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.54.12 h1:TJXv7kZjdXA2maPDaJFFEQPBrPmvPtMybN3qYDOpJ4Y= +github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2 v1.54.12/go.mod h1:lwjtb9DHOAmNt7EUW68Zd1Qd+cPyFxacXHN5c9JZ2VY= github.com/aws/aws-sdk-go-v2/service/eventbridge v1.45.17 h1:ltbEzdlO5qKYK1FuwTt2LibddWFmH/QY6usxvPOQP08= github.com/aws/aws-sdk-go-v2/service/eventbridge v1.45.17/go.mod h1:KXFNdzl+mZpQlLYm378Ml18wBHybbMpyBwNXuYjbDT4= -github.com/aws/aws-sdk-go-v2/service/iam v1.53.9 h1:slEs4iUvSt/YOiQQajtXkYBZTMrsEeplSnaB928p4l0= -github.com/aws/aws-sdk-go-v2/service/iam v1.53.9/go.mod h1:1vkJzjCYC3byO0kIrBqLPzvZpuvYhPXkuyARs6E7tM4= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8 h1:HtOTYcbVcGABLOVuPYaIihj6IlkqubBwFj10K5fxRek= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8/go.mod h1:VsK9abqQeGlzPgUr+isNWzPlK2vKe9INMLWnY65f5Xs= +github.com/aws/aws-sdk-go-v2/service/iam v1.53.10 h1:kcN3I3llO7VwIY5w3Pc5FmEonpsr23Ou7Cwk4qf7dik= +github.com/aws/aws-sdk-go-v2/service/iam v1.53.10/go.mod h1:1vkJzjCYC3byO0kIrBqLPzvZpuvYhPXkuyARs6E7tM4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9 h1:FLudkZLt5ci0ozzgkVo8BJGwvqNaZbTWb3UcucAateA= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.9/go.mod h1:w7wZ/s9qK7c8g4al+UyoF1Sp/Z45UwMGcqIzLWVQHWk= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7 h1:DIBqIrJ7hv+e4CmIk2z3pyKT+3B6qVMgRsawHiR3qso= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7/go.mod h1:vLm00xmBke75UmpNvOcZQ/Q30ZFjbczeLFqGx5urmGo= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22 h1:PUmZeJU6Y1Lbvt9WFuJ0ugUK2xn6hIWUBBbKuOWF30s= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22/go.mod h1:nO6egFBoAaoXze24a2C0NjQCvdpk8OueRoYimvEB9jo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23 h1:pbrxO/kuIwgEsOPLkaHu0O+m4fNgLU8B3vxQ+72jTPw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.23/go.mod h1:/CMNUqoj46HpS3MNRDEDIwcgEnrtZlKRaHNaHxIFpNA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 h1:NSbvS17MlI2lurYgXnCOLvCFX38sBW4eiVER7+kkgsU= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16/go.mod h1:SwT8Tmqd4sA6G1qaGdzWCJN99bUmPGHfRwwq3G5Qb+A= github.com/aws/aws-sdk-go-v2/service/kms v1.51.0 h1:696UM+NwOrETBCLQJyCAGtVmmZmziBT59yMwgg6Fvrw= @@ -168,8 +168,8 @@ github.com/aws/aws-sdk-go-v2/service/signin v1.0.10/go.mod h1:p6+MXNxW7IA6dMgHfTAzljuwSKD0NCm/4lbS4t6+7vI= github.com/aws/aws-sdk-go-v2/service/sqs v1.42.20 h1:qa+1W+Kon3WDwO+8ugco4D9KvO0Pf0KBTn1hN7opIFw= github.com/aws/aws-sdk-go-v2/service/sqs v1.42.20/go.mod h1:OG0Y3TgC+IeM++ngh+IcEkN24ruGsmRiAP8GUsOhMW8= -github.com/aws/aws-sdk-go-v2/service/ssm v1.68.2 h1:idKv7B7NjmTDd05YHQYMMEFNeD0rWxs/kVX4lsjEiDo= -github.com/aws/aws-sdk-go-v2/service/ssm v1.68.2/go.mod h1:1NiL45h4A60CO/hu/UdNyG5AD3VEsdpaQx1l5KtpurA= +github.com/aws/aws-sdk-go-v2/service/ssm v1.68.6 h1:0LPJjbSNEDHidGOXa0LfvSVbdn9/GdlJUQTgE0kFpso= +github.com/aws/aws-sdk-go-v2/service/ssm v1.68.6/go.mod h1:SrZAopBP5/lyQ6NBVXKlRp8wPIXhzBCZU98sEozmv8Y= github.com/aws/aws-sdk-go-v2/service/sso v1.30.16 h1:x6bKbmDhsgSZwv6q19wY/u3rLk/3FGjJWyqKcIRufpE= github.com/aws/aws-sdk-go-v2/service/sso v1.30.16/go.mod h1:CudnEVKRtLn0+3uMV0yEXZ+YZOKnAtUJ5DmDhilVnIw= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20 h1:oK/njaL8GtyEihkWMD4k3VgHCT64RQKkZwh0DG5j8ak= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/actions/cluster/upgrade.go new/eksctl-0.229.0/pkg/actions/cluster/upgrade.go --- old/eksctl-0.228.0/pkg/actions/cluster/upgrade.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/actions/cluster/upgrade.go 2026-07-02 00:20:24.000000000 +0200 @@ -10,6 +10,7 @@ api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" "github.com/weaveworks/eksctl/pkg/ctl/cmdutils" "github.com/weaveworks/eksctl/pkg/eks" + "github.com/weaveworks/eksctl/pkg/utils" ) func upgrade(ctx context.Context, cfg *api.ClusterConfig, ctl *eks.ClusterProvider, dryRun bool) (bool, error) { @@ -31,14 +32,24 @@ } if upgradeVersion != "" { + currentVersion := ctl.ControlPlaneVersion() + // A resolved target lower than the current version is a rollback (downgrade); + // use direction-aware wording so the logs don't say "upgrade" for a downgrade. + action, pastAction := "upgrade", "upgraded" + if c, err := utils.CompareVersions(upgradeVersion, currentVersion); err != nil { + return false, err + } else if c < 0 { + action, pastAction = "roll back", "rolled back" + } + msgNodeGroupsAndAddons := "you will need to follow the upgrade procedure for all of nodegroups and add-ons" - cmdutils.LogIntendedAction(dryRun, "upgrade cluster %q control plane from current version %q to %q", cfg.Metadata.Name, ctl.ControlPlaneVersion(), upgradeVersion) + cmdutils.LogIntendedAction(dryRun, "%s cluster %q control plane from current version %q to %q", action, cfg.Metadata.Name, currentVersion, upgradeVersion) if !dryRun { cfg.Metadata.Version = upgradeVersion if err := ctl.UpdateClusterVersionBlocking(ctx, cfg); err != nil { return false, err } - logger.Success("cluster %q control plane has been upgraded to version %q", cfg.Metadata.Name, cfg.Metadata.Version) + logger.Success("cluster %q control plane has been %s to version %q", cfg.Metadata.Name, pastAction, cfg.Metadata.Version) logger.Info(msgNodeGroupsAndAddons) } } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/assets/schema.json new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/assets/schema.json --- old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/assets/schema.json 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/assets/schema.json 2026-07-02 00:20:24.000000000 +0200 @@ -1072,6 +1072,11 @@ "description": "the AWS region hosting this cluster", "x-intellij-html-description": "the AWS region hosting this cluster" }, + "rollbackConfig": { + "$ref": "#/definitions/RollbackConfig", + "description": "configures the automatic rollback behaviour when updating the cluster version (including downgrades).", + "x-intellij-html-description": "configures the automatic rollback behaviour when updating the cluster version (including downgrades)." + }, "tags": { "additionalProperties": { "type": "string" @@ -1092,6 +1097,7 @@ "region", "version", "forceUpdateVersion", + "rollbackConfig", "tags", "annotations" ], @@ -2828,12 +2834,24 @@ "$ref": "#/definitions/Placement", "description": "specifies the placement configuration for control plane instances on Outposts.", "x-intellij-html-description": "specifies the placement configuration for control plane instances on Outposts." + }, + "etcdInstanceType": { + "type": "string", + "description": "specifies the instance type to use for etcd instances on Outposts.", + "x-intellij-html-description": "specifies the instance type to use for etcd instances on Outposts." + }, + "etcdPlacement": { + "$ref": "#/definitions/Placement", + "description": "specifies the placement configuration for etcd instances on Outposts.", + "x-intellij-html-description": "specifies the placement configuration for etcd instances on Outposts." } }, "preferredOrder": [ "controlPlaneOutpostARN", "controlPlaneInstanceType", - "controlPlanePlacement" + "controlPlanePlacement", + "etcdInstanceType", + "etcdPlacement" ], "additionalProperties": false, "description": "holds the Outpost configuration.", @@ -2843,10 +2861,14 @@ "properties": { "groupName": { "type": "string" + }, + "spreadLevel": { + "type": "string" } }, "preferredOrder": [ - "groupName" + "groupName", + "spreadLevel" ], "additionalProperties": false, "description": "specifies placement group information", @@ -3037,6 +3059,21 @@ ], "additionalProperties": false }, + "RollbackConfig": { + "properties": { + "timeoutMinutes": { + "type": "integer", + "description": "length of time in minutes to wait before cancelling the update. The timeout is a minimum-bound: cancellation occurs no sooner than the time specified, but can occur shortly thereafter. Valid values are between 120 (2 hours) and 10080 (7 days). When unset, EKS defaults to 720 (12 hours).", + "x-intellij-html-description": "length of time in minutes to wait before cancelling the update. The timeout is a minimum-bound: cancellation occurs no sooner than the time specified, but can occur shortly thereafter. Valid values are between 120 (2 hours) and 10080 (7 days). When unset, EKS defaults to 720 (12 hours)." + } + }, + "preferredOrder": [ + "timeoutMinutes" + ], + "additionalProperties": false, + "description": "holds the rollback configuration used when updating the cluster version. EKS waits for the configured timeout before automatically cancelling an in-progress cluster version update.", + "x-intellij-html-description": "holds the rollback configuration used when updating the cluster version. EKS waits for the configured timeout before automatically cancelling an in-progress cluster version update." + }, "SSOIdentity": { "required": [ "id", diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/defaults.go new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/defaults.go --- old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/defaults.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/defaults.go 2026-07-02 00:20:24.000000000 +0200 @@ -57,10 +57,10 @@ if cfg.AccessConfig == nil { cfg.AccessConfig = &AccessConfig{ - AuthenticationMode: getDefaultAuthenticationMode(cfg.IsControlPlaneOnOutposts()), + AuthenticationMode: getDefaultAuthenticationMode(cfg.IsControlPlaneOnOutposts(), cfg.Outpost != nil && cfg.Outpost.EtcdInstanceType != ""), } } else if cfg.AccessConfig.AuthenticationMode == "" { - cfg.AccessConfig.AuthenticationMode = getDefaultAuthenticationMode(cfg.IsControlPlaneOnOutposts()) + cfg.AccessConfig.AuthenticationMode = getDefaultAuthenticationMode(cfg.IsControlPlaneOnOutposts(), cfg.Outpost != nil && cfg.Outpost.EtcdInstanceType != "") } if cfg.IsAutoModeEnabled() && cfg.AutoModeConfig.NodePools == nil { defaultNodePools := slices.Clone(AutoModeKnownNodePools) @@ -289,8 +289,8 @@ return DefaultNodeVolumeType } -func getDefaultAuthenticationMode(nodeGroupOnOutposts bool) ekstypes.AuthenticationMode { - if nodeGroupOnOutposts { +func getDefaultAuthenticationMode(isOutpost bool, isOutpostV2 bool) ekstypes.AuthenticationMode { + if isOutpost && !isOutpostV2 { return ekstypes.AuthenticationModeConfigMap } return ekstypes.AuthenticationModeApiAndConfigMap diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/outposts_validation_test.go new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/outposts_validation_test.go --- old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/outposts_validation_test.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/outposts_validation_test.go 2026-07-02 00:20:24.000000000 +0200 @@ -7,7 +7,6 @@ . "github.com/onsi/gomega" "github.com/aws/aws-sdk-go-v2/aws" - ekstypes "github.com/aws/aws-sdk-go-v2/service/eks/types" api "github.com/weaveworks/eksctl/pkg/apis/eksctl.io/v1alpha5" ) @@ -30,18 +29,6 @@ err := api.ValidateClusterConfig(clusterConfig) Expect(err).To(MatchError(ContainSubstring(oe.expectedErr))) }, - Entry("Authentication Mode - API", outpostsEntry{ - updateDefaultConfig: func(c *api.ClusterConfig) { - c.AccessConfig.AuthenticationMode = ekstypes.AuthenticationModeApi - }, - expectedErr: fmt.Sprintf("accessConfig.AuthenticationMode must be set to %s on Outposts", ekstypes.AuthenticationModeConfigMap), - }), - Entry("Authentication mode - API_AND_CONFIG_MAP", outpostsEntry{ - updateDefaultConfig: func(c *api.ClusterConfig) { - c.AccessConfig.AuthenticationMode = ekstypes.AuthenticationModeApiAndConfigMap - }, - expectedErr: fmt.Sprintf("accessConfig.AuthenticationMode must be set to %s on Outposts", ekstypes.AuthenticationModeConfigMap), - }), Entry("BootstrapClusterCreatorAdminPermissions - false", outpostsEntry{ updateDefaultConfig: func(c *api.ClusterConfig) { c.AccessConfig.BootstrapClusterCreatorAdminPermissions = aws.Bool(false) @@ -322,4 +309,55 @@ Entry(api.NodeVolumeTypeST1, api.NodeVolumeTypeST1, true), Entry(api.NodeVolumeTypeGP2, api.NodeVolumeTypeGP2, false), ) + + DescribeTable("remoteNetworkConfig on Outpost clusters", func(oe outpostsEntry) { + clusterConfig := api.NewClusterConfig() + clusterConfig.Metadata.Version = api.Version1_31 + clusterConfig.Outpost = &api.Outpost{ + ControlPlaneOutpostARN: "arn:aws:outposts:us-west-2:1234:outpost/op-1234", + EtcdInstanceType: "m5d.large", + } + api.SetClusterConfigDefaults(clusterConfig) + oe.updateDefaultConfig(clusterConfig) + err := api.ValidateClusterConfig(clusterConfig) + if oe.expectedErr != "" { + Expect(err).To(MatchError(ContainSubstring(oe.expectedErr))) + } else { + Expect(err).NotTo(HaveOccurred()) + } + }, + Entry("remoteNetworkConfig with only remotePodNetworks is valid on Outposts", outpostsEntry{ + updateDefaultConfig: func(c *api.ClusterConfig) { + c.RemoteNetworkConfig = &api.RemoteNetworkConfig{ + RemotePodNetworks: []*api.RemoteNetwork{{CIDRs: []string{"10.0.0.0/16"}}}, + IAM: &api.RemoteNodesIAM{ + Provider: &api.SSMProvider, + }, + } + }, + }), + Entry("remoteNetworkConfig with both networks is valid on Outposts", outpostsEntry{ + updateDefaultConfig: func(c *api.ClusterConfig) { + c.RemoteNetworkConfig = &api.RemoteNetworkConfig{ + RemoteNodeNetworks: []*api.RemoteNetwork{{CIDRs: []string{"192.168.0.0/16"}}}, + RemotePodNetworks: []*api.RemoteNetwork{{CIDRs: []string{"10.0.0.0/16"}}}, + IAM: &api.RemoteNodesIAM{ + Provider: &api.SSMProvider, + }, + } + }, + }), + Entry("remoteNetworkConfig on Outpost without etcdInstanceType is rejected", outpostsEntry{ + updateDefaultConfig: func(c *api.ClusterConfig) { + c.Outpost.EtcdInstanceType = "" + c.RemoteNetworkConfig = &api.RemoteNetworkConfig{ + RemotePodNetworks: []*api.RemoteNetwork{{CIDRs: []string{"10.0.0.0/16"}}}, + IAM: &api.RemoteNodesIAM{ + Provider: &api.SSMProvider, + }, + } + }, + expectedErr: "remoteNetworkConfig on Outpost clusters requires outpost.etcdInstanceType to be set", + }), + ) }) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/types.go new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/types.go --- old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/types.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/types.go 2026-07-02 00:20:24.000000000 +0200 @@ -708,6 +708,10 @@ // When updating cluster version, provide the force flag to override upgrade-blocking insights // +optional ForceUpdateVersion *bool `json:"forceUpdateVersion,omitempty"` + // RollbackConfig configures the automatic rollback behaviour when updating + // the cluster version (including downgrades). + // +optional + RollbackConfig *RollbackConfig `json:"rollbackConfig,omitempty"` // Tags are used to tag AWS resources created by eksctl // +optional Tags map[string]string `json:"tags,omitempty"` @@ -727,6 +731,19 @@ SupportType string `json:"supportType,omitempty"` } +// RollbackConfig holds the rollback configuration used when updating the +// cluster version. EKS waits for the configured timeout before automatically +// cancelling an in-progress cluster version update. +type RollbackConfig struct { + // TimeoutMinutes is the length of time in minutes to wait before cancelling + // the update. The timeout is a minimum-bound: cancellation occurs no sooner + // than the time specified, but can occur shortly thereafter. Valid values + // are between 120 (2 hours) and 10080 (7 days). When unset, EKS defaults to + // 720 (12 hours). + // +optional + TimeoutMinutes *int `json:"timeoutMinutes,omitempty"` +} + // KubernetesNetworkConfig contains cluster networking options type KubernetesNetworkConfig struct { // Valid variants are `IPFamily` constants @@ -1091,6 +1108,10 @@ ControlPlaneInstanceType string `json:"controlPlaneInstanceType"` // ControlPlanePlacement specifies the placement configuration for control plane instances on Outposts. ControlPlanePlacement *Placement `json:"controlPlanePlacement,omitempty"` + // EtcdInstanceType specifies the instance type to use for etcd instances on Outposts. + EtcdInstanceType string `json:"etcdInstanceType,omitempty"` + // EtcdPlacement specifies the placement configuration for etcd instances on Outposts. + EtcdPlacement *Placement `json:"etcdPlacement,omitempty"` } // GetInstanceType returns the control plane instance type. @@ -1105,7 +1126,7 @@ // HasPlacementGroup reports whether this Outpost has a placement group. func (o *Outpost) HasPlacementGroup() bool { - return o.ControlPlanePlacement != nil + return o.ControlPlanePlacement != nil && o.ControlPlanePlacement.GroupName != "" } // ControlPlaneScalingConfig holds control plane scaling configuration. @@ -1273,6 +1294,24 @@ ControlPlaneOutpostARN: outpostARN, ControlPlaneInstanceType: *outpost.ControlPlaneInstanceType, } + if outpost.ControlPlanePlacement != nil { + c.Outpost.ControlPlanePlacement = &Placement{} + if outpost.ControlPlanePlacement.GroupName != nil { + c.Outpost.ControlPlanePlacement.GroupName = *outpost.ControlPlanePlacement.GroupName + } + if outpost.ControlPlanePlacement.SpreadLevel != "" { + c.Outpost.ControlPlanePlacement.SpreadLevel = string(outpost.ControlPlanePlacement.SpreadLevel) + } + } + if outpost.EtcdInstanceType != nil { + c.Outpost.EtcdInstanceType = *outpost.EtcdInstanceType + } + if outpost.EtcdPlacement != nil { + c.Outpost.EtcdPlacement = &Placement{} + if outpost.EtcdPlacement.SpreadLevel != "" { + c.Outpost.EtcdPlacement.SpreadLevel = string(outpost.EtcdPlacement.SpreadLevel) + } + } } else if c.IsControlPlaneOnOutposts() { return errors.New("outpost.controlPlaneOutpostARN is set but control plane is not on Outposts") } @@ -1927,7 +1966,8 @@ // Placement specifies placement group information type Placement struct { - GroupName string `json:"groupName,omitempty"` + GroupName string `json:"groupName,omitempty"` + SpreadLevel string `json:"spreadLevel,omitempty"` } // ListOptions returns metav1.ListOptions with label selector for the nodegroup diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/validation.go new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/validation.go --- old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/validation.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/validation.go 2026-07-02 00:20:24.000000000 +0200 @@ -96,6 +96,10 @@ return nil } + if c.IsControlPlaneOnOutposts() && c.Outpost.EtcdInstanceType == "" { + return fmt.Errorf("remoteNetworkConfig on Outpost clusters requires outpost.etcdInstanceType to be set") + } + if c.IPv6Enabled() { return fmt.Errorf("remoteNetworkConfig is not supported on EKS cluster configured with IPv6 address family") } @@ -104,6 +108,14 @@ return fmt.Errorf("remoteNetworkConfig requires authenticationMode to be either %q or %q", ekstypes.AuthenticationModeApiAndConfigMap, ekstypes.AuthenticationModeApi) } + if len(rnc.RemoteNodeNetworks) > 1 { + return fmt.Errorf("only one remoteNodeNetwork is allowed in remoteNetworkConfig.remoteNodeNetworks") + } + + if len(rnc.RemotePodNetworks) > 1 { + return fmt.Errorf("only one remotePodNetwork is allowed in remoteNetworkConfig.remotePodNetworks") + } + if len(rnc.RemoteNodeNetworks) == 0 { // Both lists being explicitly empty is valid for upgrades (removes all remote networks). // For creates, this is a no-op since HasRemoteNetworkingConfigured() gates the CFN builder. @@ -111,6 +123,12 @@ logger.Warning("remoteNetworkConfig has empty remoteNodeNetworks and remotePodNetworks; this will remove all remote networks on upgrade, or be ignored on create") return nil } + if c.IsControlPlaneOnOutposts() { + if len(rnc.RemotePodNetworks) == 0 { + return setNonEmpty("remoteNetworkConfig.remotePodNetworks") + } + return nil + } return setNonEmpty("remoteNetworkConfig.remoteNodeNetworks") } @@ -164,6 +182,23 @@ return nil } +// RollbackTimeoutMinutesMin and RollbackTimeoutMinutesMax are the inclusive +// bounds EKS accepts for metadata.rollbackConfig.timeoutMinutes. +const ( + RollbackTimeoutMinutesMin = 120 + RollbackTimeoutMinutesMax = 10080 +) + +func validateRollbackConfig(rollbackConfig *RollbackConfig) error { + if rollbackConfig == nil || rollbackConfig.TimeoutMinutes == nil { + return nil + } + if timeout := *rollbackConfig.TimeoutMinutes; timeout < RollbackTimeoutMinutesMin || timeout > RollbackTimeoutMinutesMax { + return fmt.Errorf("metadata.rollbackConfig.timeoutMinutes must be between %d and %d, got %d", RollbackTimeoutMinutesMin, RollbackTimeoutMinutesMax, timeout) + } + return nil +} + // ValidateClusterConfig checks compatible fields of a given ClusterConfig func ValidateClusterConfig(cfg *ClusterConfig) error { if cfg.UpgradePolicy != nil { @@ -174,6 +209,12 @@ } } + if cfg.Metadata != nil { + if err := validateRollbackConfig(cfg.Metadata.RollbackConfig); err != nil { + return err + } + } + if IsDisabled(cfg.IAM.WithOIDC) && len(cfg.IAM.ServiceAccounts) > 0 { return fmt.Errorf("iam.withOIDC must be enabled explicitly for iam.serviceAccounts to be created") } @@ -262,9 +303,6 @@ return err } - if cfg.AccessConfig.AuthenticationMode != ekstypes.AuthenticationModeConfigMap { - return fmt.Errorf("accessConfig.AuthenticationMode must be set to %s on Outposts", ekstypes.AuthenticationModeConfigMap) - } if IsDisabled(cfg.AccessConfig.BootstrapClusterCreatorAdminPermissions) { return fmt.Errorf("accessConfig.BootstrapClusterCreatorAdminPermissions can't be set to false on Outposts") } @@ -307,6 +345,18 @@ return errors.New("publicAccessCIDRs is not supported on Outposts") } } + if cfg.Outpost.EtcdPlacement != nil && cfg.Outpost.EtcdInstanceType == "" { + return errors.New("outpost.etcdInstanceType is required when outpost.etcdPlacement is specified") + } + if cfg.Outpost.ControlPlanePlacement != nil && cfg.Outpost.ControlPlanePlacement.SpreadLevel != "" && cfg.Outpost.EtcdInstanceType == "" { + return errors.New("outpost.etcdInstanceType is required when outpost.controlPlanePlacement.spreadLevel is specified") + } + if cfg.Outpost.ControlPlanePlacement != nil && cfg.Outpost.ControlPlanePlacement.GroupName != "" && cfg.Outpost.EtcdInstanceType != "" { + return errors.New("outpost.controlPlanePlacement.groupName is not supported when outpost.etcdInstanceType is specified") + } + if cfg.Outpost.EtcdInstanceType != "" && cfg.AccessConfig.AuthenticationMode == ekstypes.AuthenticationModeConfigMap { + return errors.New("Outpost clusters with EC2 instance store require accessConfig.authenticationMode to be API_AND_CONFIG_MAP or API") + } } else if ngOutpostARN != "" && cfg.IsFullyPrivate() { return errors.New("nodeGroup.outpostARN is not supported on a fully-private cluster (privateCluster.enabled)") } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/validation_test.go new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/validation_test.go --- old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/validation_test.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/validation_test.go 2026-07-02 00:20:24.000000000 +0200 @@ -55,6 +55,42 @@ }) }) + Describe("metadata.rollbackConfig validation", func() { + var cfg *api.ClusterConfig + + BeforeEach(func() { + cfg = api.NewClusterConfig() + }) + + It("accepts a missing rollbackConfig", func() { + Expect(api.ValidateClusterConfig(cfg)).To(Succeed()) + }) + + It("accepts a rollbackConfig without a timeout", func() { + cfg.Metadata.RollbackConfig = &api.RollbackConfig{} + Expect(api.ValidateClusterConfig(cfg)).To(Succeed()) + }) + + DescribeTable("timeoutMinutes bounds", + func(timeoutMinutes int, expectValid bool) { + cfg.Metadata.RollbackConfig = &api.RollbackConfig{ + TimeoutMinutes: aws.Int(timeoutMinutes), + } + err := api.ValidateClusterConfig(cfg) + if expectValid { + Expect(err).NotTo(HaveOccurred()) + } else { + Expect(err).To(MatchError(ContainSubstring("metadata.rollbackConfig.timeoutMinutes must be between 120 and 10080"))) + } + }, + Entry("rejects below the minimum", 119, false), + Entry("accepts the minimum", 120, true), + Entry("accepts a value within range", 720, true), + Entry("accepts the maximum", 10080, true), + Entry("rejects above the maximum", 10081, false), + ) + }) + Describe("nodeGroups[*].name validation", func() { var ( cfg *api.ClusterConfig diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/zz_generated.deepcopy.go new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/zz_generated.deepcopy.go --- old/eksctl-0.228.0/pkg/apis/eksctl.io/v1alpha5/zz_generated.deepcopy.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/apis/eksctl.io/v1alpha5/zz_generated.deepcopy.go 2026-07-02 00:20:24.000000000 +0200 @@ -985,6 +985,11 @@ *out = new(bool) **out = **in } + if in.RollbackConfig != nil { + in, out := &in.RollbackConfig, &out.RollbackConfig + *out = new(RollbackConfig) + (*in).DeepCopyInto(*out) + } if in.Tags != nil { in, out := &in.Tags, &out.Tags *out = make(map[string]string, len(*in)) @@ -2350,6 +2355,11 @@ *out = new(Placement) **out = **in } + if in.EtcdPlacement != nil { + in, out := &in.EtcdPlacement, &out.EtcdPlacement + *out = new(Placement) + **out = **in + } return } @@ -2577,6 +2587,27 @@ in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *RollbackConfig) DeepCopyInto(out *RollbackConfig) { + *out = *in + if in.TimeoutMinutes != nil { + in, out := &in.TimeoutMinutes, &out.TimeoutMinutes + *out = new(int) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RollbackConfig. +func (in *RollbackConfig) DeepCopy() *RollbackConfig { + if in == nil { + return nil + } + out := new(RollbackConfig) + in.DeepCopyInto(out) + return out +} // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SSOIdentity) DeepCopyInto(out *SSOIdentity) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/awsapi/eks.go new/eksctl-0.229.0/pkg/awsapi/eks.go --- old/eksctl-0.228.0/pkg/awsapi/eks.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/awsapi/eks.go 2026-07-02 00:20:24.000000000 +0200 @@ -39,6 +39,15 @@ // // [Using RBAC Authorization]: https://kubernetes.io/docs/reference/access-authn-authz/rbac/ AssociateIdentityProviderConfig(ctx context.Context, params *eks.AssociateIdentityProviderConfigInput, optFns ...func(*Options)) (*eks.AssociateIdentityProviderConfigOutput, error) + // Cancels an in-progress update to an Amazon EKS cluster on a best-effort basis. + // Cancellation is only performed if the update can be cancelled. Currently, this + // is supported for VersionRollback update types on EKS Auto Mode clusters when + // nodes are rolling back. + // + // A successful cancellation stops the node rollback. After cancellation, nodes + // converge to the current cluster version honoring configured disruption controls. + // If the control plane rollback has already begun, the cancellation request fails. + CancelUpdate(ctx context.Context, params *eks.CancelUpdateInput, optFns ...func(*Options)) (*eks.CancelUpdateOutput, error) // Creates an access entry. // // An access entry allows an IAM principal to access your cluster. Access entries diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/cfn/builder/cluster.go new/eksctl-0.229.0/pkg/cfn/builder/cluster.go --- old/eksctl-0.228.0/pkg/cfn/builder/cluster.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/cfn/builder/cluster.go 2026-07-02 00:20:24.000000000 +0200 @@ -425,6 +425,22 @@ cluster.OutpostConfig.ControlPlanePlacement = &gfneks.Cluster_ControlPlanePlacement{ GroupName: gfnt.NewString(c.spec.Outpost.ControlPlanePlacement.GroupName), } + if c.spec.Outpost.ControlPlanePlacement.SpreadLevel != "" { + cluster.OutpostConfig.ControlPlanePlacement.SpreadLevel = gfnt.NewString(c.spec.Outpost.ControlPlanePlacement.SpreadLevel) + } + } else if c.spec.Outpost.ControlPlanePlacement != nil && c.spec.Outpost.ControlPlanePlacement.SpreadLevel != "" { + cluster.OutpostConfig.ControlPlanePlacement = &gfneks.Cluster_ControlPlanePlacement{ + SpreadLevel: gfnt.NewString(c.spec.Outpost.ControlPlanePlacement.SpreadLevel), + } + } + if c.spec.Outpost.EtcdInstanceType != "" { + cluster.OutpostConfig.EtcdInstanceType = gfnt.NewString(c.spec.Outpost.EtcdInstanceType) + } + if c.spec.Outpost.EtcdPlacement != nil { + cluster.OutpostConfig.EtcdPlacement = &gfneks.Cluster_EtcdPlacement{} + if c.spec.Outpost.EtcdPlacement.SpreadLevel != "" { + cluster.OutpostConfig.EtcdPlacement.SpreadLevel = gfnt.NewString(c.spec.Outpost.EtcdPlacement.SpreadLevel) + } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/eks/mocksv2/EKS.go new/eksctl-0.229.0/pkg/eks/mocksv2/EKS.go --- old/eksctl-0.228.0/pkg/eks/mocksv2/EKS.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/eks/mocksv2/EKS.go 2026-07-02 00:20:24.000000000 +0200 @@ -244,6 +244,80 @@ return _c } +// CancelUpdate provides a mock function with given fields: ctx, params, optFns +func (_m *EKS) CancelUpdate(ctx context.Context, params *eks.CancelUpdateInput, optFns ...func(*eks.Options)) (*eks.CancelUpdateOutput, error) { + _va := make([]interface{}, len(optFns)) + for _i := range optFns { + _va[_i] = optFns[_i] + } + var _ca []interface{} + _ca = append(_ca, ctx, params) + _ca = append(_ca, _va...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for CancelUpdate") + } + + var r0 *eks.CancelUpdateOutput + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *eks.CancelUpdateInput, ...func(*eks.Options)) (*eks.CancelUpdateOutput, error)); ok { + return rf(ctx, params, optFns...) + } + if rf, ok := ret.Get(0).(func(context.Context, *eks.CancelUpdateInput, ...func(*eks.Options)) *eks.CancelUpdateOutput); ok { + r0 = rf(ctx, params, optFns...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*eks.CancelUpdateOutput) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *eks.CancelUpdateInput, ...func(*eks.Options)) error); ok { + r1 = rf(ctx, params, optFns...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EKS_CancelUpdate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CancelUpdate' +type EKS_CancelUpdate_Call struct { + *mock.Call +} + +// CancelUpdate is a helper method to define mock.On call +// - ctx context.Context +// - params *eks.CancelUpdateInput +// - optFns ...func(*eks.Options) +func (_e *EKS_Expecter) CancelUpdate(ctx interface{}, params interface{}, optFns ...interface{}) *EKS_CancelUpdate_Call { + return &EKS_CancelUpdate_Call{Call: _e.mock.On("CancelUpdate", + append([]interface{}{ctx, params}, optFns...)...)} +} + +func (_c *EKS_CancelUpdate_Call) Run(run func(ctx context.Context, params *eks.CancelUpdateInput, optFns ...func(*eks.Options))) *EKS_CancelUpdate_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]func(*eks.Options), len(args)-2) + for i, a := range args[2:] { + if a != nil { + variadicArgs[i] = a.(func(*eks.Options)) + } + } + run(args[0].(context.Context), args[1].(*eks.CancelUpdateInput), variadicArgs...) + }) + return _c +} + +func (_c *EKS_CancelUpdate_Call) Return(_a0 *eks.CancelUpdateOutput, _a1 error) *EKS_CancelUpdate_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EKS_CancelUpdate_Call) RunAndReturn(run func(context.Context, *eks.CancelUpdateInput, ...func(*eks.Options)) (*eks.CancelUpdateOutput, error)) *EKS_CancelUpdate_Call { + _c.Call.Return(run) + return _c +} + // CreateAccessEntry provides a mock function with given fields: ctx, params, optFns func (_m *EKS) CreateAccessEntry(ctx context.Context, params *eks.CreateAccessEntryInput, optFns ...func(*eks.Options)) (*eks.CreateAccessEntryOutput, error) { _va := make([]interface{}, len(optFns)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/eks/update.go new/eksctl-0.229.0/pkg/eks/update.go --- old/eksctl-0.228.0/pkg/eks/update.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/eks/update.go 2026-07-02 00:20:24.000000000 +0200 @@ -236,6 +236,14 @@ if cfg.Metadata.ForceUpdateVersion != nil { input.Force = *cfg.Metadata.ForceUpdateVersion } + // Only send a RollbackConfig when there is a value to set; an empty struct + // would serialize as "rollbackConfig": {}, which is redundant with omitting it + // (EKS applies its default timeout either way). + if rollbackConfig := cfg.Metadata.RollbackConfig; rollbackConfig != nil && rollbackConfig.TimeoutMinutes != nil { + input.RollbackConfig = &ekstypes.RollbackConfig{ + TimeoutMinutes: aws.Int32(int32(*rollbackConfig.TimeoutMinutes)), + } + } output, err := c.AWSProvider.EKS().UpdateClusterVersion(ctx, input) if err != nil { return nil, err diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/eks/update_test.go new/eksctl-0.229.0/pkg/eks/update_test.go --- old/eksctl-0.228.0/pkg/eks/update_test.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/eks/update_test.go 2026-07-02 00:20:24.000000000 +0200 @@ -180,4 +180,61 @@ Expect(ctl.UpdateClusterConfigForLogging(context.Background(), cfg)).To(Succeed()) }) }) + + Describe("UpdateClusterVersion", func() { + var ( + ctl *ClusterProvider + cfg *api.ClusterConfig + p *mockprovider.MockProvider + + sentInput *awseks.UpdateClusterVersionInput + ) + + BeforeEach(func() { + p = mockprovider.NewMockProvider() + ctl = &ClusterProvider{ + AWSProvider: p, + Status: &ProviderStatus{}, + } + + cfg = api.NewClusterConfig() + cfg.Metadata.Name = "testcluster" + cfg.Metadata.Version = "1.30" + + p.MockEKS().On("UpdateClusterVersion", mock.Anything, mock.MatchedBy(func(input *awseks.UpdateClusterVersionInput) bool { + sentInput = input + return true + })).Return(&awseks.UpdateClusterVersionOutput{ + Update: &ekstypes.Update{ + Id: aws.String("u123"), + Type: ekstypes.UpdateTypeVersionUpdate, + }, + }, nil) + }) + + It("does not set RollbackConfig when none is configured", func() { + _, err := ctl.UpdateClusterVersion(context.Background(), cfg) + Expect(err).NotTo(HaveOccurred()) + Expect(sentInput.RollbackConfig).To(BeNil()) + }) + + It("passes the configured rollback timeout through to the API", func() { + cfg.Metadata.RollbackConfig = &api.RollbackConfig{ + TimeoutMinutes: aws.Int(360), + } + + _, err := ctl.UpdateClusterVersion(context.Background(), cfg) + Expect(err).NotTo(HaveOccurred()) + Expect(sentInput.RollbackConfig).NotTo(BeNil()) + Expect(sentInput.RollbackConfig.TimeoutMinutes).To(Equal(aws.Int32(360))) + }) + + It("does not set RollbackConfig when configured without a timeout", func() { + cfg.Metadata.RollbackConfig = &api.RollbackConfig{} + + _, err := ctl.UpdateClusterVersion(context.Background(), cfg) + Expect(err).NotTo(HaveOccurred()) + Expect(sentInput.RollbackConfig).To(BeNil()) + }) + }) }) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/eks/versions_manager.go new/eksctl-0.229.0/pkg/eks/versions_manager.go --- old/eksctl-0.228.0/pkg/eks/versions_manager.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/eks/versions_manager.go 2026-07-02 00:20:24.000000000 +0200 @@ -133,8 +133,9 @@ } func (cvm *ClusterVersionsManager) ResolveUpgradeVersion(desiredVersion string, currentVersion string) (string, error) { - // Resolve next version + // Resolve next and previous versions var nextVersion string + var previousVersion string switch { case currentVersion == "": return "", fmt.Errorf("couldn't resolve control plane version") @@ -144,29 +145,27 @@ return "", fmt.Errorf("control plane version %q is not supported", currentVersion) default: i := slices.Index(cvm.supportedVersions, currentVersion) - if i == len(cvm.supportedVersions)-1 { - logger.Info("control plane is already on latest version %q", currentVersion) - return "", nil + // Determine next version + if i < len(cvm.supportedVersions)-1 { + nextVersion = cvm.supportedVersions[i+1] + } + // Determine previous version + if i > 0 { + previousVersion = cvm.supportedVersions[i-1] } - nextVersion = cvm.supportedVersions[i+1] } // If the version was not specified, default to the next Kubernetes version, and assume the user intended to upgrade if possible. // Also support "auto" as version (see #2461) if desiredVersion == "" || desiredVersion == "auto" { - if cvm.IsSupportedVersion(nextVersion) { + if nextVersion != "" { return nextVersion, nil } + logger.Info("control plane is already on latest version %q", currentVersion) // There is no new version, stay in the current one return "", nil } - if c, err := utils.CompareVersions(desiredVersion, currentVersion); err != nil { - return "", fmt.Errorf("couldn't compare versions for upgrade: %w", err) - } else if c < 0 { - return "", fmt.Errorf("cannot upgrade to a lower version. Found given target version %q, current cluster version %q", desiredVersion, currentVersion) - } - if cvm.IsDeprecatedVersion(desiredVersion) { return "", fmt.Errorf("control plane version %q has been deprecated", desiredVersion) } @@ -179,15 +178,37 @@ return "", nil } - if desiredVersion == nextVersion { + c, err := utils.CompareVersions(desiredVersion, currentVersion) + if err != nil { + return "", fmt.Errorf("couldn't compare versions: %w", err) + } + + // Handle upgrade + if c > 0 { + if desiredVersion == nextVersion { + return desiredVersion, nil + } + return "", fmt.Errorf( + "upgrading more than one version at a time is not supported. Found upgrade from %q to %q. Please upgrade to %q first", + currentVersion, + desiredVersion, + nextVersion) + } + + // Handle downgrade (rollback) + if previousVersion == "" { + return "", fmt.Errorf("cannot downgrade: %q is the oldest supported version", currentVersion) + } + + if desiredVersion == previousVersion { return desiredVersion, nil } return "", fmt.Errorf( - "upgrading more than one version at a time is not supported. Found upgrade from %q to %q. Please upgrade to %q first", + "downgrading more than one version at a time is not supported. Found downgrade from %q to %q. Please downgrade to %q first", currentVersion, desiredVersion, - nextVersion) + previousVersion) } func resolveDeprecatedVersions(currentVersion string) ([]string, error) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/eks/versions_manager_test.go new/eksctl-0.229.0/pkg/eks/versions_manager_test.go --- old/eksctl-0.228.0/pkg/eks/versions_manager_test.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/eks/versions_manager_test.go 2026-07-02 00:20:24.000000000 +0200 @@ -53,12 +53,10 @@ upgradeVersion, err := cvm.ResolveUpgradeVersion(c.givenVersion, c.eksVersion) if c.expectedErrorText != "" { - if c.expectedErrorText != "cannot upgrade to a lower version" { - } else { - Expect(err).To(HaveOccurred()) - Expect(err.Error()).To(ContainSubstring(c.expectedErrorText)) - } + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring(c.expectedErrorText)) } else { + Expect(err).NotTo(HaveOccurred()) Expect(upgradeVersion).To(Equal(c.expectedUpgradeVersion)) } }, @@ -99,10 +97,16 @@ expectedErrorText: "upgrading more than one version at a time is not supported", }), - Entry("fails when the given version is lower than the current one", upgradeCase{ - givenVersion: api.Version1_29, + Entry("downgrades to the previous version when specified", upgradeCase{ + givenVersion: api.Version1_29, + eksVersion: api.Version1_30, + expectedUpgradeVersion: api.Version1_29, + }), + + Entry("fails when the downgrade jumps more than one kubernetes version", upgradeCase{ + givenVersion: api.Version1_28, eksVersion: api.Version1_30, - expectedErrorText: "cannot upgrade to a lower version", + expectedErrorText: "downgrading more than one version at a time is not supported", }), Entry("fails when the version is deprecated", upgradeCase{ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_controlplaneplacement.go new/eksctl-0.229.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_controlplaneplacement.go --- old/eksctl-0.228.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_controlplaneplacement.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_controlplaneplacement.go 2026-07-02 00:20:24.000000000 +0200 @@ -15,6 +15,11 @@ // See: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-controlplaneplacement.html#cfn-eks-cluster-controlplaneplacement-groupname GroupName *types.Value `json:"GroupName,omitempty"` + // SpreadLevel AWS CloudFormation Property + // Required: false + // See: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-controlplaneplacement.html#cfn-eks-cluster-controlplaneplacement-spreadlevel + SpreadLevel *types.Value `json:"SpreadLevel,omitempty"` + // AWSCloudFormationDeletionPolicy represents a CloudFormation DeletionPolicy AWSCloudFormationDeletionPolicy policies.DeletionPolicy `json:"-"` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_etcdplacement.go new/eksctl-0.229.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_etcdplacement.go --- old/eksctl-0.228.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_etcdplacement.go 1970-01-01 01:00:00.000000000 +0100 +++ new/eksctl-0.229.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_etcdplacement.go 2026-07-02 00:20:24.000000000 +0200 @@ -0,0 +1,37 @@ +package eks + +import ( + "github.com/weaveworks/eksctl/pkg/goformation/cloudformation/types" + + "github.com/weaveworks/eksctl/pkg/goformation/cloudformation/policies" +) + +// Cluster_EtcdPlacement AWS CloudFormation Resource (AWS::EKS::Cluster.EtcdPlacement) +// See: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-etcdplacement.html +type Cluster_EtcdPlacement struct { + + // SpreadLevel AWS CloudFormation Property + // Required: false + // See: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-etcdplacement.html#cfn-eks-cluster-etcdplacement-spreadlevel + SpreadLevel *types.Value `json:"SpreadLevel,omitempty"` + + // AWSCloudFormationDeletionPolicy represents a CloudFormation DeletionPolicy + AWSCloudFormationDeletionPolicy policies.DeletionPolicy `json:"-"` + + // AWSCloudFormationUpdateReplacePolicy represents a CloudFormation UpdateReplacePolicy + AWSCloudFormationUpdateReplacePolicy policies.UpdateReplacePolicy `json:"-"` + + // AWSCloudFormationDependsOn stores the logical ID of the resources to be created before this resource + AWSCloudFormationDependsOn []string `json:"-"` + + // AWSCloudFormationMetadata stores structured data associated with this resource + AWSCloudFormationMetadata map[string]interface{} `json:"-"` + + // AWSCloudFormationCondition stores the logical ID of the condition that must be satisfied for this resource to be created + AWSCloudFormationCondition string `json:"-"` +} + +// AWSCloudFormationType returns the AWS CloudFormation resource type +func (r *Cluster_EtcdPlacement) AWSCloudFormationType() string { + return "AWS::EKS::Cluster.EtcdPlacement" +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_outpostconfig.go new/eksctl-0.229.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_outpostconfig.go --- old/eksctl-0.228.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_outpostconfig.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/goformation/cloudformation/eks/aws-eks-cluster_outpostconfig.go 2026-07-02 00:20:24.000000000 +0200 @@ -20,6 +20,16 @@ // See: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-outpostconfig.html#cfn-eks-cluster-outpostconfig-controlplaneplacement ControlPlanePlacement *Cluster_ControlPlanePlacement `json:"ControlPlanePlacement,omitempty"` + // EtcdInstanceType AWS CloudFormation Property + // Required: false + // See: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-outpostconfig.html#cfn-eks-cluster-outpostconfig-etcdinstancetype + EtcdInstanceType *types.Value `json:"EtcdInstanceType,omitempty"` + + // EtcdPlacement AWS CloudFormation Property + // Required: false + // See: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-outpostconfig.html#cfn-eks-cluster-outpostconfig-etcdplacement + EtcdPlacement *Cluster_EtcdPlacement `json:"EtcdPlacement,omitempty"` + // OutpostArns AWS CloudFormation Property // Required: true // See: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-outpostconfig.html#cfn-eks-cluster-outpostconfig-outpostarns diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/version/release.go new/eksctl-0.229.0/pkg/version/release.go --- old/eksctl-0.228.0/pkg/version/release.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/version/release.go 2026-07-02 00:20:24.000000000 +0200 @@ -3,7 +3,7 @@ // This file was generated by release_generate.go; DO NOT EDIT. // Version is the version number in semver format X.Y.Z -var Version = "0.228.0" +var Version = "0.229.0" // PreReleaseID can be empty for releases, "rc.X" for release candidates and "dev" for snapshots var PreReleaseID = "dev" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/eksctl-0.228.0/pkg/vpc/vpc.go new/eksctl-0.229.0/pkg/vpc/vpc.go --- old/eksctl-0.228.0/pkg/vpc/vpc.go 2026-06-24 20:06:01.000000000 +0200 +++ new/eksctl-0.229.0/pkg/vpc/vpc.go 2026-07-02 00:20:24.000000000 +0200 @@ -541,7 +541,7 @@ return err } - if spec.IsControlPlaneOnOutposts() { + if spec.IsControlPlaneOnOutposts() && spec.Outpost.EtcdInstanceType == "" { var invalidSubnetIDs []string for _, subnet := range subnets { if subnet.OutpostArn == nil || *subnet.OutpostArn != spec.Outpost.ControlPlaneOutpostARN { @@ -552,6 +552,7 @@ return fmt.Errorf("all subnets must be on the control plane Outpost when specifying pre-existing subnets for a cluster on Outposts; found invalid %s subnet(s): %v", strings.ToLower(string(topology)), strings.Join(invalidSubnetIDs, ",")) } } + return ImportSubnets(ctx, ec2API, spec, subnetMapping, subnets, nil) } ++++++ eksctl.obsinfo ++++++ --- /var/tmp/diff_new_pack.OBYpkU/_old 2026-07-02 20:14:39.120182164 +0200 +++ /var/tmp/diff_new_pack.OBYpkU/_new 2026-07-02 20:14:39.180184238 +0200 @@ -1,5 +1,5 @@ name: eksctl -version: 0.228.0 -mtime: 1782324361 -commit: ab26c5b38e42a8143f9f110c1ba4bf745ba07d5e +version: 0.229.0 +mtime: 1782944424 +commit: 489531af5b30af332357bac5688592fb20c22644 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/eksctl/vendor.tar.gz /work/SRC/openSUSE:Factory/.eksctl.new.1982/vendor.tar.gz differ: char 13, line 1
