Skip to content

Commit 10b82d8

Browse files
authored
feat(cmx): Refactor network update, add collect-report bool (#558)
* feat(cmx): Refactor network update, add collect-report bool This PR refactors network update to no longer accept subcommands and instead accept the '--policy' flag to modify policies. It also removes the 'network outbound' subcommand which has long been deprecated. Finally, the --collect-report bool has been added to the network update command to allow enabling/disabling network reporting on a network. If a network has the collect-report bool set to true the REPORTING column will show either on/off. Signed-off-by: Kyle Squizzato <[email protected]> * Unhide the network report subcommand Signed-off-by: Kyle Squizzato <[email protected]> --------- Signed-off-by: Kyle Squizzato <[email protected]>
1 parent c0bf68a commit 10b82d8

File tree

9 files changed

+103
-165
lines changed

9 files changed

+103
-165
lines changed

cli/cmd/network_report.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ replicated network report --id abc123 --watch --output table
2626
replicated network report --id abc123 --watch --output json`,
2727
RunE: r.getNetworkReport,
2828
ValidArgsFunction: r.completeNetworkIDs,
29-
Hidden: true,
3029
}
3130
parent.AddCommand(cmd)
3231

cli/cmd/network_update.go

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,40 @@ package cmd
22

33
import (
44
"github.com/pkg/errors"
5+
"github.com/replicatedhq/replicated/cli/print"
6+
"github.com/replicatedhq/replicated/pkg/kotsclient"
57
"github.com/replicatedhq/replicated/pkg/platformclient"
68
"github.com/spf13/cobra"
79
)
810

911
func (r *runners) InitNetworkUpdateCommand(parent *cobra.Command) *cobra.Command {
1012
cmd := &cobra.Command{
11-
Use: "update",
13+
Use: "update [ID_OR_NAME]",
1214
Short: "Update network settings.",
1315
Long: `The 'update' command allows you to update various settings of a test network.
1416
1517
You can either specify the network ID directly or provide the network name, and the command will resolve the corresponding network ID.`,
1618
Example: `# Update a network using its ID
17-
replicated network update --id <network-id> [subcommand]
19+
replicated network update <network-id> --policy airgap
1820
1921
# Update a network using its name
20-
replicated network update --name <network-name> [subcommand]`,
22+
replicated network update <network-name> --policy airgap
23+
24+
# Update using --id or --name flags
25+
replicated network update --id <network-id> --policy airgap
26+
replicated network update --name <network-name> --policy airgap
27+
28+
# Enable report collection on a network
29+
replicated network update <network-id> --collect-report
30+
31+
# Disable report collection on a network
32+
replicated network update <network-id> --collect-report=false
33+
34+
# Update both policy and report collection on a network
35+
replicated network update <network-id> --policy airgap --collect-report`,
36+
RunE: r.updateNetwork,
37+
SilenceUsage: true,
38+
ValidArgsFunction: r.completeNetworkIDsAndNames,
2139
}
2240
parent.AddCommand(cmd)
2341

