From 2eb83f3cbb5a7318f9cffb6c30e844865b4988df Mon Sep 17 00:00:00 2001 From: Adam Janikowski <12255597+ajanikow@users.noreply.github.com> Date: Thu, 14 Mar 2024 08:47:13 +0100 Subject: [PATCH] [Feature] Extend Backup Details (#1619) --- CHANGELOG.md | 1 + pkg/debug_package/generator.go | 1 + .../generators/kubernetes/arango_backup.go | 52 +++++++++++++ .../kubernetes/arango_backup_backup.go | 73 +++++++++++++++++++ .../kubernetes/arango_backup_policy.go | 73 +++++++++++++++++++ 5 files changed, 200 insertions(+) create mode 100644 pkg/debug_package/generators/kubernetes/arango_backup.go create mode 100644 pkg/debug_package/generators/kubernetes/arango_backup_backup.go create mode 100644 pkg/debug_package/generators/kubernetes/arango_backup_policy.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 79de9162f..2f286142f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [master](https://github.com/arangodb/kube-arangodb/tree/master) (N/A) - (Feature) Add Core fields to the Scheduler Container Spec - (Feature) Add Metadata fields to the Scheduler Pod Spec +- (Feature) Extend Backup Details in DebugPackage ## [1.2.39](https://github.com/arangodb/kube-arangodb/tree/1.2.39) (2024-03-11) - (Feature) Extract Scheduler API diff --git a/pkg/debug_package/generator.go b/pkg/debug_package/generator.go index 5ddee7610..4cc8810b6 100644 --- a/pkg/debug_package/generator.go +++ b/pkg/debug_package/generator.go @@ -43,6 +43,7 @@ var rootFactories = []shared.Factory{ kubernetes.Deployments(), kubernetes.AgencyDump(), kubernetes.ML(), + kubernetes.Backup(), } func InitCommand(cmd *cobra.Command) { diff --git a/pkg/debug_package/generators/kubernetes/arango_backup.go b/pkg/debug_package/generators/kubernetes/arango_backup.go new file mode 100644 index 000000000..fa2b52a4d --- /dev/null +++ b/pkg/debug_package/generators/kubernetes/arango_backup.go @@ -0,0 +1,52 @@ +// +// DISCLAIMER +// +// Copyright 2024 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 kubernetes + +import ( + "github.com/rs/zerolog" + + "github.com/arangodb/kube-arangodb/pkg/debug_package/shared" + "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/kclient" +) + +func Backup() shared.Factory { + return shared.NewFactory("backupBackup", true, backup) +} + +func backup(logger zerolog.Logger, files chan<- shared.File) error { + k, ok := kclient.GetDefaultFactory().Client() + if !ok { + return errors.Errorf("Client is not initialised") + } + + if err := backupBackups(logger, files, k); err != nil { + logger.Err(err).Msgf("Error while collecting arango backup") + return err + } + + if err := backupPolicies(logger, files, k); err != nil { + logger.Err(err).Msgf("Error while collecting arango backup policye") + return err + } + + return nil +} diff --git a/pkg/debug_package/generators/kubernetes/arango_backup_backup.go b/pkg/debug_package/generators/kubernetes/arango_backup_backup.go new file mode 100644 index 000000000..9a8b9135f --- /dev/null +++ b/pkg/debug_package/generators/kubernetes/arango_backup_backup.go @@ -0,0 +1,73 @@ +// +// DISCLAIMER +// +// Copyright 2024 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 kubernetes + +import ( + "context" + "fmt" + + "github.com/rs/zerolog" + + backupApi "github.com/arangodb/kube-arangodb/pkg/apis/backup/v1" + "github.com/arangodb/kube-arangodb/pkg/debug_package/cli" + "github.com/arangodb/kube-arangodb/pkg/debug_package/shared" + "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/kerrors" + "github.com/arangodb/kube-arangodb/pkg/util/kclient" +) + +func backupBackups(logger zerolog.Logger, files chan<- shared.File, client kclient.Client) error { + backups, err := listBackupBackups(client) + if err != nil { + if kerrors.IsForbiddenOrNotFound(err) { + return nil + } + + return err + } + + if err := errors.ExecuteWithErrorArrayP2(backupBackup, client, files, backups...); err != nil { + logger.Err(err).Msgf("Error while collecting arango ml batchjobs") + return err + } + + return nil +} + +func backupBackup(client kclient.Client, files chan<- shared.File, ext *backupApi.ArangoBackup) error { + files <- shared.NewYAMLFile(fmt.Sprintf("kubernetes/arango/backupBackup/backups/%s.yaml", ext.GetName()), func() ([]interface{}, error) { + return []interface{}{ext}, nil + }) + + return nil +} + +func listBackupBackups(client kclient.Client) ([]*backupApi.ArangoBackup, error) { + return ListObjects[*backupApi.ArangoBackupList, *backupApi.ArangoBackup](context.Background(), client.Arango().BackupV1().ArangoBackups(cli.GetInput().Namespace), func(result *backupApi.ArangoBackupList) []*backupApi.ArangoBackup { + q := make([]*backupApi.ArangoBackup, len(result.Items)) + + for id, e := range result.Items { + q[id] = e.DeepCopy() + } + + return q + }) +} diff --git a/pkg/debug_package/generators/kubernetes/arango_backup_policy.go b/pkg/debug_package/generators/kubernetes/arango_backup_policy.go new file mode 100644 index 000000000..8a2fc390a --- /dev/null +++ b/pkg/debug_package/generators/kubernetes/arango_backup_policy.go @@ -0,0 +1,73 @@ +// +// DISCLAIMER +// +// Copyright 2024 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 kubernetes + +import ( + "context" + "fmt" + + "github.com/rs/zerolog" + + backupApi "github.com/arangodb/kube-arangodb/pkg/apis/backup/v1" + "github.com/arangodb/kube-arangodb/pkg/debug_package/cli" + "github.com/arangodb/kube-arangodb/pkg/debug_package/shared" + "github.com/arangodb/kube-arangodb/pkg/util/errors" + "github.com/arangodb/kube-arangodb/pkg/util/k8sutil/kerrors" + "github.com/arangodb/kube-arangodb/pkg/util/kclient" +) + +func backupPolicies(logger zerolog.Logger, files chan<- shared.File, client kclient.Client) error { + backups, err := listBackupPolicies(client) + if err != nil { + if kerrors.IsForbiddenOrNotFound(err) { + return nil + } + + return err + } + + if err := errors.ExecuteWithErrorArrayP2(backupPolicy, client, files, backups...); err != nil { + logger.Err(err).Msgf("Error while collecting arango ml batchjobs") + return err + } + + return nil +} + +func backupPolicy(client kclient.Client, files chan<- shared.File, ext *backupApi.ArangoBackupPolicy) error { + files <- shared.NewYAMLFile(fmt.Sprintf("kubernetes/arango/backup/policies/%s.yaml", ext.GetName()), func() ([]interface{}, error) { + return []interface{}{ext}, nil + }) + + return nil +} + +func listBackupPolicies(client kclient.Client) ([]*backupApi.ArangoBackupPolicy, error) { + return ListObjects[*backupApi.ArangoBackupPolicyList, *backupApi.ArangoBackupPolicy](context.Background(), client.Arango().BackupV1().ArangoBackupPolicies(cli.GetInput().Namespace), func(result *backupApi.ArangoBackupPolicyList) []*backupApi.ArangoBackupPolicy { + q := make([]*backupApi.ArangoBackupPolicy, len(result.Items)) + + for id, e := range result.Items { + q[id] = e.DeepCopy() + } + + return q + }) +}