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

Reply via email to