Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DEVOPS-2915 add postgresdump status #100

Merged
merged 17 commits into from
Dec 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pkg/cmd/postgresdump.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ var postgresdumpCMD = &cobra.Command{
return errors.Wrap(err, "failed to create postgresdump instance")
}
pterm.Info.Printf("Created postgresdump kind with Name: " + instanceName + " Namespace: " + postgresdumpObj.Namespace + " . \n")
pterm.Info.Printf("You can check status of DB backup using 'ridectl status' command \n")
return nil
},
}
135 changes: 95 additions & 40 deletions pkg/cmd/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@ limitations under the License.
package cmd

import (
"fmt"
"os"
osExec "os/exec"
"reflect"
"strings"
"time"

"github.com/Ridecell/ridectl/pkg/utils"
"github.com/manifoldco/promptui"
"github.com/pkg/errors"
"github.com/pterm/pterm"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -65,81 +67,134 @@ func getData(objType string, context string, namespace string, tenant string) (s
if err != nil {
return "", errors.Wrap(err, "error getting deployment info")
}
} else {
objectData, err := TempFS.ReadFile("templates/show_postgresdump.tpl")
if err != nil {
return "", errors.Wrap(err, "error reading show_postgresdump.tpl")
}
command := "kubectl get postgresdumps.db.controllers.ridecell.io -n " + namespace + " --context " + context + " -o" + " go-template='" + string(objectData) + "'"
if strings.Contains(tenant, "svc-") {
command = "kubectl get postgresdumps.db.controllers.ridecell.io -n " + namespace + " --context " + context + " -o" + " go-template='" + string(objectData) + "'" + " | grep " + tenant
}
data, err = osExec.Command("bash", "-c", command).Output()
if err != nil {
return "", errors.Wrap(err, "error getting postgresdump instance info")
}
}

return string(data), err
}

var statusCmd = &cobra.Command{
Use: "status [follow] <cluster_name>",
Use: "status",
Short: "Get status report of an Summon Instance",
Long: "Shows status details for all components of a Summon Instance",
Args: func(_ *cobra.Command, args []string) error {
if len(args) == 0 {
return fmt.Errorf("cluster name argument is required")
}
if len(args) > 1 {
return fmt.Errorf("too many arguments")
}
return nil
},
PreRunE: func(cmd *cobra.Command, args []string) error {

utils.CheckVPN()
utils.CheckKubectl()
return nil
},
RunE: func(_ *cobra.Command, args []string) error {
RunE: func(cmd *cobra.Command, args []string) error {
followStatus, _ := cmd.Flags().GetBool("follow")
statusTypes := []string{"Summon Platform", "DB Backup"}
statusPrompt := promptui.Select{
Label: "Select ",
Items: statusTypes,
}
_, statusType, err := statusPrompt.Run()
if err != nil {
return errors.Wrapf(err, "Prompt failed")
}
validator := func(input string) error {
if input == "" {
return errors.New("Invalid summont tenant name or microservice name")
}
return nil
}
instanceNamePromt := promptui.Prompt{
Label: "Enter summon tenant(sandbox-dev)/microservice(svc-us-master-microservice) name",
Validate: validator,
}
name, err := instanceNamePromt.Run()
if err != nil {
return errors.Wrapf(err, "Prompt failed")
}

kubeconfig := utils.GetKubeconfig()
target, err := kubernetes.ParseSubject(args[0])
target, err := kubernetes.ParseSubject(name)
if err != nil {
pterm.Error.Println(err, "Its not a valid Summonplatform or Microservice")
os.Exit(1)
}

kubeObj := kubernetes.GetAppropriateObjectWithContext(*kubeconfig, args[0], target, inCluster)
kubeObj := kubernetes.GetAppropriateObjectWithContext(*kubeconfig, name, target, inCluster)
if reflect.DeepEqual(kubeObj, kubernetes.Kubeobject{}) {
pterm.Error.Printf("No instance found %s\n", args[0])
pterm.Error.Printf("No instance found %s\n", name)
os.Exit(1)
}

sData, err := getData("summon", kubeObj.Context.Cluster, target.Namespace, args[0])
if err != nil {
return err
}
dData, err := getData("deployment", kubeObj.Context.Cluster, target.Namespace, args[0])
if err != nil {
return err
var sData, dData, pData string
if statusType == "Summon Platform" {
sData, err = getData("summon", kubeObj.Context.Cluster, target.Namespace, name)
if err != nil {
return err
}
dData, err = getData("deployment", kubeObj.Context.Cluster, target.Namespace, name)
if err != nil {
return err
}
} else {
pData, err = getData("postgresdump", kubeObj.Context.Cluster, target.Namespace, name)
if err != nil {
return err
}
}
if follow {
if followStatus {
area, _ := pterm.DefaultArea.WithRemoveWhenDone().Start()

for {
area.Update(sData, "\n", dData)
p := pterm.DefaultProgressbar.WithTotal(2)
p := pterm.DefaultProgressbar
p.ShowElapsedTime = false
p.RemoveWhenDone = true
_, _ = p.Start()
p.Title = "Fetching data"

// Calling it at end of for loop since we made these calls right before.
sData, err = getData("summon", kubeObj.Context.Cluster, target.Namespace, args[0])
if err != nil {
return err
if statusType == "Summon Platform" {
p = *p.WithTotal(2)
area.Update(sData, "\n", dData)
_, _ = p.Start()
p.Title = "Fetching data"
sData, err = getData("summon", kubeObj.Context.Cluster, target.Namespace, name)
if err != nil {
return err
}
p.Increment()

dData, err = getData("deployment", kubeObj.Context.Cluster, target.Namespace, name)
if err != nil {
return err
}
p.Increment()
} else {
p = *p.WithTotal(1)
area.Update(pData)
_, _ = p.Start()
p.Title = "Fetching data"
pData, err = getData("posgtresdump", kubeObj.Context.Cluster, target.Namespace, name)
if err != nil {
return err
}
p.Increment()
time.Sleep(time.Second * 10)
}
p.Increment()

dData, err = getData("deployment", kubeObj.Context.Cluster, target.Namespace, args[0])
if err != nil {
return err
}
p.Increment()
_, _ = p.Stop()
_ = area.Stop()

}
} else {
pterm.Success.Printf(sData + "\n" + dData + "\n")
if statusType == "Summon Platform" {
pterm.Success.Printf(sData + "\n" + dData)
} else {
pterm.Success.Printf(pData)
}
}
return nil
},
Expand Down
10 changes: 6 additions & 4 deletions pkg/cmd/templates/show_postgresdump.tpl
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
STATUS: {{.status.status }}
MESSAGE: {{.status.message -}}
{{if .status.dumpPath }}
S3PATH: {{.status.dumpPath }}{{end}}
{{printf "%-70s%-15s%-50s" "NAME" "STATUS" "MESSAGE" -}}
{{range $postgresDump := .items }}
{{printf "%-70s" $postgresDump.metadata.name -}}
{{printf "%-15s" $postgresDump.status.status -}}
{{printf "%-50s" $postgresDump.status.message -}}
{{end -}}