func findNewLeaseAndInsert()

in tools/ipam-autopilot/container/api.go [221:328]


func findNewLeaseAndInsert(c *fiber.Ctx, tx *sql.Tx, p RangeRequest, routingDomain *RoutingDomain) error {
	var err error
	var parent *Range
	if p.Parent != "" {
		parent_id, err := strconv.ParseInt(p.Parent, 10, 64)
		if err != nil {
			parent, err = getRangeByCidrAndRoutingDomain(tx, p.Parent, routingDomain.Id)
			if err != nil {
				return c.Status(400).JSON(&fiber.Map{
					"success": false,
					"message": fmt.Sprintf("Parent needs to be either a cidr range within the routing domain or the id of a valid range %v", err),
				})
			}
		} else {
			parent, err = GetRangeFromDBWithTx(tx, parent_id)
			if err != nil {
				tx.Rollback()
				return c.Status(503).JSON(&fiber.Map{
					"success": false,
					"message": fmt.Sprintf("Unable to create new Subnet Lease  %v", err),
				})
			}
		}
	} else {
		return c.Status(400).JSON(&fiber.Map{
			"success": false,
			"message": "Please provide the ID of a parent range",
		})
	}
	range_size := p.Range_size
	subnet_ranges, err := GetRangesForParentFromDB(tx, int64(parent.Subnet_id))
	if err != nil {
		tx.Rollback()
		return c.Status(503).JSON(&fiber.Map{
			"success": false,
			"message": fmt.Sprintf("Unable to create new Subnet Lease  %v", err),
		})
	}
	if os.Getenv("CAI_ORG_ID") != "" {
		log.Printf("CAI for org %s enabled", os.Getenv("CAI_ORG_ID"))
		// Integrating ranges from the VPC -- start
		vpcs := strings.Split(routingDomain.Vpcs, ",")
		log.Printf("Looking for subnets in vpcs %v", vpcs)
		ranges, err := GetRangesForNetwork(fmt.Sprintf("organizations/%s", os.Getenv("CAI_ORG_ID")), vpcs)
		if err != nil {
			tx.Rollback()
			return c.Status(503).JSON(&fiber.Map{
				"success": false,
				"message": fmt.Sprintf("error %v", err),
			})
		}
		log.Printf("Found %d subnets in vpcs %v", len(ranges), vpcs)

		for j := 0; j < len(ranges); j++ {
			vpc_range := ranges[j]
			if !ContainsRange(subnet_ranges, vpc_range.cidr) {
				log.Printf("Adding range %s from CAI", vpc_range.cidr)
				subnet_ranges = append(subnet_ranges, Range{
					Cidr: vpc_range.cidr,
				})
			}

			for k := 0; k < len(vpc_range.secondaryRanges); k++ {
				secondaryRange := vpc_range.secondaryRanges[k]
				if !ContainsRange(subnet_ranges, secondaryRange.cidr) {
					log.Printf("Adding secondary range %s from CAI", vpc_range.cidr)
					subnet_ranges = append(subnet_ranges, Range{
						Cidr: secondaryRange.cidr,
					})
				}
			}
		}
		// Integrating ranges from the VPC -- end
	} else {
		log.Printf("Not checking CAI, env variable with Org ID not set")
	}

	subnet, subnetOnes, err := findNextSubnet(int(range_size), parent.Cidr, subnet_ranges)
	if err != nil {
		tx.Rollback()
		return c.Status(503).JSON(&fiber.Map{
			"success": false,
			"message": fmt.Sprintf("Unable to create new Subnet Lease %v", err),
		})
	}
	nextSubnet, _ := cidr.NextSubnet(subnet, int(range_size))
	log.Printf("next subnet will be starting with %s", nextSubnet.IP.String())

	id, err := CreateRangeInDb(tx, int64(parent.Subnet_id), routingDomain.Id, p.Name, fmt.Sprintf("%s/%d", subnet.IP.To4().String(), subnetOnes))

	if err != nil {
		tx.Rollback()
		return c.Status(503).JSON(&fiber.Map{
			"success": false,
			"message": fmt.Sprintf("Unable to create new Subnet Lease %v", err),
		})
	}

	err = tx.Commit()
	if err != nil {
		log.Fatal(err)
	}

	return c.Status(200).JSON(&fiber.Map{
		"id":   id,
		"cidr": fmt.Sprintf("%s/%d", subnet.IP.To4().String(), subnetOnes),
	})
}