feat(storage): prepare custom resource for storage API

This commit is contained in:
Peter 2025-01-21 21:54:53 +01:00
parent d02e2d4653
commit b55afea477
Signed by: prskr
GPG key ID: F56BED6903BC5E37
34 changed files with 1110 additions and 369 deletions

View file

@ -22,6 +22,50 @@ import (
corev1 "k8s.io/api/core/v1"
)
type JwtSpec struct {
// SecretRef - object reference to the Secret where JWT values are stored
SecretName string `json:"secretName,omitempty"`
// SecretKey - key in secret where to read the JWT HMAC secret from
// +kubebuilder:default=secret
SecretKey string `json:"secretKey,omitempty"`
// JwksKey - key in secret where to read the JWKS from
// +kubebuilder:default=jwks.json
JwksKey string `json:"jwksKey,omitempty"`
// AnonKey - key in secret where to read the anon JWT from
// +kubebuilder:default=anon_key
AnonKey string `json:"anonKey,omitempty"`
// ServiceKey - key in secret where to read the service JWT from
// +kubebuilder:default=service_key
ServiceKey string `json:"serviceKey,omitempty"`
}
func (s JwtSpec) SecretKeySelector() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: s.SecretName,
},
Key: s.SecretKey,
}
}
func (s JwtSpec) AnonKeySelector() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: s.SecretName,
},
Key: s.AnonKey,
}
}
func (s JwtSpec) ServiceKeySelector() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: s.SecretName,
},
Key: s.ServiceKey,
}
}
type ImageSpec struct {
Image string `json:"image,omitempty"`
PullPolicy corev1.PullPolicy `json:"pullPolicy,omitempty"`

View file

@ -41,11 +41,11 @@ func init() {
var ErrNoSuchSecretValue = errors.New("no such secret value")
type DatabaseRolesSecrets struct {
Admin *corev1.LocalObjectReference `json:"supabaseAdmin,omitempty"`
Authenticator *corev1.LocalObjectReference `json:"authenticator,omitempty"`
AuthAdmin *corev1.LocalObjectReference `json:"supabaseAuthAdmin,omitempty"`
FunctionsAdmin *corev1.LocalObjectReference `json:"supabaseFunctionsAdmin,omitempty"`
StorageAdmin *corev1.LocalObjectReference `json:"supabaseStorageAdmin,omitempty"`
Admin string `json:"supabaseAdmin,omitempty"`
Authenticator string `json:"authenticator,omitempty"`
AuthAdmin string `json:"supabaseAuthAdmin,omitempty"`
FunctionsAdmin string `json:"supabaseFunctionsAdmin,omitempty"`
StorageAdmin string `json:"supabaseStorageAdmin,omitempty"`
}
type DatabaseRoles struct {
@ -91,23 +91,10 @@ func (d Database) DSNEnv(key string) corev1.EnvVar {
}
type CoreJwtSpec struct {
JwtSpec `json:",inline"`
// Secret - JWT HMAC secret in plain text
// This is WRITE-ONLY and will be copied to the SecretRef by the defaulter
Secret *string `json:"secret,omitempty"`
// SecretRef - object reference to the Secret where JWT values are stored
SecretRef *corev1.LocalObjectReference `json:"secretRef,omitempty"`
// SecretKey - key in secret where to read the JWT HMAC secret from
// +kubebuilder:default=secret
SecretKey string `json:"secretKey,omitempty"`
// JwksKey - key in secret where to read the JWKS from
// +kubebuilder:default=jwks.json
JwksKey string `json:"jwksKey,omitempty"`
// AnonKey - key in secret where to read the anon JWT from
// +kubebuilder:default=anon_key
AnonKey string `json:"anonKey,omitempty"`
// ServiceKey - key in secret where to read the service JWT from
// +kubebuilder:default=service_key
ServiceKey string `json:"serviceKey,omitempty"`
// Expiry - expiration time in seconds for JWTs
// +kubebuilder:default=3600
Expiry int `json:"expiry,omitempty"`
@ -115,7 +102,7 @@ type CoreJwtSpec struct {
func (s CoreJwtSpec) GetJWTSecret(ctx context.Context, client client.Client) ([]byte, error) {
var secret corev1.Secret
if err := client.Get(ctx, types.NamespacedName{Name: s.SecretRef.Name}, &secret); err != nil {
if err := client.Get(ctx, types.NamespacedName{Name: s.SecretName}, &secret); err != nil {
return nil, nil
}
@ -129,15 +116,19 @@ func (s CoreJwtSpec) GetJWTSecret(ctx context.Context, client client.Client) ([]
func (s CoreJwtSpec) SecretKeySelector() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: *s.SecretRef,
Key: s.SecretKey,
LocalObjectReference: corev1.LocalObjectReference{
Name: s.SecretName,
},
Key: s.SecretKey,
}
}
func (s CoreJwtSpec) JwksKeySelector() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: *s.SecretRef,
Key: s.JwksKey,
LocalObjectReference: corev1.LocalObjectReference{
Name: s.SecretName,
},
Key: s.JwksKey,
}
}
@ -146,8 +137,10 @@ func (s CoreJwtSpec) SecretAsEnv(key string) corev1.EnvVar {
Name: key,
ValueFrom: &corev1.EnvVarSource{
SecretKeyRef: &corev1.SecretKeySelector{
LocalObjectReference: *s.SecretRef,
Key: s.SecretKey,
LocalObjectReference: corev1.LocalObjectReference{
Name: s.SecretName,
},
Key: s.SecretKey,
},
},
}
@ -194,11 +187,21 @@ func (p *AuthProviderMeta) Vars(provider string) []corev1.EnvVar {
}}
}
type SmtpCredentialsReference struct {
SecretName string `json:"secretName"`
// UsernameKey
// +kubebuilder:default="username"
UsernameKey string `json:"usernameKey"`
// PasswordKey
// +kubebuilder:default="password"
PasswordKey string `json:"passwordKey"`
}
type EmailAuthSmtpSpec struct {
Host string `json:"host"`
Port uint16 `json:"port"`
MaxFrequency *uint `json:"maxFrequency,omitempty"`
CredentialsFrom *corev1.LocalObjectReference `json:"credentialsFrom"`
Host string `json:"host"`
Port uint16 `json:"port"`
MaxFrequency *uint `json:"maxFrequency,omitempty"`
CredentialsRef *SmtpCredentialsReference `json:"credentialsRef"`
}
type EmailAuthProvider struct {
@ -225,8 +228,10 @@ func (p *EmailAuthProvider) Vars(apiExternalURL string) []corev1.EnvVar {
Name: "GOTRUE_SMTP_USER",
ValueFrom: &corev1.EnvVarSource{
SecretKeyRef: &corev1.SecretKeySelector{
LocalObjectReference: *p.SmtpSpec.CredentialsFrom,
Key: corev1.BasicAuthUsernameKey,
LocalObjectReference: corev1.LocalObjectReference{
Name: p.SmtpSpec.CredentialsRef.SecretName,
},
Key: p.SmtpSpec.CredentialsRef.UsernameKey,
},
},
},
@ -234,8 +239,10 @@ func (p *EmailAuthProvider) Vars(apiExternalURL string) []corev1.EnvVar {
Name: "GOTRUE_SMTP_PASS",
ValueFrom: &corev1.EnvVarSource{
SecretKeyRef: &corev1.SecretKeySelector{
LocalObjectReference: *p.SmtpSpec.CredentialsFrom,
Key: corev1.BasicAuthPasswordKey,
LocalObjectReference: corev1.LocalObjectReference{
Name: p.SmtpSpec.CredentialsRef.SecretName,
},
Key: p.SmtpSpec.CredentialsRef.PasswordKey,
},
},
},

View file

@ -21,43 +21,8 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type DashboardJwtSpec struct {
// SecretRef - object reference to the Secret where JWT values are stored
SecretRef *corev1.LocalObjectReference `json:"secretRef,omitempty"`
// SecretKey - key in secret where to read the JWT HMAC secret from
// +kubebuilder:default=secret
SecretKey string `json:"secretKey,omitempty"`
// AnonKey - key in secret where to read the anon JWT from
// +kubebuilder:default=anon_key
AnonKey string `json:"anonKey,omitempty"`
// ServiceKey - key in secret where to read the service JWT from
// +kubebuilder:default=service_key
ServiceKey string `json:"serviceKey,omitempty"`
}
func (s DashboardJwtSpec) SecretKeySelector() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: *s.SecretRef,
Key: s.SecretKey,
}
}
func (s DashboardJwtSpec) AnonKeySelector() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: *s.SecretRef,
Key: s.AnonKey,
}
}
func (s DashboardJwtSpec) ServiceKeySelector() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: *s.SecretRef,
Key: s.ServiceKey,
}
}
type StudioSpec struct {
JWT *DashboardJwtSpec `json:"jwt,omitempty"`
JWT *JwtSpec `json:"jwt,omitempty"`
// WorkloadTemplate - customize the studio deployment
WorkloadTemplate *WorkloadTemplate `json:"workloadTemplate,omitempty"`
// GatewayServiceSelector - selector to find the service for the API gateway
@ -75,6 +40,16 @@ type PGMetaSpec struct {
WorkloadTemplate *WorkloadTemplate `json:"workloadTemplate,omitempty"`
}
type DbCredentialsReference struct {
SecretName string `json:"secretName"`
// UsernameKey
// +kubebuilder:default="username"
UsernameKey string `json:"usernameKey,omitempty"`
// PasswordKey
// +kubebuilder:default="password"
PasswordKey string `json:"passwordKey,omitempty"`
}
type DashboardDbSpec struct {
Host string `json:"host"`
// Port - Database port, typically 5432
@ -83,20 +58,24 @@ type DashboardDbSpec struct {
DBName string `json:"dbName"`
// DBCredentialsRef - reference to a Secret key where the DB credentials can be retrieved from
// Credentials need to be stored in basic auth form
DBCredentialsRef *corev1.LocalObjectReference `json:"dbCredentialsRef"`
DBCredentialsRef *DbCredentialsReference `json:"dbCredentialsRef"`
}
func (s DashboardDbSpec) UserRef() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: *s.DBCredentialsRef,
Key: corev1.BasicAuthUsernameKey,
LocalObjectReference: corev1.LocalObjectReference{
Name: s.DBCredentialsRef.SecretName,
},
Key: s.DBCredentialsRef.UsernameKey,
}
}
func (s DashboardDbSpec) PasswordRef() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: *s.DBCredentialsRef,
Key: corev1.BasicAuthPasswordKey,
LocalObjectReference: corev1.LocalObjectReference{
Name: s.DBCredentialsRef.SecretName,
},
Key: s.DBCredentialsRef.PasswordKey,
}
}

