Choose and pin the provider
Record:- the provider package and version;
- the managed resource kind and API version;
- the controller image digest;
- how that provider version configures a custom endpoint;
- which origin identity the controller uses;
- the deletion policy and target resource owner.
ProviderConfig from another family.
Start with one bounded resource
Choose a resource with a small lifecycle, such as one object or bucket only when its full create, observe, update, and delete operations are documented for the selected target. Give it a unique external name and no production dependencies. Apply the provider configuration and one managed resource, then observe:Ready and Synced conditions, reason, message, observed generation, external name, and controller request identifiers. A healthy provider pod does not prove the managed resource reconciled.
Verify the reconcile loop
Test each phase separately:- Observe absent: controller confirms the target resource does not exist.
- Create: controller issues the documented create operation.
- Observe present: controller reads back identity and late-initialized fields.
- No-op reconcile: a second pass does not mutate the target.
- Update: change one supported mutable field and observe convergence.
- Drift: make one controlled target-side change and observe correction or reporting.
- Delete: remove the managed resource and verify the configured deletion policy.
Composition comes later
A Composition introduces multiple managed resources, dependency ordering, patches, readiness checks, connection details, and rollback questions. Add it only after every underlying resource has its own passing lifecycle fixture and cleanup evidence.Common failure boundaries
Compare the exact operations with the service catalog and use diagnostic response headers where the provider exposes them.