Skip to content

Commit

Permalink
commands: add command to wiping cluster
Browse files Browse the repository at this point in the history
Added command destroy-cluster for remove all crds
Added documentation for destroy-cluster
Added unittest and integration tests

Signed-off-by: Javier <[email protected]>
  • Loading branch information
Javlopez committed Oct 1, 2023
1 parent 7fb9e7d commit cd7ebc7
Show file tree
Hide file tree
Showing 15 changed files with 900 additions and 0 deletions.
17 changes: 17 additions & 0 deletions .github/workflows/go-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,23 @@ jobs:
kubectl -n test-cluster scale deployment rook-ceph-osd-0 --replicas 0
kubectl rook-ceph --operator-namespace test-operator -n test-cluster rook purge-osd 0 --force
- name: List CRDS
run: |
set -ex
kubectl -n test-cluster get all
- name: Destroy Cluster (removing CRDS)
env:
ROOK_PLUGIN_SKIP_PROMPTS: true
run: |
set -ex
kubectl rook-ceph --operator-namespace test-operator -n test-cluster destroy-cluster
- name: Validate destroyed CRDS
run: |
set -ex
kubectl get deployments -n rook-ceph --no-headers| wc -l | (read n && [ $n -le 1 ] || { echo "the crds could not be deleted"; exit 1;})
- name: collect common logs
if: always()
uses: ./.github/workflows/collect-logs
Expand Down
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,8 @@ help :
@echo "build : Create go binary."
@echo "test : Runs unit tests"
@echo "clean : Remove go binary file."

