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  }