From 9300f8990b2d4c71467b10f03c4d6a64bcefad54 Mon Sep 17 00:00:00 2001 From: Matias Frank Jensen Date: Mon, 11 Sep 2023 09:52:00 +0200 Subject: [PATCH] Added get-resources to the capsule CLI cmd --- cmd/rig/cmd/capsule/common.go | 49 +++++++++++++++++++++++++ cmd/rig/cmd/capsule/get_resources.go | 55 ++++++++++++++++++++++++++++ cmd/rig/cmd/capsule/set_resources.go | 53 ++++++--------------------- cmd/rig/cmd/capsule/setup.go | 1 + 4 files changed, 116 insertions(+), 42 deletions(-) create mode 100644 cmd/rig/cmd/capsule/common.go create mode 100644 cmd/rig/cmd/capsule/get_resources.go diff --git a/cmd/rig/cmd/capsule/common.go b/cmd/rig/cmd/capsule/common.go new file mode 100644 index 000000000..648b5ed58 --- /dev/null +++ b/cmd/rig/cmd/capsule/common.go @@ -0,0 +1,49 @@ +package capsule + +import ( + "context" + + "github.com/bufbuild/connect-go" + "github.com/rigdev/rig-go-api/api/v1/capsule" + "github.com/rigdev/rig-go-api/model" + "github.com/rigdev/rig-go-sdk" + "github.com/rigdev/rig/pkg/utils" +) + +func getCurrentContainerSettings(ctx context.Context, capsuleID CapsuleID, client rig.Client) (*capsule.ContainerSettings, error) { + resp, err := client.Capsule().ListRollouts(ctx, connect.NewRequest(&capsule.ListRolloutsRequest{ + CapsuleId: capsuleID.String(), + Pagination: &model.Pagination{ + Offset: 0, + Limit: 1, + Descending: true, + }, + })) + if err != nil { + return nil, err + } + + if resp.Msg.Total == 0 { + return nil, nil + } + + r, err := client.Capsule().GetRollout(ctx, connect.NewRequest(&capsule.GetRolloutRequest{ + CapsuleId: capsuleID.String(), + RolloutId: resp.Msg.Rollouts[0].RolloutId, + })) + if err != nil { + return nil, err + } + + container := r.Msg.Rollout.Config.GetContainerSettings() + if container == nil { + container = &capsule.ContainerSettings{} + } + if container.Resources == nil { + container.Resources = &capsule.Resources{} + } + + utils.FeedDefaultResources(container.Resources) + + return container, nil +} diff --git a/cmd/rig/cmd/capsule/get_resources.go b/cmd/rig/cmd/capsule/get_resources.go new file mode 100644 index 000000000..836aeeac4 --- /dev/null +++ b/cmd/rig/cmd/capsule/get_resources.go @@ -0,0 +1,55 @@ +package capsule + +import ( + "context" + "fmt" + + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rigdev/rig-go-sdk" + "github.com/rigdev/rig/cmd/common" + "github.com/rigdev/rig/cmd/rig/cmd/base" + "github.com/spf13/cobra" +) + +func setupGetResources(parent *cobra.Command) { + getResources := &cobra.Command{ + Use: "get-resources", + Short: "Displays the resource (container size) of the capsule", + Args: cobra.MaximumNArgs(1), + RunE: base.Register(GetResources), + } + getResources.Flags().BoolVar(&outputJSON, "json", false, "output as json") + + parent.AddCommand(getResources) +} + +func GetResources(ctx context.Context, cmd *cobra.Command, capsuleID CapsuleID, client rig.Client) error { + containerSettings, err := getCurrentContainerSettings(ctx, capsuleID, client) + if err != nil { + return err + } + if containerSettings == nil { + fmt.Println("Capsule has no rollouts yet") + return nil + } + + if outputJSON { + cmd.Println(common.ProtoToPrettyJson(containerSettings.Resources)) + return nil + } + + limits := containerSettings.Resources.Limits + requests := containerSettings.Resources.Requests + + t := table.NewWriter() + t.AppendRows([]table.Row{{"", "Requests", "Limits"}}) + t.AppendSeparator() + t.AppendRows([]table.Row{ + {"CPU", milliIntToString(uint64(requests.Cpu)), milliIntToString(uint64(limits.Cpu))}, + {"Memory", intToByteString(requests.Memory), intToByteString(limits.Memory)}, + {"Ephemeral Storage", intToByteString(requests.EphemeralStorage), intToByteString(limits.EphemeralStorage)}, + }) + cmd.Println(t.Render()) + + return nil +} diff --git a/cmd/rig/cmd/capsule/set_resources.go b/cmd/rig/cmd/capsule/set_resources.go index 570b91fad..73c0ce1cb 100644 --- a/cmd/rig/cmd/capsule/set_resources.go +++ b/cmd/rig/cmd/capsule/set_resources.go @@ -4,15 +4,12 @@ import ( "context" "fmt" "math" - "strconv" "github.com/bufbuild/connect-go" "github.com/rigdev/rig-go-api/api/v1/capsule" - "github.com/rigdev/rig-go-api/model" "github.com/rigdev/rig-go-sdk" "github.com/rigdev/rig/cmd/common" "github.com/rigdev/rig/cmd/rig/cmd/base" - "github.com/rigdev/rig/pkg/utils" "github.com/spf13/cobra" "k8s.io/apimachinery/pkg/api/resource" ) @@ -79,42 +76,6 @@ func SetResources(ctx context.Context, cmd *cobra.Command, capsuleID CapsuleID, return nil } -func getCurrentContainerSettings(ctx context.Context, capsuleID CapsuleID, client rig.Client) (*capsule.ContainerSettings, error) { - resp, err := client.Capsule().ListRollouts(ctx, connect.NewRequest(&capsule.ListRolloutsRequest{ - CapsuleId: capsuleID.String(), - Pagination: &model.Pagination{ - Offset: 0, - Limit: 1, - Descending: true, - }, - })) - if err != nil { - return nil, err - } - - if resp.Msg.Total == 0 { - return nil, nil - } - - r, err := client.Capsule().GetRollout(ctx, connect.NewRequest(&capsule.GetRolloutRequest{ - CapsuleId: capsuleID.String(), - RolloutId: resp.Msg.Rollouts[0].RolloutId, - })) - if err != nil { - return nil, err - } - - container := r.Msg.Rollout.Config.GetContainerSettings() - if container == nil { - container = &capsule.ContainerSettings{} - } - if container.Resources == nil { - container.Resources = &capsule.Resources{} - } - utils.FeedDefaultResources(container.Resources) - return container, nil -} - func setResourcesInteractive(curResources *capsule.Resources) error { for { i, _, err := common.PromptSelect("What to update", []string{"Requests", "Limits", "Done"}) @@ -154,15 +115,15 @@ func setResourcesInteractive(curResources *capsule.Resources) error { switch i { case 0: name = "CPU" - current = strconv.FormatInt(int64(curR.Cpu), 10) + "m" + current = milliIntToString(uint64(curR.Cpu)) resourceString = &cpu case 1: name = "memory" - current = common.FormatIntToSI(curR.Memory, 3) + "B" + current = intToByteString(curR.Memory) resourceString = &mem case 2: name = "ephemeral storage" - current = common.FormatIntToSI(curR.EphemeralStorage, 3) + "B" + current = intToByteString(curR.EphemeralStorage) resourceString = &ephemeral default: done = true @@ -185,6 +146,14 @@ func setResourcesInteractive(curResources *capsule.Resources) error { return nil } +func milliIntToString(millis uint64) string { + return fmt.Sprintf("%v", float64(millis)/1000) +} + +func intToByteString(i uint64) string { + return common.FormatIntToSI(i, 3) + "B" +} + func setResourcesFromFlags(curResources *capsule.Resources) error { if err := updateResources(curResources.Requests, requestCPU, requestMemory, requestEphemeral); err != nil { return err diff --git a/cmd/rig/cmd/capsule/setup.go b/cmd/rig/cmd/capsule/setup.go index e73c8090d..0c5a4a119 100644 --- a/cmd/rig/cmd/capsule/setup.go +++ b/cmd/rig/cmd/capsule/setup.go @@ -199,6 +199,7 @@ func Setup(parent *cobra.Command) { capsule.AddCommand(events) setupSetResources(capsule) + setupGetResources(capsule) parent.AddCommand(capsule)