From 22244768de4505063a113c32aace3e5d1027d2cc Mon Sep 17 00:00:00 2001 From: surajgour-d11 Date: Tue, 4 Feb 2025 11:53:09 +0530 Subject: [PATCH] chore: refactoring Signed-off-by: surajgour-d11 --- cmd/deploy/model.go | 46 ---- cmd/deploy/service.go | 213 +----------------- cmd/deploy/view.go | 33 --- internal/service/service.go | 42 +++- internal/ui/deploy.go | 166 ++++++++++++++ internal/ui/deploymodel.go | 75 ++++++ {pkg => internal}/ui/styles.go | 0 .../dream11/oam/dto/v1/provider_account.pb.go | 2 +- .../provideraccount/v1/provider_account.pb.go | 2 +- .../v1/provider_account_grpc.pb.go | 2 +- proto/gen/go/dream11/od/auth/v1/auth.pb.go | 2 +- .../gen/go/dream11/od/auth/v1/auth_grpc.pb.go | 2 +- .../dream11/od/component/v1/component.pb.go | 2 +- .../od/component/v1/component_grpc.pb.go | 2 +- .../gen/go/dream11/od/dto/v1/component.pb.go | 2 +- .../go/dream11/od/dto/v1/component_task.pb.go | 2 +- .../go/dream11/od/dto/v1/environment.pb.go | 2 +- .../dream11/od/dto/v1/provisioning_type.pb.go | 2 +- proto/gen/go/dream11/od/dto/v1/service.pb.go | 2 +- .../go/dream11/od/dto/v1/service_task.pb.go | 2 +- .../od/environment/v1/environment.pb.go | 2 +- .../od/environment/v1/environment_grpc.pb.go | 2 +- .../go/dream11/od/service/v1/service.pb.go | 2 +- .../dream11/od/service/v1/service_grpc.pb.go | 2 +- 24 files changed, 309 insertions(+), 300 deletions(-) delete mode 100644 cmd/deploy/model.go delete mode 100644 cmd/deploy/view.go create mode 100644 internal/ui/deploy.go create mode 100644 internal/ui/deploymodel.go rename {pkg => internal}/ui/styles.go (100%) diff --git a/cmd/deploy/model.go b/cmd/deploy/model.go deleted file mode 100644 index 429ae9a8..00000000 --- a/cmd/deploy/model.go +++ /dev/null @@ -1,46 +0,0 @@ -package deploy - -import ( - "github.com/charmbracelet/bubbles/progress" - "github.com/charmbracelet/bubbles/spinner" - "github.com/charmbracelet/bubbles/viewport" -) - -type Model struct { - ServiceDisplayMeta ServiceDisplayMeta - ServiceView ServiceView -} - -type ServiceDisplayMeta struct { - Height int - Width int - Ready bool - Cursor int - ElapsedTime int - TotalCompletionTime int - Progress progress.Model - ComponentDisplayMeta []ComponentDisplayMeta -} - -type ComponentDisplayMeta struct { - Height int - Width int - Toggle bool - Spinner spinner.Model - LogViewPort viewport.Model -} - -type ServiceView struct { - Name string - Status string - Action string - TraceId string - ComponentsView []ComponentView -} - -type ComponentView struct { - Name string - Status string - Action string - Content string -} diff --git a/cmd/deploy/service.go b/cmd/deploy/service.go index 18734abf..428bac58 100644 --- a/cmd/deploy/service.go +++ b/cmd/deploy/service.go @@ -4,18 +4,8 @@ import ( "context" "encoding/json" "errors" - "fmt" - "github.com/charmbracelet/bubbles/progress" - "github.com/charmbracelet/bubbles/spinner" - "github.com/charmbracelet/bubbles/viewport" - tea "github.com/charmbracelet/bubbletea" - "github.com/charmbracelet/lipgloss" - "github.com/dream11/odin/pkg/ui" - "github.com/dream11/odin/pkg/util" - "io" "os" "regexp" - "strings" "github.com/dream11/odin/internal/service" "github.com/dream11/odin/pkg/config" @@ -57,192 +47,23 @@ func init() { func execute(cmd *cobra.Command) { env = config.EnsureEnvPresent(env) - // Add program in context ctx := cmd.Context() - program := tea.NewProgram( - &Model{ - ServiceView: ServiceView{ - Name: "Initiating service deployment", - }, - }, - tea.WithAltScreen(), - ) - - go func() { - if (serviceName == "" && serviceVersion == "" && labels == "") && (definitionFile != "" && provisioningFile != "") { - deployUsingFiles(ctx, program) - } else if (serviceName != "" && serviceVersion != "" && labels == "") && (definitionFile == "" && provisioningFile == "") { - deployUsingServiceNameAndVersion(ctx) - } else if (serviceName != "" && labels != "" && serviceVersion == "") && (definitionFile == "" && provisioningFile == "") { - if err := validateLabels(labels); err != nil { - log.Fatal("Invalid labels format: ", err) - } - deployUsingServiceNameAndLabels(ctx) - } else { - log.Fatal("Invalid combination of flags. Use either (service name and version) or (service name and labels) or (definitionFile and provisioningFile).") - } - }() - - if _, err := program.Run(); err != nil { - os.Exit(1) - } -} - -func (m *Model) Init() tea.Cmd { - m.ServiceDisplayMeta.Progress = progress.New(progress.WithDefaultScaledGradient()) - m.ServiceDisplayMeta.Progress.PercentageStyle = ui.ProgressBarStyle - m.ServiceDisplayMeta.Progress.SetPercent(100) - m.ServiceDisplayMeta.Cursor = 0 - return nil -} - -func (m *Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { - var updateCmds []tea.Cmd - switch msg := msg.(type) { - // Handle updates - case Model: - m.ServiceDisplayMeta.Ready = true - m.ServiceView = msg.ServiceView - if len(m.ServiceView.ComponentsView) > len(m.ServiceDisplayMeta.ComponentDisplayMeta) { - for i := len(m.ServiceDisplayMeta.ComponentDisplayMeta); i < len(m.ServiceView.ComponentsView); i++ { - m.ServiceDisplayMeta.ComponentDisplayMeta = append(m.ServiceDisplayMeta.ComponentDisplayMeta, ComponentDisplayMeta{ - LogViewPort: viewport.Model{ - Width: m.ServiceDisplayMeta.Width, - Height: 10, - }, - }) - m.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner = spinner.New() - m.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.Style = ui.SpinnerStyle - m.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.Spinner = spinner.Points - } - } - // Handle key presses - case tea.KeyMsg: - anyToggled := false - for _, component := range m.ServiceDisplayMeta.ComponentDisplayMeta { - if component.Toggle { - anyToggled = true - break - } - } - switch msg.String() { - case "up": - if m.ServiceDisplayMeta.Cursor > 0 && !anyToggled { - m.ServiceDisplayMeta.Cursor-- - } - break - - case "down": - if m.ServiceDisplayMeta.Cursor < len(m.ServiceDisplayMeta.ComponentDisplayMeta)-1 && !anyToggled { - m.ServiceDisplayMeta.Cursor++ - } - break - - case "enter", " ": - if m.ServiceDisplayMeta.Cursor < len(m.ServiceDisplayMeta.ComponentDisplayMeta) { - m.ServiceDisplayMeta.ComponentDisplayMeta[m.ServiceDisplayMeta.Cursor].Toggle = - !m.ServiceDisplayMeta.ComponentDisplayMeta[m.ServiceDisplayMeta.Cursor].Toggle - } - break - - case "q": - return m, tea.Quit - } - - // Handle window resizes - case tea.WindowSizeMsg: - m.ServiceDisplayMeta.Height = msg.Height - m.ServiceDisplayMeta.Width = msg.Width - if m.ServiceDisplayMeta.Ready { - for i := range m.ServiceDisplayMeta.ComponentDisplayMeta { - m.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort.Width = msg.Width - m.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort.Height = - max(util.GetAvailableViewPortHeight(msg.Height, lipgloss.Height("text"), len(m.ServiceDisplayMeta.ComponentDisplayMeta)), 10) - } - } - case spinner.TickMsg: - spinnerUpdateCmds := m.updateSpinners(msg) - return m, tea.Batch(spinnerUpdateCmds...) - } - - // Handle keyboard and mouse events in the viewport - updateCmds = append(updateCmds, m.tickSpinners()...) - updateCmds = append(updateCmds, m.updateViewPort(msg)...) - return m, tea.Batch(updateCmds...) -} - -func (m *Model) updateViewPort(msg tea.Msg) []tea.Cmd { - var cmds []tea.Cmd - var cmd tea.Cmd - for i := range m.ServiceDisplayMeta.ComponentDisplayMeta { - m.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort, cmd = - m.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort.Update(msg) - cmds = append(cmds, cmd) - } - return cmds -} - -func (m *Model) updateSpinners(msg tea.Msg) []tea.Cmd { - var cmds []tea.Cmd - var cmd tea.Cmd - for i := range m.ServiceDisplayMeta.ComponentDisplayMeta { - m.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner, cmd = - m.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.Update(msg) - cmds = append(cmds, cmd) - } - return cmds -} - -func (m *Model) tickSpinners() []tea.Cmd { - var cmds []tea.Cmd - for i := range m.ServiceDisplayMeta.ComponentDisplayMeta { - cmds = append(cmds, m.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.Tick) - } - return cmds -} - -func (m *Model) View() string { - if !m.ServiceDisplayMeta.Ready { - return ui.H1Style.Render("Initializing service deployment...") - } - var builder strings.Builder - - // Build Service View - serviceHeader := util.GetHeaderText(m.ServiceView.Name, m.ServiceView.Action, m.ServiceView.Status, "Service") - builder.WriteString(fmt.Sprintf("%s\n", ui.H1Style.Render(serviceHeader))) - m.ServiceDisplayMeta.Progress.Width = lipgloss.Width(serviceHeader) + 6 // to accommodate the percentage text - builder.WriteString(fmt.Sprintf("%s\n", m.ServiceDisplayMeta.Progress.ViewAs(100.0))) - builder.WriteString(fmt.Sprintf("Trace Id: %s\n", ui.TextStyle.Render(m.ServiceView.TraceId))) - - for i, componentView := range m.ServiceView.ComponentsView { - componentHeader := util.GetHeaderText(componentView.Name, componentView.Action, componentView.Status, "Component") - var componentHeaderText string - if i == m.ServiceDisplayMeta.Cursor { - componentHeaderText = ui.SelectedStyle(ui.H2Style).Render(componentHeader) - } else { - componentHeaderText = ui.H2Style.Render(componentHeader) - } - if m.ServiceView.ComponentsView[i].Status != "IN_PROGRESS" { - m.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.Spinner = spinner.Pulse - } - builder.WriteString(fmt.Sprintf("%s %s\n", componentHeaderText, m.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.View())) - if m.ServiceDisplayMeta.ComponentDisplayMeta[i].Toggle { - // Render logs - logsText := strings.Split(componentView.Content, "\\n") - m.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort.SetContent(ui.InfoStyle.Render(strings.Join(logsText, "\n"))) - builder.WriteString(fmt.Sprintf("%s \n", m.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort.View())) + if (serviceName == "" && serviceVersion == "" && labels == "") && (definitionFile != "" && provisioningFile != "") { + deployUsingFiles(ctx) + } else if (serviceName != "" && serviceVersion != "" && labels == "") && (definitionFile == "" && provisioningFile == "") { + deployUsingServiceNameAndVersion(ctx) + } else if (serviceName != "" && labels != "" && serviceVersion == "") && (definitionFile == "" && provisioningFile == "") { + if err := validateLabels(labels); err != nil { + log.Fatal("Invalid labels format: ", err) } + deployUsingServiceNameAndLabels(ctx) + } else { + log.Fatal("Invalid combination of flags. Use either (service name and version) or (service name and labels) or (definitionFile and provisioningFile).") } - - // Add Footer with operating instructions - builder.WriteString("\n\n") - builder.WriteString(ui.FooterStyle.Render("Use ↑ and ↓ to navigate components, Enter to toggle logs, q to quit")) - - return builder.String() } -func deployUsingFiles(ctx context.Context, program *tea.Program) { +func deployUsingFiles(ctx context.Context) { definitionData, err := os.ReadFile(definitionFile) if err != nil { log.Fatal("Error while reading definition file ", err) @@ -264,7 +85,7 @@ func deployUsingFiles(ctx context.Context, program *tea.Program) { ComponentProvisioningConfig: compProvConfigs, } - stream, err := serviceClient.DeployService(&ctx, &serviceProto.DeployServiceRequest{ + err = serviceClient.DeployService(&ctx, &serviceProto.DeployServiceRequest{ EnvName: env, ServiceDefinition: &definitionProto, ProvisioningConfig: provisioningProto, @@ -273,16 +94,6 @@ func deployUsingFiles(ctx context.Context, program *tea.Program) { if err != nil { log.Fatal("Failed to deploy service ", err) } - for { - response, err := stream.Recv() - if err != nil { - if errors.Is(err, context.Canceled) || err == io.EOF { - break - } - program.Quit() - } - program.Send(GetServiceDeployModel(response)) - } } func deployUsingServiceNameAndVersion(ctx context.Context) { diff --git a/cmd/deploy/view.go b/cmd/deploy/view.go deleted file mode 100644 index 797e57f8..00000000 --- a/cmd/deploy/view.go +++ /dev/null @@ -1,33 +0,0 @@ -package deploy - -import ( - v1 "github.com/dream11/odin/proto/gen/go/dream11/od/service/v1" -) - -func GetServiceDeployModel(response *v1.DeployServiceResponse) Model { - serviceName := response.GetServiceResponse().Name - - serviceView := ServiceView{ - Name: serviceName, - Action: response.GetServiceResponse().ServiceStatus.GetServiceAction(), - Status: response.GetServiceResponse().ServiceStatus.GetServiceStatus(), - TraceId: "random-trace-id", - ComponentsView: make([]ComponentView, 0), - } - for _, component := range response.GetServiceResponse().GetComponentsStatus() { - errorMessage := "Awaiting component logs" - if component.GetError() != "" { - errorMessage = component.GetError() - } - componentView := ComponentView{ - Name: component.GetComponentName(), - Action: component.GetComponentAction(), - Status: component.GetComponentStatus(), - Content: errorMessage, - } - serviceView.ComponentsView = append(serviceView.ComponentsView, componentView) - } - return Model{ - ServiceView: serviceView, - } -} diff --git a/internal/service/service.go b/internal/service/service.go index c7d9de5a..158f38a5 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -5,7 +5,10 @@ import ( "context" "errors" "fmt" + tea "github.com/charmbracelet/bubbletea" + "github.com/dream11/odin/internal/ui" "io" + "os" "github.com/briandowns/spinner" "github.com/dream11/odin/pkg/constant" @@ -21,14 +24,47 @@ type Service struct{} var responseMap = make(map[string]string) +var program = tea.NewProgram( + &ui.ServiceDeployModel{ + ServiceView: ui.ServiceView{ + Name: "Initiating service deployment", + }, + }, + tea.WithAltScreen(), +) + // DeployService deploys service -func (e *Service) DeployService(ctx *context.Context, request *serviceProto.DeployServiceRequest) (serviceProto.ServiceService_DeployServiceClient, error) { +func (e *Service) DeployService(ctx *context.Context, request *serviceProto.DeployServiceRequest) error { conn, requestCtx, err := grpcClient(ctx) if err != nil { - return nil, err + return err } client := serviceProto.NewServiceServiceClient(conn) - return client.DeployService(*requestCtx, request) + stream, err := client.DeployService(*requestCtx, request) + if err != nil { + return err + } + + go func() { + for { + response, err := stream.Recv() + if err != nil { + if errors.Is(err, context.Canceled) || err == io.EOF { + break + } + log.Errorf("TraceID: %s", (*requestCtx).Value(constant.TraceIDKey)) + program.Quit() + } + if response != nil { + program.Send(ui.GetServiceDeployModel(response)) + } + } + }() + + if _, err := program.Run(); err != nil { + os.Exit(1) + } + return err } func logFailedComponentMessagesOnce(response *serviceProto.ServiceResponse) { diff --git a/internal/ui/deploy.go b/internal/ui/deploy.go new file mode 100644 index 00000000..58511004 --- /dev/null +++ b/internal/ui/deploy.go @@ -0,0 +1,166 @@ +package ui + +import ( + "fmt" + "github.com/charmbracelet/bubbles/progress" + "github.com/charmbracelet/bubbles/spinner" + "github.com/charmbracelet/bubbles/viewport" + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/lipgloss" + "github.com/dream11/odin/pkg/util" + "strings" +) + +func (s *ServiceDeployModel) Init() tea.Cmd { + s.ServiceDisplayMeta.Progress = progress.New(progress.WithDefaultScaledGradient()) + s.ServiceDisplayMeta.Progress.PercentageStyle = ProgressBarStyle + s.ServiceDisplayMeta.Progress.SetPercent(100) + s.ServiceDisplayMeta.Cursor = 0 + return nil +} + +func (s *ServiceDeployModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + var updateCmds []tea.Cmd + switch msg := msg.(type) { + // Handle updates + case ServiceDeployModel: + s.ServiceDisplayMeta.Ready = true + s.ServiceView = msg.ServiceView + if len(s.ServiceView.ComponentsView) > len(s.ServiceDisplayMeta.ComponentDisplayMeta) { + for i := len(s.ServiceDisplayMeta.ComponentDisplayMeta); i < len(s.ServiceView.ComponentsView); i++ { + s.ServiceDisplayMeta.ComponentDisplayMeta = append(s.ServiceDisplayMeta.ComponentDisplayMeta, ComponentDisplayMeta{ + LogViewPort: viewport.Model{ + Width: s.ServiceDisplayMeta.Width, + Height: 10, + }, + }) + s.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner = spinner.New() + s.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.Style = SpinnerStyle + s.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.Spinner = spinner.Points + } + } + // Handle key presses + case tea.KeyMsg: + anyToggled := false + for _, component := range s.ServiceDisplayMeta.ComponentDisplayMeta { + if component.Toggle { + anyToggled = true + break + } + } + switch msg.String() { + case "up": + if s.ServiceDisplayMeta.Cursor > 0 && !anyToggled { + s.ServiceDisplayMeta.Cursor-- + } + break + + case "down": + if s.ServiceDisplayMeta.Cursor < len(s.ServiceDisplayMeta.ComponentDisplayMeta)-1 && !anyToggled { + s.ServiceDisplayMeta.Cursor++ + } + break + + case "enter", " ": + if s.ServiceDisplayMeta.Cursor < len(s.ServiceDisplayMeta.ComponentDisplayMeta) { + s.ServiceDisplayMeta.ComponentDisplayMeta[s.ServiceDisplayMeta.Cursor].Toggle = + !s.ServiceDisplayMeta.ComponentDisplayMeta[s.ServiceDisplayMeta.Cursor].Toggle + } + break + + case "q": + return s, tea.Quit + } + + // Handle window resizes + case tea.WindowSizeMsg: + s.ServiceDisplayMeta.Height = msg.Height + s.ServiceDisplayMeta.Width = msg.Width + if s.ServiceDisplayMeta.Ready { + for i := range s.ServiceDisplayMeta.ComponentDisplayMeta { + s.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort.Width = msg.Width + s.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort.Height = + max(util.GetAvailableViewPortHeight(msg.Height, lipgloss.Height("text"), len(s.ServiceDisplayMeta.ComponentDisplayMeta)), 10) + } + } + case spinner.TickMsg: + spinnerUpdateCmds := s.updateSpinners(msg) + return s, tea.Batch(spinnerUpdateCmds...) + } + + // Handle keyboard and mouse events in the viewport + updateCmds = append(updateCmds, s.tickSpinners()...) + updateCmds = append(updateCmds, s.updateViewPort(msg)...) + + return s, tea.Batch(updateCmds...) +} + +func (s *ServiceDeployModel) View() string { + if !s.ServiceDisplayMeta.Ready { + return H1Style.Render("Initializing service deployment...") + } + var builder strings.Builder + + // Build Service View + serviceHeader := util.GetHeaderText(s.ServiceView.Name, s.ServiceView.Action, s.ServiceView.Status, "Service") + builder.WriteString(fmt.Sprintf("%s\n", H1Style.Render(serviceHeader))) + s.ServiceDisplayMeta.Progress.Width = lipgloss.Width(serviceHeader) + 6 // to accommodate the percentage text + builder.WriteString(fmt.Sprintf("%s\n", s.ServiceDisplayMeta.Progress.ViewAs(100.0))) + builder.WriteString(fmt.Sprintf("Trace Id: %s\n", TextStyle.Render(s.ServiceView.TraceId))) + + for i, componentView := range s.ServiceView.ComponentsView { + componentHeader := util.GetHeaderText(componentView.Name, componentView.Action, componentView.Status, "Component") + var componentHeaderText string + if i == s.ServiceDisplayMeta.Cursor { + componentHeaderText = SelectedStyle(H2Style).Render(componentHeader) + } else { + componentHeaderText = H2Style.Render(componentHeader) + } + if s.ServiceView.ComponentsView[i].Status != "IN_PROGRESS" { + s.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.Spinner = spinner.Pulse + } + builder.WriteString(fmt.Sprintf("%s %s\n", componentHeaderText, s.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.View())) + if s.ServiceDisplayMeta.ComponentDisplayMeta[i].Toggle { + // Render logs + logsText := strings.Split(componentView.Content, "\\n") + s.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort.SetContent(InfoStyle.Render(strings.Join(logsText, "\n"))) + builder.WriteString(fmt.Sprintf("%s \n", s.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort.View())) + } + } + + // Add Footer with operating instructions + builder.WriteString("\n\n") + builder.WriteString(FooterStyle.Render("Use ↑ and ↓ to navigate components, Enter to toggle logs, q to quit")) + + return builder.String() +} + +func (s *ServiceDeployModel) updateViewPort(msg tea.Msg) []tea.Cmd { + var cmds []tea.Cmd + var cmd tea.Cmd + for i := range s.ServiceDisplayMeta.ComponentDisplayMeta { + s.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort, cmd = + s.ServiceDisplayMeta.ComponentDisplayMeta[i].LogViewPort.Update(msg) + cmds = append(cmds, cmd) + } + return cmds +} + +func (s *ServiceDeployModel) updateSpinners(msg tea.Msg) []tea.Cmd { + var cmds []tea.Cmd + var cmd tea.Cmd + for i := range s.ServiceDisplayMeta.ComponentDisplayMeta { + s.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner, cmd = + s.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.Update(msg) + cmds = append(cmds, cmd) + } + return cmds +} + +func (s *ServiceDeployModel) tickSpinners() []tea.Cmd { + var cmds []tea.Cmd + for i := range s.ServiceDisplayMeta.ComponentDisplayMeta { + cmds = append(cmds, s.ServiceDisplayMeta.ComponentDisplayMeta[i].Spinner.Tick) + } + return cmds +} diff --git a/internal/ui/deploymodel.go b/internal/ui/deploymodel.go new file mode 100644 index 00000000..b1efbaf2 --- /dev/null +++ b/internal/ui/deploymodel.go @@ -0,0 +1,75 @@ +package ui + +import ( + "github.com/charmbracelet/bubbles/progress" + "github.com/charmbracelet/bubbles/spinner" + "github.com/charmbracelet/bubbles/viewport" + v1 "github.com/dream11/odin/proto/gen/go/dream11/od/service/v1" +) + +type ServiceDeployModel struct { + ServiceDisplayMeta ServiceDisplayMeta + ServiceView ServiceView +} + +type ServiceDisplayMeta struct { + Height int + Width int + Ready bool + Cursor int + ElapsedTime int + TotalCompletionTime int + Progress progress.Model + ComponentDisplayMeta []ComponentDisplayMeta +} + +type ComponentDisplayMeta struct { + Height int + Width int + Toggle bool + Spinner spinner.Model + LogViewPort viewport.Model +} + +type ServiceView struct { + Name string + Status string + Action string + TraceId string + ComponentsView []ComponentView +} + +type ComponentView struct { + Name string + Status string + Action string + Content string +} + +func GetServiceDeployModel(response *v1.DeployServiceResponse) ServiceDeployModel { + serviceName := response.GetServiceResponse().Name + + serviceView := ServiceView{ + Name: serviceName, + Action: response.GetServiceResponse().ServiceStatus.GetServiceAction(), + Status: response.GetServiceResponse().ServiceStatus.GetServiceStatus(), + TraceId: "random-trace-id", + ComponentsView: make([]ComponentView, 0), + } + for _, component := range response.GetServiceResponse().GetComponentsStatus() { + errorMessage := "Awaiting component logs" + if component.GetError() != "" { + errorMessage = component.GetError() + } + componentView := ComponentView{ + Name: component.GetComponentName(), + Action: component.GetComponentAction(), + Status: component.GetComponentStatus(), + Content: errorMessage, + } + serviceView.ComponentsView = append(serviceView.ComponentsView, componentView) + } + return ServiceDeployModel{ + ServiceView: serviceView, + } +} diff --git a/pkg/ui/styles.go b/internal/ui/styles.go similarity index 100% rename from pkg/ui/styles.go rename to internal/ui/styles.go diff --git a/proto/gen/go/dream11/oam/dto/v1/provider_account.pb.go b/proto/gen/go/dream11/oam/dto/v1/provider_account.pb.go index 5c2052c2..e62b689d 100644 --- a/proto/gen/go/dream11/oam/dto/v1/provider_account.pb.go +++ b/proto/gen/go/dream11/oam/dto/v1/provider_account.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/oam/dto/v1/provider_account.proto package v1 diff --git a/proto/gen/go/dream11/oam/provideraccount/v1/provider_account.pb.go b/proto/gen/go/dream11/oam/provideraccount/v1/provider_account.pb.go index ad377710..0e92fef9 100644 --- a/proto/gen/go/dream11/oam/provideraccount/v1/provider_account.pb.go +++ b/proto/gen/go/dream11/oam/provideraccount/v1/provider_account.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/oam/provideraccount/v1/provider_account.proto package v1 diff --git a/proto/gen/go/dream11/oam/provideraccount/v1/provider_account_grpc.pb.go b/proto/gen/go/dream11/oam/provideraccount/v1/provider_account_grpc.pb.go index 058d5d5c..66fa33eb 100644 --- a/proto/gen/go/dream11/oam/provideraccount/v1/provider_account_grpc.pb.go +++ b/proto/gen/go/dream11/oam/provideraccount/v1/provider_account_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.26.1 +// - protoc v5.29.3 // source: dream11/oam/provideraccount/v1/provider_account.proto package v1 diff --git a/proto/gen/go/dream11/od/auth/v1/auth.pb.go b/proto/gen/go/dream11/od/auth/v1/auth.pb.go index 81dba86b..c00c872d 100644 --- a/proto/gen/go/dream11/od/auth/v1/auth.pb.go +++ b/proto/gen/go/dream11/od/auth/v1/auth.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/od/auth/v1/auth.proto package v1 diff --git a/proto/gen/go/dream11/od/auth/v1/auth_grpc.pb.go b/proto/gen/go/dream11/od/auth/v1/auth_grpc.pb.go index dce36b78..85bc99fd 100644 --- a/proto/gen/go/dream11/od/auth/v1/auth_grpc.pb.go +++ b/proto/gen/go/dream11/od/auth/v1/auth_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.26.1 +// - protoc v5.29.3 // source: dream11/od/auth/v1/auth.proto package v1 diff --git a/proto/gen/go/dream11/od/component/v1/component.pb.go b/proto/gen/go/dream11/od/component/v1/component.pb.go index dc0b79b1..7c566b81 100644 --- a/proto/gen/go/dream11/od/component/v1/component.pb.go +++ b/proto/gen/go/dream11/od/component/v1/component.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/od/component/v1/component.proto package v1 diff --git a/proto/gen/go/dream11/od/component/v1/component_grpc.pb.go b/proto/gen/go/dream11/od/component/v1/component_grpc.pb.go index 5989ad67..da28f65f 100644 --- a/proto/gen/go/dream11/od/component/v1/component_grpc.pb.go +++ b/proto/gen/go/dream11/od/component/v1/component_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.26.1 +// - protoc v5.29.3 // source: dream11/od/component/v1/component.proto package v1 diff --git a/proto/gen/go/dream11/od/dto/v1/component.pb.go b/proto/gen/go/dream11/od/dto/v1/component.pb.go index 6b17f5c4..21e614ab 100644 --- a/proto/gen/go/dream11/od/dto/v1/component.pb.go +++ b/proto/gen/go/dream11/od/dto/v1/component.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/od/dto/v1/component.proto package v1 diff --git a/proto/gen/go/dream11/od/dto/v1/component_task.pb.go b/proto/gen/go/dream11/od/dto/v1/component_task.pb.go index 41778f2d..053445e0 100644 --- a/proto/gen/go/dream11/od/dto/v1/component_task.pb.go +++ b/proto/gen/go/dream11/od/dto/v1/component_task.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/od/dto/v1/component_task.proto package v1 diff --git a/proto/gen/go/dream11/od/dto/v1/environment.pb.go b/proto/gen/go/dream11/od/dto/v1/environment.pb.go index fa67eb85..d8e0d070 100644 --- a/proto/gen/go/dream11/od/dto/v1/environment.pb.go +++ b/proto/gen/go/dream11/od/dto/v1/environment.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/od/dto/v1/environment.proto package v1 diff --git a/proto/gen/go/dream11/od/dto/v1/provisioning_type.pb.go b/proto/gen/go/dream11/od/dto/v1/provisioning_type.pb.go index 4f70b6ae..51ae9600 100644 --- a/proto/gen/go/dream11/od/dto/v1/provisioning_type.pb.go +++ b/proto/gen/go/dream11/od/dto/v1/provisioning_type.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/od/dto/v1/provisioning_type.proto package v1 diff --git a/proto/gen/go/dream11/od/dto/v1/service.pb.go b/proto/gen/go/dream11/od/dto/v1/service.pb.go index 7344ef6a..ea012c09 100644 --- a/proto/gen/go/dream11/od/dto/v1/service.pb.go +++ b/proto/gen/go/dream11/od/dto/v1/service.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/od/dto/v1/service.proto package v1 diff --git a/proto/gen/go/dream11/od/dto/v1/service_task.pb.go b/proto/gen/go/dream11/od/dto/v1/service_task.pb.go index 5576de04..513c5c38 100644 --- a/proto/gen/go/dream11/od/dto/v1/service_task.pb.go +++ b/proto/gen/go/dream11/od/dto/v1/service_task.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/od/dto/v1/service_task.proto package v1 diff --git a/proto/gen/go/dream11/od/environment/v1/environment.pb.go b/proto/gen/go/dream11/od/environment/v1/environment.pb.go index 45839571..c0e13e7f 100644 --- a/proto/gen/go/dream11/od/environment/v1/environment.pb.go +++ b/proto/gen/go/dream11/od/environment/v1/environment.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/od/environment/v1/environment.proto package v1 diff --git a/proto/gen/go/dream11/od/environment/v1/environment_grpc.pb.go b/proto/gen/go/dream11/od/environment/v1/environment_grpc.pb.go index e5f7e77d..88e64bcd 100644 --- a/proto/gen/go/dream11/od/environment/v1/environment_grpc.pb.go +++ b/proto/gen/go/dream11/od/environment/v1/environment_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.26.1 +// - protoc v5.29.3 // source: dream11/od/environment/v1/environment.proto package v1 diff --git a/proto/gen/go/dream11/od/service/v1/service.pb.go b/proto/gen/go/dream11/od/service/v1/service.pb.go index 505509b2..41801a01 100644 --- a/proto/gen/go/dream11/od/service/v1/service.pb.go +++ b/proto/gen/go/dream11/od/service/v1/service.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc v5.29.3 // source: dream11/od/service/v1/service.proto package v1 diff --git a/proto/gen/go/dream11/od/service/v1/service_grpc.pb.go b/proto/gen/go/dream11/od/service/v1/service_grpc.pb.go index daab0198..c80cb4cc 100644 --- a/proto/gen/go/dream11/od/service/v1/service_grpc.pb.go +++ b/proto/gen/go/dream11/od/service/v1/service_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.26.1 +// - protoc v5.29.3 // source: dream11/od/service/v1/service.proto package v1