9
9
appsv1 "k8s.io/api/apps/v1"
10
10
corev1 "k8s.io/api/core/v1"
11
11
rbacv1 "k8s.io/api/rbac/v1"
12
- k8serrors "k8s.io/apimachinery/pkg/api/errors"
12
+ apierrors "k8s.io/apimachinery/pkg/api/errors"
13
13
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14
14
"k8s.io/apimachinery/pkg/util/intstr"
15
15
@@ -160,7 +160,7 @@ func (i *StrategyDeploymentInstaller) getCertResources() []certResource {
160
160
}
161
161
162
162
func (i * StrategyDeploymentInstaller ) certResourcesForDeployment (deploymentName string ) []certResource {
163
- result := []certResource {}
163
+ var result []certResource
164
164
for _ , desc := range i .getCertResources () {
165
165
if desc .getDeploymentName () == deploymentName {
166
166
result = append (result , desc )
@@ -185,13 +185,12 @@ func (i *StrategyDeploymentInstaller) installCertRequirements(strategy Strategy)
185
185
}
186
186
187
187
// Create the CA
188
- expiration := time .Now (). Add ( DefaultCertValidFor )
189
- ca , err := certs .GenerateCA (expiration , Organization )
188
+ i . certificateExpirationTime = CalculateCertExpiration ( time .Now ())
189
+ ca , err := certs .GenerateCA (i . certificateExpirationTime , Organization )
190
190
if err != nil {
191
191
logger .Debug ("failed to generate CA" )
192
192
return nil , err
193
193
}
194
- rotateAt := expiration .Add (- 1 * DefaultCertMinFresh )
195
194
196
195
for n , sddSpec := range strategyDetailsDeployment .DeploymentSpecs {
197
196
certResources := i .certResourcesForDeployment (sddSpec .Name )
@@ -202,7 +201,7 @@ func (i *StrategyDeploymentInstaller) installCertRequirements(strategy Strategy)
202
201
}
203
202
204
203
// Update the deployment for each certResource
205
- newDepSpec , caPEM , err := i .installCertRequirementsForDeployment (sddSpec .Name , ca , rotateAt , sddSpec .Spec , getServicePorts (certResources ))
204
+ newDepSpec , caPEM , err := i .installCertRequirementsForDeployment (sddSpec .Name , ca , i . certificateExpirationTime , sddSpec .Spec , getServicePorts (certResources ))
206
205
if err != nil {
207
206
return nil , err
208
207
}
@@ -214,6 +213,14 @@ func (i *StrategyDeploymentInstaller) installCertRequirements(strategy Strategy)
214
213
return strategyDetailsDeployment , nil
215
214
}
216
215
216
+ func (i * StrategyDeploymentInstaller ) CertsRotateAt () time.Time {
217
+ return CalculateCertRotatesAt (i .certificateExpirationTime )
218
+ }
219
+
220
+ func (i * StrategyDeploymentInstaller ) CertsRotated () bool {
221
+ return i .certificatesRotated
222
+ }
223
+
217
224
func ShouldRotateCerts (csv * v1alpha1.ClusterServiceVersion ) bool {
218
225
now := metav1 .Now ()
219
226
if ! csv .Status .CertsRotateAt .IsZero () && csv .Status .CertsRotateAt .Before (& now ) {
@@ -223,7 +230,15 @@ func ShouldRotateCerts(csv *v1alpha1.ClusterServiceVersion) bool {
223
230
return false
224
231
}
225
232
226
- func (i * StrategyDeploymentInstaller ) installCertRequirementsForDeployment (deploymentName string , ca * certs.KeyPair , rotateAt time.Time , depSpec appsv1.DeploymentSpec , ports []corev1.ServicePort ) (* appsv1.DeploymentSpec , []byte , error ) {
233
+ func CalculateCertExpiration (startingFrom time.Time ) time.Time {
234
+ return startingFrom .Add (DefaultCertValidFor )
235
+ }
236
+
237
+ func CalculateCertRotatesAt (certExpirationTime time.Time ) time.Time {
238
+ return certExpirationTime .Add (- 1 * DefaultCertMinFresh )
239
+ }
240
+
241
+ func (i * StrategyDeploymentInstaller ) installCertRequirementsForDeployment (deploymentName string , ca * certs.KeyPair , expiration time.Time , depSpec appsv1.DeploymentSpec , ports []corev1.ServicePort ) (* appsv1.DeploymentSpec , []byte , error ) {
227
242
logger := log .WithFields (log.Fields {})
228
243
229
244
// Create a service for the deployment
@@ -246,7 +261,7 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
246
261
247
262
// Delete the Service to replace
248
263
deleteErr := i .strategyClient .GetOpClient ().DeleteService (service .GetNamespace (), service .GetName (), & metav1.DeleteOptions {})
249
- if deleteErr != nil && ! k8serrors .IsNotFound (deleteErr ) {
264
+ if deleteErr != nil && ! apierrors .IsNotFound (deleteErr ) {
250
265
return nil , nil , fmt .Errorf ("could not delete existing service %s" , service .GetName ())
251
266
}
252
267
}
@@ -263,7 +278,7 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
263
278
fmt .Sprintf ("%s.%s" , service .GetName (), i .owner .GetNamespace ()),
264
279
fmt .Sprintf ("%s.%s.svc" , service .GetName (), i .owner .GetNamespace ()),
265
280
}
266
- servingPair , err := certGenerator .Generate (rotateAt , Organization , ca , hosts )
281
+ servingPair , err := certGenerator .Generate (expiration , Organization , ca , hosts )
267
282
if err != nil {
268
283
logger .Warnf ("could not generate signed certs for hosts %v" , hosts )
269
284
return nil , nil , err
@@ -311,16 +326,18 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
311
326
secret = existingSecret
312
327
caPEM = existingCAPEM
313
328
caHash = certs .PEMSHA256 (caPEM )
314
- } else if _ , err := i .strategyClient .GetOpClient ().UpdateSecret (secret ); err != nil {
315
- logger .Warnf ("could not update secret %s" , secret .GetName ())
316
- return nil , nil , err
329
+ } else {
330
+ if _ , err := i .strategyClient .GetOpClient ().UpdateSecret (secret ); err != nil {
331
+ logger .Warnf ("could not update secret %s" , secret .GetName ())
332
+ return nil , nil , err
333
+ }
334
+ i .certificatesRotated = true
317
335
}
318
-
319
- } else if k8serrors .IsNotFound (err ) {
336
+ } else if apierrors .IsNotFound (err ) {
320
337
// Create the secret
321
338
ownerutil .AddNonBlockingOwner (secret , i .owner )
322
339
if _ , err := i .strategyClient .GetOpClient ().CreateSecret (secret ); err != nil {
323
- if ! k8serrors .IsAlreadyExists (err ) {
340
+ if ! apierrors .IsAlreadyExists (err ) {
324
341
log .Warnf ("could not create secret %s: %v" , secret .GetName (), err )
325
342
return nil , nil , err
326
343
}
@@ -331,6 +348,7 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
331
348
return nil , nil , err
332
349
}
333
350
}
351
+ i .certificatesRotated = true
334
352
} else {
335
353
return nil , nil , err
336
354
}
@@ -361,7 +379,7 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
361
379
logger .Warnf ("could not update secret role %s" , secretRole .GetName ())
362
380
return nil , nil , err
363
381
}
364
- } else if k8serrors .IsNotFound (err ) {
382
+ } else if apierrors .IsNotFound (err ) {
365
383
// Create the role
366
384
ownerutil .AddNonBlockingOwner (secretRole , i .owner )
367
385
_ , err = i .strategyClient .GetOpClient ().CreateRole (secretRole )
@@ -407,7 +425,7 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
407
425
logger .Warnf ("could not update secret rolebinding %s" , secretRoleBinding .GetName ())
408
426
return nil , nil , err
409
427
}
410
- } else if k8serrors .IsNotFound (err ) {
428
+ } else if apierrors .IsNotFound (err ) {
411
429
// Create the role
412
430
ownerutil .AddNonBlockingOwner (secretRoleBinding , i .owner )
413
431
_ , err = i .strategyClient .GetOpClient ().CreateRoleBinding (secretRoleBinding )
@@ -452,7 +470,7 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
452
470
logger .Warnf ("could not update auth delegator clusterrolebinding %s" , authDelegatorClusterRoleBinding .GetName ())
453
471
return nil , nil , err
454
472
}
455
- } else if k8serrors .IsNotFound (err ) {
473
+ } else if apierrors .IsNotFound (err ) {
456
474
// Create the role.
457
475
if err := ownerutil .AddOwnerLabels (authDelegatorClusterRoleBinding , i .owner ); err != nil {
458
476
return nil , nil , err
@@ -499,7 +517,7 @@ func (i *StrategyDeploymentInstaller) installCertRequirementsForDeployment(deplo
499
517
logger .Warnf ("could not update auth reader role binding %s" , authReaderRoleBinding .GetName ())
500
518
return nil , nil , err
501
519
}
502
- } else if k8serrors .IsNotFound (err ) {
520
+ } else if apierrors .IsNotFound (err ) {
503
521
// Create the role.
504
522
if err := ownerutil .AddOwnerLabels (authReaderRoleBinding , i .owner ); err != nil {
505
523
return nil , nil , err
0 commit comments