generate:
@echo "generating mocks..."
@go generate ./...
@echo completed
44 changes: 44 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ Visit docs below for complete details about each command and their flags uses.
1. [Debug OSDs and Mons](docs/debug.md)
1. [Restore mon quorum](docs/mons.md#restore-quorum)
1. [Disaster Recovery](docs/dr-health.md)
1. [Destroy Cluster](docs/destroy_cluster.md)

## Examples

Expand Down Expand Up @@ -178,6 +179,49 @@ kubectl rook-ceph ceph versions
}
}
```
### Destroy Cluster
```bash
$ kubectl rook-ceph -n rook-ceph destroy-cluster
Warning: Are you sure you want to destroy the cluster in namespace "rook-ceph"?
yes-really-destroy-cluster
Info: proceeding
Info: Getting resources kind cephblockpoolradosnamespaces
Warning: resource cephblockpoolradosnamespaces was not found on the cluster
Info: Getting resources kind cephblockpools
Warning: resource cephblockpools was not found on the cluster
Info: Getting resources kind cephbucketnotifications
Warning: resource cephbucketnotifications was not found on the cluster
Info: Getting resources kind cephbuckettopics
Warning: resource cephbuckettopics was not found on the cluster
Info: Getting resources kind cephclients
Warning: resource cephclients was not found on the cluster
Info: Getting resources kind cephclusters
Warning: resource cephclusters was not found on the cluster
Info: Getting resources kind cephcosidrivers
Warning: resource cephcosidrivers was not found on the cluster
Info: Getting resources kind cephfilesystemmirrors
Warning: resource cephfilesystemmirrors was not found on the cluster
Info: Getting resources kind cephfilesystems
Warning: resource cephfilesystems was not found on the cluster
Info: Getting resources kind cephfilesystemsubvolumegroup
Warning: the server could not find the requested resource: cephfilesystemsubvolumegroup
Info: Getting resources kind cephnfses
Warning: resource cephnfses was not found on the cluster
Info: Getting resources kind cephobjectrealms
Warning: resource cephobjectrealms was not found on the cluster
Info: Getting resources kind cephobjectstores
Warning: resource cephobjectstores was not found on the cluster
Info: Getting resources kind cephobjectstoreusers
Warning: resource cephobjectstoreusers was not found on the cluster
Info: Getting resources kind cephobjectzonegroups
Warning: resource cephobjectzonegroups was not found on the cluster
Info: Getting resources kind cephobjectzones
Warning: resource cephobjectzones was not found on the cluster
Info: Getting resources kind cephrbdmirrors
Warning: resource cephrbdmirrors was not found on the cluster
Info: done
$
```

## Contributing

Expand Down
71 changes: 71 additions & 0 deletions cmd/commands/destroy_cluster.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
Copyright 2023 The Rook Authors. All rights reserved.
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.
*/

package command

import (
"fmt"
"github.com/rook/kubectl-rook-ceph/pkg/crds"
"github.com/rook/kubectl-rook-ceph/pkg/logging"
"github.com/spf13/cobra"
"os"
"strings"
)

const (
destroyClusterQuestion = "Are you sure you want to destroy the cluster in namespace \"%s\"? "
destroyClusterAnswer = "yes-really-destroy-cluster"
)

// DestroyClusterCmd represents the command for destroy cluster
var DestroyClusterCmd = &cobra.Command{
Use: "destroy-cluster",
Short: "delete all Rook CRDs",
Run: func(cmd *cobra.Command, args []string) {
question := fmt.Sprintf(destroyClusterQuestion, CephClusterNamespace)
confirmation, err := confirmPrompt(question, destroyClusterAnswer)
if err != nil {
logging.Fatal(err)
}

logging.Info(confirmation)
clientsets := GetClientsets(cmd.Context())
err = crds.DeleteCustomResources(cmd.Context(), clientsets, CephClusterNamespace)
if err != nil {
logging.Fatal(err)
}
logging.Info("done")
},
}

func init() {
DestroyClusterCmd.Flags().BoolP("yes-really-destroy-cluster", "", false, "confirm cluster deletion")
}

func confirmPrompt(question, key string) (string, error) {
var answer string
if skip, ok := os.LookupEnv("ROOK_PLUGIN_SKIP_PROMPTS"); ok && skip == "true" {
return "skipped prompt since ROOK_PLUGIN_SKIP_PROMPTS=true", nil
}
logging.Warning(question)
fmt.Scan(&answer)

if strings.EqualFold(answer, key) {
return "proceeding", nil
}

return "", fmt.Errorf("you need to response \"yes-really-destroy-cluster\" to confirm the cluster deletion")
}
6 changes: 6 additions & 0 deletions cmd/commands/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package command
import (
"context"
"fmt"
"k8s.io/client-go/dynamic"
"regexp"
"strings"

Expand Down Expand Up @@ -102,6 +103,11 @@ func GetClientsets(ctx context.Context) *k8sutil.Clientsets {
logging.Fatal(err)
}

clientsets.Dynamic, err = dynamic.NewForConfig(clientsets.KubeConfig)
if err != nil {
logging.Fatal(err)
}

PreValidationCheck(ctx, clientsets, OperatorNamespace, CephClusterNamespace)

return clientsets
Expand Down
1 change: 1 addition & 0 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,6 @@ func addcommands() {
command.DebugCmd,
command.Health,
command.DrCmd,
command.DestroyClusterCmd,
)
}
108 changes: 108 additions & 0 deletions docs/destroy_cluster.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Destroy Cluster

This command is used for destroy CRDS (custom resource definitions) created by rook-ceph

## !!! Warning !!!
**This command is not reversible**, and it will destroy your rook-ceph cluster completely and your data,
please only use this command if your sure that your data must be destroyed.

## How to use:

Just you need to run the command, and you will be asked for the confirmation
```bash
$ kubectl rook-ceph -n rook-ceph destroy-cluster
Are you sure you want to destroy the cluster in namespace "rook-ceph"? |
```

You must write exactly this answer **yes-really-destroy-cluster**
to confirm that you really want to execute the command and destroy
your cluster, any other response will be rejected and
the process will be stopped even responding yes

```bash
$ kubectl rook-ceph -n rook-ceph destroy-cluster
Are you sure you want to destroy the cluster in namespace "rook-ceph"? yes
Error: you need to response "yes-really-destroy-cluster" to confirm the cluster deletion
exit status 1

