From f163cf9e15b38e165f3663c1c3562f1e910864a1 Mon Sep 17 00:00:00 2001 From: Medya Gh Date: Wed, 23 Sep 2020 20:03:11 -0700 Subject: [PATCH] update with new logic --- pkg/drivers/kic/kic.go | 6 ++--- pkg/drivers/kic/kic_test.go | 5 ++++ pkg/drivers/kic/oci/network_create.go | 37 ++++++++++++++------------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/pkg/drivers/kic/kic.go b/pkg/drivers/kic/kic.go index d63dfcd943..9183fd6098 100644 --- a/pkg/drivers/kic/kic.go +++ b/pkg/drivers/kic/kic.go @@ -94,13 +94,11 @@ func (d *Driver) Create() error { APIServerPort: d.NodeConfig.APIServerPort, } - // one network bridge per cluster. - defaultNetwork := d.NodeConfig.ClusterName - if gateway, err := oci.CreateNetwork(d.OCIBinary, defaultNetwork); err != nil { + if gateway, err := oci.CreateNetwork(d.OCIBinary, d.NodeConfig.ClusterName); err != nil { glog.Warningf("failed to create network: %v", err) out.WarningT("Unable to create dedicated network, This might result in cluster IP change after restart.") } else { - params.Network = defaultNetwork + params.Network = d.NodeConfig.ClusterName ip := gateway.To4() // calculate the container IP based on its machine order ip[3] += byte(machineOrder(d.NodeConfig.MachineName)) diff --git a/pkg/drivers/kic/kic_test.go b/pkg/drivers/kic/kic_test.go index d607bbc7f2..a5bb6c9783 100644 --- a/pkg/drivers/kic/kic_test.go +++ b/pkg/drivers/kic/kic_test.go @@ -34,6 +34,11 @@ func TestMachineOrder(t *testing.T) { Name: "second-node", MachineName: "minikube-m02", Want: 2}, + { + Name: "funny", + MachineName: "hahaha", + Want: 1}, + { Name: "dash-profile", MachineName: "my-dashy-minikube", diff --git a/pkg/drivers/kic/oci/network_create.go b/pkg/drivers/kic/oci/network_create.go index 259efc7f35..04ba730a61 100644 --- a/pkg/drivers/kic/oci/network_create.go +++ b/pkg/drivers/kic/oci/network_create.go @@ -29,7 +29,10 @@ import ( ) // DefaultSubnet subnet to be used on first cluster -const defaultSubnet = "192.168.39.0/24" +const defaultSubnetAddr = "192.168.39.0" + +// big enough for a cluster of 256 nodes +const defaultSubnetRange = 24 // CreateNetwork creates a network returns gateway and error, minikube creates one network per cluster func CreateNetwork(ociBin string, name string) (net.IP, error) { @@ -39,21 +42,17 @@ func CreateNetwork(ociBin string, name string) (net.IP, error) { return createDockerNetwork(name) } -func createDockerNetwork(name string) (net.IP, error) { +func createDockerNetwork(clusterName string) (net.IP, error) { // check if the network already exists - subnet, gateway, err := dockerNetworkInspect(name) + subnet, gateway, err := dockerNetworkInspect(clusterName) if err == nil { glog.Infof("Found existing network with subnet %s and gateway %s.", subnet, gateway) return gateway, nil } // simple way to create networks, subnet is taken, try one bigger attempt := 0 - _, subnet, err = net.ParseCIDR(defaultSubnet) - if err != nil { - return nil, errors.Wrapf(err, "parse default subnet %s", defaultSubnet) - } - - gateway, err = tryCreateDockerNetwork(subnet, name) + subnetAddr := defaultSubnetAddr + gateway, err = tryCreateDockerNetwork(subnetAddr, defaultSubnetRange, clusterName) if err != nil { if err != ErrNetworkSubnetTaken { return nil, errors.Wrapf(err, "error creating network") @@ -62,18 +61,20 @@ func createDockerNetwork(name string) (net.IP, error) { // we can try up to 255 for attempt < 13 { attempt++ - glog.Infof("Couldn't create network %q at %q subnet will try again with a new subnet ...", name, subnet) + glog.Infof("Couldn't create network %q at %q subnet will try again with a new subnet ...", clusterName, subnetAddr) // increase 3nd digit by 10 each time // 13 times adding 10 defaultSubnet "192.168.39.0/24" // at most it will add up to 169 which is still less than max allowed 255 // this is large enough to try more and not too small to not try enough // can be tuned in the next iterations - subnet.IP.To4()[2] += 10 - gateway, err := tryCreateDockerNetwork(subnet, name) + ip := net.ParseIP(subnetAddr).To4() + ip[2] += byte(9 + attempt) + + gateway, err = tryCreateDockerNetwork(ip.String(), defaultSubnetRange, clusterName) if err == nil { return gateway, nil } - if err == ErrNetworkSubnetTaken { + if errors.Is(err, ErrNetworkSubnetTaken) || errors.Is(err, ErrNetworkGatewayTaken) { continue } } @@ -82,12 +83,12 @@ func createDockerNetwork(name string) (net.IP, error) { return gateway, nil } -func tryCreateDockerNetwork(subnet *net.IPNet, name string) (net.IP, error) { - gateway := subnet.IP.To4() - gateway[3]++ // first ip for gateway - glog.Infof("attempt to create network %q with subnet: %s and gateway %s...", subnet, name, gateway) +func tryCreateDockerNetwork(subnetAddr string, subnetRange int, name string) (net.IP, error) { + gateway := net.ParseIP(subnetAddr) + gateway.To4()[3]++ // first ip for gateway + glog.Infof("attempt to create network %q with subnet: %s and gateway %s...", subnetAddr, name, gateway) // options documentation https://docs.docker.com/engine/reference/commandline/network_create/#bridge-driver-options - rr, err := runCmd(exec.Command(Docker, "network", "create", "--driver=bridge", fmt.Sprintf("--subnet=%s", subnet), fmt.Sprintf("--gateway=%s", gateway), "-o", "--ip-masq", "-o", "--icc", fmt.Sprintf("--label=%s=%s", CreatedByLabelKey, "true"), name)) + rr, err := runCmd(exec.Command(Docker, "network", "create", "--driver=bridge", fmt.Sprintf("--subnet=%s", fmt.Sprintf("%s/%d", subnetAddr, subnetRange)), fmt.Sprintf("--gateway=%s", gateway), "-o", "--ip-masq", "-o", "--icc", fmt.Sprintf("--label=%s=%s", CreatedByLabelKey, "true"), name)) if err != nil { if strings.Contains(rr.Output(), "Pool overlaps with other one on this address space") { return nil, ErrNetworkSubnetTaken