Skip to content

Commit 5309a67

Browse files
committed
Simplify regex limit enforcement
1 parent abded19 commit 5309a67

6 files changed

Lines changed: 66 additions & 79 deletions

File tree

lib/instances/create.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,10 +183,7 @@ func (m *manager) createInstance(
183183
}
184184

185185
totalMemory := size + hotplugSize
186-
if err := validateResourceLimitsForName(req.Name, m.limits, overlaySize, vcpus, totalMemory); err != nil {
187-
return nil, err
188-
}
189-
if err := m.validateProvisionedResourceLimitsForName(ctx, req.Name, overlaySize, vcpus, totalMemory, req.NetworkBandwidthDownload, req.NetworkBandwidthUpload, req.DiskIOBps, req.Volumes); err != nil {
186+
if err := m.validateNamedResourceLimits(ctx, req.Name, overlaySize, vcpus, totalMemory, req.NetworkBandwidthDownload, req.NetworkBandwidthUpload, req.DiskIOBps, req.Volumes); err != nil {
190187
return nil, err
191188
}
192189

lib/instances/fork.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,7 @@ func (m *manager) forkInstanceFromStoppedOrStandby(ctx context.Context, id strin
297297
forkMeta.IP = ""
298298
forkMeta.MAC = ""
299299
}
300-
if err := validateResourceLimitsForName(req.Name, m.limits, forkMeta.OverlaySize, forkMeta.Vcpus, forkMeta.Size+forkMeta.HotplugSize); err != nil {
301-
return nil, err
302-
}
303-
if err := m.validateProvisionedResourceLimitsForName(ctx, req.Name, forkMeta.OverlaySize, forkMeta.Vcpus, forkMeta.Size+forkMeta.HotplugSize, forkMeta.NetworkBandwidthDownload, forkMeta.NetworkBandwidthUpload, forkMeta.DiskIOBps, forkMeta.Volumes); err != nil {
300+
if err := m.validateNamedResourceLimits(ctx, req.Name, forkMeta.OverlaySize, forkMeta.Vcpus, forkMeta.Size+forkMeta.HotplugSize, forkMeta.NetworkBandwidthDownload, forkMeta.NetworkBandwidthUpload, forkMeta.DiskIOBps, forkMeta.Volumes); err != nil {
304301
return nil, err
305302
}
306303

lib/instances/name_limits.go

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,13 @@ func (l NamedResourceLimit) hasAggregateProvisionedLimits() bool {
6363
l.MaxTotalDiskIO != nil
6464
}
6565

66-
func (l ResourceLimits) matchingPatternIndex(name string) int {
66+
func (l ResourceLimits) matchingPattern(name string) (int, *NamedResourceLimit) {
6767
for i := range l.NamePatterns {
6868
if l.NamePatterns[i].matches(name) {
69-
return i
69+
return i, &l.NamePatterns[i]
7070
}
7171
}
72-
return -1
73-
}
74-
75-
func (l ResourceLimits) matchingPattern(name string) *NamedResourceLimit {
76-
index := l.matchingPatternIndex(name)
77-
if index < 0 {
78-
return nil
79-
}
80-
return &l.NamePatterns[index]
72+
return -1, nil
8173
}
8274

8375
func (l ResourceLimits) ForName(name string) ResourceLimits {
@@ -87,7 +79,7 @@ func (l ResourceLimits) ForName(name string) ResourceLimits {
8779
MaxMemoryPerInstance: l.MaxMemoryPerInstance,
8880
}
8981

90-
if pattern := l.matchingPattern(name); pattern != nil {
82+
if _, pattern := l.matchingPattern(name); pattern != nil {
9183
if pattern.MaxOverlaySize != nil {
9284
resolved.MaxOverlaySize = *pattern.MaxOverlaySize
9385
}

lib/instances/name_provisioned_limits.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,18 @@ func (r *provisionedResources) add(other provisionedResources) {
4040
}
4141

4242
func validateProvisionedResourceLimitsForName(name string, limits ResourceLimits, existing []resources.InstanceAllocation, requested provisionedResources) error {
43-
patternIndex := limits.matchingPatternIndex(name)
44-
if patternIndex < 0 {
43+
patternIndex, pattern := limits.matchingPattern(name)
44+
if pattern == nil {
4545
return nil
4646
}
47-
pattern := limits.NamePatterns[patternIndex]
4847
if !pattern.hasAggregateProvisionedLimits() {
4948
return nil
5049
}
5150

5251
var current provisionedResources
5352
for _, alloc := range existing {
54-
if limits.matchingPatternIndex(alloc.Name) != patternIndex {
53+
matchedIndex, _ := limits.matchingPattern(alloc.Name)
54+
if matchedIndex != patternIndex {
5555
continue
5656
}
5757
current.add(provisionedResourcesFromAllocation(alloc))
@@ -109,12 +109,10 @@ func (m *manager) requestedProvisionedResources(ctx context.Context, overlaySize
109109
}, nil
110110
}
111111

112-
func (m *manager) validateProvisionedResourceLimitsForName(ctx context.Context, name string, overlaySize int64, vcpus int, totalMemory int64, networkDownloadBps int64, networkUploadBps int64, diskIOBps int64, volumes []VolumeAttachment) error {
113-
pattern := m.limits.matchingPattern(name)
114-
if pattern == nil || !pattern.hasAggregateProvisionedLimits() {
115-
return nil
112+
func (m *manager) validateNamedResourceLimits(ctx context.Context, name string, overlaySize int64, vcpus int, totalMemory int64, networkDownloadBps int64, networkUploadBps int64, diskIOBps int64, volumes []VolumeAttachment) error {
113+
if err := validateResourceLimitsForName(name, m.limits, overlaySize, vcpus, totalMemory); err != nil {
114+
return err
116115
}
117-
118116
requested, err := m.requestedProvisionedResources(ctx, overlaySize, vcpus, totalMemory, networkDownloadBps, networkUploadBps, diskIOBps, volumes)
119117
if err != nil {
120118
return err

lib/instances/snapshot.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -450,10 +450,7 @@ func (m *manager) forkSnapshot(ctx context.Context, snapshotID string, req ForkS
450450
forkMeta.IP = ""
451451
forkMeta.MAC = ""
452452
}
453-
if err := validateResourceLimitsForName(req.Name, m.limits, forkMeta.OverlaySize, forkMeta.Vcpus, forkMeta.Size+forkMeta.HotplugSize); err != nil {
454-
return nil, err
455-
}
456-
if err := m.validateProvisionedResourceLimitsForName(ctx, req.Name, forkMeta.OverlaySize, forkMeta.Vcpus, forkMeta.Size+forkMeta.HotplugSize, forkMeta.NetworkBandwidthDownload, forkMeta.NetworkBandwidthUpload, forkMeta.DiskIOBps, forkMeta.Volumes); err != nil {
453+
if err := m.validateNamedResourceLimits(ctx, req.Name, forkMeta.OverlaySize, forkMeta.Vcpus, forkMeta.Size+forkMeta.HotplugSize, forkMeta.NetworkBandwidthDownload, forkMeta.NetworkBandwidthUpload, forkMeta.DiskIOBps, forkMeta.Volumes); err != nil {
457454
return nil, err
458455
}
459456

lib/providers/instance_limits.go

Lines changed: 52 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -23,52 +23,7 @@ func parseInstanceLimits(cfg *config.Config) (instances.ResourceLimits, error) {
2323

2424
namePatterns := make([]instances.NamedResourceLimit, 0, len(cfg.Limits.NamePatterns))
2525
for i, patternCfg := range cfg.Limits.NamePatterns {
26-
var maxVcpus *int
27-
if patternCfg.MaxVcpusPerInstance != nil {
28-
value := *patternCfg.MaxVcpusPerInstance
29-
maxVcpus = &value
30-
}
31-
var maxTotalVcpus *int
32-
if patternCfg.MaxTotalVcpus != nil {
33-
value := *patternCfg.MaxTotalVcpus
34-
maxTotalVcpus = &value
35-
}
36-
37-
maxMemory, err := parseOptionalByteSizePtr(fmt.Sprintf("limits.name_patterns[%d].max_memory_per_instance", i), patternCfg.MaxMemoryPerInstance)
38-
if err != nil {
39-
return instances.ResourceLimits{}, err
40-
}
41-
maxOverlay, err := parseOptionalByteSizePtr(fmt.Sprintf("limits.name_patterns[%d].max_overlay_size", i), patternCfg.MaxOverlaySize)
42-
if err != nil {
43-
return instances.ResourceLimits{}, err
44-
}
45-
maxTotalMemory, err := parseOptionalByteSizePtr(fmt.Sprintf("limits.name_patterns[%d].max_total_memory", i), patternCfg.MaxTotalMemory)
46-
if err != nil {
47-
return instances.ResourceLimits{}, err
48-
}
49-
maxTotalDisk, err := parseOptionalByteSizePtr(fmt.Sprintf("limits.name_patterns[%d].max_total_disk", i), patternCfg.MaxTotalDisk)
50-
if err != nil {
51-
return instances.ResourceLimits{}, err
52-
}
53-
maxTotalNetwork, err := parseOptionalBandwidthPtr(fmt.Sprintf("limits.name_patterns[%d].max_total_network_bandwidth", i), patternCfg.MaxTotalNetworkBandwidth)
54-
if err != nil {
55-
return instances.ResourceLimits{}, err
56-
}
57-
maxTotalDiskIO, err := parseOptionalBandwidthPtr(fmt.Sprintf("limits.name_patterns[%d].max_total_disk_io", i), patternCfg.MaxTotalDiskIO)
58-
if err != nil {
59-
return instances.ResourceLimits{}, err
60-
}
61-
62-
pattern, err := instances.NewNamedResourceLimit(patternCfg.Pattern, instances.NamedResourceLimitConfig{
63-
MaxVcpusPerInstance: maxVcpus,
64-
MaxMemoryPerInstance: maxMemory,
65-
MaxOverlaySize: maxOverlay,
66-
MaxTotalVcpus: maxTotalVcpus,
67-
MaxTotalMemory: maxTotalMemory,
68-
MaxTotalDisk: maxTotalDisk,
69-
MaxTotalNetworkBandwidth: maxTotalNetwork,
70-
MaxTotalDiskIO: maxTotalDiskIO,
71-
})
26+
pattern, err := parseNamedResourceLimit(i, patternCfg)
7227
if err != nil {
7328
return instances.ResourceLimits{}, fmt.Errorf("parse limits.name_patterns[%d]: %w", i, err)
7429
}
@@ -83,6 +38,57 @@ func parseInstanceLimits(cfg *config.Config) (instances.ResourceLimits, error) {
8338
}, nil
8439
}
8540

41+
func parseNamedResourceLimit(i int, cfg config.NamePatternLimitsConfig) (instances.NamedResourceLimit, error) {
42+
parsed := instances.NamedResourceLimitConfig{
43+
MaxVcpusPerInstance: parseOptionalIntPtr(cfg.MaxVcpusPerInstance),
44+
MaxTotalVcpus: parseOptionalIntPtr(cfg.MaxTotalVcpus),
45+
}
46+
47+
byteFields := []struct {
48+
field string
49+
src *string
50+
dst **int64
51+
}{
52+
{field: "max_memory_per_instance", src: cfg.MaxMemoryPerInstance, dst: &parsed.MaxMemoryPerInstance},
53+
{field: "max_overlay_size", src: cfg.MaxOverlaySize, dst: &parsed.MaxOverlaySize},
54+
{field: "max_total_memory", src: cfg.MaxTotalMemory, dst: &parsed.MaxTotalMemory},
55+
{field: "max_total_disk", src: cfg.MaxTotalDisk, dst: &parsed.MaxTotalDisk},
56+
}
57+
for _, field := range byteFields {
58+
value, err := parseOptionalByteSizePtr(fmt.Sprintf("limits.name_patterns[%d].%s", i, field.field), field.src)
59+
if err != nil {
60+
return instances.NamedResourceLimit{}, err
61+
}
62+
*field.dst = value
63+
}
64+
65+
bandwidthFields := []struct {
66+
field string
67+
src *string
68+
dst **int64
69+
}{
70+
{field: "max_total_network_bandwidth", src: cfg.MaxTotalNetworkBandwidth, dst: &parsed.MaxTotalNetworkBandwidth},
71+
{field: "max_total_disk_io", src: cfg.MaxTotalDiskIO, dst: &parsed.MaxTotalDiskIO},
72+
}
73+
for _, field := range bandwidthFields {
74+
value, err := parseOptionalBandwidthPtr(fmt.Sprintf("limits.name_patterns[%d].%s", i, field.field), field.src)
75+
if err != nil {
76+
return instances.NamedResourceLimit{}, err
77+
}
78+
*field.dst = value
79+
}
80+
81+
return instances.NewNamedResourceLimit(cfg.Pattern, parsed)
82+
}
83+
84+
func parseOptionalIntPtr(value *int) *int {
85+
if value == nil {
86+
return nil
87+
}
88+
parsed := *value
89+
return &parsed
90+
}
91+
8692
func parseOptionalByteSizePtr(field string, value *string) (*int64, error) {
8793
if value == nil {
8894
return nil, nil

0 commit comments

Comments
 (0)