Skip to content
This repository has been archived by the owner on Jan 19, 2023. It is now read-only.

Slow tabs #861

Merged
merged 2 commits into from
Apr 22, 2020
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
112 changes: 23 additions & 89 deletions internal/describer/crd.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,51 +8,42 @@ package describer
import (
"context"
"fmt"
"github.com/pkg/errors"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"

"github.com/vmware-tanzu/octant/internal/config"
"github.com/vmware-tanzu/octant/internal/gvk"
"github.com/vmware-tanzu/octant/internal/link"
"github.com/vmware-tanzu/octant/internal/modules/overview/yamlviewer"
"github.com/vmware-tanzu/octant/internal/octant"
"github.com/vmware-tanzu/octant/internal/printer"
"github.com/vmware-tanzu/octant/internal/queryer"
"github.com/vmware-tanzu/octant/internal/resourceviewer"
"github.com/vmware-tanzu/octant/pkg/icon"
"github.com/vmware-tanzu/octant/pkg/store"
"github.com/vmware-tanzu/octant/pkg/view/component"
)

type crdPrinter func(ctx context.Context, crd, object *unstructured.Unstructured, options printer.Options) (component.Component, error)
type metadataPrinter func(runtime.Object, link.Interface) (*component.FlexLayout, error)
type resourceViewerPrinter func(ctx context.Context, object *unstructured.Unstructured, dashConfig config.Dash, q queryer.Queryer) (component.Component, error)
type yamlPrinter func(runtime.Object) (*component.Editor, error)
func defaultCustomResourceTabs(crdName string) []Tab {
return []Tab{
{Name: "Summary", Factory: CustomResourceSummaryTab(crdName)},
{Name: "Metadata", Factory: MetadataTab},
{Name: "Resource Viewer", Factory: ResourceViewerTab},
{Name: "YAML", Factory: YAMLViewerTab},
}
}

type crdOption func(*crd)

type crd struct {
base

path string
name string
summaryPrinter crdPrinter
metadataPrinter metadataPrinter
resourceViewerPrinter resourceViewerPrinter
yamlPrinter yamlPrinter
path string
name string
tabsGenerator TabsGenerator
tabFuncDescriptors []Tab
}

var _ Describer = (*crd)(nil)

func newCRD(name, path string, options ...crdOption) *crd {
d := &crd{
path: path,
name: name,
summaryPrinter: printer.CustomResourceHandler,
metadataPrinter: printer.MetadataHandler,
resourceViewerPrinter: createCRDResourceViewer,
yamlPrinter: yamlviewer.ToComponent,
path: path,
name: name,
tabsGenerator: NewObjectTabsGenerator(),
tabFuncDescriptors: defaultCustomResourceTabs(name),
}

for _, option := range options {
Expand Down Expand Up @@ -110,57 +101,18 @@ func (c *crd) Describe(ctx context.Context, namespace string, options Options) (
cr.IconName = iconName
cr.IconSource = iconSource

linkGenerator, err := link.NewFromDashConfig(options)
if err != nil {
return component.EmptyContentResponse, err
}

printOptions := printer.Options{
DashConfig: options,
Link: linkGenerator,
}

summary, err := c.summaryPrinter(ctx, crd, object, printOptions)
if err != nil {
return component.EmptyContentResponse, err
}
summary.SetAccessor("summary")

cr.Add(summary)

metadata, err := c.metadataPrinter(object, linkGenerator)
if err != nil {
return component.EmptyContentResponse, err
}
metadata.SetAccessor("metadata")
cr.Add(metadata)

resourceViewerComponent, err := c.resourceViewerPrinter(ctx, object, options, options.Queryer)
if err != nil {
return component.EmptyContentResponse, err
}

resourceViewerComponent.SetAccessor("resourceViewer")
cr.Add(resourceViewerComponent)

yvComponent, err := c.yamlPrinter(object)
if err != nil {
return component.EmptyContentResponse, err
generatorConfig := TabsGeneratorConfig{
Object: object,
TabsFactory: objectTabsFactory(ctx, object, c.tabFuncDescriptors, options),
Options: options,
}

yvComponent.SetAccessor("yaml")
cr.Add(yvComponent)

pluginPrinter := options.PluginManager()
tabs, err := pluginPrinter.Tabs(ctx, object)
tabComponents, err := c.tabsGenerator.Generate(ctx, generatorConfig)
if err != nil {
return component.EmptyContentResponse, errors.Wrap(err, "getting tabs from plugins")
return component.EmptyContentResponse, fmt.Errorf("generate tabs: %w", err)
}

for _, tab := range tabs {
tab.Contents.SetAccessor(tab.Name)
cr.Add(&tab.Contents)
}
cr.Add(tabComponents...)

return *cr, nil
}
Expand All @@ -170,21 +122,3 @@ func (c *crd) PathFilters() []PathFilter {
*NewPathFilter(c.path, c),
}
}

func createCRDResourceViewer(ctx context.Context, object *unstructured.Unstructured, dashConfig config.Dash, q queryer.Queryer) (component.Component, error) {
rv, err := resourceviewer.New(dashConfig, resourceviewer.WithDefaultQueryer(dashConfig, q))
if err != nil {
return nil, err
}

handler, err := resourceviewer.NewHandler(dashConfig)
if err != nil {
return nil, err
}

if err := rv.Visit(ctx, object, handler); err != nil {
return nil, err
}

return resourceviewer.GenerateComponent(ctx, handler, "")
}
4 changes: 2 additions & 2 deletions internal/describer/describer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ func createPodTable(pods ...corev1.Pod) *component.Table {
return table
}

func podListType() interface{} {
func PodListType() interface{} {
return &corev1.PodList{}
}

func podObjectType() interface{} {
func PodObjectType() interface{} {
return &corev1.Pod{}
}
51 changes: 51 additions & 0 deletions internal/describer/fake/mock_tabs_generator.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions internal/describer/list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ func TestListDescriber(t *testing.T) {
Path: thePath,
Title: "list",
StoreKey: key,
ListType: podListType,
ObjectType: podObjectType,
ListType: PodListType,
ObjectType: PodObjectType,
IsClusterWide: false,
IconName: "icon-name",
IconSource: "icon-source",
Expand Down