Skip to content

Commit

Permalink
feat: add plugin custom charts (#169)
Browse files Browse the repository at this point in the history
* feat: add plugin custom charts

* fix: overview chart replacement problem
  • Loading branch information
Mahanmmi authored May 30, 2024
1 parent 75ca598 commit de348f2
Show file tree
Hide file tree
Showing 12 changed files with 1,483 additions and 324 deletions.
40 changes: 27 additions & 13 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -243,19 +243,33 @@ func Execute() {
statusBar := view.NewStatusBarView(jobsController, helpController)
jobsPage := view.NewJobsPage(jobsController, helpController, statusBar)

optimizationsController := controller.NewOptimizations()
optimizationsPage := view.NewOptimizationsView(optimizationsController, helpController, statusBar)
optimizationsDetailsPage := view.NewOptimizationDetailsView(optimizationsController, helpController, statusBar)
preferencesPage := view.NewPreferencesConfiguration(helpController, optimizationsController, statusBar)

manager.SetUI(jobsController, optimizationsController)

p := tea.NewProgram(view.NewApp(
optimizationsPage,
optimizationsDetailsPage,
preferencesPage,
jobsPage,
), tea.WithFPS(10))
var app *view.App
if runningPlg.Plugin.Config.DevicesChart != nil && runningPlg.Plugin.Config.OverviewChart != nil {
optimizationsController := controller.NewOptimizations[golang.ChartOptimizationItem]()
optimizationsPage := view.NewPluginCustomOverviewPageView(runningPlg.Plugin.Config.OverviewChart, optimizationsController, helpController, statusBar)
optimizationsDetailsPage := view.NewPluginCustomOptimizationDetailsView(runningPlg.Plugin.Config.DevicesChart, optimizationsController, helpController, statusBar)
preferencesPage := view.NewPreferencesConfiguration(helpController, optimizationsController, statusBar)
manager.SetCustomUI(jobsController, optimizationsController)
app = view.NewCustomPluginApp(
optimizationsPage,
optimizationsDetailsPage,
preferencesPage,
jobsPage,
)
} else {
optimizationsController := controller.NewOptimizations[golang.OptimizationItem]()
optimizationsPage := view.NewOptimizationsView(optimizationsController, helpController, statusBar)
optimizationsDetailsPage := view.NewOptimizationDetailsView(optimizationsController, helpController, statusBar)
preferencesPage := view.NewPreferencesConfiguration(helpController, optimizationsController, statusBar)
manager.SetDefaultUI(jobsController, optimizationsController)
app = view.NewApp(
optimizationsPage,
optimizationsDetailsPage,
preferencesPage,
jobsPage,
)
}
p := tea.NewProgram(app, tea.WithFPS(10))
if _, err := p.Run(); err != nil {
return err
}
Expand Down
47 changes: 29 additions & 18 deletions controller/optimization.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,42 @@ import (
"github.com/kaytu-io/kaytu/pkg/plugin/proto/src/golang"
)

type Optimizations struct {
itemsChan chan *golang.OptimizationItem
items []*golang.OptimizationItem
type Optimizations[T golang.OptimizationItem | golang.ChartOptimizationItem] struct {
itemsChan chan *T
items []*T

selectedItem *golang.OptimizationItem
selectedItem *T

reEvaluateFunc func(id string, items []*golang.PreferenceItem)
}

func NewOptimizations() *Optimizations {
o := Optimizations{
itemsChan: make(chan *golang.OptimizationItem, 1000),
func NewOptimizations[T golang.OptimizationItem | golang.ChartOptimizationItem]() *Optimizations[T] {
o := Optimizations[T]{
itemsChan: make(chan *T, 1000),
}
go o.Process()
return &o
}

func (o *Optimizations) Process() {
func (o *Optimizations[T]) Process() {
for newItem := range o.itemsChan {
updated := false
for idx, i := range o.items {
if newItem.Id == i.Id {
o.items[idx] = newItem
updated = true
break
switch castedNewItem := any(newItem).(type) {
case *golang.OptimizationItem:
castedI := any(i).(*golang.OptimizationItem)
if castedNewItem.Id == castedI.Id {
o.items[idx] = newItem
updated = true
break
}
case *golang.ChartOptimizationItem:
castedI := any(i).(*golang.ChartOptimizationItem)
if castedNewItem.GetOverviewChartRow().GetRowId() == castedI.GetOverviewChartRow().GetRowId() {
o.items[idx] = newItem
updated = true
break
}
}
}
if !updated {
Expand All @@ -37,26 +48,26 @@ func (o *Optimizations) Process() {
}
}

func (o *Optimizations) SendItem(item *golang.OptimizationItem) {
func (o *Optimizations[T]) SendItem(item *T) {
o.itemsChan <- item
}

func (o *Optimizations) Items() []*golang.OptimizationItem {
func (o *Optimizations[T]) Items() []*T {
return o.items
}

func (o *Optimizations) SetReEvaluateFunc(f func(id string, items []*golang.PreferenceItem)) {
func (o *Optimizations[T]) SetReEvaluateFunc(f func(id string, items []*golang.PreferenceItem)) {
o.reEvaluateFunc = f
}

func (o *Optimizations) SelectItem(i *golang.OptimizationItem) {
func (o *Optimizations[T]) SelectItem(i *T) {
o.selectedItem = i
}

func (o *Optimizations) SelectedItem() *golang.OptimizationItem {
func (o *Optimizations[T]) SelectedItem() *T {
return o.selectedItem
}

func (o *Optimizations) ReEvaluate(id string, preferences []*golang.PreferenceItem) {
func (o *Optimizations[T]) ReEvaluate(id string, preferences []*golang.PreferenceItem) {
o.reEvaluateFunc(id, preferences)
}
32 changes: 29 additions & 3 deletions pkg/plugin/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ type Manager struct {

golang.PluginServer

jobs *controller.Jobs
optimizations *controller.Optimizations
jobs *controller.Jobs
optimizations *controller.Optimizations[golang.OptimizationItem]
pluginCustomOptimizations *controller.Optimizations[golang.ChartOptimizationItem]

NonInteractiveView *view.NonInteractiveView
}
Expand Down Expand Up @@ -147,8 +148,17 @@ func (m *Manager) Register(stream golang.Plugin_RegisterServer) error {
m.jobs.Publish(receivedMsg.GetJob())

case receivedMsg.GetOi() != nil:
if m.optimizations == nil {
return errors.New("default optimizations controller not set - is plugin running in custom ui mode?")
}
m.optimizations.SendItem(receivedMsg.GetOi())

case receivedMsg.GetCoi() != nil:
if m.pluginCustomOptimizations == nil {
return errors.New("custom optimizations controller not set - is plugin running in default ui mode?")
}
m.pluginCustomOptimizations.SendItem(receivedMsg.GetCoi())

case receivedMsg.GetErr() != nil:
m.jobs.PublishError(fmt.Errorf(receivedMsg.GetErr().Error))
}
Expand Down Expand Up @@ -301,7 +311,7 @@ func (m *Manager) Install(addr, token string, unsafe bool) error {
return nil
}

func (m *Manager) SetUI(jobs *controller.Jobs, optimizations *controller.Optimizations) {
func (m *Manager) SetDefaultUI(jobs *controller.Jobs, optimizations *controller.Optimizations[golang.OptimizationItem]) {
m.jobs = jobs
m.optimizations = optimizations

Expand All @@ -317,6 +327,22 @@ func (m *Manager) SetUI(jobs *controller.Jobs, optimizations *controller.Optimiz
})
}

func (m *Manager) SetCustomUI(jobs *controller.Jobs, optimizations *controller.Optimizations[golang.ChartOptimizationItem]) {
m.jobs = jobs
m.pluginCustomOptimizations = optimizations

optimizations.SetReEvaluateFunc(func(id string, items []*golang.PreferenceItem) {
m.stream.Send(&golang.ServerMessage{
ServerMessage: &golang.ServerMessage_ReEvaluate{
ReEvaluate: &golang.ReEvaluate{
Id: id,
Preferences: items,
},
},
})
})
}

func (m *Manager) SetNonInteractiveView() {
m.NonInteractiveView = view.NewNonInteractiveView()
}
Expand Down
40 changes: 40 additions & 0 deletions pkg/plugin/proto/plugin.proto
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,28 @@ message RegisterConfig {
string provider = 3;
repeated Command commands = 4;
string min_kaytu_version = 5;

ChartDefinition overview_chart = 6;
ChartDefinition devices_chart = 7;
}

message ChartRowItem {
string value = 1;
}

message ChartRow {
string row_id = 1;
map<string, ChartRowItem> values = 2; // Column Id -> Item
}

message ChartColumnItem {
string id = 1;
string name = 2;
uint32 width = 3;
}

message ChartDefinition {
repeated ChartColumnItem columns = 2;
}

message Error {
Expand All @@ -47,6 +69,10 @@ message Property {
bool hidden = 6;
}

message Properties {
repeated Property properties = 1;
}

message Device {
string device_id = 1;
string resource_type = 2;
Expand Down Expand Up @@ -83,6 +109,19 @@ message OptimizationItem {
bool lazy_loading_enabled = 12;
}

message ChartOptimizationItem {
ChartRow overview_chart_row = 1;
repeated PreferenceItem preferences = 2;
bool loading = 3;
bool skipped = 4;
google.protobuf.StringValue skip_reason = 5;
bool lazy_loading_enabled = 6;
string description = 7;

repeated ChartRow devices_chart_rows = 8;
map<string, Properties> devices_properties = 9; // Device Row id -> Row properties
}

message ResultsReady {
bool ready = 1;
}
Expand All @@ -94,6 +133,7 @@ message PluginMessage {
RegisterConfig conf = 3;
Error err = 4;
ResultsReady ready = 5;
ChartOptimizationItem coi = 6;
}
}

Expand Down
Loading

0 comments on commit de348f2

Please sign in to comment.