diff --git a/cli/cmd/network.go b/cli/cmd/network.go index 276049f4..6a98cd30 100644 --- a/cli/cmd/network.go +++ b/cli/cmd/network.go @@ -51,7 +51,7 @@ func (r *runners) completeNetworkNames(cmd *cobra.Command, args []string, toComp return nil, cobra.ShellCompDirectiveNoFileComp } - networks, err := r.kotsAPI.ListNetworks(nil, nil) + networks, err := r.kotsAPI.ListNetworks(false, nil, nil) if err != nil { return nil, cobra.ShellCompDirectiveError } @@ -71,7 +71,7 @@ func (r *runners) completeNetworkIDs(cmd *cobra.Command, args []string, toComple return nil, cobra.ShellCompDirectiveNoFileComp } - networks, err := r.kotsAPI.ListNetworks(nil, nil) + networks, err := r.kotsAPI.ListNetworks(false, nil, nil) if err != nil { return nil, cobra.ShellCompDirectiveError } @@ -89,7 +89,7 @@ func (r *runners) completeNetworkIDsAndNames(cmd *cobra.Command, args []string, return nil, cobra.ShellCompDirectiveNoFileComp } - networks, err := r.kotsAPI.ListNetworks(nil, nil) + networks, err := r.kotsAPI.ListNetworks(false, nil, nil) if err != nil { return nil, cobra.ShellCompDirectiveError } @@ -115,7 +115,7 @@ func (r *runners) getNetworkIDFromArg(arg string) (string, error) { return "", errors.Wrap(err, "get network") } - networks, err := r.kotsAPI.ListNetworks(nil, nil) + networks, err := r.kotsAPI.ListNetworks(false, nil, nil) if errors.Cause(err) == platformclient.ErrForbidden { return "", ErrCompatibilityMatrixTermsNotAccepted } else if err != nil { diff --git a/cli/cmd/network_ls.go b/cli/cmd/network_ls.go index 4ab3022a..82b0c483 100644 --- a/cli/cmd/network_ls.go +++ b/cli/cmd/network_ls.go @@ -22,6 +22,8 @@ func (r *runners) InitNetworkList(parent *cobra.Command) *cobra.Command { } parent.AddCommand(cmd) + cmd.Flags().BoolVar(&r.args.lsNetworkShowTerminated, "show-terminated", false, "when set, only show terminated networks") + cmd.Flags().BoolVar(&r.args.lsNetworkShowReports, "show-reports", false, "when set, only show networks that have reports") cmd.Flags().StringVar(&r.args.lsNetworkStartTime, "start-time", "", "start time for the query (Format: 2006-01-02T15:04:05Z)") cmd.Flags().StringVar(&r.args.lsNetworkEndTime, "end-time", "", "end time for the query (Format: 2006-01-02T15:04:05Z)") cmd.Flags().StringVarP(&r.outputFormat, "output", "o", "table", "The output format to use. One of: json|table|wide") @@ -48,13 +50,24 @@ func (r *runners) listNetworks(_ *cobra.Command, args []string) error { endTime = &et } - networks, err := r.kotsAPI.ListNetworks(startTime, endTime) + networks, err := r.kotsAPI.ListNetworks(r.args.lsNetworkShowTerminated, startTime, endTime) if errors.Cause(err) == platformclient.ErrForbidden { return ErrCompatibilityMatrixTermsNotAccepted } else if err != nil { return errors.Wrap(err, "list networks") } + // Filter networks if --show-reports is set + if r.args.lsNetworkShowReports { + filteredNetworks := make([]*types.Network, 0) + for _, network := range networks { + if network.HasReport { + filteredNetworks = append(filteredNetworks, network) + } + } + networks = filteredNetworks + } + header := true if r.args.lsNetworkWatch { @@ -74,7 +87,7 @@ func (r *runners) listNetworks(_ *cobra.Command, args []string) error { // Runs until ctrl C is recognized for range time.Tick(2 * time.Second) { - newNetworks, err := r.kotsAPI.ListNetworks(startTime, endTime) + newNetworks, err := r.kotsAPI.ListNetworks(r.args.lsNetworkShowTerminated, startTime, endTime) if err != nil { if err == promptui.ErrInterrupt { return errors.New("interrupted") @@ -83,6 +96,17 @@ func (r *runners) listNetworks(_ *cobra.Command, args []string) error { return errors.Wrap(err, "watch networks") } + // Filter networks if --show-reports is set + if r.args.lsNetworkShowReports { + filteredNetworks := make([]*types.Network, 0) + for _, network := range newNetworks { + if network.HasReport { + filteredNetworks = append(filteredNetworks, network) + } + } + newNetworks = filteredNetworks + } + // Create a map from the IDs of the new networks newNetworkMap := make(map[string]*types.Network) for _, newNetwork := range newNetworks { diff --git a/cli/cmd/network_rm.go b/cli/cmd/network_rm.go index 8f4aaa9a..920a157c 100644 --- a/cli/cmd/network_rm.go +++ b/cli/cmd/network_rm.go @@ -60,7 +60,7 @@ func (r *runners) removeNetworks(_ *cobra.Command, args []string) error { } if len(r.args.removeNetworkNames) > 0 { - networks, err := r.kotsAPI.ListNetworks(nil, nil) + networks, err := r.kotsAPI.ListNetworks(false, nil, nil) if err != nil { return errors.Wrap(err, "list networks") } @@ -77,7 +77,7 @@ func (r *runners) removeNetworks(_ *cobra.Command, args []string) error { } if r.args.removeNetworkAll { - networks, err := r.kotsAPI.ListNetworks(nil, nil) + networks, err := r.kotsAPI.ListNetworks(false, nil, nil) if err != nil { return errors.Wrap(err, "list networks") } @@ -99,7 +99,7 @@ func (r *runners) removeNetworks(_ *cobra.Command, args []string) error { continue } - networks, err := r.kotsAPI.ListNetworks(nil, nil) + networks, err := r.kotsAPI.ListNetworks(false, nil, nil) if err != nil { return errors.Wrap(err, "list networks") } diff --git a/cli/cmd/network_update.go b/cli/cmd/network_update.go index bfbf890d..e34d1c6f 100644 --- a/cli/cmd/network_update.go +++ b/cli/cmd/network_update.go @@ -91,7 +91,7 @@ func (r *runners) ensureUpdateNetworkIDArg(args []string) error { } r.args.updateNetworkID = networkID } else if r.args.updateNetworkName != "" { - networks, err := r.kotsAPI.ListNetworks(nil, nil) + networks, err := r.kotsAPI.ListNetworks(false, nil, nil) if errors.Cause(err) == platformclient.ErrForbidden { return ErrCompatibilityMatrixTermsNotAccepted } else if err != nil { diff --git a/cli/cmd/runner.go b/cli/cmd/runner.go index 768490e5..ca5b4043 100644 --- a/cli/cmd/runner.go +++ b/cli/cmd/runner.go @@ -247,9 +247,11 @@ type runnerArgs struct { createNetworkWaitDuration time.Duration createNetworkDryRun bool - lsNetworkStartTime string - lsNetworkEndTime string - lsNetworkWatch bool + lsNetworkShowTerminated bool + lsNetworkShowReports bool + lsNetworkStartTime string + lsNetworkEndTime string + lsNetworkWatch bool networkReportID string networkReportWatch bool diff --git a/cli/print/networks.go b/cli/print/networks.go index f8fda55d..c47c3b0f 100644 --- a/cli/print/networks.go +++ b/cli/print/networks.go @@ -11,9 +11,9 @@ import ( // Table formatting var ( - networksTmplTableHeaderSrc = `ID NAME STATUS CREATED EXPIRES POLICY REPORTING` + networksTmplTableHeaderSrc = `ID NAME STATUS CREATED EXPIRES POLICY HAS REPORT` networksTmplTableRowSrc = `{{ range . -}} -{{ .ID }} {{ padding .Name 27 }} {{ padding (printf "%s" .Status) 12 }} {{ padding (printf "%s" (localeTime .CreatedAt)) 30 }} {{if .ExpiresAt.IsZero}}{{ padding "-" 30 }}{{else}}{{ padding (printf "%s" (localeTime .ExpiresAt)) 30 }}{{end}} {{if eq .Policy ""}}{{ padding "open" 30 }}{{else}}{{ padding (printf "%s" (.Policy)) 30 }}{{end}} {{if .CollectReport}}{{ padding "on" 30 }}{{else}}{{ padding "off" 30 }}{{end}} +{{ printf "%.8s" .ID }} {{ padding .Name 27 }} {{ padding (printf "%s" .Status) 12 }} {{ padding (printf "%s" (localeTime .CreatedAt)) 30 }} {{if .ExpiresAt.IsZero}}{{ padding "-" 30 }}{{else}}{{ padding (printf "%s" (localeTime .ExpiresAt)) 30 }}{{end}} {{if eq .Policy ""}}{{ padding "open" 10 }}{{else}}{{ padding (printf "%s" (.Policy)) 10 }}{{end}} {{if .HasReport}}{{ padding "yes" 10 }}{{else}}{{ padding "no" 10 }}{{end}} {{ end }}` ) @@ -25,9 +25,11 @@ var ( // Wide table formatting var ( - networksTmplWideHeaderSrc = `ID NAME STATUS CREATED EXPIRES POLICY REPORTING` + networksTmplWideHeaderSrc = `ID NAME STATUS CREATED EXPIRES POLICY HAS REPORT REPORTING RESOURCES` networksTmplWideRowSrc = `{{ range . -}} -{{ .ID }} {{ padding .Name 27 }} {{ padding (printf "%s" .Status) 12 }} {{ padding (printf "%s" (localeTime .CreatedAt)) 30 }} {{if .ExpiresAt.IsZero}}{{ padding "-" 30 }}{{else}}{{ padding (printf "%s" (localeTime .ExpiresAt)) 30 }}{{end}} {{if eq .Policy ""}}{{ padding "open" 30 }}{{else}}{{ padding (printf "%s" (.Policy)) 30 }}{{end}} {{if .CollectReport}}{{ padding "on" 30 }}{{else}}{{ padding "off" 30 }}{{end}} +{{ printf "%.8s" .ID }} {{ padding .Name 27 }} {{ padding (printf "%s" .Status) 12 }} {{ padding (printf "%s" (localeTime .CreatedAt)) 30 }} {{if .ExpiresAt.IsZero}}{{ padding "-" 30 }}{{else}}{{ padding (printf "%s" (localeTime .ExpiresAt)) 30 }}{{end}} {{if eq .Policy ""}}{{ padding "open" 10 }}{{else}}{{ padding (printf "%s" (.Policy)) 10 }}{{end}} {{if .HasReport}}{{ padding "yes" 10 }}{{else}}{{ padding "no" 10 }}{{end}} {{if .CollectReport}}{{ padding "on" 10 }}{{else}}{{ padding "off" 10 }}{{end}} {{if eq (len .Resources) 0}}-{{else}}{{ range $index, $resource := .Resources }}{{if $index}} + {{end}}{{ $resource.Distribution }}: {{ $resource.Name }} ({{ $resource.ID }}){{ end }}{{end}} + {{ end }}` ) diff --git a/pkg/kotsclient/network_list.go b/pkg/kotsclient/network_list.go index ad19d8ee..601f008e 100644 --- a/pkg/kotsclient/network_list.go +++ b/pkg/kotsclient/network_list.go @@ -18,7 +18,7 @@ type ListNetworksResponse struct { TotalNetworks int `json:"totalNetworks"` } -func (c *VendorV3Client) ListNetworks(startTime *time.Time, endTime *time.Time) ([]*types.Network, error) { +func (c *VendorV3Client) ListNetworks(includeTerminated bool, startTime *time.Time, endTime *time.Time) ([]*types.Network, error) { allNetworks := []*types.Network{} page := 0 for { @@ -32,6 +32,7 @@ func (c *VendorV3Client) ListNetworks(startTime *time.Time, endTime *time.Time) v.Set("end-time", endTime.Format(time.RFC3339)) } v.Set("currentPage", strconv.Itoa(page)) + v.Set("show-terminated", strconv.FormatBool(includeTerminated)) url := fmt.Sprintf("/v3/networks?%s", v.Encode()) err := c.DoJSON(context.TODO(), "GET", url, http.StatusOK, nil, &networks) if err != nil { diff --git a/pkg/types/network.go b/pkg/types/network.go index 2db786c6..20de6098 100644 --- a/pkg/types/network.go +++ b/pkg/types/network.go @@ -17,8 +17,16 @@ type Network struct { OverlayEndpoint string `json:"overlay_endpoint,omitempty"` OverlayToken string `json:"overlay_token,omitempty"` - Policy string `json:"policy,omitempty"` - CollectReport bool `json:"collect_report,omitempty"` + Policy string `json:"policy,omitempty"` + CollectReport bool `json:"collect_report,omitempty"` + HasReport bool `json:"has_report,omitempty"` + Resources []*NetworkResource `json:"resources,omitempty"` +} + +type NetworkResource struct { + Name string `json:"name"` + Distribution string `json:"distribution"` + ID string `json:"id"` } type NetworkStatus string