@@ -57,89 +57,6 @@ type InMemProvisioner struct {
57
57
removeHandlers map [schema.ResourceType ]InMemResourceProvisionerFn
58
58
}
59
59
60
- func (d * InMemProvisioner ) DeProvision (ctx context.Context , req * connect.Request [provisioner.DeProvisionRequest ]) (* connect.Response [provisioner.DeProvisionResponse ], error ) {
61
- logger := log .FromContext (ctx )
62
- parsed , err := key .ParseChangesetKey (req .Msg .Changeset )
63
- if err != nil {
64
- err = fmt .Errorf ("invalid changeset: %w" , err )
65
- return nil , connect .NewError (connect .CodeInvalidArgument , err )
66
- }
67
-
68
- var replacementModule * schema.Module
69
- if req .Msg .ReplacementModule != nil {
70
- pm , err := schema .ValidatedModuleFromProto (req .Msg .ReplacementModule )
71
- if err != nil {
72
- err = fmt .Errorf ("invalid replacment module: %w" , err )
73
- return nil , connect .NewError (connect .CodeInvalidArgument , err )
74
- }
75
- replacementModule = pm
76
- }
77
- removingModule , err := schema .ValidatedModuleFromProto (req .Msg .Module )
78
- if err != nil {
79
- err = fmt .Errorf ("invalid removing module: %w" , err )
80
- return nil , connect .NewError (connect .CodeInvalidArgument , err )
81
- }
82
- kinds := slices .Map (req .Msg .Kinds , func (k string ) schema.ResourceType { return schema .ResourceType (k ) })
83
- currentNodes := schema .GetProvisioned (replacementModule )
84
- removingNodes := schema .GetProvisioned (removingModule )
85
-
86
- task := & inMemProvisioningTask {}
87
- // use chans to safely collect all events before completing each task
88
- completions := make (chan stepCompletedEvent , 16 )
89
-
90
- for id , toRemove := range removingNodes {
91
- inUse , ok := currentNodes [id ]
92
- for _ , resource := range toRemove .GetProvisioned () {
93
- if ! ok || ! resource .IsEqual (inUse .GetProvisioned ().Get (resource .Kind )) {
94
- if slices .Contains (kinds , resource .Kind ) {
95
- handler , ok := d .removeHandlers [resource .Kind ]
96
- if ! ok {
97
- err := fmt .Errorf ("unsupported resource type: %s" , resource .Kind )
98
- return nil , connect .NewError (connect .CodeInvalidArgument , err )
99
- }
100
- step := & inMemProvisioningStep {Done : atomic .New (false )}
101
- task .steps = append (task .steps , step )
102
- go func () {
103
- event , err := handler (ctx , parsed , removingModule .Runtime .Deployment .DeploymentKey , toRemove )
104
- if err != nil {
105
- step .Err = err
106
- logger .Errorf (err , "failed to de-provision resource %s:%s" , resource .Kind , toRemove .ResourceID ())
107
- completions <- stepCompletedEvent {step : step }
108
- return
109
- }
110
- completions <- stepCompletedEvent {
111
- step : step ,
112
- event : optional .Ptr (event ),
113
- }
114
- }()
115
- }
116
- }
117
- }
118
- }
119
-
120
- go func () {
121
- for c := range channels .IterContext (ctx , completions ) {
122
- if e , ok := c .event .Get (); ok {
123
- task .events = append (task .events , & e )
124
- }
125
- c .step .Done .Store (true )
126
- done , err := task .Done ()
127
- if done || err != nil {
128
- return
129
- }
130
- }
131
- }()
132
-
133
- token := uuid .New ().String ()
134
- logger .Debugf ("started a task with token %s" , token )
135
- d .running .Store (token , task )
136
-
137
- return connect .NewResponse (& provisioner.DeProvisionResponse {
138
- ProvisioningToken : token ,
139
- Status : provisioner .ProvisionResponseStatus_PROVISION_RESPONSE_STATUS_SUBMITTED ,
140
- }), nil
141
- }
142
-
143
60
func NewEmbeddedProvisioner (handlers map [schema.ResourceType ]InMemResourceProvisionerFn , deProvisionHandlers map [schema.ResourceType ]InMemResourceProvisionerFn ) * InMemProvisioner {
144
61
return & InMemProvisioner {
145
62
running : xsync .NewMapOf [string , * inMemProvisioningTask ](),
@@ -190,15 +107,25 @@ func (d *InMemProvisioner) Provision(ctx context.Context, req *connect.Request[p
190
107
completions := make (chan stepCompletedEvent , 16 )
191
108
192
109
for id , desired := range desiredNodes {
193
- previous , ok := previousNodes [id ]
110
+ previous , prevOk := previousNodes [id ]
194
111
195
112
for _ , resource := range desired .GetProvisioned () {
196
- if ! ok || ! resource .IsEqual (previous .GetProvisioned ().Get (resource .Kind )) {
113
+ if ! prevOk || ! resource .IsEqual (previous .GetProvisioned ().Get (resource .Kind )) {
197
114
if slices .Contains (kinds , resource .Kind ) {
198
- handler , ok := d .handlers [resource .Kind ]
199
- if ! ok {
200
- // TODO: should a missing de-provisioner handler be an error?
201
- continue
115
+ var handler InMemResourceProvisionerFn
116
+ var ok bool
117
+ if desiredModule .Runtime .Deployment .State == schema .DeploymentStateDeProvisioning {
118
+ handler , ok = d .removeHandlers [resource .Kind ]
119
+ if ! ok {
120
+ // TODO: should a missing de-provisioner handler be an error?
121
+ continue
122
+ }
123
+ } else {
124
+ handler , ok = d .handlers [resource .Kind ]
125
+ if ! ok {
126
+ err := fmt .Errorf ("unsupported resource type: %s" , resource .Kind )
127
+ return nil , connect .NewError (connect .CodeInvalidArgument , err )
128
+ }
202
129
}
203
130
step := & inMemProvisioningStep {Done : atomic .New (false )}
204
131
task .steps = append (task .steps , step )
@@ -239,7 +166,7 @@ func (d *InMemProvisioner) Provision(ctx context.Context, req *connect.Request[p
239
166
240
167
return connect .NewResponse (& provisioner.ProvisionResponse {
241
168
ProvisioningToken : token ,
242
- Status : provisioner .ProvisionResponseStatus_PROVISION_RESPONSE_STATUS_SUBMITTED ,
169
+ Status : provisioner .ProvisionResponse_PROVISION_RESPONSE_STATUS_SUBMITTED ,
243
170
}), nil
244
171
}
245
172
0 commit comments