Skip to content
Open
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
47 changes: 44 additions & 3 deletions kubernetes/table_kubernetes_custom_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ func tableKubernetesCustomResource(ctx context.Context) *plugin.Table {
activeVersion := ctx.Value(contextKey("ActiveVersion")).(string)
versionSchemaSpec := ctx.Value(contextKey("VersionSchemaSpec"))
versionSchemaStatus := ctx.Value(contextKey("VersionSchemaStatus"))
versionSchemaReport := ctx.Value(contextKey("VersionSchemaReport"))
tableName := ctx.Value(contextKey("TableName")).(string)

var description string
Expand All @@ -39,11 +40,11 @@ func tableKubernetesCustomResource(ctx context.Context) *plugin.Table {
List: &plugin.ListConfig{
Hydrate: listK8sCustomResources(ctx, crdName, resourceName, resourceNameSingular, groupName, activeVersion),
},
Columns: k8sCRDResourceCommonColumns(getCustomResourcesDynamicColumns(ctx, versionSchemaSpec, versionSchemaStatus)),
Columns: k8sCRDResourceCommonColumns(getCustomResourcesDynamicColumns(ctx, versionSchemaSpec, versionSchemaStatus, versionSchemaReport)),
}
}

func getCustomResourcesDynamicColumns(ctx context.Context, versionSchemaSpec interface{}, versionSchemaStatus interface{}) []*plugin.Column {
func getCustomResourcesDynamicColumns(ctx context.Context, versionSchemaSpec interface{}, versionSchemaStatus interface{},versionSchemaReport interface{}) []*plugin.Column {
Copy link

Copilot AI Dec 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing space after comma in function parameter list. Should be versionSchemaStatus interface{}, versionSchemaReport interface{} instead of versionSchemaStatus interface{},versionSchemaReport interface{}.

Suggested change
func getCustomResourcesDynamicColumns(ctx context.Context, versionSchemaSpec interface{}, versionSchemaStatus interface{},versionSchemaReport interface{}) []*plugin.Column {
func getCustomResourcesDynamicColumns(ctx context.Context, versionSchemaSpec interface{}, versionSchemaStatus interface{}, versionSchemaReport interface{}) []*plugin.Column {

Copilot uses AI. Check for mistakes.
columns := []*plugin.Column{}

// default metadata columns
Expand Down Expand Up @@ -103,7 +104,32 @@ func getCustomResourcesDynamicColumns(ctx context.Context, versionSchemaSpec int
columns = append(columns, column)
}
}

// add the report columns
schemaReport := versionSchemaReport.(v1.JSONSchemaProps)
Copy link

Copilot AI Dec 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Potential panic due to type assertion without nil check. If versionSchemaReport is nil, this type assertion will panic. Consider adding a nil check similar to the existing pattern or handling the case where report schema might not be present in the CRD:

if versionSchemaReport != nil {
    schemaReport := versionSchemaReport.(v1.JSONSchemaProps)
    // ... rest of the report columns logic
}

Copilot uses AI. Check for mistakes.
for k, v := range schemaReport.Properties {
flag := 0
for _, reportColumn := range allColumns {
if reportColumn == strcase.ToSnake(k) {
flag = 1
column := &plugin.Column{
Name: "report_" + strcase.ToSnake(k),
Description: v.Description,
Transform: transform.FromP(extractReportProperty, k),
}
setDynamicColumns(v, column)
columns = append(columns, column)
}
}
if flag == 0 {
column := &plugin.Column{
Name: strcase.ToSnake(k),
Description: v.Description,
Transform: transform.FromP(extractReportProperty, k),
}
Copy link

Copilot AI Dec 2, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The report columns logic does not update the allColumns slice when a new column is added (flag == 0), unlike the spec columns logic at line 75. This could lead to duplicate column names if subsequent sections (like report) have properties that overlap with earlier sections. Consider adding:

if flag == 0 {
    column := &plugin.Column{
        Name:        strcase.ToSnake(k),
        Description: v.Description,
        Transform:   transform.FromP(extractReportProperty, k),
    }
    allColumns = append(allColumns, strcase.ToSnake(k))  // Add this line
    setDynamicColumns(v, column)
    columns = append(columns, column)
}
Suggested change
}
}
allColumns = append(allColumns, strcase.ToSnake(k))

Copilot uses AI. Check for mistakes.
setDynamicColumns(v, column)
columns = append(columns, column)
}
}
return columns
}

Expand All @@ -118,6 +144,7 @@ type CRDResourceInfo struct {
Spec interface{}
Labels interface{}
Status interface{}
Report interface{}
Path string
StartLine int
EndLine int
Expand Down Expand Up @@ -166,6 +193,7 @@ func listK8sCustomResources(ctx context.Context, crdName string, resourceName st
Labels: deployment.GetLabels(),
Spec: data["spec"],
Status: data["status"],
Report: data["report"],
StartLine: content.StartLine,
EndLine: content.EndLine,
Path: content.Path,
Expand Down Expand Up @@ -210,6 +238,7 @@ func listK8sCustomResources(ctx context.Context, crdName string, resourceName st
Labels: crd.GetLabels(),
Spec: data["spec"],
Status: data["status"],
Report: data["report"],
SourceType: "deployed",
ContextName: currentContext.(string),
})
Expand Down Expand Up @@ -249,7 +278,19 @@ func extractStatusProperty(_ context.Context, d *transform.TransformData) (inter
if status[param] != nil {
return status[param], nil
}
return nil, nil
}

func extractReportProperty(_ context.Context, d *transform.TransformData) (interface{}, error) {
ob := d.HydrateItem.(*CRDResourceInfo).Report
if ob == nil {
return nil, nil
}
param := d.Param.(string)
report := ob.(map[string]interface{})
if report[param] != nil {
return report[param], nil
}
return nil, nil
}

Expand Down
Loading