github.com/containerd/nerdctl@v1.7.7/cmd/nerdctl/network_create.go (about) 1 /* 2 Copyright The containerd Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package main 18 19 import ( 20 "fmt" 21 22 "github.com/containerd/containerd/identifiers" 23 "github.com/containerd/nerdctl/pkg/api/types" 24 "github.com/containerd/nerdctl/pkg/cmd/network" 25 "github.com/containerd/nerdctl/pkg/netutil" 26 "github.com/containerd/nerdctl/pkg/strutil" 27 28 "github.com/spf13/cobra" 29 ) 30 31 func newNetworkCreateCommand() *cobra.Command { 32 var networkCreateCommand = &cobra.Command{ 33 Use: "create [flags] NETWORK", 34 Short: "Create a network", 35 Long: `NOTE: To isolate CNI bridge, CNI plugin "firewall" (>= v1.1.0) is needed.`, 36 Args: IsExactArgs(1), 37 RunE: networkCreateAction, 38 SilenceUsage: true, 39 SilenceErrors: true, 40 } 41 networkCreateCommand.Flags().StringP("driver", "d", DefaultNetworkDriver, "Driver to manage the Network") 42 networkCreateCommand.RegisterFlagCompletionFunc("driver", shellCompleteNetworkDrivers) 43 networkCreateCommand.Flags().StringArrayP("opt", "o", nil, "Set driver specific options") 44 networkCreateCommand.Flags().String("ipam-driver", "default", "IP Address Management Driver") 45 networkCreateCommand.RegisterFlagCompletionFunc("ipam-driver", shellCompleteIPAMDrivers) 46 networkCreateCommand.Flags().StringArray("ipam-opt", nil, "Set IPAM driver specific options") 47 networkCreateCommand.Flags().StringArray("subnet", nil, `Subnet in CIDR format that represents a network segment, e.g. "10.5.0.0/16"`) 48 networkCreateCommand.Flags().String("gateway", "", `Gateway for the master subnet`) 49 networkCreateCommand.Flags().String("ip-range", "", `Allocate container ip from a sub-range`) 50 networkCreateCommand.Flags().StringArray("label", nil, "Set metadata for a network") 51 networkCreateCommand.Flags().Bool("ipv6", false, "Enable IPv6 networking") 52 return networkCreateCommand 53 } 54 55 func networkCreateAction(cmd *cobra.Command, args []string) error { 56 globalOptions, err := processRootCmdFlags(cmd) 57 if err != nil { 58 return err 59 } 60 name := args[0] 61 if err := identifiers.Validate(name); err != nil { 62 return fmt.Errorf("malformed name %s: %w", name, err) 63 } 64 if err != nil { 65 return err 66 } 67 driver, err := cmd.Flags().GetString("driver") 68 if err != nil { 69 return err 70 } 71 opts, err := cmd.Flags().GetStringArray("opt") 72 if err != nil { 73 return err 74 } 75 ipamDriver, err := cmd.Flags().GetString("ipam-driver") 76 if err != nil { 77 return err 78 } 79 ipamOpts, err := cmd.Flags().GetStringArray("ipam-opt") 80 if err != nil { 81 return err 82 } 83 subnets, err := cmd.Flags().GetStringArray("subnet") 84 if err != nil { 85 return err 86 } 87 gatewayStr, err := cmd.Flags().GetString("gateway") 88 if err != nil { 89 return err 90 } 91 ipRangeStr, err := cmd.Flags().GetString("ip-range") 92 if err != nil { 93 return err 94 } 95 labels, err := cmd.Flags().GetStringArray("label") 96 if err != nil { 97 return err 98 } 99 labels = strutil.DedupeStrSlice(labels) 100 ipv6, err := cmd.Flags().GetBool("ipv6") 101 if err != nil { 102 return err 103 } 104 105 return network.Create(types.NetworkCreateOptions{ 106 GOptions: globalOptions, 107 CreateOptions: netutil.CreateOptions{ 108 Name: name, 109 Driver: driver, 110 Options: strutil.ConvertKVStringsToMap(opts), 111 IPAMDriver: ipamDriver, 112 IPAMOptions: strutil.ConvertKVStringsToMap(ipamOpts), 113 Subnets: subnets, 114 Gateway: gatewayStr, 115 IPRange: ipRangeStr, 116 Labels: labels, 117 IPv6: ipv6, 118 }, 119 }, cmd.OutOrStdout()) 120 }