File: helpers.go

package info (click to toggle)
docker.io 26.1.5%2Bdfsg1-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 68,576 kB
  • sloc: sh: 5,748; makefile: 912; ansic: 664; asm: 228; python: 162
file content (111 lines) | stat: -rw-r--r-- 2,468 bytes parent folder | download | duplicates (2)
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
99
100
101
102
103
104
105
106
107
108
109
110
111
package genericresource

import (
	"github.com/moby/swarmkit/v2/api"
)

// NewSet creates a set object
func NewSet(key string, vals ...string) []*api.GenericResource {
	rs := make([]*api.GenericResource, 0, len(vals))

	for _, v := range vals {
		rs = append(rs, NewString(key, v))
	}

	return rs
}

// NewString creates a String resource
func NewString(key, val string) *api.GenericResource {
	return &api.GenericResource{
		Resource: &api.GenericResource_NamedResourceSpec{
			NamedResourceSpec: &api.NamedGenericResource{
				Kind:  key,
				Value: val,
			},
		},
	}
}

// NewDiscrete creates a Discrete resource
func NewDiscrete(key string, val int64) *api.GenericResource {
	return &api.GenericResource{
		Resource: &api.GenericResource_DiscreteResourceSpec{
			DiscreteResourceSpec: &api.DiscreteGenericResource{
				Kind:  key,
				Value: val,
			},
		},
	}
}

// GetResource returns resources from the "resources" parameter matching the kind key
func GetResource(kind string, resources []*api.GenericResource) []*api.GenericResource {
	var res []*api.GenericResource

	for _, r := range resources {
		if Kind(r) != kind {
			continue
		}

		res = append(res, r)
	}

	return res
}

// ConsumeNodeResources removes "res" from nodeAvailableResources
func ConsumeNodeResources(nodeAvailableResources *[]*api.GenericResource, res []*api.GenericResource) {
	if nodeAvailableResources == nil {
		return
	}

	w := 0

loop:
	for _, na := range *nodeAvailableResources {
		for _, r := range res {
			if Kind(na) != Kind(r) {
				continue
			}

			if remove(na, r) {
				continue loop
			}
			// If this wasn't the right element then
			// we need to continue
		}

		(*nodeAvailableResources)[w] = na
		w++
	}

	*nodeAvailableResources = (*nodeAvailableResources)[:w]
}

// Returns true if the element is to be removed from the list
func remove(na, r *api.GenericResource) bool {
	switch tr := r.Resource.(type) {
	case *api.GenericResource_DiscreteResourceSpec:
		if na.GetDiscreteResourceSpec() == nil {
			return false // Type change, ignore
		}

		na.GetDiscreteResourceSpec().Value -= tr.DiscreteResourceSpec.Value
		if na.GetDiscreteResourceSpec().Value <= 0 {
			return true
		}
	case *api.GenericResource_NamedResourceSpec:
		if na.GetNamedResourceSpec() == nil {
			return false // Type change, ignore
		}

		if tr.NamedResourceSpec.Value != na.GetNamedResourceSpec().Value {
			return false // not the right item, ignore
		}

		return true
	}

	return false
}