8000 [Feature] [ML] Unify Images, Resources and Lifecycle (#1523) · arangodb/kube-arangodb@2b063dc · GitHub
[go: up one dir, main page]

Skip to content

Commit 2b063dc

Browse files
authored
[Feature] [ML] Unify Images, Resources and Lifecycle (#1523)
1 parent 0c5238b commit 2b063dc

15 files changed

+392
-86
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
- (Refactoring) Extract Resource Helpers
2929
- (Feature) (ML) Extension Storage Condition
3030
- (Improvement) (ML) Switch to fsnotify for file watching for MacOS support
31+
- (Feature) (ML) Unify Images, Resources and Lifecycle
3132

3233
## [1.2.35](https://github.com/arangodb/kube-arangodb/tree/1.2.35) (2023-11-06)
3334
- (Maintenance) Update go-driver to v1.6.0, update IsNotFound() checks

docs/api/ArangoMLStorage.V1Alpha1.md

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,14 @@
44

55
### .spec.backend.s3.allowInsecure
66

7-
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>
7+
Type: `boolean` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec_backend_s3.go#L40)</sup>
88

99
AllowInsecure if set to true, the Endpoint certificates won't be checked
1010

1111
Default Value: `false`
1212

1313
***
1414

15-
### .spec.backend.s3.bucketName
16-
17-
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>
18-
19-
BucketName specifies the name of the bucket
20-
Required
21-
22-
***
23-
2415
### .spec.backend.s3.caSecret.name
2516

2617
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/shared/v1/object.go#L32)</sup>
@@ -80,29 +71,74 @@ Required
8071

A935
8172
### .spec.backend.s3.region
8273

83-
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>
74+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec_backend_s3.go#L49)</sup>
8475

8576
Region defines the availability zone name.
8677

8778
Default Value: `""`
8879

8980
***
9081

82+
### .spec.bucketName
83+
84+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec.go#L30)</sup>
85+
86+
BucketName specifies the name of the bucket
87+
Required
88+
89+
***
90+
91+
### .spec.bucketPath
92+
93+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec.go#L34)</sup>
94+
95+
BucketPath specifies the path within the bucket
96+
97+
Default Value: `/`
98+
99+
***
100+
101+
### .spec.mode.sidecar.image
102+
103+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/shared/v1/image.go#L31)</sup>
104+
105+
Image define image details
106+
107+
***
108+
91109
### .spec.mode.sidecar.listenPort
92110

93-
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>
111+
Type: `integer` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/ml/v1alpha1/storage_spec_mode_sidecar.go#L32)</sup>
94112

95113
ListenPort defines on which port the sidecar container will be listening for connections
96114

97115
Default Value: `9201`
98116

99117
***
100118

119+
### .spec.mode.sidecar.pullPolicy
120+
121+
Type: `string` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/shared/v1/image.go#L35)</sup>
122+
123+
PullPolicy define Image pull policy
124+
125+
Default Value: `IfNotPresent`
126+
127+
***
128+
129+
### .spec.mode.sidecar.pullSecrets
130+
131+
Type: `array` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/shared/v1/image.go#L38)</sup>
132+
133+
PullSecrets define Secrets used to pull Image from registry
134+
135+
***
136+
101137
### .spec.mode.sidecar.resources
102138

103-
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>
139+
Type: `core.ResourceRequirements` <sup>[\[ref\]](https://github.com/arangodb/kube-arangodb/blob/1.2.35/pkg/apis/shared/v1/resources.go#L33)</sup>
104140

105-
Resources holds resource requests & limits for container running the S3 proxy
141+
Resources holds resource requests & limits for container
106142

107143
Links:
108144
* [Documentation of core.ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#resourcerequirements-v1-core)

pkg/apis/ml/v1alpha1/storage_spec.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,34 @@ import (
2525
)
2626

2727
type ArangoMLStorageSpec struct {
28+
// BucketName specifies the name of the bucket
29+
// Required
30+
BucketName *string `json:"bucketName,omitempty"`
31+
32+
// BucketPath specifies the path within the bucket
33+
// +doc/default: /
34+
BucketPath *string `json:"bucketPath,omitempty"`
35+
2836
// Mode defines how storage implementation should be deployed
2937
Mode *ArangoMLStorageSpecMode `json:"mode,omitempty"`
3038
// Backend defines how storage is implemented
3139
Backend *ArangoMLStorageSpecBackend `json:"backend,omitempty"`
3240
}
3341

42+
func (s *ArangoMLStorageSpec) GetBucketName() string {
43+
if s == nil || s.BucketName == nil {
44+
return ""
45+
}
46+
return *s.BucketName
47+
}
48+
49+
func (s *ArangoMLStorageSpec) GetBucketPath() string {
50+
if s == nil || s.BucketPath == nil {
51+
return "/"
52+
}
53+
return *s.BucketPath
54+
}
55+
3456
func (s *ArangoMLStorageSpec) GetMode() *ArangoMLStorageSpecMode {
3557
if s == nil || s.Mode == nil {
3658
return &ArangoMLStorageSpecMode{}
@@ -53,6 +75,7 @@ func (s *ArangoMLStorageSpec) Validate() error {
5375
if err := shared.WithErrors(shared.PrefixResourceErrors("spec",
5476
shared.PrefixResourceError("backend", s.Backend.Validate()),
5577
shared.PrefixResourceError("mode", s.Mode.Validate()),
78+
shared.PrefixResourceError("bucket", shared.ValidateRequired(s.BucketName, shared.ValidateResourceName)),
5679
)); err != nil {
5780
return err
5881
}

pkg/apis/ml/v1alpha1/storage_spec_backend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ type ArangoMLStorageSpecBackend struct {
3232

3333
func (s *ArangoMLStorageSpecBackend) GetS3() *ArangoMLStorageSpecBackendS3 {
3434
if s == nil || s.S3 == nil {
35-
return &ArangoMLStorageSpecBackendS3{}
35+
return nil
3636
}
3737
return s.S3
3838
}

pkg/apis/ml/v1alpha1/storage_spec_backend_s3.go

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@ type ArangoMLStorageSpecBackendS3 struct {
3232
// Endpoint specifies the S3 API-compatible endpoint which implements storage
3333
// Required
3434
Endpoint *string `json:"endpoint"`
35-
// BucketName specifies the name of the bucket
36-
// Required
37-
BucketName *string `json:"bucketName"`
3835
// CredentialsSecret specifies the Kubernetes Secret containing AccessKey and SecretKey for S3 API authorization
3936
// Required
4037
CredentialsSecret *sharedApi.Object `json:"credentialsSecret"`
@@ -59,10 +56,6 @@ func (s *ArangoMLStorageSpecBackendS3) Validate() error {
5956

6057
var errs []error
6158

62-
if s.GetBucketName() == "" {
63-
errs = append(errs, shared.PrefixResourceErrors("bucketName", errors.New("must be not empty")))
64-
}
65< 1CF5 code class="diff-text syntax-highlighted-line deletion">-
6659
if s.GetEndpoint() == "" {
6760
errs = append(errs, shared.PrefixResourceErrors("endpoint", errors.New("must be not empty")))
6861
}
@@ -87,13 +80,6 @@ func (s *ArangoMLStorageSpecBackendS3) GetEndpoint() string {
8780
return *s.Endpoint
8881
}
8982

90-
func (s *ArangoMLStorageSpecBackendS3) GetBucketName() string {
91-
if s == nil || s.BucketName == nil {
92-
return ""
93-
}
94-
return *s.BucketName
95-
}
96-
9783
func (s *ArangoMLStorageSpecBackendS3) GetCredentialsSecret() *sharedApi.Object {
9884
if s == nil || s.CredentialsSecret == nil {
9985
return &sharedApi.Object{}

pkg/apis/ml/v1alpha1/storage_spec_mode_sidecar.go

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,53 @@
2121
package v1alpha1
2222

2323
import (
24-
core "k8s.io/api/core/v1"
25-
"k8s.io/apimachinery/pkg/api/resource"
26-
2724
"github.com/arangodb/kube-arangodb/pkg/apis/shared"
25+
sharedApi "github.com/arangodb/kube-arangodb/pkg/apis/shared/v1"
2826
"github.com/arangodb/kube-arangodb/pkg/util/errors"
2927
)
3028

31-
var (
32-
defaultRequestsCPU = resource.MustParse("100m")
33-
defaultRequestsMemory = resource.MustParse("100Mi")
34-
defaultLimitsCPU = resource.MustParse("200m")
35-
defaultLimitsMemory = resource.MustParse("200Mi")
36-
)
37-
3829
type ArangoMLStorageSpecModeSidecar struct {
3930
// ListenPort defines on which port the sidecar container will be listening for connections
4031
// +doc/default: 9201
4132
ListenPort *uint16 `json:"listenPort,omitempty"`
4233

34+
// Image define default image used for the extension
35+
*sharedApi.Image `json:",inline"`
36+
4337
// Resources holds resource requests & limits for container running the S3 proxy
44-
// +doc/type: core.ResourceRequirements
45-
// +doc/link: Documentation of core.ResourceRequirements|https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.26/#resourcerequirements-v1-core
46-
Resources *core.ResourceRequirements `json:"resources,omitempty"`
38+
*sharedApi.Resources `json:",inline"`
39+
}
40+
41+
func (s *ArangoMLStorageSpecModeSidecar) GetImage() *sharedApi.Image {
42+
if s == nil || s.Image == nil {
43+
return nil
44+
}
45+
46+
return s.Image
47+
}
48+
49+
func (s *ArangoMLStorageSpecModeSidecar) GetResources() *sharedApi.Resources {
50+
if s == nil || s.Resources == nil {
51+
return nil
52+
}
53+
54+
return s.Resources
4755
}
4856

4957
func (s *ArangoMLStorageSpecModeSidecar) Validate() error {
5058
if s == nil {
5159
s = &ArangoMLStorageSpecModeSidecar{}
5260
}
61+
62+
var err []error
63+
5364
if s.GetListenPort() < 1 {
54-
return shared.PrefixResourceErrors("database", errors.Newf("must be positive"))
65+
err = append(err, shared.PrefixResourceErrors("database", errors.Newf("must be positive")))
5566
}
56-
return nil
67+
68+
err = append(err, s.GetResources().Validate())
69+
70+
return shared.WithErrors(err...)
5771
}
5872

5973
func (s *ArangoMLStorageSpecModeSidecar) GetListenPort() uint16 {
@@ -62,22 +76,3 @@ func (s *ArangoMLStorageSpecModeSidecar) GetListenPort() uint16 {
6276
}
6377
return *s.ListenPort
6478
}
65-
66-
func (s *ArangoMLStorageSpecModeSidecar) GetResources() core.ResourceRequirements {
67-
var resources core.ResourceRequirements
68-
if s != nil && s.Resources != nil {
69-
resources = *s.Resources
70-
}
71-
72-
if len(resources.Requests) == 0 {
73-
resources.Requests = make(core.ResourceList)
74-
resources.Requests[core.ResourceCPU] = defaultRequestsCPU
75-
resources.Requests[core.ResourceMemory] = defaultRequestsMemory
76-
}
77-
if len(resources.Limits) == 0 {
78-
resources.Limits = make(core.ResourceList)
79-
resources.Limits[core.ResourceCPU] = defaultLimitsCPU
80-
resources.Limits[core.ResourceMemory] = defaultLimitsMemory
81-
}
82-
return resources
83-
}

pkg/apis/ml/v1alpha1/storage_spec_test.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ func Test_ArangoMLStorageSpec(t *testing.T) {
5050

5151
require.Error(t, s.Backend.S3.Validate())
5252
s.Backend.S3 = &ArangoMLStorageSpecBackendS3{
53-
Endpoint: util.NewType("http://test.s3.example.com"),
54-
BucketName: util.NewType("bucket"),
53+
Endpoint: util.NewType("http://test.s3.example.com"),
5554
CredentialsSecret: &sharedApi.Object{
5655
Name: "a-secret",
5756
Namespace: nil,
5857
},
5958
}
59+
s.BucketName = util.NewType("bucket")
6060
require.NoError(t, s.Validate())
6161

6262
t.Run("default requests and limits assigned", func(t *testing.T) {
@@ -66,7 +66,7 @@ func Test_ArangoMLStorageSpec(t *testing.T) {
6666
core.ResourceMemory: resource.MustParse("200Mi"),
6767
},
6868
}
69-
s.Mode.Sidecar.Resources = &assignedRequirements
69+
s.Mode.Sidecar.Resources = &sharedApi.Resources{Resources: &assignedRequirements}
7070

7171
expectedRequirements := core.ResourceRequirements{
7272
Requests: assignedRequirements.Requests,
@@ -76,7 +76,16 @@ func Test_ArangoMLStorageSpec(t *testing.T) {
7676
},
7777
}
7878

79-
actualRequirements := s.Mode.Sidecar.GetResources()
79+
actualRequirements := s.Mode.Sidecar.GetResources().With(core.ResourceRequirements{
80+
Limits: core.ResourceList{
81+
core.ResourceCPU: resource.MustParse("100m"),
82+
core.ResourceMemory: resource.MustParse("128Mi"),
83+
},
84+
Requests: core.ResourceList{
85+
core.ResourceCPU: resource.MustParse("200m"),
86+
core.ResourceMemory: resource.MustParse("256Mi"),
87+
},
88+
})
8089
require.Equal(t, expectedRequirements, actualRequirements)
8190
})
8291
}

pkg/apis/ml/v1alpha1/zz_generated.deepcopy.go

Lines changed: 16 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
0