diff --git a/cmd/swarmctl/cluster/list.go b/cmd/swarmctl/cluster/list.go index 9c79f697a8..37f5379d22 100644 --- a/cmd/swarmctl/cluster/list.go +++ b/cmd/swarmctl/cluster/list.go @@ -9,6 +9,7 @@ import ( "github.com/moby/swarmkit/v2/api" "github.com/moby/swarmkit/v2/cmd/swarmctl/common" "github.com/spf13/cobra" + "google.golang.org/grpc" ) var ( @@ -31,7 +32,8 @@ var ( if err != nil { return err } - r, err := c.ListClusters(common.Context(cmd), &api.ListClustersRequest{}) + r, err := c.ListClusters(common.Context(cmd), &api.ListClustersRequest{}, + grpc.MaxCallRecvMsgSize(common.DefaultRecvSizeForListResponse)) if err != nil { return err } diff --git a/cmd/swarmctl/common/common.go b/cmd/swarmctl/common/common.go index 2179e2755c..767f133244 100644 --- a/cmd/swarmctl/common/common.go +++ b/cmd/swarmctl/common/common.go @@ -3,6 +3,7 @@ package common import ( "context" "crypto/tls" + "math" "net" "strings" "time" @@ -15,6 +16,8 @@ import ( "google.golang.org/grpc/credentials" ) +const DefaultRecvSizeForListResponse = math.MaxInt32 + // Dial establishes a connection and creates a client. // It infers connection parameters from CLI options. func Dial(cmd *cobra.Command) (api.ControlClient, error) { diff --git a/cmd/swarmctl/config/list.go b/cmd/swarmctl/config/list.go index 7483f70b3f..3adfab770c 100644 --- a/cmd/swarmctl/config/list.go +++ b/cmd/swarmctl/config/list.go @@ -12,6 +12,7 @@ import ( "github.com/moby/swarmkit/v2/api" "github.com/moby/swarmkit/v2/cmd/swarmctl/common" "github.com/spf13/cobra" + "google.golang.org/grpc" ) type configSorter []*api.Config @@ -50,7 +51,8 @@ var ( return err } - resp, err := client.ListConfigs(common.Context(cmd), &api.ListConfigsRequest{}) + resp, err := client.ListConfigs(common.Context(cmd), &api.ListConfigsRequest{}, + grpc.MaxCallRecvMsgSize(common.DefaultRecvSizeForListResponse)) if err != nil { return err } diff --git a/cmd/swarmctl/network/create.go b/cmd/swarmctl/network/create.go index 6acee380f9..631f4c2658 100644 --- a/cmd/swarmctl/network/create.go +++ b/cmd/swarmctl/network/create.go @@ -30,6 +30,11 @@ var ( return err } + ingress, err := flags.GetBool("ingress") + if err != nil { + return err + } + // Process driver configurations var driver *api.Driver if flags.Changed("driver") { @@ -68,6 +73,7 @@ var ( }, DriverConfig: driver, IPAM: ipamOpts, + Ingress: ingress, } c, err := common.Dial(cmd) @@ -179,4 +185,5 @@ func init() { createCmd.Flags().StringSlice("gateway", []string{}, "Gateway IP addresses for network segments") createCmd.Flags().StringSlice("ip-range", []string{}, "IP ranges to allocate from within the subnets") createCmd.Flags().StringSlice("opts", []string{}, "Network driver options") + createCmd.Flags().Bool("ingress", false, "Create ingress network") } diff --git a/cmd/swarmctl/network/inspect.go b/cmd/swarmctl/network/inspect.go index f45c52da13..eedbed3a27 100644 --- a/cmd/swarmctl/network/inspect.go +++ b/cmd/swarmctl/network/inspect.go @@ -60,6 +60,7 @@ func printNetworkSummary(network *api.Network) { } fmt.Fprintf(w, " IPv6Enabled\t: %t\n", spec.Ipv6Enabled) fmt.Fprintf(w, " Internal\t: %t\n", spec.Internal) + fmt.Fprintf(w, " Is Ingress?\t: %t\n", spec.Ingress) driver := network.DriverState if driver != nil { diff --git a/cmd/swarmctl/network/list.go b/cmd/swarmctl/network/list.go index 9d4a829305..ddad748b2a 100644 --- a/cmd/swarmctl/network/list.go +++ b/cmd/swarmctl/network/list.go @@ -9,6 +9,7 @@ import ( "github.com/moby/swarmkit/v2/api" "github.com/moby/swarmkit/v2/cmd/swarmctl/common" "github.com/spf13/cobra" + "google.golang.org/grpc" ) var ( @@ -31,7 +32,8 @@ var ( if err != nil { return err } - r, err := c.ListNetworks(common.Context(cmd), &api.ListNetworksRequest{}) + r, err := c.ListNetworks(common.Context(cmd), &api.ListNetworksRequest{}, + grpc.MaxCallRecvMsgSize(common.DefaultRecvSizeForListResponse)) if err != nil { return err } diff --git a/cmd/swarmctl/node/inspect.go b/cmd/swarmctl/node/inspect.go index 8dcca8360c..432205b6ef 100644 --- a/cmd/swarmctl/node/inspect.go +++ b/cmd/swarmctl/node/inspect.go @@ -78,6 +78,18 @@ func printNodeSummary(node *api.Node) { } } + fmt.Fprintln(w, "Node Attachment:\t") + printNetworkAttachment(w, node.Attachment) + + fmt.Fprintln(w, "Network Attachments:\t") + if node.Attachments != nil && len(node.Attachments) > 0 { + for _, na := range node.Attachments { + printNetworkAttachment(w, na) + } + } else { + fmt.Fprintf(w, " \n") + } + if desc.Engine != nil { fmt.Fprintln(w, "Plugins:\t") var pluginTypes []string @@ -165,6 +177,17 @@ var ( } ) +func printNetworkAttachment(w *tabwriter.Writer, na *api.NetworkAttachment) { + if na == nil { + fmt.Fprintf(w, " \n") + return + } + fmt.Fprintf(w, " Network Name\t: %s\n", na.Network.Spec.Annotations.Name) + fmt.Fprintf(w, " Network ID\t: %s\n", na.Network.ID) + fmt.Fprintf(w, " Addresses\t: %s\n", na.Addresses) + fmt.Fprintf(w, " Is Ingress?\t: %v\n", na.Network.Spec.Ingress) +} + func init() { inspectCmd.Flags().BoolP("all", "a", false, "Show all tasks (default shows just running)") } diff --git a/cmd/swarmctl/node/list.go b/cmd/swarmctl/node/list.go index 1dba9d63bd..08ea5ca697 100644 --- a/cmd/swarmctl/node/list.go +++ b/cmd/swarmctl/node/list.go @@ -9,6 +9,7 @@ import ( "github.com/moby/swarmkit/v2/api" "github.com/moby/swarmkit/v2/cmd/swarmctl/common" "github.com/spf13/cobra" + "google.golang.org/grpc" ) var ( @@ -31,7 +32,8 @@ var ( if err != nil { return err } - r, err := c.ListNodes(common.Context(cmd), &api.ListNodesRequest{}) + r, err := c.ListNodes(common.Context(cmd), &api.ListNodesRequest{}, + grpc.MaxCallRecvMsgSize(common.DefaultRecvSizeForListResponse)) if err != nil { return err } diff --git a/cmd/swarmctl/secret/list.go b/cmd/swarmctl/secret/list.go index 9a35ec996f..6cf831436f 100644 --- a/cmd/swarmctl/secret/list.go +++ b/cmd/swarmctl/secret/list.go @@ -12,6 +12,7 @@ import ( "github.com/moby/swarmkit/v2/api" "github.com/moby/swarmkit/v2/cmd/swarmctl/common" "github.com/spf13/cobra" + "google.golang.org/grpc" ) type secretSorter []*api.Secret @@ -50,7 +51,8 @@ var ( return err } - resp, err := client.ListSecrets(common.Context(cmd), &api.ListSecretsRequest{}) + resp, err := client.ListSecrets(common.Context(cmd), &api.ListSecretsRequest{}, + grpc.MaxCallRecvMsgSize(common.DefaultRecvSizeForListResponse)) if err != nil { return err } diff --git a/cmd/swarmctl/service/list.go b/cmd/swarmctl/service/list.go index 0e15d3574c..ced62c321b 100644 --- a/cmd/swarmctl/service/list.go +++ b/cmd/swarmctl/service/list.go @@ -9,6 +9,7 @@ import ( "github.com/moby/swarmkit/v2/api" "github.com/moby/swarmkit/v2/cmd/swarmctl/common" "github.com/spf13/cobra" + "google.golang.org/grpc" ) var ( @@ -31,12 +32,14 @@ var ( if err != nil { return err } - r, err := c.ListServices(common.Context(cmd), &api.ListServicesRequest{}) + r, err := c.ListServices(common.Context(cmd), &api.ListServicesRequest{}, + grpc.MaxCallRecvMsgSize(common.DefaultRecvSizeForListResponse)) if err != nil { return err } - nr, err := c.ListNodes(common.Context(cmd), &api.ListNodesRequest{}) + nr, err := c.ListNodes(common.Context(cmd), &api.ListNodesRequest{}, + grpc.MaxCallRecvMsgSize(common.DefaultRecvSizeForListResponse)) if err != nil { return err } @@ -50,7 +53,8 @@ var ( var output func(j *api.Service) if !quiet { - tr, err := c.ListTasks(common.Context(cmd), &api.ListTasksRequest{}) + tr, err := c.ListTasks(common.Context(cmd), &api.ListTasksRequest{}, + grpc.MaxCallRecvMsgSize(common.DefaultRecvSizeForListResponse)) if err != nil { return err } diff --git a/cmd/swarmctl/task/inspect.go b/cmd/swarmctl/task/inspect.go index 5f5b06fcaa..0f6f541654 100644 --- a/cmd/swarmctl/task/inspect.go +++ b/cmd/swarmctl/task/inspect.go @@ -64,30 +64,32 @@ func printTaskSummary(task *api.Task, res *common.Resolver) { fmt.Fprintln(w, "Spec\t") ctr := task.Spec.GetContainer() - common.FprintfIfNotEmpty(w, " Image\t: %s\n", ctr.Image) - common.FprintfIfNotEmpty(w, " Command\t: %q\n", strings.Join(ctr.Command, " ")) - common.FprintfIfNotEmpty(w, " Args\t: [%s]\n", strings.Join(ctr.Args, ", ")) - common.FprintfIfNotEmpty(w, " Env\t: [%s]\n", strings.Join(ctr.Env, ", ")) - if len(ctr.Secrets) > 0 { - fmt.Fprintln(w, " Secrets:") - for _, sr := range ctr.Secrets { - var targetName, mode string - if sr.GetFile() != nil { - targetName = sr.GetFile().Name - mode = "FILE" + if ctr != nil { + common.FprintfIfNotEmpty(w, " Image\t: %s\n", ctr.Image) + common.FprintfIfNotEmpty(w, " Command\t: %q\n", strings.Join(ctr.Command, " ")) + common.FprintfIfNotEmpty(w, " Args\t: [%s]\n", strings.Join(ctr.Args, ", ")) + common.FprintfIfNotEmpty(w, " Env\t: [%s]\n", strings.Join(ctr.Env, ", ")) + if len(ctr.Secrets) > 0 { + fmt.Fprintln(w, " Secrets:") + for _, sr := range ctr.Secrets { + var targetName, mode string + if sr.GetFile() != nil { + targetName = sr.GetFile().Name + mode = "FILE" + } + fmt.Fprintf(w, " [%s] %s:%s\n", mode, sr.SecretName, targetName) } - fmt.Fprintf(w, " [%s] %s:%s\n", mode, sr.SecretName, targetName) } - } - if len(ctr.Configs) > 0 { - fmt.Fprintln(w, " Configs:") - for _, cr := range ctr.Configs { - var targetName, mode string - if cr.GetFile() != nil { - targetName = cr.GetFile().Name - mode = "FILE" + if len(ctr.Configs) > 0 { + fmt.Fprintln(w, " Configs:") + for _, cr := range ctr.Configs { + var targetName, mode string + if cr.GetFile() != nil { + targetName = cr.GetFile().Name + mode = "FILE" + } + fmt.Fprintf(w, " [%s] %s:%s\n", mode, cr.ConfigName, targetName) } - fmt.Fprintf(w, " [%s] %s:%s\n", mode, cr.ConfigName, targetName) } } } diff --git a/cmd/swarmctl/task/list.go b/cmd/swarmctl/task/list.go index 9fb2f5ddae..3fb3f70287 100644 --- a/cmd/swarmctl/task/list.go +++ b/cmd/swarmctl/task/list.go @@ -9,6 +9,7 @@ import ( "github.com/moby/swarmkit/v2/api" "github.com/moby/swarmkit/v2/cmd/swarmctl/common" "github.com/spf13/cobra" + "google.golang.org/grpc" ) var ( @@ -36,7 +37,8 @@ var ( if err != nil { return err } - r, err := c.ListTasks(common.Context(cmd), &api.ListTasksRequest{}) + r, err := c.ListTasks(common.Context(cmd), &api.ListTasksRequest{}, + grpc.MaxCallRecvMsgSize(common.DefaultRecvSizeForListResponse)) if err != nil { return err } diff --git a/cmd/swarmctl/task/print.go b/cmd/swarmctl/task/print.go index f0d5b73aa1..ca5e67ab8a 100644 --- a/cmd/swarmctl/task/print.go +++ b/cmd/swarmctl/task/print.go @@ -49,11 +49,15 @@ func Print(tasks []*api.Task, all bool, res *common.Resolver) { continue } c := t.Spec.GetContainer() + var image string + if c != nil { + image = c.Image + } fmt.Fprintf(w, "%s\t%s\t%d\t%s\t%s\t%s %s\t%s\n", t.ID, t.ServiceAnnotations.Name, t.Slot, - c.Image, + image, t.DesiredState.String(), t.Status.State.String(), common.TimestampAgo(t.Status.Timestamp),