This repository has been archived by the owner on Nov 30, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
/
create.go
98 lines (79 loc) · 2.74 KB
/
create.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package ipam
import (
"context"
"fmt"
"net"
"github.com/giantswarm/ipam"
"github.com/giantswarm/microerror"
"k8s.io/apimachinery/pkg/api/meta"
"github.com/giantswarm/azure-operator/v4/pkg/locker"
)
// EnsureCreated allocates tenant cluster network segments. It gathers existing
// subnets from existing system resources like Vnets and Cluster CRs.
func (r *Resource) EnsureCreated(ctx context.Context, obj interface{}) error {
var err error
m, err := meta.Accessor(obj)
if err != nil {
return microerror.Mask(err)
}
{
r.logger.LogCtx(ctx, "level", "debug", "message", "acquiring lock for IPAM")
err := r.locker.Lock(ctx)
if locker.IsAlreadyExists(err) {
r.logger.LogCtx(ctx, "level", "debug", "message", "lock for IPAM is already acquired")
} else if err != nil {
return microerror.Mask(err)
} else {
r.logger.LogCtx(ctx, "level", "debug", "message", "acquired lock for IPAM")
}
defer func() {
r.logger.LogCtx(ctx, "level", "debug", "message", "releasing lock for IPAM")
err := r.locker.Unlock(ctx)
if locker.IsNotFound(err) {
r.logger.LogCtx(ctx, "level", "debug", "message", "lock for IPAM is already released")
} else if err != nil {
r.logger.LogCtx(ctx, "level", "error", "message", "failed to release lock for IPAM", "stack", fmt.Sprintf("%#v", err))
} else {
r.logger.LogCtx(ctx, "level", "debug", "message", "released lock for IPAM")
}
}()
}
{
proceed, err := r.checker.Check(ctx, m.GetNamespace(), m.GetName())
if err != nil {
return microerror.Mask(err)
}
if !proceed {
r.logger.LogCtx(ctx, "level", "debug", "message", "subnet already allocated")
r.logger.LogCtx(ctx, "level", "debug", "message", "canceling resource")
return nil
}
}
var allocatedSubnets []net.IPNet
{
r.logger.LogCtx(ctx, "level", "debug", "message", "finding allocated subnets")
allocatedSubnets, err = r.collector.Collect(ctx)
if err != nil {
return microerror.Mask(err)
}
r.logger.LogCtx(ctx, "level", "debug", "message", fmt.Sprintf("found allocated subnets %#q", allocatedSubnets))
}
var freeSubnet net.IPNet
{
r.logger.LogCtx(ctx, "level", "debug", "message", "finding free subnet")
freeSubnet, err = ipam.Free(r.networkRange, r.allocatedSubnetMask, allocatedSubnets)
if err != nil {
return microerror.Mask(err)
}
r.logger.LogCtx(ctx, "level", "debug", "message", fmt.Sprintf("found free subnet %#q", freeSubnet))
}
{
r.logger.LogCtx(ctx, "level", "debug", "message", fmt.Sprintf("allocating free subnet %#q", freeSubnet))
err = r.persister.Persist(ctx, freeSubnet, m.GetNamespace(), m.GetName())
if err != nil {
return microerror.Mask(err)
}
r.logger.LogCtx(ctx, "level", "debug", "message", fmt.Sprintf("allocated free subnet %#q", freeSubnet))
}
return nil
}