@@ -27,9 +45,47 @@ replicated network update --name <network-name> [subcommand]`,
2745
cmd.PersistentFlags().StringVar(&r.args.updateNetworkID, "id", "", "id of the network to update (when name is not provided)")
2846
cmd.RegisterFlagCompletionFunc("id", r.completeNetworkIDs)
2947

48+
cmd.Flags().StringVar(&r.args.updateNetworkPolicy, "policy", "", "Update network policy setting")
49+
cmd.Flags().BoolVar(&r.args.updateNetworkCollectReport, "collect-report", false, "Enable report collection on this network (use --collect-report=false to disable)")
50+
cmd.Flags().StringVar(&r.outputFormat, "output", "table", "The output format to use. One of: json|table|wide")
51+
3052
return cmd
3153
}
3254

55+
func (r *runners) updateNetwork(cmd *cobra.Command, args []string) error {
56+
if err := r.ensureUpdateNetworkIDArg(args); err != nil {
57+
return errors.Wrap(err, "must provide network id or name")
58+
}
59+
60+
// Check if any update flags are provided
61+
if r.args.updateNetworkPolicy == "" && !cmd.Flags().Changed("collect-report") {
62+
// If no specific update flags are provided, show help
63+
return cmd.Help()
64+
}
65+
66+
// Prepare update options
67+
opts := kotsclient.UpdateNetworkOpts{}
68+
69+
if r.args.updateNetworkPolicy != "" {
70+
opts.Policy = r.args.updateNetworkPolicy
71+
}
72+
73+
if cmd.Flags().Changed("collect-report") {
74+
opts.CollectReport = r.args.updateNetworkCollectReport
75+
}
76+
77+
// Update the network
78+
network, err := r.kotsAPI.UpdateNetwork(r.args.updateNetworkID, opts)
79+
if errors.Cause(err) == platformclient.ErrForbidden {
80+
return ErrCompatibilityMatrixTermsNotAccepted
81+
}
82+
if err != nil {
83+
return errors.Wrap(err, "update network")
84+
}
85+
86+
return print.Network(r.outputFormat, r.w, network)
87+
}
88+
3389
func (r *runners) ensureUpdateNetworkIDArg(args []string) error {
3490
if len(args) > 0 {
3591
networkID, err := r.getNetworkIDFromArg(args[0])

cli/cmd/network_update_outbound.go

Lines changed: 0 additions & 71 deletions
This file was deleted.

cli/cmd/network_update_policy.go

Lines changed: 0 additions & 53 deletions
This file was deleted.

cli/cmd/root.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,7 @@ func Execute(rootCmd *cobra.Command, stdin io.Reader, stdout io.Writer, stderr i
287287
runCmds.InitNetworkJoin(networkCmd)
288288
runCmds.InitNetworkReport(networkCmd)
289289

290-
networkUpdateCmd := runCmds.InitNetworkUpdateCommand(networkCmd)
291-
runCmds.InitNetworkUpdateOutbound(networkUpdateCmd)
292-
runCmds.InitNetworkUpdatePolicy(networkUpdateCmd)
290+
runCmds.InitNetworkUpdateCommand(networkCmd)
293291

294292
runCmds.InitLoginCommand(runCmds.rootCmd)
295293
runCmds.InitLogoutCommand(runCmds.rootCmd)

cli/cmd/runner.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -248,10 +248,10 @@ type runnerArgs struct {
248248
networkReportID string
249249
networkReportWatch bool
250250

251-
updateNetworkOutbound string
252-
updateNetworkPolicy string
253-
updateNetworkName string
254-
updateNetworkID string
251+
updateNetworkPolicy string
252+
updateNetworkCollectReport bool
253+
updateNetworkName string
254+
updateNetworkID string
255255

256256
removeNetworkAll bool
257257
removeNetworkNames []string

cli/print/networks.go

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,32 @@ import (
1010
)
1111

1212
// Table formatting
13-
var networksTmplTableHeaderSrc = `ID NAME STATUS CREATED EXPIRES POLICY`
14-
var networksTmplTableRowSrc = `{{ range . -}}
15-
{{ .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}}
13+
var (
14+
networksTmplTableHeaderSrc = `ID NAME STATUS CREATED EXPIRES POLICY REPORTING`
15+
networksTmplTableRowSrc = `{{ range . -}}
16+
{{ .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}}
1617
{{ end }}`
17-
var networksTmplTableSrc = fmt.Sprintln(networksTmplTableHeaderSrc) + networksTmplTableRowSrc
18-
var networksTmplTable = template.Must(template.New("networks").Funcs(funcs).Parse(networksTmplTableSrc))
19-
var networksTmplTableNoHeader = template.Must(template.New("networks").Funcs(funcs).Parse(networksTmplTableRowSrc))
18+
)
19+
20+
var (
21+
networksTmplTableSrc = fmt.Sprintln(networksTmplTableHeaderSrc) + networksTmplTableRowSrc
22+
networksTmplTable = template.Must(template.New("networks").Funcs(funcs).Parse(networksTmplTableSrc))
23+
networksTmplTableNoHeader = template.Must(template.New("networks").Funcs(funcs).Parse(networksTmplTableRowSrc))
24+
)
2025

