mirror of
https://github.com/arangodb/kube-arangodb.git
synced 2024-12-14 11:57:37 +00:00
Restructure ML Storage CR (#1508)
This commit is contained in:
parent
2c528fb2ad
commit
b2986a01ec
14 changed files with 794 additions and 214 deletions
|
@ -2,9 +2,79 @@
|
|||
|
||||
## Spec
|
||||
|
||||
### .spec.listenPort
|
||||
### .spec.backend.s3.allowInsecure
|
||||
|
||||
Type: `integer` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec.go#L32)</sup>
|
||||
Type: `boolean` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec_backend_s3.go#L43)</sup>
|
||||
|
||||
AllowInsecure if set to true, the Endpoint certificates won't be checked
|
||||
|
||||
Default Value: `false`
|
||||
|
||||
***
|
||||
|
||||
### .spec.backend.s3.bucketName
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec_backend_s3.go#L37)</sup>
|
||||
|
||||
BucketName specifies the name of the bucket
|
||||
Required
|
||||
|
||||
***
|
||||
|
||||
### .spec.backend.s3.caSecret.name
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/batchjob_status.go#L12)</sup>
|
||||
|
||||
Name of the object
|
||||
|
||||
***
|
||||
|
||||
### .spec.backend.s3.caSecret.namespace
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/batchjob_status.go#L13)</sup>
|
||||
|
||||
Namespace of the object. Should default to the namespace of the parent object
|
||||
|
||||
***
|
||||
|
||||
### .spec.backend.s3.credentialsSecret.name
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/batchjob_status.go#L12)</sup>
|
||||
|
||||
Name of the object
|
||||
|
||||
***
|
||||
|
||||
### .spec.backend.s3.credentialsSecret.namespace
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/batchjob_status.go#L13)</sup>
|
||||
|
||||
Namespace of the object. Should default to the namespace of the parent object
|
||||
|
||||
***
|
||||
|
||||
### .spec.backend.s3.endpoint
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec_backend_s3.go#L34)</sup>
|
||||
|
||||
Endpoint specifies the S3 API-compatible endpoint which implements storage
|
||||
Required
|
||||
|
||||
***
|
||||
|
||||
### .spec.backend.s3.region
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec_backend_s3.go#L52)</sup>
|
||||
|
||||
Region defines the availability zone name.
|
||||
|
||||
Default Value: `""`
|
||||
|
||||
***
|
||||
|
||||
### .spec.mode.sidecar.listenPort
|
||||
|
||||
Type: `integer` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec_mode_sidecar.go#L41)</sup>
|
||||
|
||||
ListenPort defines on which port the sidecar container will be listening for connections
|
||||
|
||||
|
@ -12,62 +82,15 @@ Default Value: `9201`
|
|||
|
||||
***
|
||||
|
||||
### .spec.resources
|
||||
### .spec.mode.sidecar.resources
|
||||
|
||||
Type: `core.ResourceRequirements` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec.go#L37)</sup>
|
||||
Type: `core.ResourceRequirements` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec_mode_sidecar.go#L46)</sup>
|
||||
|
||||
Resources holds resource requests & limits for container running the S3 proxy
|
||||
|
||||
Links:
|
||||
* [Documentation of core.ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#resourcerequirements-v1-core)
|
||||
|
||||
***
|
||||
|
||||
### .spec.s3.bucketName
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_s3_spec.go#L39)</sup>
|
||||
|
||||
BucketName specifies the name of the bucket
|
||||
Required
|
||||
|
||||
***
|
||||
|
||||
### .spec.s3.credentialsSecret
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_s3_spec.go#L42)</sup>
|
||||
|
||||
CredentialsSecretName specifies the name of the secret containing AccessKey and SecretKey for S3 API authorization
|
||||
Required
|
||||
|
||||
***
|
||||
|
||||
### .spec.s3.disableSSL
|
||||
|
||||
Type: `boolean` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_s3_spec.go#L33)</sup>
|
||||
|
||||
DisableSSL if set to true, no certificate checks will be performed for Endpoint
|
||||
|
||||
Default Value: `false`
|
||||
|
||||
***
|
||||
|
||||
### .spec.s3.endpoint
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_s3_spec.go#L30)</sup>
|
||||
|
||||
Endpoint specifies the S3 API-compatible endpoint which implements storage
|
||||
Required
|
||||
|
||||
***
|
||||
|
||||
### .spec.s3.region
|
||||
|
||||
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_s3_spec.go#L36)</sup>
|
||||
|
||||
Region defines the availability zone name. If empty, defaults to 'us-east-1'
|
||||
|
||||
Default Value: `""`
|
||||
|
||||
## Status
|
||||
|
||||
### .status.conditions
|
||||
|
|
|
@ -128,6 +128,8 @@ func Test_GenerateAPIDocs(t *testing.T) {
|
|||
root := os.Getenv("ROOT")
|
||||
require.NotEmpty(t, root)
|
||||
|
||||
sharedFields, sharedFilesSet := parseSourceFiles(t, fmt.Sprintf("%s/pkg/apis/shared/v1", root))
|
||||
|
||||
// package path -> result doc file name -> name of the top-level field to be described -> field instance for reflection
|
||||
input := map[string]map[string]map[string]interface{}{
|
||||
fmt.Sprintf("%s/pkg/apis/deployment/v1", root): {
|
||||
|
@ -180,8 +182,17 @@ func Test_GenerateAPIDocs(t *testing.T) {
|
|||
|
||||
resultPaths := make(map[string]string)
|
||||
for apiDir, docs := range input {
|
||||
fields, fileSets := parseSourceFiles(t, apiDir)
|
||||
util.CopyMap(resultPaths, generateDocs(t, docs, fields, fileSets))
|
||||
fields, fileSet := parseSourceFiles(t, apiDir)
|
||||
|
||||
for n, f := range sharedFields {
|
||||
fields[n] = f
|
||||
}
|
||||
sharedFilesSet.Iterate(func(file *token.File) bool {
|
||||
fileSet.AddFile(file.Name(), fileSet.Base()+file.Base(), file.Size())
|
||||
return true
|
||||
})
|
||||
|
||||
util.CopyMap(resultPaths, generateDocs(t, docs, fields, fileSet))
|
||||
}
|
||||
generateIndex(t, resultPaths)
|
||||
}
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
//
|
||||
// DISCLAIMER
|
||||
//
|
||||
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
|
||||
package v1alpha1
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
type ArangoMLStorageS3Spec struct {
|
||||
// Endpoint specifies the S3 API-compatible endpoint which implements storage
|
||||
// Required
|
||||
Endpoint string `json:"endpoint"`
|
||||
// DisableSSL if set to true, no certificate checks will be performed for Endpoint
|
||||
// +doc/default: false
|
||||
DisableSSL bool `json:"disableSSL,omitempty"`
|
||||
// Region defines the availability zone name. If empty, defaults to 'us-east-1'
|
||||
// +doc/default: ""
|
||||
Region string `json:"region,omitempty"`
|
||||
// BucketName specifies the name of the bucket
|
||||
// Required
|
||||
BucketName string `json:"bucketName"`
|
||||
// CredentialsSecretName specifies the name of the secret containing AccessKey and SecretKey for S3 API authorization
|
||||
// Required
|
||||
CredentialsSecretName string `json:"credentialsSecret"`
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageS3Spec) Validate() error {
|
||||
if s.BucketName == "" {
|
||||
return errors.New("S3 BucketName must be not empty")
|
||||
}
|
||||
|
||||
if s.Endpoint == "" {
|
||||
return errors.New("S3 Endpoint must be not empty")
|
||||
}
|
||||
|
||||
if s.CredentialsSecretName == "" {
|
||||
return errors.New("S3 CredentialsSecretName must be not empty")
|
||||
}
|
||||
return nil
|
||||
}
|
|
@ -21,47 +21,41 @@
|
|||
package v1alpha1
|
||||
|
||||
import (
|
||||
"github.com/pkg/errors"
|
||||
core "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
|
||||
)
|
||||
|
||||
type ArangoMLStorageSpec struct {
|
||||
// ListenPort defines on which port the sidecar container will be listening for connections
|
||||
// +doc/default: 9201
|
||||
ListenPort *uint16 `json:"listenPort,omitempty"`
|
||||
// Mode defines how storage implementation should be deployed
|
||||
Mode *ArangoMLStorageSpecMode `json:"mode,omitempty"`
|
||||
// Backend defines how storage is implemented
|
||||
Backend *ArangoMLStorageSpecBackend `json:"backend,omitempty"`
|
||||
}
|
||||
|
||||
// Resources holds resource requests & limits for container running the S3 proxy
|
||||
// +doc/type: core.ResourceRequirements
|
||||
// +doc/link: Documentation of core.ResourceRequirements|https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#resourcerequirements-v1-core
|
||||
Resources core.ResourceRequirements `json:"resources,omitempty"`
|
||||
func (s *ArangoMLStorageSpec) GetMode() *ArangoMLStorageSpecMode {
|
||||
if s == nil || s.Mode == nil {
|
||||
return &ArangoMLStorageSpecMode{}
|
||||
}
|
||||
return s.Mode
|
||||
}
|
||||
|
||||
S3 *ArangoMLStorageS3Spec `json:"s3,omitempty"`
|
||||
func (s *ArangoMLStorageSpec) GetBackend() *ArangoMLStorageSpecBackend {
|
||||
if s == nil || s.Backend == nil {
|
||||
return &ArangoMLStorageSpecBackend{}
|
||||
}
|
||||
return s.Backend
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpec) Validate() error {
|
||||
if s.S3 == nil {
|
||||
return errors.New("Currently only s3 storage type is supported")
|
||||
}
|
||||
|
||||
return s.S3.Validate()
|
||||
}
|
||||
|
||||
// SetDefaults fills in missing defaults
|
||||
func (s *ArangoMLStorageSpec) SetDefaults() {
|
||||
if s == nil {
|
||||
return
|
||||
s = &ArangoMLStorageSpec{}
|
||||
}
|
||||
|
||||
resources := s.Resources
|
||||
if len(resources.Requests) == 0 {
|
||||
resources.Requests = make(core.ResourceList)
|
||||
resources.Requests[core.ResourceCPU] = resource.MustParse("100m")
|
||||
resources.Requests[core.ResourceMemory] = resource.MustParse("100m")
|
||||
}
|
||||
if len(resources.Limits) == 0 {
|
||||
resources.Limits = make(core.ResourceList)
|
||||
resources.Limits[core.ResourceCPU] = resource.MustParse("250m")
|
||||
resources.Limits[core.ResourceMemory] = resource.MustParse("250m")
|
||||
if err := shared.WithErrors(shared.PrefixResourceErrors("spec",
|
||||
shared.PrefixResourceError("backend", s.Backend.Validate()),
|
||||
shared.PrefixResourceError("mode", s.Mode.Validate()),
|
||||
)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
50
pkg/apis/ml/v1alpha1/storage_spec_backend.go
Normal file
50
pkg/apis/ml/v1alpha1/storage_spec_backend.go
Normal file
|
@ -0,0 +1,50 @@
|
|||
//
|
||||
// DISCLAIMER
|
||||
//
|
||||
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
|
||||
package v1alpha1
|
||||
|
||||
import (
|
||||
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
|
||||
"github.com/arangodb/kube-arangodb/pkg/util/errors"
|
||||
)
|
||||
|
||||
type ArangoMLStorageSpecBackend struct {
|
||||
// S3 backend implements storage as a proxy to the provided S3 API endpoint
|
||||
S3 *ArangoMLStorageSpecBackendS3 `json:"s3,omitempty"`
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecBackend) GetS3() *ArangoMLStorageSpecBackendS3 {
|
||||
if s == nil || s.S3 == nil {
|
||||
return &ArangoMLStorageSpecBackendS3{}
|
||||
}
|
||||
return s.S3
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecBackend) Validate() error {
|
||||
if s == nil {
|
||||
return errors.Newf("Backend is not specified")
|
||||
}
|
||||
|
||||
if s.S3 == nil {
|
||||
return errors.Newf("At least one backend needs to be defined")
|
||||
}
|
||||
|
||||
return shared.WithErrors(shared.PrefixResourceError("s3", s.S3.Validate()))
|
||||
}
|
123
pkg/apis/ml/v1alpha1/storage_spec_backend_s3.go
Normal file
123
pkg/apis/ml/v1alpha1/storage_spec_backend_s3.go
Normal file
|
@ -0,0 +1,123 @@
|
|||
//
|
||||
// DISCLAIMER
|
||||
//
|
||||
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
|
||||
package v1alpha1
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
|
||||
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
|
||||
sharedApi "github.com/arangodb/kube-arangodb/pkg/apis/shared/v1"
|
||||
"github.com/arangodb/kube-arangodb/pkg/util/errors"
|
||||
)
|
||||
|
||||
type ArangoMLStorageSpecBackendS3 struct {
|
||||
// Endpoint specifies the S3 API-compatible endpoint which implements storage
|
||||
// Required
|
||||
Endpoint *string `json:"endpoint"`
|
||||
// BucketName specifies the name of the bucket
|
||||
// Required
|
||||
BucketName *string `json:"bucketName"`
|
||||
// CredentialsSecret specifies the Kubernetes Secret containing AccessKey and SecretKey for S3 API authorization
|
||||
// Required
|
||||
CredentialsSecret *sharedApi.Object `json:"credentialsSecret"`
|
||||
// AllowInsecure if set to true, the Endpoint certificates won't be checked
|
||||
// +doc/default: false
|
||||
AllowInsecure *bool `json:"allowInsecure,omitempty"`
|
||||
// CASecret if not empty, the given Kubernetes Secret will be used to check the authenticity of Endpoint
|
||||
// The specified Secret, must contain the following data fields:
|
||||
// - `ca.crt` PEM encoded public key of the CA certificate
|
||||
// - `ca.key` PEM encoded private key of the CA certificate
|
||||
// +doc/default: nil
|
||||
CASecret *sharedApi.Object `json:"caSecret,omitempty"`
|
||||
// Region defines the availability zone name.
|
||||
// +doc/default: ""
|
||||
Region *string `json:"region,omitempty"`
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecBackendS3) Validate() error {
|
||||
if s == nil {
|
||||
s = &ArangoMLStorageSpecBackendS3{}
|
||||
}
|
||||
|
||||
var errs []error
|
||||
|
||||
if s.GetBucketName() == "" {
|
||||
errs = append(errs, shared.PrefixResourceErrors("bucketName", errors.New("must be not empty")))
|
||||
}
|
||||
|
||||
if s.GetEndpoint() == "" {
|
||||
errs = append(errs, shared.PrefixResourceErrors("endpoint", errors.New("must be not empty")))
|
||||
}
|
||||
|
||||
if _, err := url.Parse(s.GetEndpoint()); err != nil {
|
||||
errs = append(errs, shared.PrefixResourceErrors("endpoint", errors.Newf("invalid URL: %s", err.Error())))
|
||||
}
|
||||
|
||||
errs = append(errs, shared.PrefixResourceErrors("credentialsSecret", s.GetCredentialsSecret().Validate()))
|
||||
|
||||
if caSecret := s.GetCASecret(); !caSecret.IsEmpty() {
|
||||
errs = append(errs, shared.PrefixResourceErrors("caSecret", caSecret.Validate()))
|
||||
}
|
||||
|
||||
return shared.WithErrors(errs...)
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecBackendS3) GetEndpoint() string {
|
||||
if s == nil || s.Endpoint == nil {
|
||||
return ""
|
||||
}
|
||||
return *s.Endpoint
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecBackendS3) GetBucketName() string {
|
||||
if s == nil || s.BucketName == nil {
|
||||
return ""
|
||||
}
|
||||
return *s.BucketName
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecBackendS3) GetCredentialsSecret() *sharedApi.Object {
|
||||
if s == nil || s.CredentialsSecret == nil {
|
||||
return &sharedApi.Object{}
|
||||
}
|
||||
return s.CredentialsSecret
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecBackendS3) GetAllowInsecure() bool {
|
||||
if s == nil || s.AllowInsecure == nil {
|
||||
return false
|
||||
}
|
||||
return *s.AllowInsecure
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecBackendS3) GetCASecret() *sharedApi.Object {
|
||||
if s == nil || s.CASecret == nil {
|
||||
return &sharedApi.Object{}
|
||||
}
|
||||
return s.CASecret
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecBackendS3) GetRegion() string {
|
||||
if s == nil || s.Region == nil {
|
||||
return ""
|
||||
}
|
||||
return *s.Region
|
||||
}
|
45
pkg/apis/ml/v1alpha1/storage_spec_mode.go
Normal file
45
pkg/apis/ml/v1alpha1/storage_spec_mode.go
Normal file
|
@ -0,0 +1,45 @@
|
|||
//
|
||||
// DISCLAIMER
|
||||
//
|
||||
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
|
||||
package v1alpha1
|
||||
|
||||
import (
|
||||
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
|
||||
"github.com/arangodb/kube-arangodb/pkg/util/errors"
|
||||
)
|
||||
|
||||
type ArangoMLStorageSpecMode struct {
|
||||
// Sidecar mode runs the storage implementation as a sidecar
|
||||
Sidecar *ArangoMLStorageSpecModeSidecar `json:"sidecar,omitempty"`
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecMode) GetSidecar() *ArangoMLStorageSpecModeSidecar {
|
||||
if s == nil || s.Sidecar == nil {
|
||||
return &ArangoMLStorageSpecModeSidecar{}
|
||||
}
|
||||
return s.Sidecar
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecMode) Validate() error {
|
||||
if s == nil {
|
||||
return errors.Newf("Mode is not defined")
|
||||
}
|
||||
return shared.WithErrors(shared.PrefixResourceError("sidecar", s.Sidecar.Validate()))
|
||||
}
|
83
pkg/apis/ml/v1alpha1/storage_spec_mode_sidecar.go
Normal file
83
pkg/apis/ml/v1alpha1/storage_spec_mode_sidecar.go
Normal file
|
@ -0,0 +1,83 @@
|
|||
//
|
||||
// DISCLAIMER
|
||||
//
|
||||
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
|
||||
package v1alpha1
|
||||
|
||||
import (
|
||||
core "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
|
||||
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
|
||||
"github.com/arangodb/kube-arangodb/pkg/util/errors"
|
||||
)
|
||||
|
||||
var (
|
||||
defaultRequestsCPU = resource.MustParse("100m")
|
||||
defaultRequestsMemory = resource.MustParse("100Mi")
|
||||
defaultLimitsCPU = resource.MustParse("200m")
|
||||
defaultLimitsMemory = resource.MustParse("200Mi")
|
||||
)
|
||||
|
||||
type ArangoMLStorageSpecModeSidecar struct {
|
||||
// ListenPort defines on which port the sidecar container will be listening for connections
|
||||
// +doc/default: 9201
|
||||
ListenPort *uint16 `json:"listenPort,omitempty"`
|
||||
|
||||
// Resources holds resource requests & limits for container running the S3 proxy
|
||||
// +doc/type: core.ResourceRequirements
|
||||
// +doc/link: Documentation of core.ResourceRequirements|https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#resourcerequirements-v1-core
|
||||
Resources *core.ResourceRequirements `json:"resources,omitempty"`
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecModeSidecar) Validate() error {
|
||||
if s == nil {
|
||||
s = &ArangoMLStorageSpecModeSidecar{}
|
||||
}
|
||||
if s.GetListenPort() < 1 {
|
||||
return shared.PrefixResourceErrors("database", errors.Newf("must be positive"))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecModeSidecar) GetListenPort() uint16 {
|
||||
if s == nil || s.ListenPort == nil {
|
||||
return 9201
|
||||
}
|
||||
return *s.ListenPort
|
||||
}
|
||||
|
||||
func (s *ArangoMLStorageSpecModeSidecar) GetResources() core.ResourceRequirements {
|
||||
var resources core.ResourceRequirements
|
||||
if s != nil && s.Resources != nil {
|
||||
resources = *s.Resources
|
||||
}
|
||||
|
||||
if len(resources.Requests) == 0 {
|
||||
resources.Requests = make(core.ResourceList)
|
||||
resources.Requests[core.ResourceCPU] = defaultRequestsCPU
|
||||
resources.Requests[core.ResourceMemory] = defaultRequestsMemory
|
||||
}
|
||||
if len(resources.Limits) == 0 {
|
||||
resources.Limits = make(core.ResourceList)
|
||||
resources.Limits[core.ResourceCPU] = defaultLimitsCPU
|
||||
resources.Limits[core.ResourceMemory] = defaultLimitsMemory
|
||||
}
|
||||
return resources
|
||||
}
|
|
@ -25,23 +25,58 @@ import (
|
|||
|
||||
"github.com/stretchr/testify/require"
|
||||
core "k8s.io/api/core/v1"
|
||||
"k8s.io/apimachinery/pkg/api/resource"
|
||||
|
||||
sharedApi "github.com/arangodb/kube-arangodb/pkg/apis/shared/v1"
|
||||
"github.com/arangodb/kube-arangodb/pkg/util"
|
||||
)
|
||||
|
||||
func Test_ArangoMLStorageSpec(t *testing.T) {
|
||||
s := ArangoMLStorageSpec{
|
||||
ListenPort: nil,
|
||||
Resources: core.ResourceRequirements{},
|
||||
S3: nil,
|
||||
}
|
||||
s.SetDefaults()
|
||||
s := ArangoMLStorageSpec{}
|
||||
require.Error(t, s.Validate())
|
||||
require.NotNil(t, s.GetMode())
|
||||
require.NotNil(t, s.GetBackend())
|
||||
|
||||
require.NotNil(t, s.Mode.GetSidecar())
|
||||
s.Mode = &ArangoMLStorageSpecMode{}
|
||||
|
||||
require.NotNil(t, s.Backend.GetS3())
|
||||
s.Backend = &ArangoMLStorageSpecBackend{}
|
||||
require.Error(t, s.Validate())
|
||||
|
||||
s.S3 = &ArangoMLStorageS3Spec{
|
||||
Endpoint: "some-endpoint",
|
||||
DisableSSL: false,
|
||||
Region: "",
|
||||
BucketName: "test-bucket",
|
||||
CredentialsSecretName: "some-secret",
|
||||
require.NotNil(t, s.Mode.Sidecar.GetListenPort())
|
||||
require.NotNil(t, s.Mode.Sidecar.GetResources())
|
||||
s.Mode.Sidecar = &ArangoMLStorageSpecModeSidecar{}
|
||||
|
||||
require.Error(t, s.Backend.S3.Validate())
|
||||
s.Backend.S3 = &ArangoMLStorageSpecBackendS3{
|
||||
Endpoint: util.NewType("http://test.s3.example.com"),
|
||||
BucketName: util.NewType("bucket"),
|
||||
CredentialsSecret: &sharedApi.Object{
|
||||
Name: "a-secret",
|
||||
Namespace: nil,
|
||||
},
|
||||
}
|
||||
require.NoError(t, s.Validate())
|
||||
|
||||
t.Run("default requests and limits assigned", func(t *testing.T) {
|
||||
assignedRequirements := core.ResourceRequirements{
|
||||
Requests: core.ResourceList{
|
||||
core.ResourceCPU: resource.MustParse("200m"),
|
||||
core.ResourceMemory: resource.MustParse("200Mi"),
|
||||
},
|
||||
}
|
||||
s.Mode.Sidecar.Resources = &assignedRequirements
|
||||
|
||||
expectedRequirements := core.ResourceRequirements{
|
||||
Requests: assignedRequirements.Requests,
|
||||
Limits: core.ResourceList{
|
||||
core.ResourceCPU: resource.MustParse("200m"),
|
||||
core.ResourceMemory: resource.MustParse("200Mi"),
|
||||
},
|
||||
}
|
||||
|
||||
actualRequirements := s.Mode.Sidecar.GetResources()
|
||||
require.Equal(t, expectedRequirements, actualRequirements)
|
||||
})
|
||||
}
|
||||
|
|
149
pkg/apis/ml/v1alpha1/zz_generated.deepcopy.go
generated
149
pkg/apis/ml/v1alpha1/zz_generated.deepcopy.go
generated
|
@ -27,6 +27,8 @@ package v1alpha1
|
|||
|
||||
import (
|
||||
v1 "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1"
|
||||
sharedv1 "github.com/arangodb/kube-arangodb/pkg/apis/shared/v1"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||
)
|
||||
|
||||
|
@ -391,35 +393,18 @@ func (in *ArangoMLStorageList) DeepCopyObject() runtime.Object {
|
|||
return nil
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ArangoMLStorageS3Spec) DeepCopyInto(out *ArangoMLStorageS3Spec) {
|
||||
*out = *in
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArangoMLStorageS3Spec.
|
||||
func (in *ArangoMLStorageS3Spec) DeepCopy() *ArangoMLStorageS3Spec {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ArangoMLStorageS3Spec)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ArangoMLStorageSpec) DeepCopyInto(out *ArangoMLStorageSpec) {
|
||||
*out = *in
|
||||
if in.ListenPort != nil {
|
||||
in, out := &in.ListenPort, &out.ListenPort
|
||||
*out = new(uint16)
|
||||
**out = **in
|
||||
if in.Mode != nil {
|
||||
in, out := &in.Mode, &out.Mode
|
||||
*out = new(ArangoMLStorageSpecMode)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
in.Resources.DeepCopyInto(&out.Resources)
|
||||
if in.S3 != nil {
|
||||
in, out := &in.S3, &out.S3
|
||||
*out = new(ArangoMLStorageS3Spec)
|
||||
**out = **in
|
||||
if in.Backend != nil {
|
||||
in, out := &in.Backend, &out.Backend
|
||||
*out = new(ArangoMLStorageSpecBackend)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -434,6 +419,120 @@ func (in *ArangoMLStorageSpec) DeepCopy() *ArangoMLStorageSpec {
|
|||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ArangoMLStorageSpecBackend) DeepCopyInto(out *ArangoMLStorageSpecBackend) {
|
||||
*out = *in
|
||||
if in.S3 != nil {
|
||||
in, out := &in.S3, &out.S3
|
||||
*out = new(ArangoMLStorageSpecBackendS3)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArangoMLStorageSpecBackend.
|
||||
func (in *ArangoMLStorageSpecBackend) DeepCopy() *ArangoMLStorageSpecBackend {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ArangoMLStorageSpecBackend)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ArangoMLStorageSpecBackendS3) DeepCopyInto(out *ArangoMLStorageSpecBackendS3) {
|
||||
*out = *in
|
||||
if in.Endpoint != nil {
|
||||
in, out := &in.Endpoint, &out.Endpoint
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
if in.BucketName != nil {
|
||||
in, out := &in.BucketName, &out.BucketName
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
if in.CredentialsSecret != nil {
|
||||
in, out := &in.CredentialsSecret, &out.CredentialsSecret
|
||||
*out = new(sharedv1.Object)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.AllowInsecure != nil {
|
||||
in, out := &in.AllowInsecure, &out.AllowInsecure
|
||||
*out = new(bool)
|
||||
**out = **in
|
||||
}
|
||||
if in.CASecret != nil {
|
||||
in, out := &in.CASecret, &out.CASecret
|
||||
*out = new(sharedv1.Object)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
if in.Region != nil {
|
||||
in, out := &in.Region, &out.Region
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArangoMLStorageSpecBackendS3.
|
||||
func (in *ArangoMLStorageSpecBackendS3) DeepCopy() *ArangoMLStorageSpecBackendS3 {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ArangoMLStorageSpecBackendS3)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ArangoMLStorageSpecMode) DeepCopyInto(out *ArangoMLStorageSpecMode) {
|
||||
*out = *in
|
||||
if in.Sidecar != nil {
|
||||
in, out := &in.Sidecar, &out.Sidecar
|
||||
*out = new(ArangoMLStorageSpecModeSidecar)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArangoMLStorageSpecMode.
|
||||
func (in *ArangoMLStorageSpecMode) DeepCopy() *ArangoMLStorageSpecMode {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ArangoMLStorageSpecMode)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ArangoMLStorageSpecModeSidecar) DeepCopyInto(out *ArangoMLStorageSpecModeSidecar) {
|
||||
*out = *in
|
||||
if in.ListenPort != nil {
|
||||
in, out := &in.ListenPort, &out.ListenPort
|
||||
*out = new(uint16)
|
||||
**out = **in
|
||||
}
|
||||
if in.Resources != nil {
|
||||
in, out := &in.Resources, &out.Resources
|
||||
*out = new(corev1.ResourceRequirements)
|
||||
(*in).DeepCopyInto(*out)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ArangoMLStorageSpecModeSidecar.
|
||||
func (in *ArangoMLStorageSpecModeSidecar) DeepCopy() *ArangoMLStorageSpecModeSidecar {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(ArangoMLStorageSpecModeSidecar)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *ArangoMLStorageStatus) DeepCopyInto(out *ArangoMLStorageStatus) {
|
||||
*out = *in
|
||||
|
|
72
pkg/apis/shared/v1/object.go
Normal file
72
pkg/apis/shared/v1/object.go
Normal file
|
@ -0,0 +1,72 @@
|
|||
//
|
||||
// DISCLAIMER
|
||||
//
|
||||
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
|
||||
package v1
|
||||
|
||||
import (
|
||||
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
|
||||
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
|
||||
)
|
||||
|
||||
type Object struct {
|
||||
// Name of the object
|
||||
Name string `json:"name"`
|
||||
|
||||
// Namespace of the object. Should default to the namespace of the parent object
|
||||
Namespace *string `json:"namespace,omitempty"`
|
||||
}
|
||||
|
||||
func (o *Object) IsEmpty() bool {
|
||||
return o == nil ||
|
||||
(o.Name == "" && o.Namespace != nil)
|
||||
}
|
||||
|
||||
func (o *Object) GetName() string {
|
||||
if o == nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
return o.Name
|
||||
}
|
||||
|
||||
func (o *Object) GetNamespace(obj meta.Object) string {
|
||||
if o != nil {
|
||||
if n := o.Namespace; n != nil {
|
||||
return *n
|
||||
}
|
||||
}
|
||||
|
||||
return obj.GetNamespace()
|
||||
}
|
||||
|
||||
func (o *Object) Validate() error {
|
||||
if o == nil {
|
||||
o = &Object{}
|
||||
}
|
||||
|
||||
var errs []error
|
||||
errs = append(errs, shared.PrefixResourceErrors("name", AsKubernetesResourceName(&o.Name).Validate()))
|
||||
if o.Namespace != nil {
|
||||
errs = append(errs, shared.PrefixResourceErrors("namespace", AsKubernetesResourceName(o.Namespace).Validate()))
|
||||
}
|
||||
|
||||
return shared.WithErrors(errs...)
|
||||
}
|
52
pkg/apis/shared/v1/object_test.go
Normal file
52
pkg/apis/shared/v1/object_test.go
Normal file
|
@ -0,0 +1,52 @@
|
|||
//
|
||||
// DISCLAIMER
|
||||
//
|
||||
// Copyright 2023 ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
||||
//
|
||||
|
||||
package v1
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/arangodb/kube-arangodb/pkg/util"
|
||||
)
|
||||
|
||||
func Test_Object_Validate(t *testing.T) {
|
||||
var o *Object
|
||||
require.Error(t, o.Validate())
|
||||
|
||||
o = &Object{}
|
||||
require.Error(t, o.Validate())
|
||||
|
||||
o.Name = "#invalid"
|
||||
require.Error(t, o.Validate())
|
||||
|
||||
o.Name = "valid"
|
||||
require.NoError(t, o.Validate())
|
||||
|
||||
o.Namespace = util.NewType("")
|
||||
require.Error(t, o.Validate())
|
||||
|
||||
o.Namespace = util.NewType("#invalid")
|
||||
require.Error(t, o.Validate())
|
||||
|
||||
o.Namespace = util.NewType("valid")
|
||||
require.NoError(t, o.Validate())
|
||||
}
|
21
pkg/apis/shared/v1/zz_generated.deepcopy.go
generated
21
pkg/apis/shared/v1/zz_generated.deepcopy.go
generated
|
@ -44,3 +44,24 @@ func (in HashList) DeepCopy() HashList {
|
|||
in.DeepCopyInto(out)
|
||||
return *out
|
||||
}
|
||||
|
||||
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||
func (in *Object) DeepCopyInto(out *Object) {
|
||||
*out = *in
|
||||
if in.Namespace != nil {
|
||||
in, out := &in.Namespace, &out.Namespace
|
||||
*out = new(string)
|
||||
**out = **in
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Object.
|
||||
func (in *Object) DeepCopy() *Object {
|
||||
if in == nil {
|
||||
return nil
|
||||
}
|
||||
out := new(Object)
|
||||
in.DeepCopyInto(out)
|
||||
return out
|
||||
}
|
||||
|
|
|
@ -3,45 +3,75 @@ v1alpha1:
|
|||
properties:
|
||||
spec:
|
||||
properties:
|
||||
listenPort:
|
||||
description: ListenPort defines on which port the sidecar container will be listening for connections
|
||||
format: int32
|
||||
type: integer
|
||||
resources:
|
||||
description: Resources holds resource requests & limits for container running the S3 proxy
|
||||
backend:
|
||||
description: Backend defines how storage is implemented
|
||||
properties:
|
||||
limits:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
requests:
|
||||
additionalProperties:
|
||||
type: string
|
||||
s3:
|
||||
description: S3 backend implements storage as a proxy to the provided S3 API endpoint
|
||||
properties:
|
||||
allowInsecure:
|
||||
description: AllowInsecure if set to true, the Endpoint certificates won't be checked
|
||||
type: boolean
|
||||
bucketName:
|
||||
description: |-
|
||||
BucketName specifies the name of the bucket
|
||||
Required
|
||||
type: string
|
||||
caSecret:
|
||||
description: |-
|
||||
CASecret if not empty, the given Kubernetes Secret will be used to check the authenticity of Endpoint
|
||||
The specified Secret, must contain the following data fields:
|
||||
- `ca.crt` PEM encoded public key of the CA certificate
|
||||
- `ca.key` PEM encoded private key of the CA certificate
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
namespace:
|
||||
type: string
|
||||
type: object
|
||||
credentialsSecret:
|
||||
description: |-
|
||||
CredentialsSecret specifies the Kubernetes Secret containing AccessKey and SecretKey for S3 API authorization
|
||||
Required
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
namespace:
|
||||
type: string
|
||||
type: object
|
||||
endpoint:
|
||||
description: |-
|
||||
Endpoint specifies the S3 API-compatible endpoint which implements storage
|
||||
Required
|
||||
type: string
|
||||
region:
|
||||
description: Region defines the availability zone name.
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
s3:
|
||||
mode:
|
||||
description: Mode defines how storage implementation should be deployed
|
||||
properties:
|
||||
bucketName:
|
||||
description: |-
|
||||
BucketName specifies the name of the bucket
|
||||
Required
|
||||
type: string
|
||||
credentialsSecret:
|
||||
description: |-
|
||||
CredentialsSecretName specifies the name of the secret containing AccessKey and SecretKey for S3 API authorization
|
||||
Required
|
||||
type: string
|
||||
disableSSL:
|
||||
description: DisableSSL if set to true, no certificate checks will be performed for Endpoint
|
||||
type: boolean
|
||||
endpoint:
|
||||
description: |-
|
||||
Endpoint specifies the S3 API-compatible endpoint which implements storage
|
||||
Required
|
||||
type: string
|
||||
region:
|
||||
description: Region defines the availability zone name. If empty, defaults to 'us-east-1'
|
||||
type: string
|
||||
sidecar:
|
||||
description: Sidecar mode runs the storage implementation as a sidecar
|
||||
properties:
|
||||
listenPort:
|
||||
description: ListenPort defines on which port the sidecar container will be listening for connections
|
||||
format: int32
|
||||
type: integer
|
||||
resources:
|
||||
description: Resources holds resource requests & limits for container running the S3 proxy
|
||||
properties:
|
||||
limits:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
requests:
|
||||
additionalProperties:
|
||||
type: string
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
type: object
|
||||
|
|
Loading…
Reference in a new issue