Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
68bf076
[1952] Add Spec Kit design artifacts for clouds.yaml credentials
gtherond May 18, 2026
f7b7f8b
[1952] feat(crd): add CloudName and Conditions to OpenstackCreds
gtherond May 18, 2026
98966f1
[1952] test: microversion floor and Conditions helpers (red phase)
gtherond May 18, 2026
76cb77f
[1952] feat: implement microversion floor and SetCondition (green phase)
gtherond May 18, 2026
8f80a6a
[1952] test: clouds.yaml parser scaffolding and stub (red phase)
gtherond May 18, 2026
ea26383
[1952] feat: implement clouds.yaml parser (green phase)
gtherond May 18, 2026
3c3cb69
[1952] feat(credutils): branch on clouds.yaml vs OS_* in provider client
gtherond May 18, 2026
9abc204
[1952] feat(v2v-helper): wire microversion floor into service clients
gtherond May 18, 2026
61d81b3
[1952] feat(controller): populate Conditions + watch credential Secrets
gtherond May 18, 2026
85161b4
[1952] feat(crd): retire OpenStackValidationStatus and Message flat f…
gtherond May 18, 2026
f07dda2
[1952] docs: operator credentials guide (clouds.yaml + Application Cr…
gtherond May 18, 2026
6334b24
[1952] fix(validation): branch on clouds.yaml in the controller's val…
gtherond May 18, 2026
e1c4932
[1952] feat(controller): inject OS_*_API_VERSION env vars from clouds…
gtherond May 18, 2026
446f9c9
[1952] fix: address Devin review findings on #1955
gtherond May 18, 2026
0e65128
[1952] fix: round 2 of Devin review findings on #1955
gtherond May 18, 2026
ff5fd22
[1952] fix: vpwned proxy writes Conditions; checkStatusSuccess prefer…
gtherond May 18, 2026
cfad5e6
[1954] feat(ui): clouds.yaml credential input component
gtherond May 18, 2026
4c8a52a
[1954] fix(ui): use useEffect instead of useMemo for onChange side ef…
gtherond May 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ For information about alternative licensing arrangements, contact info@platform9
- **OpenStack Environment**:
- OpenStack-compliant cloud target
- Network and storage access
- Credentials can be supplied as either standard `clouds.yaml` (preferred — supports OpenStack Application Credentials and per-service microversion configuration) or the legacy per-field `OS_*` Secret keys. See [`docs/credentials.md`](docs/credentials.md) for the operator runbook.

- **Network Connectivity**:
- Access to vCenter, ESXi, and OpenStack API endpoints
Expand Down
95 changes: 89 additions & 6 deletions deploy/00crds.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1570,8 +1570,11 @@ spec:
scope: Namespaced
versions:
- additionalPrinterColumns:
- jsonPath: .status.openstackValidationStatus
name: Status
- jsonPath: .status.conditions[?(@.type=="CredentialsValidated")].status
name: Validated
type: string
- jsonPath: .status.conditions[?(@.type=="CredentialsValidated")].reason
name: Reason
type: string
- jsonPath: .spec.secretRef.name
name: Secret Name
Expand Down Expand Up @@ -1608,6 +1611,14 @@ spec:
spec:
description: OpenstackCredsSpec defines the desired state of OpenstackCreds
properties:
cloudName:
description: |-
CloudName selects which cloud entry to use when SecretRef points to a Secret
containing a clouds.yaml key. Ignored when the Secret contains only legacy
OS_* keys. When omitted with a single-entry clouds.yaml, that entry is used.
When omitted with a multi-entry clouds.yaml, the resource reports
CredentialsParsed=False with Reason=AmbiguousCloudName.
type: string
flavors:
description: Flavors is the list of available flavors in openstack
items:
Expand Down Expand Up @@ -1769,6 +1780,69 @@ spec:
status:
description: OpenstackCredsStatus defines the observed state of OpenstackCreds
properties:
conditions:
description: |-
Conditions represent the latest available observations of an OpenstackCreds's state.
Standard Condition Types include CredentialsParsed, CredentialsValidated,
RolesSufficient, Expiring, and Expired.
items:
description: Condition contains details for one aspect of the current
state of this API Resource.
properties:
lastTransitionTime:
description: |-
lastTransitionTime is the last time the condition transitioned from one status to another.
This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
format: date-time
type: string
message:
description: |-
message is a human readable message indicating details about the transition.
This may be an empty string.
maxLength: 32768
type: string
observedGeneration:
description: |-
observedGeneration represents the .metadata.generation that the condition was set based upon.
For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
with respect to the current state of the instance.
format: int64
minimum: 0
type: integer
reason:
description: |-
reason contains a programmatic identifier indicating the reason for the condition's last transition.
Producers of specific condition types may define expected values and meanings for this field,
and whether the values are considered a guaranteed API.
The value should be a CamelCase string.
This field may not be empty.
maxLength: 1024
minLength: 1
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
type: string
status:
description: status of the condition, one of True, False, Unknown.
enum:
- "True"
- "False"
- Unknown
type: string
type:
description: type of condition in CamelCase or in foo.example.com/CamelCase.
maxLength: 316
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
type: string
required:
- lastTransitionTime
- message
- reason
- status
- type
type: object
type: array
x-kubernetes-list-map-keys:
- type
x-kubernetes-list-type: map
openstack:
description: Openstack is the OpenStack configuration for the openstackcreds
properties:
Expand Down Expand Up @@ -1838,12 +1912,21 @@ spec:
type: array
type: object
openstackValidationMessage:
description: OpenStackValidationMessage is the message associated
with the OpenStack validation
description: |-
OpenStackValidationMessage is the legacy summary message string,
superseded by Conditions[*].Message. Populated as a derived view for
back-compat alongside OpenStackValidationStatus.
type: string
openstackValidationStatus:
description: OpenStackValidationStatus is the status of the OpenStack
validation
description: |-
OpenStackValidationStatus is the legacy summary status string. It is
superseded by Conditions (the "CredentialsValidated" Type). The
controller continues to populate this field as a derived view of
Conditions so existing UI and API consumers (UI components reading
openstackValidationStatus, pkg/vpwned proxy, etc.) keep working through
the Conditions migration window. New consumers should read Conditions;
this field will be removed in a future release once downstream
consumers migrate.
type: string
type: object
type: object
Expand Down
95 changes: 89 additions & 6 deletions deploy/installer.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1570,8 +1570,11 @@ spec:
scope: Namespaced
versions:
- additionalPrinterColumns:
- jsonPath: .status.openstackValidationStatus
name: Status
- jsonPath: .status.conditions[?(@.type=="CredentialsValidated")].status
name: Validated
type: string
- jsonPath: .status.conditions[?(@.type=="CredentialsValidated")].reason
name: Reason
type: string
- jsonPath: .spec.secretRef.name
name: Secret Name
Expand Down Expand Up @@ -1608,6 +1611,14 @@ spec:
spec:
description: OpenstackCredsSpec defines the desired state of OpenstackCreds
properties:
cloudName:
description: |-
CloudName selects which cloud entry to use when SecretRef points to a Secret
containing a clouds.yaml key. Ignored when the Secret contains only legacy
OS_* keys. When omitted with a single-entry clouds.yaml, that entry is used.
When omitted with a multi-entry clouds.yaml, the resource reports
CredentialsParsed=False with Reason=AmbiguousCloudName.
type: string
flavors:
description: Flavors is the list of available flavors in openstack
items:
Expand Down Expand Up @@ -1769,6 +1780,69 @@ spec:
status:
description: OpenstackCredsStatus defines the observed state of OpenstackCreds
properties:
conditions:
description: |-
Conditions represent the latest available observations of an OpenstackCreds's state.
Standard Condition Types include CredentialsParsed, CredentialsValidated,
RolesSufficient, Expiring, and Expired.
items:
description: Condition contains details for one aspect of the current
state of this API Resource.
properties:
lastTransitionTime:
description: |-
lastTransitionTime is the last time the condition transitioned from one status to another.
This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
format: date-time
type: string
message:
description: |-
message is a human readable message indicating details about the transition.
This may be an empty string.
maxLength: 32768
type: string
observedGeneration:
description: |-
observedGeneration represents the .metadata.generation that the condition was set based upon.
For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
with respect to the current state of the instance.
format: int64
minimum: 0
type: integer
reason:
description: |-
reason contains a programmatic identifier indicating the reason for the condition's last transition.
Producers of specific condition types may define expected values and meanings for this field,
and whether the values are considered a guaranteed API.
The value should be a CamelCase string.
This field may not be empty.
maxLength: 1024
minLength: 1
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
type: string
status:
description: status of the condition, one of True, False, Unknown.
enum:
- "True"
- "False"
- Unknown
type: string
type:
description: type of condition in CamelCase or in foo.example.com/CamelCase.
maxLength: 316
pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
type: string
required:
- lastTransitionTime
- message
- reason
- status
- type
type: object
type: array
x-kubernetes-list-map-keys:
- type
x-kubernetes-list-type: map
openstack:
description: Openstack is the OpenStack configuration for the openstackcreds
properties:
Expand Down Expand Up @@ -1838,12 +1912,21 @@ spec:
type: array
type: object
openstackValidationMessage:
description: OpenStackValidationMessage is the message associated
with the OpenStack validation
description: |-
OpenStackValidationMessage is the legacy summary message string,
superseded by Conditions[*].Message. Populated as a derived view for
back-compat alongside OpenStackValidationStatus.
type: string
openstackValidationStatus:
description: OpenStackValidationStatus is the status of the OpenStack
validation
description: |-
OpenStackValidationStatus is the legacy summary status string. It is
superseded by Conditions (the "CredentialsValidated" Type). The
controller continues to populate this field as a derived view of
Conditions so existing UI and API consumers (UI components reading
openstackValidationStatus, pkg/vpwned proxy, etc.) keep working through
the Conditions migration window. New consumers should read Conditions;
this field will be removed in a future release once downstream
consumers migrate.
type: string
type: object
type: object
Expand Down
Loading