2126
// Wide table formatting
22-
var networksTmplWideHeaderSrc = `ID NAME STATUS CREATED EXPIRES POLICY`
23-
var networksTmplWideRowSrc = `{{ range . -}}
24-
{{ .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}}
27+
var (
28+
networksTmplWideHeaderSrc = `ID NAME STATUS CREATED EXPIRES POLICY REPORTING`
29+
networksTmplWideRowSrc = `{{ range . -}}
30+
{{ .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}}
2531
{{ end }}`
26-
var networksTmplWideSrc = fmt.Sprintln(networksTmplWideHeaderSrc) + networksTmplWideRowSrc
27-
var networksTmplWide = template.Must(template.New("networks").Funcs(funcs).Parse(networksTmplWideSrc))
28-
var networksTmplWideNoHeader = template.Must(template.New("networks").Funcs(funcs).Parse(networksTmplWideRowSrc))
32+
)
33+
34+
var (
35+
networksTmplWideSrc = fmt.Sprintln(networksTmplWideHeaderSrc) + networksTmplWideRowSrc
36+
networksTmplWide = template.Must(template.New("networks").Funcs(funcs).Parse(networksTmplWideSrc))
37+
networksTmplWideNoHeader = template.Must(template.New("networks").Funcs(funcs).Parse(networksTmplWideRowSrc))
38+
)
2939

3040
func Networks(outputFormat string, w *tabwriter.Writer, networks []*types.Network, header bool) error {
3141
switch outputFormat {

pkg/kotsclient/network_update_policy.go renamed to pkg/kotsclient/network_update.go

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,42 +11,41 @@ import (
1111
"github.com/replicatedhq/replicated/pkg/types"
1212
)
1313

14-
type UpdateNetworkPolicyRequest struct {
15-
Policy string `json:"policy"`
14+
type UpdateNetworkRequest struct {
15+
Policy string `json:"policy"`
16+
CollectReport bool `json:"collect_report"`
1617
}
1718

18-
type UpdateNetworkPolicyResponse struct {
19+
type UpdateNetworkResponse struct {
1920
Network *types.Network `json:"network"`
2021
Errors []string `json:"errors"`
2122
}
2223

23-
type UpdateNetworkPolicyOpts struct {
24-
Policy string `json:"policy"`
24+
type UpdateNetworkOpts struct {
25+
Policy string `json:"policy"`
26+
CollectReport bool `json:"collect_report"`
2527
}
2628

27-
type UpdateNetworkPolicyErrorResponse struct {
29+
type UpdateNetworkErrorResponse struct {
2830
Error struct {
2931
Message string `json:"message"`
3032
}
3133
}
3234

3335
// UpdateNetworkPolicy updates a network's policy setting
34-
func (c *VendorV3Client) UpdateNetworkPolicy(networkID string, opts UpdateNetworkPolicyOpts) (*types.Network, error) {
35-
req := UpdateNetworkPolicyRequest{
36-
Policy: opts.Policy,
37-
}
38-
39-
return c.doUpdateNetworkPolicyRequest(networkID, req)
36+
func (c *VendorV3Client) UpdateNetwork(networkID string, opts UpdateNetworkOpts) (*types.Network, error) {
37+
req := UpdateNetworkRequest(opts)
38+
return c.doUpdateNetworkRequest(networkID, req)
4039
}
4140

42-
func (c *VendorV3Client) doUpdateNetworkPolicyRequest(networkID string, req UpdateNetworkPolicyRequest) (*types.Network, error) {
43-
resp := UpdateNetworkPolicyResponse{}
44-
endpoint := fmt.Sprintf("/v3/network/%s/policy", networkID)
41+
func (c *VendorV3Client) doUpdateNetworkRequest(networkID string, req UpdateNetworkRequest) (*types.Network, error) {
42+
resp := UpdateNetworkResponse{}
43+
endpoint := fmt.Sprintf("/v3/network/%s/update", networkID)
4544
err := c.DoJSON(context.TODO(), "PUT", endpoint, http.StatusOK, req, &resp)
4645
if err != nil {
4746
if apiErr, ok := errors.Cause(err).(platformclient.APIError); ok {
4847
if apiErr.StatusCode == http.StatusBadRequest {
49-
errResp := &UpdateNetworkPolicyErrorResponse{}
48+
errResp := &UpdateNetworkErrorResponse{}
5049
if jsonErr := json.Unmarshal(apiErr.Body, errResp); jsonErr != nil {
5150
return nil, fmt.Errorf("unmarshal error response: %w", err)
5251
}

pkg/types/network.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ type Network struct {
1717
OverlayEndpoint string `json:"overlay_endpoint,omitempty"`
1818
OverlayToken string `json:"overlay_token,omitempty"`
1919

20-
Outbound string `json:"outbound,omitempty"`
21-
Policy string `json:"policy,omitempty"`
20+
Policy string `json:"policy,omitempty"`
21+
CollectReport bool `json:"collect_report,omitempty"`
2222
}
2323

2424
type NetworkStatus string

0 commit comments

Comments
 (0)