/
list.go
126 lines (105 loc) · 3.85 KB
/
list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright 2024 The Carvel Authors.
// SPDX-License-Identifier: Apache-2.0
package installed
import (
"context"
"fmt"
"github.com/cppforlife/go-cli-ui/ui"
uitable "github.com/cppforlife/go-cli-ui/ui/table"
"github.com/spf13/cobra"
cmdcore "github.com/vmware-tanzu/carvel-kapp-controller/cli/pkg/kctrl/cmd/core"
"github.com/vmware-tanzu/carvel-kapp-controller/cli/pkg/kctrl/logger"
kcpkgv1alpha1 "github.com/vmware-tanzu/carvel-kapp-controller/pkg/apis/packaging/v1alpha1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type ListOptions struct {
ui ui.UI
depsFactory cmdcore.DepsFactory
logger logger.Logger
NamespaceFlags cmdcore.NamespaceFlags
AllNamespaces bool
Wide bool
pkgCmdTreeOpts cmdcore.PackageCommandTreeOpts
columns *[]string
}
func NewListOptions(ui ui.UI, depsFactory cmdcore.DepsFactory, logger logger.Logger, pkgCmdTreeOpts cmdcore.PackageCommandTreeOpts, columns *[]string) *ListOptions {
return &ListOptions{ui: ui, depsFactory: depsFactory, logger: logger, pkgCmdTreeOpts: pkgCmdTreeOpts, columns: columns}
}
func NewListCmd(o *ListOptions, flagsFactory cmdcore.FlagsFactory) *cobra.Command {
cmd := &cobra.Command{
Use: "list",
Aliases: []string{"l", "ls"},
Short: "List installed packages in a namespace",
RunE: func(_ *cobra.Command, _ []string) error { return o.Run() },
Example: cmdcore.Examples{
cmdcore.Example{"List installed packages",
[]string{"package", "installed", "list"},
},
cmdcore.Example{"List installed packages in all namespaces",
[]string{"package", "installed", "list", "-A"}},
}.Description("", o.pkgCmdTreeOpts),
SilenceUsage: true,
Annotations: map[string]string{"table": "",
cmdcore.PackageManagementCommandsHelpGroup.Key: cmdcore.PackageManagementCommandsHelpGroup.Value},
}
o.NamespaceFlags.SetWithPackageCommandTreeOpts(cmd, flagsFactory, o.pkgCmdTreeOpts)
cmd.Flags().BoolVarP(&o.AllNamespaces, "all-namespaces", "A", false, "List installed packages in all namespaces")
cmd.Flags().BoolVar(&o.Wide, "wide", false, "show additional info")
return cmd
}
func (o *ListOptions) Run() error {
tableTitle := fmt.Sprintf("Installed packages in namespace '%s'", o.NamespaceFlags.Name)
nsHeader := uitable.NewHeader("Namespace")
nsHeader.Hidden = true
if o.AllNamespaces {
o.NamespaceFlags.Name = ""
tableTitle = "Installed packages in all namespaces"
nsHeader.Hidden = false
}
client, err := o.depsFactory.KappCtrlClient()
if err != nil {
return err
}
pkgiList, err := client.PackagingV1alpha1().PackageInstalls(
o.NamespaceFlags.Name).List(context.Background(), metav1.ListOptions{})
if err != nil {
return err
}
messageHeader := uitable.NewHeader("Message")
messageHeader.Hidden = !o.Wide
table := uitable.Table{
Title: tableTitle,
Header: []uitable.Header{
nsHeader,
uitable.NewHeader("Name"),
uitable.NewHeader("Package Name"),
uitable.NewHeader("Package Version"),
uitable.NewHeader("Status"),
messageHeader,
},
SortBy: []uitable.ColumnSort{
{Column: 0, Asc: true},
{Column: 1, Asc: true},
},
}
for _, pkgi := range pkgiList.Items {
status, isFailing := packageInstallStatus(&pkgi)
table.Rows = append(table.Rows, []uitable.Value{
cmdcore.NewValueNamespace(pkgi.Namespace),
uitable.NewValueString(pkgi.Name),
uitable.NewValueString(pkgi.Spec.PackageRef.RefName),
uitable.NewValueString(pkgi.Status.Version),
uitable.ValueFmt{V: uitable.NewValueString(status), Error: isFailing},
cmdcore.NewValueTruncated(uitable.NewValueString(o.getPkgiStatusMessage(&pkgi)), 50),
})
}
return cmdcore.PrintTable(o.ui, table, o.columns)
}
func (o *ListOptions) getPkgiStatusMessage(pkgi *kcpkgv1alpha1.PackageInstall) string {
conditionsLen := len(pkgi.Status.Conditions)
if conditionsLen == 0 {
return ""
}
lastCondition := pkgi.Status.Conditions[conditionsLen-1]
return lastCondition.Message
}