Skip to content

Commit 3ba5db8

Browse files
Merge pull request #1418 from awgreene/apiservce-reorder
Create APIService after API server deployment
2 parents 89e8b5d + 45a06b8 commit 3ba5db8

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

pkg/controller/operators/olm/apiservices.go

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ func apiServiceDescriptionsForDeployment(descs []v1alpha1.APIServiceDescription,
298298
return result
299299
}
300300

301-
func (a *Operator) installOwnedAPIServiceRequirements(csv *v1alpha1.ClusterServiceVersion, strategy install.Strategy) (install.Strategy, error) {
301+
func (a *Operator) installOwnedAPIServiceRequirements(csv *v1alpha1.ClusterServiceVersion, strategy install.Strategy) (install.Strategy, map[string][]byte, error) {
302302
logger := log.WithFields(log.Fields{
303303
"csv": csv.GetName(),
304304
"namespace": csv.GetNamespace(),
@@ -307,24 +307,25 @@ func (a *Operator) installOwnedAPIServiceRequirements(csv *v1alpha1.ClusterServi
307307
// Assume the strategy is for a deployment
308308
strategyDetailsDeployment, ok := strategy.(*v1alpha1.StrategyDetailsDeployment)
309309
if !ok {
310-
return nil, fmt.Errorf("unsupported InstallStrategy type")
310+
return nil, nil, fmt.Errorf("unsupported InstallStrategy type")
311311
}
312312

313313
// Return early if there are no owned APIServices
314314
if len(csv.Spec.APIServiceDefinitions.Owned) == 0 {
315-
return strategyDetailsDeployment, nil
315+
return strategyDetailsDeployment, nil, nil
316316
}
317317

318318
// Create the CA
319319
expiration := time.Now().Add(DefaultCertValidFor)
320320
ca, err := certs.GenerateCA(expiration, Organization)
321321
if err != nil {
322322
logger.Debug("failed to generate CA")
323-
return nil, err
323+
return nil, nil, err
324324
}
325325
rotateAt := expiration.Add(-1 * DefaultCertMinFresh)
326326

327327
apiDescs := csv.GetOwnedAPIServiceDescriptions()
328+
deploymentCAPEMs := make(map[string][]byte)
328329
for i, sddSpec := range strategyDetailsDeployment.DeploymentSpecs {
329330
descs := apiServiceDescriptionsForDeployment(apiDescs, sddSpec.Name)
330331
if len(descs) == 0 {
@@ -334,25 +335,22 @@ func (a *Operator) installOwnedAPIServiceRequirements(csv *v1alpha1.ClusterServi
334335
// Update the deployment for each api service desc
335336
newDepSpec, err := a.installAPIServiceRequirements(sddSpec.Name, ca, rotateAt, sddSpec.Spec, csv, getServicePorts(descs))
336337
if err != nil {
337-
return nil, err
338+
return nil, nil, err
338339
}
339340

340341
caPEM, _, err := ca.ToPEM()
341342
if err != nil {
342343
logger.Warnf("unable to convert CA certificate to PEM format for Deployment %s", sddSpec.Name)
343-
return nil, err
344+
return nil, nil, err
344345
}
345346

346-
for _, desc := range descs {
347-
err = a.createOrUpdateAPIService(caPEM, desc, csv)
348-
if err != nil {
349-
return nil, err
350-
}
347+
deploymentCAPEMs[sddSpec.Name] = caPEM
351348

349+
for _, desc := range descs {
352350
// Cleanup legacy resources
353351
err = a.deleteLegacyAPIServiceResources(csv, desc)
354352
if err != nil {
355-
return nil, err
353+
return nil, nil, err
356354
}
357355
}
358356
strategyDetailsDeployment.DeploymentSpecs[i].Spec = *newDepSpec
@@ -364,7 +362,7 @@ func (a *Operator) installOwnedAPIServiceRequirements(csv *v1alpha1.ClusterServi
364362
csv.Status.CertsLastUpdated = &now
365363
csv.Status.CertsRotateAt = &rotateTime
366364

367-
return strategyDetailsDeployment, nil
365+
return strategyDetailsDeployment, deploymentCAPEMs, nil
368366
}
369367

370368
// updateDeploymentSpecsWithApiServiceData transforms an install strategy to include information about apiservices

pkg/controller/operators/olm/operator.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1398,7 +1398,8 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v
13981398
}
13991399

14001400
// Install owned APIServices and update strategy with serving cert data
1401-
strategy, syncError = a.installOwnedAPIServiceRequirements(out, strategy)
1401+
deploymentCAPEMs := make(map[string][]byte)
1402+
strategy, deploymentCAPEMs, syncError = a.installOwnedAPIServiceRequirements(out, strategy)
14021403
if syncError != nil {
14031404
out.SetPhaseWithEvent(v1alpha1.CSVPhaseFailed, v1alpha1.CSVReasonComponentFailed, fmt.Sprintf("install API services failed: %s", syncError), now, a.recorder)
14041405
return
@@ -1414,6 +1415,29 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v
14141415
return
14151416
}
14161417

1418+
// Create APIService
1419+
for _, desc := range out.GetOwnedAPIServiceDescriptions() {
1420+
if deploymentCAPEMs == nil {
1421+
err = fmt.Errorf("Deployment CAPEM map should not be nil")
1422+
return
1423+
}
1424+
caPEM, ok := deploymentCAPEMs[desc.DeploymentName]
1425+
if !ok {
1426+
err = fmt.Errorf("Deployment not associated with APIService")
1427+
return
1428+
}
1429+
err = a.createOrUpdateAPIService(caPEM, desc, out)
1430+
if err != nil {
1431+
return
1432+
}
1433+
1434+
// Cleanup legacy resources
1435+
err = a.deleteLegacyAPIServiceResources(out, desc)
1436+
if err != nil {
1437+
return
1438+
}
1439+
}
1440+
14171441
out.SetPhaseWithEvent(v1alpha1.CSVPhaseInstalling, v1alpha1.CSVReasonInstallSuccessful, "waiting for install components to report healthy", now, a.recorder)
14181442
err := a.csvQueueSet.Requeue(out.GetNamespace(), out.GetName())
14191443
if err != nil {

0 commit comments

Comments
 (0)