View file

@ -17,26 +17,93 @@ limitations under the License.
package v1alpha1
import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN!
// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized.
type StorageBackend string
const (
StorageBackendFile StorageBackend = "file"
StorageBackendS3 StorageBackend = "s3"
)
type StorageApiDbSpec struct {
Host string `json:"host"`
// Port - Database port, typically 5432
// +kubebuilder:default=5432
Port int `json:"port,omitempty"`
DBName string `json:"dbName"`
// DBCredentialsRef - reference to a Secret key where the DB credentials can be retrieved from
// Credentials need to be stored in basic auth form
DBCredentialsRef *DbCredentialsReference `json:"dbCredentialsRef"`
}
func (s StorageApiDbSpec) UserRef() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: s.DBCredentialsRef.SecretName,
},
Key: s.DBCredentialsRef.UsernameKey,
}
}
func (s StorageApiDbSpec) PasswordRef() *corev1.SecretKeySelector {
return &corev1.SecretKeySelector{
LocalObjectReference: corev1.LocalObjectReference{
Name: s.DBCredentialsRef.SecretName,
},
Key: s.DBCredentialsRef.PasswordKey,
}
}
type S3CredentialsRef struct {
SecretName string `json:"secretName"`
// AccessKeyIdKey - key in Secret where access key id will be referenced from
// +kubebuilder:default="accessKeyId"
AccessKeyIdKey string `json:"accessKeyIdKey,omitempty"`
// AccessSecretKeyKey - key in Secret where access secret key will be referenced from
// +kubebuilder:default="secretAccessKey"
AccessSecretKeyKey string `json:"accessSecretKeyKey,omitempty"`
}
type S3ProtocolSpec struct {
// Region - S3 region to use in the API
// +kubebuilder:default="us-east-1"
Region string `json:"region,omitempty"`
// AllowForwardedHeader
// +kubebuilder:default=true
AllowForwardedHeader bool `json:"allowForwardedHeader,omitempty"`
// CredentialsSecretRef - reference to the Secret where access key id and access secret key are stored
CredentialsSecretRef *S3CredentialsRef `json:"credentialsSecretRef,omitempty"`
}
// StorageSpec defines the desired state of Storage.
type StorageSpec struct {
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
// Important: Run "make" to regenerate code after modifying this file
// Foo is an example field of Storage. Edit storage_types.go to remove/update
Foo string `json:"foo,omitempty"`
// BackendType - backend storage type to use
// +kubebuilder:validation:Enum={s3,file}
BackendType StorageBackend `json:"backendType"`
// FileSizeLimit - maximum file upload size in bytes
// +kubebuilder:default=52428800
FileSizeLimit uint64 `json:"fileSizeLimit,omitempty"`
// JwtAuth - Configure the JWT authentication parameters.
// This includes where to retrieve anon and service key from as well as JWT secret and JWKS references
// needed to validate JWTs send to the API
JwtAuth JwtSpec `json:"jwtAuth"`
// DBSpec - Configure access to the Postgres database
// In most cases this will reference the supabase-storage-admin credentials secret provided by the Core resource
DBSpec StorageApiDbSpec `json:"db"`
// S3 - Configure S3 protocol
S3 *S3ProtocolSpec `json:"s3,omitempty"`
// EnableImageTransformation - whether to deploy the image proxy
// the image proxy scale images to lower resolutions on demand to reduce traffic for instance for mobile devices
EnableImageTransformation bool `json:"enableImageTransformation,omitempty"`
}
// StorageStatus defines the observed state of Storage.
type StorageStatus struct {
// INSERT ADDITIONAL STATUS FIELD - define observed state of cluster
// Important: Run "make" to regenerate code after modifying this file
}
type StorageStatus struct{}
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status

