...
1
2
3 package resources
4
5 import (
6 "context"
7 "errors"
8
9 "github.com/Microsoft/hcsshim/internal/credentials"
10 "github.com/Microsoft/hcsshim/internal/log"
11 "github.com/Microsoft/hcsshim/internal/uvm"
12 )
13
14
15 func (r *Resources) NetNS() string {
16 return r.netNS
17 }
18
19
20 func (r *Resources) SetNetNS(netNS string) {
21 r.netNS = netNS
22 }
23
24
25 func (r *Resources) SetCreatedNetNS(created bool) {
26 r.createdNetNS = true
27 }
28
29
30 func (r *Resources) ContainerRootInUVM() string {
31 return r.containerRootInUVM
32 }
33
34
35 func (r *Resources) SetContainerRootInUVM(containerRootInUVM string) {
36 r.containerRootInUVM = containerRootInUVM
37 }
38
39
40 func (r *Resources) SetAddedNetNSToVM(addedNetNSToVM bool) {
41 r.addedNetNSToVM = addedNetNSToVM
42 }
43
44 func (r *Resources) SetLcowScratchPath(scratchPath string) {
45 r.lcowScratchPath = scratchPath
46 }
47
48 func (r *Resources) LcowScratchPath() string {
49 return r.lcowScratchPath
50 }
51
52
53 func (r *Resources) SetLayers(l ResourceCloser) {
54 r.layers = l
55 }
56
57
58
59 func (r *Resources) Add(newResources ...ResourceCloser) {
60 r.resources = append(r.resources, newResources...)
61 }
62
63
64
65
66
67 type Resources struct {
68 id string
69
70
71
72
73
74
75 containerRootInUVM string
76
77
78
79
80 lcowScratchPath string
81
82 netNS string
83
84 createdNetNS bool
85
86 addedNetNSToVM bool
87
88 layers ResourceCloser
89
90 resources []ResourceCloser
91 }
92
93
94
95
96 type ResourceCloser interface {
97 Release(context.Context) error
98 }
99
100
101
102 func NewContainerResources(id string) *Resources {
103 return &Resources{
104 id: id,
105 }
106 }
107
108
109
110
111 func ReleaseResources(ctx context.Context, r *Resources, vm *uvm.UtilityVM, all bool) error {
112 if vm != nil {
113 if r.addedNetNSToVM {
114 if err := vm.TearDownNetworking(ctx, r.netNS); err != nil {
115 log.G(ctx).Warn(err)
116 }
117 r.addedNetNSToVM = false
118 }
119 }
120
121 releaseErr := false
122
123
124
125
126 for i := len(r.resources) - 1; i >= 0; i-- {
127 switch r.resources[i].(type) {
128 case *uvm.NetworkEndpoints:
129 if r.createdNetNS {
130 if err := r.resources[i].Release(ctx); err != nil {
131 log.G(ctx).WithError(err).Error("failed to release container resource")
132 releaseErr = true
133 }
134 r.createdNetNS = false
135 }
136 case *credentials.CCGResource:
137 if err := r.resources[i].Release(ctx); err != nil {
138 log.G(ctx).WithError(err).Error("failed to release container resource")
139 releaseErr = true
140 }
141 default:
142
143
144
145 if all {
146 if err := r.resources[i].Release(ctx); err != nil {
147 log.G(ctx).WithError(err).Error("failed to release container resource")
148 releaseErr = true
149 }
150 }
151 }
152 }
153 r.resources = nil
154 if releaseErr {
155 return errors.New("failed to release one or more container resources")
156 }
157
158 if r.layers != nil {
159 if err := r.layers.Release(ctx); err != nil {
160 return err
161 }
162 }
163 return nil
164 }
165
View as plain text