@@ -37,13 +37,14 @@ import (
37
37
38
38
// ProvisioningRequestPodsInjector creates in-memory pods from ProvisioningRequest and inject them to unscheduled pods list.
39
39
type ProvisioningRequestPodsInjector struct {
40
- initialRetryTime time.Duration
41
- maxBackoffTime time.Duration
42
- backoffDuration * lru.Cache
43
- clock clock.PassiveClock
44
- client * provreqclient.ProvisioningRequestClient
45
- lastProvisioningRequestProcessTime time.Time
46
- checkCapacityBatchProcessing bool
40
+ initialRetryTime time.Duration
41
+ maxBackoffTime time.Duration
42
+ backoffDuration * lru.Cache
43
+ clock clock.PassiveClock
44
+ client * provreqclient.ProvisioningRequestClient
45
+ lastProvisioningRequestProcessTime time.Time
46
+ checkCapacityBatchProcessing bool
47
+ checkCapacityProvisioningClassPrefix string
47
48
}
48
49
49
50
// IsAvailableForProvisioning checks if the provisioning request is the correct state for processing and provisioning has not been attempted recently.
@@ -93,16 +94,24 @@ func (p *ProvisioningRequestPodsInjector) MarkAsFailed(pr *provreqwrapper.Provis
93
94
p .UpdateLastProcessTime ()
94
95
}
95
96
97
+ func (p * ProvisioningRequestPodsInjector ) isSupportedClass (pr * provreqwrapper.ProvisioningRequest ) bool {
98
+ return provisioningrequest .SupportedProvisioningClass (pr .Spec .ProvisioningClassName , p .checkCapacityProvisioningClassPrefix )
99
+ }
100
+
101
+ func (p * ProvisioningRequestPodsInjector ) shouldMarkAsAccepted (pr * provreqwrapper.ProvisioningRequest ) bool {
102
+ // Don't mark as accepted the check capacity ProvReq when batch processing is enabled.
103
+ // It will be marked later, in parallel, during processing the requests.
104
+ return ! p .checkCapacityBatchProcessing || ! p .matchesCheckCapacityClass (pr .Spec .ProvisioningClassName )
105
+ }
106
+
96
107
// GetPodsFromNextRequest picks one ProvisioningRequest meeting the condition passed using isSupportedClass function, marks it as accepted and returns pods from it.
97
- func (p * ProvisioningRequestPodsInjector ) GetPodsFromNextRequest (
98
- isSupportedClass func (* provreqwrapper.ProvisioningRequest ) bool ,
99
- ) ([]* apiv1.Pod , error ) {
108
+ func (p * ProvisioningRequestPodsInjector ) GetPodsFromNextRequest () ([]* apiv1.Pod , error ) {
100
109
provReqs , err := p .client .ProvisioningRequests ()
101
110
if err != nil {
102
111
return nil , err
103
112
}
104
113
for _ , pr := range provReqs {
105
- if ! isSupportedClass (pr ) {
114
+ if ! p . isSupportedClass (pr ) {
106
115
continue
107
116
}
108
117
@@ -117,16 +126,13 @@ func (p *ProvisioningRequestPodsInjector) GetPodsFromNextRequest(
117
126
p .MarkAsFailed (pr , provreqconditions .FailedToCreatePodsReason , err .Error ())
118
127
continue
119
128
}
120
- // Don't mark as accepted the check capacity ProvReq when batch processing is enabled.
121
- // It will be marked later, in parallel, during processing the requests.
122
- if pr . Spec . ProvisioningClassName == v1 . ProvisioningClassCheckCapacity && p . checkCapacityBatchProcessing {
123
- p . UpdateLastProcessTime ()
129
+ if p . shouldMarkAsAccepted ( pr ) {
130
+ if err := p . MarkAsAccepted ( pr ); err != nil {
131
+ continue
132
+ }
124
133
return podsFromProvReq , nil
125
134
}
126
- if err := p .MarkAsAccepted (pr ); err != nil {
127
- continue
128
- }
129
-
135
+ p .UpdateLastProcessTime ()
130
136
return podsFromProvReq , nil
131
137
}
132
138
return nil , nil
@@ -139,6 +145,10 @@ type ProvisioningRequestWithPods struct {
139
145
Pods []* apiv1.Pod
140
146
}
141
147
148
+ func (p * ProvisioningRequestPodsInjector ) matchesCheckCapacityClass (provisioningClassName string ) bool {
149
+ return provisioningClassName == p .checkCapacityProvisioningClassPrefix + v1 .ProvisioningClassCheckCapacity
150
+ }
151
+
142
152
// GetCheckCapacityBatch returns up to the requested number of ProvisioningRequestWithPods.
143
153
// We do not mark the PRs as accepted here.
144
154
// If we fail to get the pods for a PR, we mark the PR as failed and issue an update.
@@ -152,7 +162,7 @@ func (p *ProvisioningRequestPodsInjector) GetCheckCapacityBatch(maxPrs int) ([]P
152
162
if len (prsWithPods ) >= maxPrs {
153
163
break
154
164
}
155
- if pr .Spec .ProvisioningClassName != v1 . ProvisioningClassCheckCapacity {
165
+ if ! p . matchesCheckCapacityClass ( pr .Spec .ProvisioningClassName ) {
156
166
continue
157
167
}
158
168
if ! p .IsAvailableForProvisioning (pr ) {
@@ -175,15 +185,7 @@ func (p *ProvisioningRequestPodsInjector) Process(
175
185
_ * context.AutoscalingContext ,
176
186
unschedulablePods []* apiv1.Pod ,
177
187
) ([]* apiv1.Pod , error ) {
178
- podsFromProvReq , err := p .GetPodsFromNextRequest (
179
- func (pr * provreqwrapper.ProvisioningRequest ) bool {
180
- _ , found := provisioningrequest .SupportedProvisioningClasses [pr .Spec .ProvisioningClassName ]
181
- if ! found {
182
- klog .Warningf ("Provisioning Class %s is not supported for ProvReq %s/%s" , pr .Spec .ProvisioningClassName , pr .Namespace , pr .Name )
183
- }
184
- return found
185
- })
186
-
188
+ podsFromProvReq , err := p .GetPodsFromNextRequest ()
187
189
if err != nil {
188
190
return unschedulablePods , err
189
191
}
@@ -195,19 +197,20 @@ func (p *ProvisioningRequestPodsInjector) Process(
195
197
func (p * ProvisioningRequestPodsInjector ) CleanUp () {}
196
198
197
199
// NewProvisioningRequestPodsInjector creates a ProvisioningRequest filter processor.
198
- func NewProvisioningRequestPodsInjector (kubeConfig * rest.Config , initialBackoffTime , maxBackoffTime time.Duration , maxCacheSize int , checkCapacityBatchProcessing bool ) (* ProvisioningRequestPodsInjector , error ) {
200
+ func NewProvisioningRequestPodsInjector (kubeConfig * rest.Config , initialBackoffTime , maxBackoffTime time.Duration , maxCacheSize int , checkCapacityBatchProcessing bool , checkCapacityProvisioningClassPrefix string ) (* ProvisioningRequestPodsInjector , error ) {
199
201
client , err := provreqclient .NewProvisioningRequestClient (kubeConfig )
200
202
if err != nil {
201
203
return nil , err
202
204
}
203
205
return & ProvisioningRequestPodsInjector {
204
- initialRetryTime : initialBackoffTime ,
205
- maxBackoffTime : maxBackoffTime ,
206
- backoffDuration : lru .New (maxCacheSize ),
207
- client : client ,
208
- clock : clock.RealClock {},
209
- lastProvisioningRequestProcessTime : time .Now (),
210
- checkCapacityBatchProcessing : checkCapacityBatchProcessing ,
206
+ initialRetryTime : initialBackoffTime ,
207
+ maxBackoffTime : maxBackoffTime ,
208
+ backoffDuration : lru .New (maxCacheSize ),
209
+ client : client ,
210
+ clock : clock.RealClock {},
211
+ lastProvisioningRequestProcessTime : time .Now (),
212
+ checkCapacityBatchProcessing : checkCapacityBatchProcessing ,
213
+ checkCapacityProvisioningClassPrefix : checkCapacityProvisioningClassPrefix ,
211
214
}, nil
212
215
}
213
216
0 commit comments