```

Once you respond with the right answer the process will start, and it will be deleteing the CRDS created by rook-ceph

```bash
$ kubectl rook-ceph -n rook-ceph destroy-cluster
Warning: Are you sure you want to destroy the cluster in namespace "rook-ceph"?
yes-really-destroy-cluster
Info: proceeding
Info: Getting resources kind cephblockpoolradosnamespaces
Warning: resource cephblockpoolradosnamespaces was not found on the cluster
Info: Getting resources kind cephblockpools
Warning: resource cephblockpools was not found on the cluster
Info: Getting resources kind cephbucketnotifications
Warning: resource cephbucketnotifications was not found on the cluster
Info: Getting resources kind cephbuckettopics
Warning: resource cephbuckettopics was not found on the cluster
Info: Getting resources kind cephclients
Warning: resource cephclients was not found on the cluster
Info: Getting resources kind cephclusters
Warning: resource cephclusters was not found on the cluster
Info: Getting resources kind cephcosidrivers
Warning: resource cephcosidrivers was not found on the cluster
Info: Getting resources kind cephfilesystemmirrors
Warning: resource cephfilesystemmirrors was not found on the cluster
Info: Getting resources kind cephfilesystems
Warning: resource cephfilesystems was not found on the cluster
Info: Getting resources kind cephfilesystemsubvolumegroup
Warning: the server could not find the requested resource: cephfilesystemsubvolumegroup
Info: Getting resources kind cephnfses
Warning: resource cephnfses was not found on the cluster
Info: Getting resources kind cephobjectrealms
Warning: resource cephobjectrealms was not found on the cluster
Info: Getting resources kind cephobjectstores
Warning: resource cephobjectstores was not found on the cluster
Info: Getting resources kind cephobjectstoreusers
Warning: resource cephobjectstoreusers was not found on the cluster
Info: Getting resources kind cephobjectzonegroups
Warning: resource cephobjectzonegroups was not found on the cluster
Info: Getting resources kind cephobjectzones
Warning: resource cephobjectzones was not found on the cluster
Info: Getting resources kind cephrbdmirrors
Warning: resource cephrbdmirrors was not found on the cluster
Info: done
$
```


# Developer changes
We are adding unittests in order to ensure that the destroy-cluster command is working as we expected,
so if you want to expand the functionality, and you need to change the `pgk/k8sutil/interface.go` remember to recreate the mocks by using `make generate`

```bash
$ make generate
generating mocks...
completed
$
```

# Run test

To run the tests you should to execute `make test`
```bash
$ make test
running unit tests
go test ./...
? github.com/rook/kubectl-rook-ceph/cmd [no test files]
ok github.com/rook/kubectl-rook-ceph/cmd/commands (cached)
ok github.com/rook/kubectl-rook-ceph/pkg/crds (cached)
? github.com/rook/kubectl-rook-ceph/pkg/debug [no test files]
? github.com/rook/kubectl-rook-ceph/pkg/dr [no test files]
? github.com/rook/kubectl-rook-ceph/pkg/exec [no test files]
? github.com/rook/kubectl-rook-ceph/pkg/health [no test files]
? github.com/rook/kubectl-rook-ceph/pkg/k8sutil [no test files]
? github.com/rook/kubectl-rook-ceph/pkg/logging [no test files]
? github.com/rook/kubectl-rook-ceph/pkg/rook [no test files]
ok github.com/rook/kubectl-rook-ceph/pkg/mons (cached)
$
```


1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.20

require (
github.com/fatih/color v1.15.0
github.com/golang/mock v1.6.0
github.com/rook/rook v1.12.2
github.com/rook/rook/pkg/apis v0.0.0-20230725213142-5979b3816292
github.com/spf13/cobra v1.7.0
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -800,6 +800,7 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
Expand Down
Loading

0 comments on commit cd7ebc7

Please sign in to comment.