github.com/uppal0016/docker_new@v0.0.0-20240123060250-1c98be13ac2c/daemon/network.go (about) 1 package daemon 2 3 import ( 4 "fmt" 5 "net" 6 "net/http" 7 "strings" 8 9 netsettings "github.com/docker/docker/daemon/network" 10 "github.com/docker/docker/errors" 11 "github.com/docker/docker/runconfig" 12 "github.com/docker/engine-api/types" 13 "github.com/docker/engine-api/types/filters" 14 "github.com/docker/engine-api/types/network" 15 "github.com/docker/libnetwork" 16 ) 17 18 // NetworkControllerEnabled checks if the networking stack is enabled. 19 // This feature depends on OS primitives and it's disabled in systems like Windows. 20 func (daemon *Daemon) NetworkControllerEnabled() bool { 21 return daemon.netController != nil 22 } 23 24 // FindNetwork function finds a network for a given string that can represent network name or id 25 func (daemon *Daemon) FindNetwork(idName string) (libnetwork.Network, error) { 26 // Find by Name 27 n, err := daemon.GetNetworkByName(idName) 28 if err != nil && !isNoSuchNetworkError(err) { 29 return nil, err 30 } 31 32 if n != nil { 33 return n, nil 34 } 35 36 // Find by id 37 return daemon.GetNetworkByID(idName) 38 } 39 40 func isNoSuchNetworkError(err error) bool { 41 _, ok := err.(libnetwork.ErrNoSuchNetwork) 42 return ok 43 } 44 45 // GetNetworkByID function returns a network whose ID begins with the given prefix. 46 // It fails with an error if no matching, or more than one matching, networks are found. 47 func (daemon *Daemon) GetNetworkByID(partialID string) (libnetwork.Network, error) { 48 list := daemon.GetNetworksByID(partialID) 49 50 if len(list) == 0 { 51 return nil, libnetwork.ErrNoSuchNetwork(partialID) 52 } 53 if len(list) > 1 { 54 return nil, libnetwork.ErrInvalidID(partialID) 55 } 56 return list[0], nil 57 } 58 59 // GetNetworkByName function returns a network for a given network name. 60 func (daemon *Daemon) GetNetworkByName(name string) (libnetwork.Network, error) { 61 c := daemon.netController 62 if name == "" { 63 name = c.Config().Daemon.DefaultNetwork 64 } 65 return c.NetworkByName(name) 66 } 67 68 // GetNetworksByID returns a list of networks whose ID partially matches zero or more networks 69 func (daemon *Daemon) GetNetworksByID(partialID string) []libnetwork.Network { 70 c := daemon.netController 71 list := []libnetwork.Network{} 72 l := func(nw libnetwork.Network) bool { 73 if strings.HasPrefix(nw.ID(), partialID) { 74 list = append(list, nw) 75 } 76 return false 77 } 78 c.WalkNetworks(l) 79 80 return list 81 } 82 83 // getAllNetworks returns a list containing all networks 84 func (daemon *Daemon) getAllNetworks() []libnetwork.Network { 85 c := daemon.netController 86 list := []libnetwork.Network{} 87 l := func(nw libnetwork.Network) bool { 88 list = append(list, nw) 89 return false 90 } 91 c.WalkNetworks(l) 92 93 return list 94 } 95 96 // CreateNetwork creates a network with the given name, driver and other optional parameters 97 func (daemon *Daemon) CreateNetwork(create types.NetworkCreate) (*types.NetworkCreateResponse, error) { 98 if runconfig.IsPreDefinedNetwork(create.Name) { 99 err := fmt.Errorf("%s is a pre-defined network and cannot be created", create.Name) 100 return nil, errors.NewErrorWithStatusCode(err, http.StatusForbidden) 101 } 102 103 var warning string 104 nw, err := daemon.GetNetworkByName(create.Name) 105 if err != nil { 106 if _, ok := err.(libnetwork.ErrNoSuchNetwork); !ok { 107 return nil, err 108 } 109 } 110 if nw != nil { 111 if create.CheckDuplicate { 112 return nil, libnetwork.NetworkNameError(create.Name) 113 } 114 warning = fmt.Sprintf("Network with name %s (id : %s) already exists", nw.Name(), nw.ID()) 115 } 116 117 c := daemon.netController 118 driver := create.Driver 119 if driver == "" { 120 driver = c.Config().Daemon.DefaultDriver 121 } 122 123 ipam := create.IPAM 124 v4Conf, v6Conf, err := getIpamConfig(ipam.Config) 125 if err != nil { 126 return nil, err 127 } 128 129 nwOptions := []libnetwork.NetworkOption{ 130 libnetwork.NetworkOptionIpam(ipam.Driver, "", v4Conf, v6Conf, ipam.Options), 131 libnetwork.NetworkOptionEnableIPv6(create.EnableIPv6), 132 libnetwork.NetworkOptionDriverOpts(create.Options), 133 libnetwork.NetworkOptionLabels(create.Labels), 134 } 135 if create.Internal { 136 nwOptions = append(nwOptions, libnetwork.NetworkOptionInternalNetwork()) 137 } 138 n, err := c.NewNetwork(driver, create.Name, nwOptions...) 139 if err != nil { 140 return nil, err 141 } 142 143 daemon.LogNetworkEvent(n, "create") 144 return &types.NetworkCreateResponse{ 145 ID: n.ID(), 146 Warning: warning, 147 }, nil 148 } 149 150 func getIpamConfig(data []network.IPAMConfig) ([]*libnetwork.IpamConf, []*libnetwork.IpamConf, error) { 151 ipamV4Cfg := []*libnetwork.IpamConf{} 152 ipamV6Cfg := []*libnetwork.IpamConf{} 153 for _, d := range data { 154 iCfg := libnetwork.IpamConf{} 155 iCfg.PreferredPool = d.Subnet 156 iCfg.SubPool = d.IPRange 157 iCfg.Gateway = d.Gateway 158 iCfg.AuxAddresses = d.AuxAddress 159 ip, _, err := net.ParseCIDR(d.Subnet) 160 if err != nil { 161 return nil, nil, fmt.Errorf("Invalid subnet %s : %v", d.Subnet, err) 162 } 163 if ip.To4() != nil { 164 ipamV4Cfg = append(ipamV4Cfg, &iCfg) 165 } else { 166 ipamV6Cfg = append(ipamV6Cfg, &iCfg) 167 } 168 } 169 return ipamV4Cfg, ipamV6Cfg, nil 170 } 171 172 // ConnectContainerToNetwork connects the given container to the given 173 // network. If either cannot be found, an err is returned. If the 174 // network cannot be set up, an err is returned. 175 func (daemon *Daemon) ConnectContainerToNetwork(containerName, networkName string, endpointConfig *network.EndpointSettings) error { 176 container, err := daemon.GetContainer(containerName) 177 if err != nil { 178 return err 179 } 180 return daemon.ConnectToNetwork(container, networkName, endpointConfig) 181 } 182 183 // DisconnectContainerFromNetwork disconnects the given container from 184 // the given network. If either cannot be found, an err is returned. 185 func (daemon *Daemon) DisconnectContainerFromNetwork(containerName string, network libnetwork.Network, force bool) error { 186 container, err := daemon.GetContainer(containerName) 187 if err != nil { 188 if force { 189 return daemon.ForceEndpointDelete(containerName, network) 190 } 191 return err 192 } 193 return daemon.DisconnectFromNetwork(container, network, force) 194 } 195 196 // GetNetworkDriverList returns the list of plugins drivers 197 // registered for network. 198 func (daemon *Daemon) GetNetworkDriverList() map[string]bool { 199 pluginList := make(map[string]bool) 200 201 if !daemon.NetworkControllerEnabled() { 202 return nil 203 } 204 c := daemon.netController 205 networks := c.Networks() 206 207 for _, network := range networks { 208 driver := network.Type() 209 pluginList[driver] = true 210 } 211 212 return pluginList 213 } 214 215 // DeleteNetwork destroys a network unless it's one of docker's predefined networks. 216 func (daemon *Daemon) DeleteNetwork(networkID string) error { 217 nw, err := daemon.FindNetwork(networkID) 218 if err != nil { 219 return err 220 } 221 222 if runconfig.IsPreDefinedNetwork(nw.Name()) { 223 err := fmt.Errorf("%s is a pre-defined network and cannot be removed", nw.Name()) 224 return errors.NewErrorWithStatusCode(err, http.StatusForbidden) 225 } 226 227 if err := nw.Delete(); err != nil { 228 return err 229 } 230 daemon.LogNetworkEvent(nw, "destroy") 231 return nil 232 } 233 234 // FilterNetworks returns a list of networks filtered by the given arguments. 235 // It returns an error if the filters are not included in the list of accepted filters. 236 func (daemon *Daemon) FilterNetworks(netFilters filters.Args) ([]libnetwork.Network, error) { 237 if netFilters.Len() != 0 { 238 if err := netFilters.Validate(netsettings.AcceptedFilters); err != nil { 239 return nil, err 240 } 241 } 242 nwList := daemon.getAllNetworks() 243 return netsettings.FilterNetworks(nwList, netFilters) 244 }