( ctx context.Context, desiredObjs []*unstructured.Unstructured, cr *nvidiav1alpha1.NVIDIADriver, renderData driverRenderData)
| 369 | } |
| 370 | |
| 371 | func (s *stateDriver) handleDefaultImagesInObjects( |
| 372 | ctx context.Context, |
| 373 | desiredObjs []*unstructured.Unstructured, |
| 374 | cr *nvidiav1alpha1.NVIDIADriver, |
| 375 | renderData driverRenderData) ([]*unstructured.Unstructured, error) { |
| 376 | logger := log.FromContext(ctx) |
| 377 | |
| 378 | // If 'image' field is not set in spec, then the driver image path |
| 379 | // was determined via the DRIVER_MANAGER_IMAGE env var |
| 380 | managerImageEnvVarUsed := (cr.Spec.Manager.Image == "") |
| 381 | if !managerImageEnvVarUsed { |
| 382 | return desiredObjs, nil |
| 383 | } |
| 384 | |
| 385 | // If the default image is used for driver-manager, make sure this image |
| 386 | // is only upgraded iff the driver spec has been updated. This avoids |
| 387 | // triggering undesired driver upgrades when the operator itself is upgraded |
| 388 | // but the NVIDIADriver spec is unmodified. |
| 389 | logger.V(consts.LogLevelDebug).Info("Default env var is being used for k8s-driver-manager image, checking for an updated default image") |
| 390 | |
| 391 | desiredDs, err := getDaemonsetFromObjects(desiredObjs) |
| 392 | if err != nil { |
| 393 | return nil, fmt.Errorf("error getting DaemonSet from unstructured objects: %w", err) |
| 394 | } |
| 395 | |
| 396 | currentDs := &appsv1.DaemonSet{} |
| 397 | err = s.client.Get(ctx, types.NamespacedName{Namespace: desiredDs.Namespace, Name: desiredDs.Name}, currentDs) |
| 398 | if err != nil { |
| 399 | if apierrors.IsNotFound(err) { |
| 400 | return desiredObjs, nil |
| 401 | } |
| 402 | return nil, fmt.Errorf("failed to get current driver DaemonSet object: %w", err) |
| 403 | } |
| 404 | |
| 405 | currentManagerImage := "" |
| 406 | for _, container := range currentDs.Spec.Template.Spec.InitContainers { |
| 407 | if container.Name == "k8s-driver-manager" { |
| 408 | currentManagerImage = container.Image |
| 409 | break |
| 410 | } |
| 411 | } |
| 412 | |
| 413 | logger.V(consts.LogLevelDebug).Info("Current k8s-driver-manager image", "image", currentManagerImage) |
| 414 | if currentManagerImage == renderData.Driver.ManagerImagePath { |
| 415 | logger.V(consts.LogLevelDebug).Info("Default k8s-driver-manager image has not been updated") |
| 416 | return desiredObjs, nil |
| 417 | } |
| 418 | |
| 419 | // Render manifests again but with the current k8s-driver-manager being used |
| 420 | renderData.Driver.ManagerImagePath = currentManagerImage |
| 421 | desiredObjsWithCurrentImages, err := s.renderManifestObjects(ctx, &renderData) |
| 422 | if err != nil { |
| 423 | return nil, fmt.Errorf("failed to render kubernetes manifests: %w", err) |
| 424 | } |
| 425 | |
| 426 | obj, err := getObjectOfKind(desiredObjsWithCurrentImages, "DaemonSet") |
| 427 | if err != nil { |
| 428 | return nil, fmt.Errorf("failed to get DaemonSet object: %w", err) |
no test coverage detected