From 7a806359afc110aa6b423d3c10479c1562f31036 Mon Sep 17 00:00:00 2001 From: Adam Janikowski <12255597+ajanikow@users.noreply.github.com> Date: Fri, 19 May 2023 09:18:25 +0200 Subject: [PATCH] [Feature] PersistentVolume Inspector (#1309) --- CHANGELOG.md | 1 + .../resources/inspector/inspector.go | 12 ++ .../resources/inspector/inspector_test.go | 14 +- .../resources/inspector/pdbs_version_test.go | 2 +- pkg/deployment/resources/inspector/pvs.go | 192 ++++++++++++++++++ .../resources/inspector/pvs_anonymous.go | 46 +++++ pkg/deployment/resources/inspector/pvs_gvk.go | 43 ++++ pkg/deployment/resources/inspector/pvs_v1.go | 122 +++++++++++ .../resources/inspector/throttles.go | 3 +- .../inspector/constants/pvs_constants.go | 64 ++++++ .../inspector/definitions/components.go | 4 +- pkg/util/k8sutil/inspector/inspector.go | 4 +- .../inspector/persistentvolume/definition.go | 44 ++++ .../inspector/persistentvolume/v1/loader.go | 39 ++++ .../inspector/persistentvolume/v1/reader.go | 38 ++++ .../k8sutil/inspector/throttle/throttle.go | 16 +- 16 files changed, 634 insertions(+), 10 deletions(-) create mode 100644 pkg/deployment/resources/inspector/pvs.go create mode 100644 pkg/deployment/resources/inspector/pvs_anonymous.go create mode 100644 pkg/deployment/resources/inspector/pvs_gvk.go create mode 100644 pkg/deployment/resources/inspector/pvs_v1.go create mode 100644 pkg/util/k8sutil/inspector/constants/pvs_constants.go create mode 100644 pkg/util/k8sutil/inspector/persistentvolume/definition.go create mode 100644 pkg/util/k8sutil/inspector/persistentvolume/v1/loader.go create mode 100644 pkg/util/k8sutil/inspector/persistentvolume/v1/reader.go diff --git a/CHANGELOG.md b/CHANGELOG.md index fdbf5276c..94943db4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A) - (Feature) ArangoBackup create retries and MaxIterations limit - (Feature) Add Reason in OOM Metric +- (Feature) PersistentVolume Inspector ## [1.2.27](https://github.com/arangodb/kube-arangodb/tree/1.2.27) (2023-04-27) - (Feature) Add InSync Cache diff --git a/pkg/deployment/resources/inspector/inspector.go b/pkg/deployment/resources/inspector/inspector.go index bdb5f9bc2..e64b8e3fb 100644 --- a/pkg/deployment/resources/inspector/inspector.go +++ b/pkg/deployment/resources/inspector/inspector.go @@ -46,6 +46,7 @@ import ( "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/definitions" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/endpoints" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/node" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/persistentvolume" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/persistentvolumeclaim" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/pod" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/poddisruptionbudget" @@ -128,6 +129,7 @@ type inspectorState struct { services *servicesInspector serviceAccounts *serviceAccountsInspector nodes *nodesInspector + persistentVolumes *persistentVolumesInspector podDisruptionBudgets *podDisruptionBudgetsInspector serviceMonitors *serviceMonitorsInspector arangoMembers *arangoMembersInspector @@ -218,6 +220,7 @@ func (i *inspectorState) AnonymousObjects() []anonymous.Impl { i.services, i.serviceAccounts, i.nodes, + i.persistentVolumes, i.podDisruptionBudgets, i.serviceMonitors, i.arangoMembers, @@ -302,6 +305,10 @@ func (i *inspectorState) Node() node.Definition { return i.nodes } +func (i *inspectorState) PersistentVolume() persistentvolume.Definition { + return i.persistentVolumes +} + func (i *inspectorState) ArangoClusterSynchronization() arangoclustersynchronization.Definition { return i.arangoClusterSynchronizations } @@ -441,6 +448,10 @@ func (i *inspectorState) validate() error { return err } + if err := i.persistentVolumes.validate(); err != nil { + return err + } + if err := i.podDisruptionBudgets.validate(); err != nil { return err } @@ -479,6 +490,7 @@ func (i *inspectorState) copyCore() *inspectorState { services: i.services, serviceAccounts: i.serviceAccounts, nodes: i.nodes, + persistentVolumes: i.persistentVolumes, podDisruptionBudgets: i.podDisruptionBudgets, serviceMonitors: i.serviceMonitors, arangoMembers: i.arangoMembers, diff --git a/pkg/deployment/resources/inspector/inspector_test.go b/pkg/deployment/resources/inspector/inspector_test.go index 3cc898ef7..c856fcd0c 100644 --- a/pkg/deployment/resources/inspector/inspector_test.go +++ b/pkg/deployment/resources/inspector/inspector_test.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-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. @@ -71,6 +71,14 @@ var loaderTestDefinitions = map[string]loaderTestDefinition{ return i.Node() }, }, + "PersistentVolume": { + tg: func(t throttle.Components) throttle.Throttle { + return t.PersistentVolume() + }, + get: func(i inspector.Inspector) refresh.Inspector { + return i.PersistentVolume() + }, + }, "Pod": { tg: func(t throttle.Components) throttle.Throttle { return t.Pod() @@ -134,7 +142,7 @@ func getAllTypes() []string { func Test_Inspector_RefreshMatrix(t *testing.T) { c := kclient.NewFakeClient() - tc := throttle.NewThrottleComponents(time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour) + tc := throttle.NewThrottleComponents(time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour) i := NewInspector(tc, c, "test", "test") @@ -294,7 +302,7 @@ func Test_Inspector_Load(t *testing.T) { func Test_Inspector_Invalidate(t *testing.T) { c := kclient.NewFakeClient() - tc := throttle.NewThrottleComponents(time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour) + tc := throttle.NewThrottleComponents(time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour) i := NewInspector(tc, c, "test", "test") diff --git a/pkg/deployment/resources/inspector/pdbs_version_test.go b/pkg/deployment/resources/inspector/pdbs_version_test.go index 4366b25f1..1ab15bbb3 100644 --- a/pkg/deployment/resources/inspector/pdbs_version_test.go +++ b/pkg/deployment/resources/inspector/pdbs_version_test.go @@ -52,7 +52,7 @@ func Test_PDB_Versions(t *testing.T) { GitVersion: v, }) - tc := throttle.NewThrottleComponents(time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour) + tc := throttle.NewThrottleComponents(time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour, time.Hour) i := NewInspector(tc, c, "test", "test") require.NoError(t, i.Refresh(context.Background())) diff --git a/pkg/deployment/resources/inspector/pvs.go b/pkg/deployment/resources/inspector/pvs.go new file mode 100644 index 000000000..7965e962b --- /dev/null +++ b/pkg/deployment/resources/inspector/pvs.go @@ -0,0 +1,192 @@ +// +// 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 inspector + +import ( + "context" + "time" + + core "k8s.io/api/core/v1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/globals" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/definitions" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/throttle" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/version" +) + +func init() { + requireRegisterInspectorLoader(persistentVolumesInspectorLoaderObj) +} + +var persistentVolumesInspectorLoaderObj = persistentVolumesInspectorLoader{} + +type persistentVolumesInspectorLoader struct { +} + +func (p persistentVolumesInspectorLoader) Component() definitions.Component { + return definitions.PersistentVolume +} + +func (p persistentVolumesInspectorLoader) Load(ctx context.Context, i *inspectorState) { + var q persistentVolumesInspector + p.loadV1(ctx, i, &q) + i.persistentVolumes = &q + q.state = i + q.last = time.Now() +} + +func (p persistentVolumesInspectorLoader) loadV1(ctx context.Context, i *inspectorState, q *persistentVolumesInspector) { + var z persistentVolumesInspectorV1 + + z.persistentVolumeInspector = q + + z.persistentVolumes, z.err = p.getV1PersistentVolumes(ctx, i) + + q.v1 = &z +} + +func (p persistentVolumesInspectorLoader) getV1PersistentVolumes(ctx context.Context, i *inspectorState) (map[string]*core.PersistentVolume, error) { + objs, err := p.getV1PersistentVolumesList(ctx, i) + if err != nil { + return nil, err + } + + r := make(map[string]*core.PersistentVolume, len(objs)) + + for id := range objs { + r[objs[id].GetName()] = objs[id] + } + + return r, nil +} + +func (p persistentVolumesInspectorLoader) getV1PersistentVolumesList(ctx context.Context, i *inspectorState) ([]*core.PersistentVolume, error) { + ctxChild, cancel := globals.GetGlobalTimeouts().Kubernetes().WithTimeout(ctx) + defer cancel() + obj, err := i.client.Kubernetes().CoreV1().PersistentVolumes().List(ctxChild, meta.ListOptions{ + Limit: globals.GetGlobals().Kubernetes().RequestBatchSize().Get(), + }) + + if err != nil { + return nil, err + } + + items := obj.Items + cont := obj.Continue + var s = int64(len(items)) + + if z := obj.RemainingItemCount; z != nil { + s += *z + } + + ptrs := make([]*core.PersistentVolume, 0, s) + + for { + for id := range items { + ptrs = append(ptrs, &items[id]) + } + + if cont == "" { + break + } + + items, cont, err = p.getV1PersistentVolumesListRequest(ctx, i, cont) + + if err != nil { + return nil, err + } + } + + return ptrs, nil +} + +func (p persistentVolumesInspectorLoader) getV1PersistentVolumesListRequest(ctx context.Context, i *inspectorState, cont string) ([]core.PersistentVolume, string, error) { + ctxChild, cancel := globals.GetGlobalTimeouts().Kubernetes().WithTimeout(ctx) + defer cancel() + obj, err := i.client.Kubernetes().CoreV1().PersistentVolumes().List(ctxChild, meta.ListOptions{ + Limit: globals.GetGlobals().Kubernetes().RequestBatchSize().Get(), + Continue: cont, + }) + + if err != nil { + return nil, "", err + } + + return obj.Items, obj.Continue, err +} + +func (p persistentVolumesInspectorLoader) Verify(i *inspectorState) error { + return nil +} + +func (p persistentVolumesInspectorLoader) Copy(from, to *inspectorState, override bool) { + if to.persistentVolumes != nil { + if !override { + return + } + } + + to.persistentVolumes = from.persistentVolumes + to.persistentVolumes.state = to +} + +func (p persistentVolumesInspectorLoader) Name() string { + return "persistentVolumes" +} + +type persistentVolumesInspector struct { + state *inspectorState + + last time.Time + + v1 *persistentVolumesInspectorV1 +} + +func (p *persistentVolumesInspector) LastRefresh() time.Time { + return p.last +} + +func (p *persistentVolumesInspector) Refresh(ctx context.Context) error { + p.Throttle(p.state.throttles).Invalidate() + return p.state.refresh(ctx, persistentVolumesInspectorLoaderObj) +} + +func (p *persistentVolumesInspector) Version() version.Version { + return version.V1 +} + +func (p *persistentVolumesInspector) Throttle(c throttle.Components) throttle.Throttle { + return c.PersistentVolume() +} + +func (p *persistentVolumesInspector) validate() error { + if p == nil { + return errors.Newf("PersistentVolumeInspector is nil") + } + + if p.state == nil { + return errors.Newf("Parent is nil") + } + + return p.v1.validate() +} diff --git a/pkg/deployment/resources/inspector/pvs_anonymous.go b/pkg/deployment/resources/inspector/pvs_anonymous.go new file mode 100644 index 000000000..a12d29cac --- /dev/null +++ b/pkg/deployment/resources/inspector/pvs_anonymous.go @@ -0,0 +1,46 @@ +// +// 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 inspector + +import ( + core "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/anonymous" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/constants" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/generic" +) + +func (p *persistentVolumesInspector) Anonymous(gvk schema.GroupVersionKind) (anonymous.Interface, bool) { + g := constants.PersistentVolumeGKv1() + + if g.Kind == gvk.Kind && g.Group == gvk.Group { + switch gvk.Version { + case constants.PersistentVolumeVersionV1, DefaultVersion: + if p.v1 == nil || p.v1.err != nil { + return nil, false + } + return anonymous.NewAnonymous[*core.PersistentVolume](g, p.state.persistentVolumes.v1, generic.WithModStatus[*core.PersistentVolume](g, generic.WithEmptyMod[*core.PersistentVolume](g))), true + } + } + + return nil, false +} diff --git a/pkg/deployment/resources/inspector/pvs_gvk.go b/pkg/deployment/resources/inspector/pvs_gvk.go new file mode 100644 index 000000000..055c622fa --- /dev/null +++ b/pkg/deployment/resources/inspector/pvs_gvk.go @@ -0,0 +1,43 @@ +// +// 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 inspector + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/constants" +) + +func (p *persistentVolumesInspectorV1) GroupVersionKind() schema.GroupVersionKind { + return constants.PersistentVolumeGKv1() +} + +func (p *persistentVolumesInspectorV1) GroupVersionResource() schema.GroupVersionResource { + return constants.PersistentVolumeGRv1() +} + +func (p *persistentVolumesInspector) GroupKind() schema.GroupKind { + return constants.PersistentVolumeGK() +} + +func (p *persistentVolumesInspector) GroupResource() schema.GroupResource { + return constants.PersistentVolumeGR() +} diff --git a/pkg/deployment/resources/inspector/pvs_v1.go b/pkg/deployment/resources/inspector/pvs_v1.go new file mode 100644 index 000000000..3b775afe6 --- /dev/null +++ b/pkg/deployment/resources/inspector/pvs_v1.go @@ -0,0 +1,122 @@ +// +// 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 inspector + +import ( + "context" + + core "k8s.io/api/core/v1" + apiErrors "k8s.io/apimachinery/pkg/api/errors" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" + + "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/constants" + ins "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/persistentvolume/v1" +) + +func (p *persistentVolumesInspector) V1() (ins.Inspector, error) { + if p.v1.err != nil { + return nil, p.v1.err + } + + return p.v1, nil +} + +type persistentVolumesInspectorV1 struct { + persistentVolumeInspector *persistentVolumesInspector + + persistentVolumes map[string]*core.PersistentVolume + err error +} + +func (p *persistentVolumesInspectorV1) validate() error { + if p == nil { + return errors.Newf("PersistentVolumesV1Inspector is nil") + } + + if p.persistentVolumeInspector == nil { + return errors.Newf("Parent is nil") + } + + if p.persistentVolumes == nil && p.err == nil { + return errors.Newf("PersistentVolumes or err should be not nil") + } + + if p.persistentVolumes != nil && p.err != nil { + return errors.Newf("PersistentVolumes or err cannot be not nil together") + } + + return nil +} + +func (p *persistentVolumesInspectorV1) ListSimple() []*core.PersistentVolume { + var r []*core.PersistentVolume + for _, persistentVolume := range p.persistentVolumes { + r = append(r, persistentVolume) + } + + return r +} + +func (p *persistentVolumesInspectorV1) GetSimple(name string) (*core.PersistentVolume, bool) { + persistentVolume, ok := p.persistentVolumes[name] + if !ok { + return nil, false + } + + return persistentVolume, true +} + +func (p *persistentVolumesInspectorV1) Iterate(action ins.Action, filters ...ins.Filter) error { + for _, persistentVolume := range p.persistentVolumes { + if err := p.iteratePersistentVolume(persistentVolume, action, filters...); err != nil { + return err + } + } + + return nil +} + +func (p *persistentVolumesInspectorV1) iteratePersistentVolume(persistentVolume *core.PersistentVolume, action ins.Action, filters ...ins.Filter) error { + for _, f := range filters { + if f == nil { + continue + } + + if !f(persistentVolume) { + return nil + } + } + + return action(persistentVolume) +} + +func (p *persistentVolumesInspectorV1) Read() ins.ReadInterface { + return p +} + +func (p *persistentVolumesInspectorV1) Get(ctx context.Context, name string, opts meta.GetOptions) (*core.PersistentVolume, error) { + if s, ok := p.GetSimple(name); !ok { + return nil, apiErrors.NewNotFound(constants.PersistentVolumeGR(), name) + } else { + return s, nil + } +} diff --git a/pkg/deployment/resources/inspector/throttles.go b/pkg/deployment/resources/inspector/throttles.go index ada9300d5..15345ca03 100644 --- a/pkg/deployment/resources/inspector/throttles.go +++ b/pkg/deployment/resources/inspector/throttles.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-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. @@ -32,6 +32,7 @@ func NewDefaultThrottle() throttle.Components { 30*time.Second, // ArangoMember 30*time.Second, // ArangoTask 30*time.Second, // Node + 30*time.Second, // PV 15*time.Second, // PVC time.Second, // Pod 30*time.Second, // PDB diff --git a/pkg/util/k8sutil/inspector/constants/pvs_constants.go b/pkg/util/k8sutil/inspector/constants/pvs_constants.go new file mode 100644 index 000000000..ffde3f3a7 --- /dev/null +++ b/pkg/util/k8sutil/inspector/constants/pvs_constants.go @@ -0,0 +1,64 @@ +// +// DISCLAIMER +// +// Copyright 2016-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 constants + +import ( + core "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// PersistentVolume +const ( + PersistentVolumeGroup = core.GroupName + PersistentVolumeResource = "persistentvolumes" + PersistentVolumeKind = "PersistentVolume" + PersistentVolumeVersionV1 = "v1" +) + +func PersistentVolumeGK() schema.GroupKind { + return schema.GroupKind{ + Group: PersistentVolumeGroup, + Kind: PersistentVolumeKind, + } +} + +func PersistentVolumeGKv1() schema.GroupVersionKind { + return schema.GroupVersionKind{ + Group: PersistentVolumeGroup, + Kind: PersistentVolumeKind, + Version: PersistentVolumeVersionV1, + } +} + +func PersistentVolumeGR() schema.GroupResource { + return schema.GroupResource{ + Group: PersistentVolumeGroup, + Resource: PersistentVolumeResource, + } +} + +func PersistentVolumeGRv1() schema.GroupVersionResource { + return schema.GroupVersionResource{ + Group: PersistentVolumeGroup, + Resource: PersistentVolumeResource, + Version: PersistentVolumeVersionV1, + } +} diff --git a/pkg/util/k8sutil/inspector/definitions/components.go b/pkg/util/k8sutil/inspector/definitions/components.go index e68d483c2..14974cc8f 100644 --- a/pkg/util/k8sutil/inspector/definitions/components.go +++ b/pkg/util/k8sutil/inspector/definitions/components.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-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. @@ -29,6 +29,7 @@ const ( ArangoMember Component = "ArangoMember" ArangoTask Component = "ArangoTask" Node Component = "Node" + PersistentVolume Component = "PersistentVolume" PersistentVolumeClaim Component = "PersistentVolumeClaim" Pod Component = "Pod" PodDisruptionBudget Component = "PodDisruptionBudget" @@ -45,6 +46,7 @@ func AllComponents() []Component { ArangoMember, ArangoTask, Node, + PersistentVolume, PersistentVolumeClaim, Pod, PodDisruptionBudget, diff --git a/pkg/util/k8sutil/inspector/inspector.go b/pkg/util/k8sutil/inspector/inspector.go index b85a60de3..d799af6c1 100644 --- a/pkg/util/k8sutil/inspector/inspector.go +++ b/pkg/util/k8sutil/inspector/inspector.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-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. @@ -36,6 +36,7 @@ import ( "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/endpoints" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/mods" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/node" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/persistentvolume" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/persistentvolumeclaim" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/pod" "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/poddisruptionbudget" @@ -86,6 +87,7 @@ type Inspector interface { arangodeployment.Inspector node.Inspector + persistentvolume.Inspector arangoclustersynchronization.Inspector arangotask.Inspector diff --git a/pkg/util/k8sutil/inspector/persistentvolume/definition.go b/pkg/util/k8sutil/inspector/persistentvolume/definition.go new file mode 100644 index 000000000..3b7e5c595 --- /dev/null +++ b/pkg/util/k8sutil/inspector/persistentvolume/definition.go @@ -0,0 +1,44 @@ +// +// 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 persistentvolume + +import ( + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/anonymous" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/gvk" + v1 "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/persistentvolume/v1" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/refresh" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/version" +) + +type Inspector interface { + PersistentVolume() Definition +} + +type Definition interface { + refresh.Inspector + + gvk.GK + anonymous.Impl + + Version() version.Version + + V1() (v1.Inspector, error) +} diff --git a/pkg/util/k8sutil/inspector/persistentvolume/v1/loader.go b/pkg/util/k8sutil/inspector/persistentvolume/v1/loader.go new file mode 100644 index 000000000..2a52f8d86 --- /dev/null +++ b/pkg/util/k8sutil/inspector/persistentvolume/v1/loader.go @@ -0,0 +1,39 @@ +// +// 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 ( + core "k8s.io/api/core/v1" + + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/inspector/gvk" +) + +type Inspector interface { + gvk.GVK + + ListSimple() []*core.PersistentVolume + GetSimple(name string) (*core.PersistentVolume, bool) + Iterate(action Action, filters ...Filter) error + Read() ReadInterface +} + +type Filter func(pv *core.PersistentVolume) bool +type Action func(pv *core.PersistentVolume) error diff --git a/pkg/util/k8sutil/inspector/persistentvolume/v1/reader.go b/pkg/util/k8sutil/inspector/persistentvolume/v1/reader.go new file mode 100644 index 000000000..fa8348d90 --- /dev/null +++ b/pkg/util/k8sutil/inspector/persistentvolume/v1/reader.go @@ -0,0 +1,38 @@ +// +// 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 ( + "context" + + core "k8s.io/api/core/v1" + meta "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// Interface has methods to work with PersistentVolume resources. +type Interface interface { + ReadInterface +} + +// ReadInterface has methods to work with PersistentVolume resources with ReadOnly mode. +type ReadInterface interface { + Get(ctx context.Context, name string, opts meta.GetOptions) (*core.PersistentVolume, error) +} diff --git a/pkg/util/k8sutil/inspector/throttle/throttle.go b/pkg/util/k8sutil/inspector/throttle/throttle.go index 96ae590df..0095355fa 100644 --- a/pkg/util/k8sutil/inspector/throttle/throttle.go +++ b/pkg/util/k8sutil/inspector/throttle/throttle.go @@ -1,7 +1,7 @@ // // DISCLAIMER // -// Copyright 2016-2022 ArangoDB GmbH, Cologne, Germany +// Copyright 2016-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. @@ -32,15 +32,16 @@ type Inspector interface { } func NewAlwaysThrottleComponents() Components { - return NewThrottleComponents(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + return NewThrottleComponents(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) } -func NewThrottleComponents(acs, am, at, node, pvc, pod, pdb, secret, service, serviceAccount, sm, endpoints time.Duration) Components { +func NewThrottleComponents(acs, am, at, node, pvc, pod, pv, pdb, secret, service, serviceAccount, sm, endpoints time.Duration) Components { return &throttleComponents{ arangoClusterSynchronization: NewThrottle(acs), arangoMember: NewThrottle(am), arangoTask: NewThrottle(at), node: NewThrottle(node), + persistentVolume: NewThrottle(pv), persistentVolumeClaim: NewThrottle(pvc), pod: NewThrottle(pod), podDisruptionBudget: NewThrottle(pdb), @@ -57,6 +58,7 @@ type Components interface { ArangoMember() Throttle ArangoTask() Throttle Node() Throttle + PersistentVolume() Throttle PersistentVolumeClaim() Throttle Pod() Throttle PodDisruptionBudget() Throttle @@ -78,6 +80,7 @@ type throttleComponents struct { arangoMember Throttle arangoTask Throttle node Throttle + persistentVolume Throttle persistentVolumeClaim Throttle pod Throttle podDisruptionBudget Throttle @@ -88,6 +91,10 @@ type throttleComponents struct { endpoints Throttle } +func (t *throttleComponents) PersistentVolume() Throttle { + return t.persistentVolume +} + func (t *throttleComponents) Endpoints() Throttle { return t.endpoints } @@ -121,6 +128,8 @@ func (t *throttleComponents) Get(c definitions.Component) Throttle { return t.arangoTask case definitions.Node: return t.node + case definitions.PersistentVolume: + return t.persistentVolume case definitions.PersistentVolumeClaim: return t.persistentVolumeClaim case definitions.Pod: @@ -148,6 +157,7 @@ func (t *throttleComponents) Copy() Components { arangoMember: t.arangoMember.Copy(), arangoTask: t.arangoTask.Copy(), node: t.node.Copy(), + persistentVolume: t.persistentVolume.Copy(), persistentVolumeClaim: t.persistentVolumeClaim.Copy(), pod: t.pod.Copy(), podDisruptionBudget: t.podDisruptionBudget.Copy(),