edits.go 2.66 KB
Newer Older
songlinfeng's avatar
songlinfeng committed
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/**
# Copyright (c) 2024, HCUOpt CORPORATION.  All rights reserved.
**/

package transform

import (
	"encoding/json"

	"tags.cncf.io/container-device-interface/specs-go"
)

type containerEdits specs.ContainerEdits

// IsEmpty returns true if the edits are empty.
func (e containerEdits) IsEmpty() bool {
	// Devices with empty edits are invalid
	if len(e.DeviceNodes) > 0 {
		return false
	}
	if len(e.Env) > 0 {
		return false
	}
	if len(e.Hooks) > 0 {
		return false
	}
	if len(e.Mounts) > 0 {
		return false
	}

	return true
}

func (e *containerEdits) getEntityIds() ([]string, error) {
	if e == nil {
		return nil, nil
	}
	uniqueIDs := make(map[string]bool)

	deviceNodes, err := e.getDeviceNodeIDs()
	if err != nil {
		return nil, err
	}
	for k := range deviceNodes {
		uniqueIDs[k] = true
	}

	envs, err := e.getEnvIDs()
	if err != nil {
		return nil, err
	}
	for k := range envs {
		uniqueIDs[k] = true
	}

	hooks, err := e.getHookIDs()
	if err != nil {
		return nil, err
	}
	for k := range hooks {
		uniqueIDs[k] = true
	}

	mounts, err := e.getMountIDs()
	if err != nil {
		return nil, err
	}
	for k := range mounts {
		uniqueIDs[k] = true
	}

	var ids []string
	for k := range uniqueIDs {
		ids = append(ids, k)
	}

	return ids, nil
}

func (e *containerEdits) getDeviceNodeIDs() (map[string]bool, error) {
	deviceIDs := make(map[string]bool)
	for _, entity := range e.DeviceNodes {
		id, err := deviceNode(*entity).id()
		if err != nil {
			return nil, err
		}
		deviceIDs[id] = true
	}
	return deviceIDs, nil
}

func (e *containerEdits) getEnvIDs() (map[string]bool, error) {
	envIDs := make(map[string]bool)
	for _, entity := range e.Env {
		id, err := env(entity).id()
		if err != nil {
			return nil, err
		}
		envIDs[id] = true
	}
	return envIDs, nil
}

func (e *containerEdits) getHookIDs() (map[string]bool, error) {
	hookIDs := make(map[string]bool)
	for _, entity := range e.Hooks {
		id, err := hook(*entity).id()
		if err != nil {
			return nil, err
		}
		hookIDs[id] = true
	}
	return hookIDs, nil
}

func (e *containerEdits) getMountIDs() (map[string]bool, error) {
	mountIDs := make(map[string]bool)
	for _, entity := range e.Mounts {
		id, err := mount(*entity).id()
		if err != nil {
			return nil, err
		}
		mountIDs[id] = true
	}
	return mountIDs, nil
}

type deviceNode specs.DeviceNode

func (dn deviceNode) id() (string, error) {
	b, err := json.Marshal(dn)
	return string(b), err
}

type env string

func (e env) id() (string, error) {
	return string(e), nil
}

type mount specs.Mount

func (m mount) id() (string, error) {
	b, err := json.Marshal(m)
	return string(b), err
}

type hook specs.Hook

func (m hook) id() (string, error) {
	b, err := json.Marshal(m)
	return string(b), err
}