Skip to content

Commit c452227

Browse files
authored
ARO-25108: Add v1api20251223preview API support for HcpOpenShift resources (#145)
* use 2025-12-23-preview as a storage for HCPOpenShift* resources * add CHANGELOG/v1.22.1-mce-217.md
1 parent d11f1ee commit c452227

3 files changed

Lines changed: 145 additions & 29 deletions

File tree

CHANGELOG/v1.22.1-mce-217.md

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
## Changes by Kind
2+
3+
### Feature
4+
5+
- **ARO HCP API v1api20251223preview support**: Full support for the new `2025-12-23-preview` ARM API version for HcpOpenShiftClusters, HcpOpenShiftClustersNodePools, and HcpOpenShiftClustersExternalAuth resources
6+
- Both `v1api20240610preview` and `v1api20251223preview` API versions are supported simultaneously
7+
- CAPZ auto-detects the API version used and handles structural differences (e.g., KMS `vaultName` field location)
8+
- Updated ASO CRDs with `v1api20251223previewstorage` as the new storage version for HcpOpenShift resources
9+
10+
### Bug Fixes
11+
12+
- **ASO resource reconciliation conflict fix (ARO-25529)**: Stop continuously re-patching ASO resources that are already ready, preventing conflicts with ASO controllers (etcd commit failures and generation inflation)
13+
- Skip resource reconciliation when all resources are ready and the spec hasn't changed
14+
- Use `ObservedGeneration` on the `ResourcesReady` condition to detect spec changes
15+
- Add `ASOReadyChangedPredicate` to watch for ASO Ready condition changes on managed resources
16+
- Remove unnecessary `RequeueAfter` polling in favor of event-driven watches
17+
- **ExternalAuth deletion fix**: Fix ExternalAuth deletion when NodePool is in failed state
18+
- **KeyVault bombardment fix**: Add predicate to dynamic watches to prevent excessive KeyVault reconciliation
19+
- **AROMachinePool autoscaler fix**: Fix autoscaling and API version handling for AROMachinePool
20+
- **Encryption key readiness fix**: Properly defer HcpOpenShiftCluster apply until encryption key version is available, preventing CRD validation errors
21+
- **Graceful error handling**: Handle NotFound and NoMatch errors gracefully in AROMachinePool and AROControlPlane reconcilers
22+
23+
### Dependencies
24+
25+
- Updated ASO CRDs to include `v1api20251223preview` and `v1api20251223previewstorage` versions
26+
- Migrated HcpOpenShift resource storage version from `v1api20240610previewstorage` to `v1api20251223previewstorage`
27+
28+
## API Changes (v1api20240610preview vs v1api20251223preview)
29+
30+
### HcpOpenShiftCluster - KMS encryption structure
31+
32+
**v1api20240610preview** (old):
33+
```yaml
34+
kms:
35+
activeKey:
36+
name: "key-name"
37+
vaultName: "vault-name" # vaultName inside activeKey
38+
version: "key-version"
39+
```
40+
41+
**v1api20251223preview** (new):
42+
```yaml
43+
kms:
44+
activeKey:
45+
name: "key-name"
46+
version: "key-version"
47+
vaultName: "vault-name" # vaultName moved to kms level
48+
visibility: "Public" # new required field
49+
```
50+
51+
## Details
52+
53+
This release is based on upstream v1.22.0 with Red Hat MCE-specific additions for ARO-HCP support.
54+
55+
Base upstream version: v1.22.0
56+
MCE version: 2.17

Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,8 @@ CRD_ROOT ?= $(MANIFEST_ROOT)/crd/bases
175175
WEBHOOK_ROOT ?= $(MANIFEST_ROOT)/webhook
176176
RBAC_ROOT ?= $(MANIFEST_ROOT)/rbac
177177
ASO_CRDS_PATH := $(MANIFEST_ROOT)/aso/crds.yaml
178-
ASO_VERSION := v2.13.0-hcpclusters.3
179-
ASO_WORKSPACE := marek-veber
178+
ASO_VERSION := v2.13.0-hcpclusters.7
179+
ASO_WORKSPACE := stolostron
180180
ASO_CRDS := resourcegroups.resources.azure.com natgateways.network.azure.com managedclusters.containerservice.azure.com managedclustersagentpools.containerservice.azure.com bastionhosts.network.azure.com virtualnetworks.network.azure.com virtualnetworkssubnets.network.azure.com privateendpoints.network.azure.com fleetsmembers.containerservice.azure.com extensions.kubernetesconfiguration.azure.com userassignedidentities.managedidentity.azure.com roleassignments.authorization.azure.com networksecuritygroups.network.azure.com vaults.keyvault.azure.com hcpopenshiftclusters.redhatopenshift.azure.com hcpopenshiftclustersnodepools.redhatopenshift.azure.com hcpopenshiftclustersexternalauths.redhatopenshift.azure.com
181181

182182
# Allow overriding the imagePullPolicy

config/aso/crds.yaml

Lines changed: 87 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ metadata:
66
controller-gen.kubebuilder.io/version: v0.19.0
77
labels:
88
app.kubernetes.io/name: azure-service-operator
9-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
9+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
1010
name: bastionhosts.network.azure.com
1111
spec:
1212
conversion:
@@ -1703,7 +1703,7 @@ metadata:
17031703
controller-gen.kubebuilder.io/version: v0.19.0
17041704
labels:
17051705
app.kubernetes.io/name: azure-service-operator
1706-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
1706+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
17071707
name: extensions.kubernetesconfiguration.azure.com
17081708
spec:
17091709
conversion:
@@ -4176,7 +4176,7 @@ metadata:
41764176
controller-gen.kubebuilder.io/version: v0.19.0
41774177
labels:
41784178
app.kubernetes.io/name: azure-service-operator
4179-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
4179+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
41804180
name: fleetsmembers.containerservice.azure.com
41814181
spec:
41824182
conversion:
@@ -4738,7 +4738,7 @@ metadata:
47384738
controller-gen.kubebuilder.io/version: v0.19.0
47394739
labels:
47404740
app.kubernetes.io/name: azure-service-operator
4741-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
4741+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
47424742
name: hcpopenshiftclusters.redhatopenshift.azure.com
47434743
spec:
47444744
conversion:
@@ -6671,7 +6671,7 @@ spec:
66716671
type: object
66726672
type: object
66736673
served: true
6674-
storage: true
6674+
storage: false
66756675
subresources:
66766676
status: {}
66776677
- additionalPrinterColumns:
@@ -7036,15 +7036,45 @@ spec:
70367036
pulls targeting the specified source registries.
70377037
properties:
70387038
mirrors:
7039-
description: 'Mirrors: Mirrors are one or more image repositories that may also contain the same images.'
7039+
description: |-
7040+
Mirrors: mirrors is zero or more locations that may also contain the same images. No mirror will
7041+
be configured if not specified. Images can be pulled from these mirrors only if they are
7042+
referenced by their digests. The mirrored location is obtained by replacing the part of
7043+
the input reference that matches source by the mirrors entry, e.g. for
7044+
registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io,
7045+
mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used.
7046+
The order of mirrors in this list is treated as the user's desired priority, while source
7047+
is by default considered lower priority than all mirrors.
7048+
If no mirror is specified or all image pulls from the mirror list fail, the image will
7049+
continue to be pulled from the repository in the pull spec.
7050+
Other cluster configuration, including (but not limited to) other imageDigestMirrors
7051+
objects, may impact the exact order mirrors are contacted in, or some mirrors may be
7052+
contacted in parallel, so this should be considered a preference rather than a guarantee
7053+
of ordering.
7054+
mirrors uses one of the following formats:
7055+
* host[:port]
7056+
* host[:port]/namespace[/namespace...]
7057+
* host[:port]/namespace[/namespace...]/repo
7058+
for more information about the format, see:
7059+
https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table
70407060
items:
70417061
maxLength: 255
70427062
type: string
70437063
maxItems: 255
70447064
minItems: 1
70457065
type: array
70467066
source:
7047-
description: 'Source: Source is the image repository that users refer to, e.g. in image pull specifications.'
7067+
description: |-
7068+
Source: source matches the repository that users refer to, e.g. in image pull specifications.
7069+
Setting source to a registry hostname, e.g. docker.io, quay.io, or registry.redhat.io,
7070+
will match the image pull specification of the corresponding registry.
7071+
source uses one of the following formats:
7072+
* host[:port]
7073+
* host[:port]/namespace[/namespace...]
7074+
* host[:port]/namespace[/namespace...]/repo
7075+
* [*.]host
7076+
for more information about the format, see:
7077+
https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table
70487078
maxLength: 255
70497079
type: string
70507080
required:
@@ -7543,15 +7573,45 @@ spec:
75437573
pulls targeting the specified source registries.
75447574
properties:
75457575
mirrors:
7546-
description: 'Mirrors: Mirrors are one or more image repositories that may also contain the same images.'
7576+
description: |-
7577+
Mirrors: mirrors is zero or more locations that may also contain the same images. No mirror will
7578+
be configured if not specified. Images can be pulled from these mirrors only if they are
7579+
referenced by their digests. The mirrored location is obtained by replacing the part of
7580+
the input reference that matches source by the mirrors entry, e.g. for
7581+
registry.redhat.io/product/repo reference, a (source, mirror) pair *.redhat.io,
7582+
mirror.local/redhat causes a mirror.local/redhat/product/repo repository to be used.
7583+
The order of mirrors in this list is treated as the user's desired priority, while source
7584+
is by default considered lower priority than all mirrors.
7585+
If no mirror is specified or all image pulls from the mirror list fail, the image will
7586+
continue to be pulled from the repository in the pull spec.
7587+
Other cluster configuration, including (but not limited to) other imageDigestMirrors
7588+
objects, may impact the exact order mirrors are contacted in, or some mirrors may be
7589+
contacted in parallel, so this should be considered a preference rather than a guarantee
7590+
of ordering.
7591+
mirrors uses one of the following formats:
7592+
* host[:port]
7593+
* host[:port]/namespace[/namespace...]
7594+
* host[:port]/namespace[/namespace...]/repo
7595+
for more information about the format, see:
7596+
https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table
75477597
items:
75487598
maxLength: 255
75497599
type: string
75507600
maxItems: 255
75517601
minItems: 1
75527602
type: array
75537603
source:
7554-
description: 'Source: Source is the image repository that users refer to, e.g. in image pull specifications.'
7604+
description: |-
7605+
Source: source matches the repository that users refer to, e.g. in image pull specifications.
7606+
Setting source to a registry hostname, e.g. docker.io, quay.io, or registry.redhat.io,
7607+
will match the image pull specification of the corresponding registry.
7608+
source uses one of the following formats:
7609+
* host[:port]
7610+
* host[:port]/namespace[/namespace...]
7611+
* host[:port]/namespace[/namespace...]/repo
7612+
* [*.]host
7613+
for more information about the format, see:
7614+
https://github.com/containers/image/blob/main/docs/containers-registries.conf.5.md#choosing-a-registry-toml-table
75557615
maxLength: 255
75567616
type: string
75577617
required:
@@ -8805,7 +8865,7 @@ spec:
88058865
type: object
88068866
type: object
88078867
served: true
8808-
storage: false
8868+
storage: true
88098869
subresources:
88108870
status: {}
88118871
---
@@ -8817,7 +8877,7 @@ metadata:
88178877
controller-gen.kubebuilder.io/version: v0.19.0
88188878
labels:
88198879
app.kubernetes.io/name: azure-service-operator
8820-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
8880+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
88218881
name: hcpopenshiftclustersexternalauths.redhatopenshift.azure.com
88228882
spec:
88238883
conversion:
@@ -10088,7 +10148,7 @@ spec:
1008810148
type: object
1008910149
type: object
1009010150
served: true
10091-
storage: true
10151+
storage: false
1009210152
subresources:
1009310153
status: {}
1009410154
- additionalPrinterColumns:
@@ -11341,7 +11401,7 @@ spec:
1134111401
type: object
1134211402
type: object
1134311403
served: true
11344-
storage: false
11404+
storage: true
1134511405
subresources:
1134611406
status: {}
1134711407
---
@@ -11353,7 +11413,7 @@ metadata:
1135311413
controller-gen.kubebuilder.io/version: v0.19.0
1135411414
labels:
1135511415
app.kubernetes.io/name: azure-service-operator
11356-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
11416+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
1135711417
name: hcpopenshiftclustersnodepools.redhatopenshift.azure.com
1135811418
spec:
1135911419
conversion:
@@ -12636,7 +12696,7 @@ spec:
1263612696
type: object
1263712697
type: object
1263812698
served: true
12639-
storage: true
12699+
storage: false
1264012700
subresources:
1264112701
status: {}
1264212702
- additionalPrinterColumns:
@@ -13960,7 +14020,7 @@ spec:
1396014020
type: object
1396114021
type: object
1396214022
served: true
13963-
storage: false
14023+
storage: true
1396414024
subresources:
1396514025
status: {}
1396614026
---
@@ -13972,7 +14032,7 @@ metadata:
1397214032
controller-gen.kubebuilder.io/version: v0.19.0
1397314033
labels:
1397414034
app.kubernetes.io/name: azure-service-operator
13975-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
14035+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
1397614036
name: managedclusters.containerservice.azure.com
1397714037
spec:
1397814038
conversion:
@@ -54955,7 +55015,7 @@ metadata:
5495555015
controller-gen.kubebuilder.io/version: v0.19.0
5495655016
labels:
5495755017
app.kubernetes.io/name: azure-service-operator
54958-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
55018+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
5495955019
name: managedclustersagentpools.containerservice.azure.com
5496055020
spec:
5496155021
conversion:
@@ -67852,7 +67912,7 @@ metadata:
6785267912
controller-gen.kubebuilder.io/version: v0.19.0
6785367913
labels:
6785467914
app.kubernetes.io/name: azure-service-operator
67855-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
67915+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
6785667916
name: natgateways.network.azure.com
6785767917
spec:
6785867918
conversion:
@@ -69326,7 +69386,7 @@ metadata:
6932669386
controller-gen.kubebuilder.io/version: v0.19.0
6932769387
labels:
6932869388
app.kubernetes.io/name: azure-service-operator
69329-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
69389+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
6933069390
name: networksecuritygroups.network.azure.com
6933169391
spec:
6933269392
conversion:
@@ -70445,7 +70505,7 @@ metadata:
7044570505
controller-gen.kubebuilder.io/version: v0.19.0
7044670506
labels:
7044770507
app.kubernetes.io/name: azure-service-operator
70448-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
70508+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
7044970509
name: privateendpoints.network.azure.com
7045070510
spec:
7045170511
conversion:
@@ -73125,7 +73185,7 @@ metadata:
7312573185
controller-gen.kubebuilder.io/version: v0.19.0
7312673186
labels:
7312773187
app.kubernetes.io/name: azure-service-operator
73128-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
73188+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
7312973189
name: resourcegroups.resources.azure.com
7313073190
spec:
7313173191
conversion:
@@ -73594,7 +73654,7 @@ metadata:
7359473654
controller-gen.kubebuilder.io/version: v0.19.0
7359573655
labels:
7359673656
app.kubernetes.io/name: azure-service-operator
73597-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
73657+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
7359873658
name: roleassignments.authorization.azure.com
7359973659
spec:
7360073660
conversion:
@@ -74893,7 +74953,7 @@ metadata:
7489374953
controller-gen.kubebuilder.io/version: v0.19.0
7489474954
labels:
7489574955
app.kubernetes.io/name: azure-service-operator
74896-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
74956+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
7489774957
name: userassignedidentities.managedidentity.azure.com
7489874958
spec:
7489974959
conversion:
@@ -76200,7 +76260,7 @@ metadata:
7620076260
controller-gen.kubebuilder.io/version: v0.19.0
7620176261
labels:
7620276262
app.kubernetes.io/name: azure-service-operator
76203-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
76263+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
7620476264
name: vaults.keyvault.azure.com
7620576265
spec:
7620676266
conversion:
@@ -79177,7 +79237,7 @@ metadata:
7917779237
controller-gen.kubebuilder.io/version: v0.19.0
7917879238
labels:
7917979239
app.kubernetes.io/name: azure-service-operator
79180-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
79240+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
7918179241
name: virtualnetworks.network.azure.com
7918279242
spec:
7918379243
conversion:
@@ -81023,7 +81083,7 @@ metadata:
8102381083
controller-gen.kubebuilder.io/version: v0.19.0
8102481084
labels:
8102581085
app.kubernetes.io/name: azure-service-operator
81026-
app.kubernetes.io/version: v2.13.0-hcpclusters.3
81086+
app.kubernetes.io/version: v2.13.0-hcpclusters.7
8102781087
name: virtualnetworkssubnets.network.azure.com
8102881088
spec:
8102981089
conversion:

0 commit comments

Comments
 (0)