kubernetes/kops · error

error creating subnet: %v

Error message

error creating subnet: %v

What it means

createSubnet issues a Neutron subnet Create call inside a RetryWithBackoff(writeBackoff) loop. If subnets.Create(...).Extract() fails, the error is wrapped as "error creating subnet: %v". Because it is retried, this error indicates the create failed persistently across retries.

Source

Thrown at upup/pkg/fi/cloudup/openstack/subnet.go:91

		return nil, err
	} else if done {
		return subnet, nil
	} else {
		return nil, wait.ErrWaitTimeout
	}
}

func (c *openstackCloud) CreateSubnet(opt subnets.CreateOptsBuilder) (*subnets.Subnet, error) {
	return createSubnet(c, opt)
}

func createSubnet(c OpenstackCloud, opt subnets.CreateOptsBuilder) (*subnets.Subnet, error) {
	var s *subnets.Subnet

	done, err := vfs.RetryWithBackoff(writeBackoff, func() (bool, error) {
		v, err := subnets.Create(context.TODO(), c.NetworkingClient(), opt).Extract()
		if err != nil {
			return false, fmt.Errorf("error creating subnet: %v", err)
		}
		s = v
		return true, nil
	})
	if err != nil {
		return s, err
	} else if done {
		return s, nil
	} else {
		return s, wait.ErrWaitTimeout
	}
}

func (c *openstackCloud) DeleteSubnet(subnetID string) error {
	return deleteSubnet(c, subnetID)
}

func deleteSubnet(c OpenstackCloud, subnetID string) error {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Read the wrapped Neutron error: 409 => overlap/conflict, 403 => policy, 413/403 quota => raise limits
  2. Verify the requested CIDR does not overlap existing subnets and fits the network's CIDR range
  3. Check `openstack quota show` for subnet quotas
  4. Validate the CreateOpts (cidr, network_id, ip_version) before calling createSubnet
Defensive patterns

Strategy: validation

Validate before calling

// Validate CIDR before createSubnet
_, ipNet, err := net.ParseCIDR("10.0.1.0/24")
if err != nil {
	log.Fatalf("invalid cidr: %v", err)
}
// check no overlap with existing subnets
for _, s := range existingSubnets {
	if cidrOverlap(ipNet, mustParseCIDR(s.CIDR)) {
		log.Fatalf("CIDR overlaps existing subnet %s", s.ID)
	}
}

Try / catch

sub, err := createSubnet(cloud, opts)
if err != nil {
	if strings.Contains(err.Error(), "overlaps") || strings.Contains(err.Error(), "409") {
		// adjust CIDR and retry
	}
	return err
}

Prevention

When it happens

Trigger: Invalid CreateOpts (bad CIDR overlapping an existing subnet, CIDR outside the network's range, missing gateway/IP version fields), quota exceeded on subnets, or RBAC denial.

Common situations: Cluster spec CIDR overlapping an existing subnet in the VPC, project hit its subnet quota, malformed subnets.CreateOptsBuilder passed by the caller, or Neutron policy restricting subnet creation.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/28eefa09647fd378. Report an issue: GitHub.