View file

@ -21,7 +21,7 @@ limitations under the License.
package v1alpha1
import (
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
)
@ -345,16 +345,12 @@ func (in *Core) DeepCopyObject() runtime.Object {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CoreJwtSpec) DeepCopyInto(out *CoreJwtSpec) {
*out = *in
out.JwtSpec = in.JwtSpec
if in.Secret != nil {
in, out := &in.Secret, &out.Secret
*out = new(string)
**out = **in
}
if in.SecretRef != nil {
in, out := &in.SecretRef, &out.SecretRef
*out = new(v1.LocalObjectReference)
**out = **in
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CoreJwtSpec.
@ -474,7 +470,7 @@ func (in *DashboardDbSpec) DeepCopyInto(out *DashboardDbSpec) {
*out = *in
if in.DBCredentialsRef != nil {
in, out := &in.DBCredentialsRef, &out.DBCredentialsRef
*out = new(v1.LocalObjectReference)
*out = new(DbCredentialsReference)
**out = **in
}
}
@ -489,26 +485,6 @@ func (in *DashboardDbSpec) DeepCopy() *DashboardDbSpec {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DashboardJwtSpec) DeepCopyInto(out *DashboardJwtSpec) {
*out = *in
if in.SecretRef != nil {
in, out := &in.SecretRef, &out.SecretRef
*out = new(v1.LocalObjectReference)
**out = **in
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DashboardJwtSpec.
func (in *DashboardJwtSpec) DeepCopy() *DashboardJwtSpec {
if in == nil {
return nil
}
out := new(DashboardJwtSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DashboardList) DeepCopyInto(out *DashboardList) {
*out = *in
@ -599,7 +575,7 @@ func (in *Database) DeepCopyInto(out *Database) {
*out = new(v1.SecretKeySelector)
(*in).DeepCopyInto(*out)
}
in.Roles.DeepCopyInto(&out.Roles)
out.Roles = in.Roles
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Database.
@ -615,7 +591,7 @@ func (in *Database) DeepCopy() *Database {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DatabaseRoles) DeepCopyInto(out *DatabaseRoles) {
*out = *in
in.Secrets.DeepCopyInto(&out.Secrets)
out.Secrets = in.Secrets
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DatabaseRoles.
@ -631,31 +607,6 @@ func (in *DatabaseRoles) DeepCopy() *DatabaseRoles {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DatabaseRolesSecrets) DeepCopyInto(out *DatabaseRolesSecrets) {
*out = *in
if in.Admin != nil {
in, out := &in.Admin, &out.Admin
*out = new(v1.LocalObjectReference)
**out = **in
}
if in.Authenticator != nil {
in, out := &in.Authenticator, &out.Authenticator
*out = new(v1.LocalObjectReference)
**out = **in
}
if in.AuthAdmin != nil {
in, out := &in.AuthAdmin, &out.AuthAdmin
*out = new(v1.LocalObjectReference)
**out = **in
}
if in.FunctionsAdmin != nil {
in, out := &in.FunctionsAdmin, &out.FunctionsAdmin
*out = new(v1.LocalObjectReference)
**out = **in
}
if in.StorageAdmin != nil {
in, out := &in.StorageAdmin, &out.StorageAdmin
*out = new(v1.LocalObjectReference)
**out = **in
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DatabaseRolesSecrets.
@ -706,6 +657,21 @@ func (in *DatabaseStatus) DeepCopy() *DatabaseStatus {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DbCredentialsReference) DeepCopyInto(out *DbCredentialsReference) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DbCredentialsReference.
func (in *DbCredentialsReference) DeepCopy() *DbCredentialsReference {
if in == nil {
return nil
}
out := new(DbCredentialsReference)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *EmailAuthProvider) DeepCopyInto(out *EmailAuthProvider) {
*out = *in
@ -745,9 +711,9 @@ func (in *EmailAuthSmtpSpec) DeepCopyInto(out *EmailAuthSmtpSpec) {
*out = new(uint)
**out = **in
}
if in.CredentialsFrom != nil {
in, out := &in.CredentialsFrom, &out.CredentialsFrom
*out = new(v1.LocalObjectReference)
if in.CredentialsRef != nil {
in, out := &in.CredentialsRef, &out.CredentialsRef
*out = new(SmtpCredentialsReference)
**out = **in
}
}
@ -839,6 +805,21 @@ func (in *ImageSpec) DeepCopy() *ImageSpec {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *JwtSpec) DeepCopyInto(out *JwtSpec) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new JwtSpec.
func (in *JwtSpec) DeepCopy() *JwtSpec {
if in == nil {
return nil
}
out := new(JwtSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in MigrationStatus) DeepCopyInto(out *MigrationStatus) {
{
@ -946,12 +927,62 @@ func (in *PostgrestSpec) DeepCopy() *PostgrestSpec {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *S3CredentialsRef) DeepCopyInto(out *S3CredentialsRef) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new S3CredentialsRef.
func (in *S3CredentialsRef) DeepCopy() *S3CredentialsRef {
if in == nil {
return nil
}
out := new(S3CredentialsRef)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *S3ProtocolSpec) DeepCopyInto(out *S3ProtocolSpec) {
*out = *in
if in.CredentialsSecretRef != nil {
in, out := &in.CredentialsSecretRef, &out.CredentialsSecretRef
*out = new(S3CredentialsRef)
**out = **in
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new S3ProtocolSpec.
func (in *S3ProtocolSpec) DeepCopy() *S3ProtocolSpec {
if in == nil {
return nil
}
out := new(S3ProtocolSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SmtpCredentialsReference) DeepCopyInto(out *SmtpCredentialsReference) {
*out = *in
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SmtpCredentialsReference.
func (in *SmtpCredentialsReference) DeepCopy() *SmtpCredentialsReference {
if in == nil {
return nil
}
out := new(SmtpCredentialsReference)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Storage) DeepCopyInto(out *Storage) {
*out = *in
out.TypeMeta = in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
out.Spec = in.Spec
in.Spec.DeepCopyInto(&out.Spec)
out.Status = in.Status
}
@ -973,6 +1004,26 @@ func (in *Storage) DeepCopyObject() runtime.Object {
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageApiDbSpec) DeepCopyInto(out *StorageApiDbSpec) {
*out = *in
if in.DBCredentialsRef != nil {
in, out := &in.DBCredentialsRef, &out.DBCredentialsRef
*out = new(DbCredentialsReference)
**out = **in
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageApiDbSpec.
func (in *StorageApiDbSpec) DeepCopy() *StorageApiDbSpec {
if in == nil {
return nil
}
out := new(StorageApiDbSpec)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageList) DeepCopyInto(out *StorageList) {
*out = *in
@ -1008,6 +1059,13 @@ func (in *StorageList) DeepCopyObject() runtime.Object {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *StorageSpec) DeepCopyInto(out *StorageSpec) {
*out = *in
out.JwtAuth = in.JwtAuth
in.DBSpec.DeepCopyInto(&out.DBSpec)
if in.S3 != nil {
in, out := &in.S3, &out.S3
*out = new(S3ProtocolSpec)
(*in).DeepCopyInto(*out)
}
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageSpec.
@ -1040,8 +1098,8 @@ func (in *StudioSpec) DeepCopyInto(out *StudioSpec) {
*out = *in
if in.JWT != nil {
in, out := &in.JWT, &out.JWT
*out = new(DashboardJwtSpec)
(*in).DeepCopyInto(*out)
*out = new(JwtSpec)
**out = **in
}
if in.WorkloadTemplate != nil {
in, out := &in.WorkloadTemplate, &out.WorkloadTemplate