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),
})
}