CRD Lifecycle
Maturity lifecycle, graduation criteria, and version management for Snowplane Custom Resource Definitions.
Maturity Levels
Every Snowplane CRD carries a maturity label (snowplane.hupe1980.github.io/maturity):
| Level | API Version | Stability | Gating |
|---|---|---|---|
| alpha | v1alpha1 |
None — API may change or be removed | --enable-alpha-resources (default: true) |
| beta | v1beta1 |
Backwards-compatible changes only | Always enabled |
| stable | v1 |
Full backwards-compatibility | Always enabled |
Current Classification
| CRD | Maturity | Notes |
|---|---|---|
| Database | alpha | Full lifecycle, adoption, drift detection |
| Schema | alpha | Parent ref resolution, cascading delete |
| Warehouse | alpha | Account-level resource, adoption support |
| User | alpha | Secret-referenced credentials |
| AccountRole | alpha | Simplest resource type |
| DatabaseRole | alpha | Two-part identifier, parent dependency |
| GrantPrivilegesToAccountRole | alpha | Grant/Revoke (no ALTER) |
| GrantPrivilegesToDatabaseRole | alpha | Grant/Revoke (no ALTER) |
| AccountRoleAssignment | alpha | GRANT ROLE TO ROLE/USER (immutable, no ALTER) |
| DatabaseRoleAssignment | alpha | GRANT DATABASE ROLE TO ROLE/DATABASE ROLE (immutable, no ALTER) |
| GrantPrivilegesToShare | alpha | Grant/Revoke (no ALTER) |
| GrantOwnership | alpha | Ownership transfer, no-op on delete |
| Table | alpha | Column management, schema-level |
| View | alpha | AS query management, secure views |
| MaterializedView | alpha | Materialized query results, secure, cluster by |
| InternalStage | alpha | Internal stages, file format |
| ExternalStage | alpha | External stages (S3, GCS, Azure) |
| Task | alpha | Scheduled SQL, DAG, serverless |
| Alert | alpha | Condition-based monitoring & notification |
| StreamOnTable | alpha | CDC on tables |
| StreamOnView | alpha | CDC on views |
| StreamOnExternalTable | alpha | CDC on external tables |
| StreamOnDirectoryTable | alpha | CDC on stage directory tables |
| StreamOnDynamicTable | alpha | CDC on dynamic tables |
| Tag | alpha | Data governance with allowed values |
| NetworkPolicy | alpha | IP allow/block lists |
| ResourceMonitor | alpha | Credit quota monitoring |
| MaskingPolicy | alpha | Dynamic masking for PII/PCI |
| RowAccessPolicy | alpha | Row-level security |
| StorageIntegrationAWS | alpha | S3 storage integration |
| StorageIntegrationGCS | alpha | GCS storage integration |
| StorageIntegrationAzure | alpha | Azure storage integration |
| ExternalOAuthIntegration | alpha | External OAuth integration |
| SAML2Integration | alpha | SAML2 integration |
| SCIMIntegration | alpha | SCIM provisioning integration |
| EmailNotificationIntegration | alpha | Email notification integration |
| QueueNotificationIntegration | alpha | Queue notification integration (AWS SNS, Azure Event Grid, GCP Pub/Sub) |
| WebhookNotificationIntegration | alpha | Webhook notification integration |
| PasswordPolicy | alpha | Password compliance rules |
| NetworkRule | alpha | Network identifier groups |
| FileFormat | alpha | CSV, JSON, Parquet, etc. |
| Pipe | alpha | Snowpipe continuous loading |
| DynamicTable | alpha | Auto-refresh materialisation |
| FieldExport | alpha | ConfigMap/Secret export |
| Share | alpha | Outbound data sharing, account management |
| ExternalFunction | alpha | HTTPS external functions, create/drop only |
| ComputePool | alpha | SPCS compute infrastructure, immutable instanceFamily |
| Service | alpha | SPCS container workloads, schema-scoped |
| ImageRepository | alpha | SPCS container image registry, create/drop only |
| OAuthIntegrationForCustomClients | alpha | Snowflake-hosted OAuth for custom clients |
| OAuthIntegrationForPartnerApplications | alpha | Partner app OAuth (Tableau, Looker) |
| PrimaryConnection | alpha | HA/failover primary connection |
| SecondaryConnection | alpha | HA/failover secondary connection replica |
| ProviderConfig | stable | Core infrastructure, always required |
Graduation Criteria
Alpha → Beta
- API Stability — No breaking spec changes for 2+ minor releases
- Test Coverage — Integration tests for all lifecycle operations
- Documentation — Complete user-facing docs with examples
- Production Usage — At least one production deployment
- Validation — CEL rules complete
- Error Handling — All error paths produce meaningful conditions
Beta → Stable
- API Freeze — No schema changes for 3+ minor releases (additive OK)
- Conversion Webhook —
v1beta1→v1transparency - Migration Path — Documented migration guide
- Performance — Validated under load (100+ resources)
- Multi-tenant — Tested with multiple ProviderConfigs
- Observability — Complete metrics, events, and conditions
Deprecation Policy
Version Overlap
- Minimum 2 minor releases of overlap between deprecated and replacement versions
- Both versions are served and stored during overlap
- Deprecated version emits a warning header
Timeline
Release N — v1beta1 introduced alongside v1alpha1
Release N+1 — v1alpha1 deprecated (warning header)
Release N+2 — v1alpha1 removed from served versions
Release N+3 — v1alpha1 storage version migrated
Conversion Webhooks
When a CRD has multiple served API versions:
- Hub-and-spoke model: Latest stable version is the “hub”
- All other versions convert to/from the hub
- Round-trip fuzz tests validate no data loss
func (src *Database) ConvertTo(dstRaw conversion.Hub) error {
dst := dstRaw.(*v1beta1.Database)
// Copy common fields...
return nil
}
Controller Gating
# Disable alpha resources
manager --enable-alpha-resources=false
# Disable specific controllers
manager --disable-controllers=grantprivilegestoaccountrole,internalstage,view
When disabled:
- Controllers log a skip message and do not register
- Existing CRD instances remain in their last-known state
- CRD definitions remain in the cluster
Version Transition Checklist
- Update maturity label in CRD YAML
- Add new API version directory
- Implement conversion webhook (hub-and-spoke)
- Add round-trip fuzz tests
- Update
WithMaturity()in controller registration - Add migration guide to release notes