From b65a713cbdf4faa8534ceeb614577f193d1305dd Mon Sep 17 00:00:00 2001 From: Gong Zhang Date: Wed, 20 Sep 2023 12:09:50 +0800 Subject: [PATCH] refactor context for vspheredeploymentzone controller Signed-off-by: Gong Zhang --- controllers/controllers_suite_test.go | 2 +- .../vspheredeploymentzone_controller.go | 61 +++++++++---------- ...vspheredeploymentzone_controller_domain.go | 60 +++++++++--------- ...redeploymentzone_controller_domain_test.go | 26 ++++---- .../vspheredeploymentzone_controller_test.go | 16 +++-- main.go | 2 +- pkg/services/govmomi/cluster/rule.go | 10 +-- pkg/services/govmomi/cluster/rule_test.go | 2 +- pkg/services/govmomi/cluster/service.go | 1 + pkg/services/govmomi/cluster/vmgroup.go | 7 ++- pkg/services/govmomi/metadata/metadata.go | 10 ++- .../govmomi/metadata/metadata_suite_test.go | 35 +++++------ pkg/services/interfaces.go | 12 ++-- pkg/taggable/get.go | 7 +-- 14 files changed, 126 insertions(+), 125 deletions(-) diff --git a/controllers/controllers_suite_test.go b/controllers/controllers_suite_test.go index b97f15ed67..71b8bb2b12 100644 --- a/controllers/controllers_suite_test.go +++ b/controllers/controllers_suite_test.go @@ -105,7 +105,7 @@ func setup() { if err := AddVsphereClusterIdentityControllerToManager(testEnv.GetContext(), testEnv.Manager, controllerOpts); err != nil { panic(fmt.Sprintf("unable to setup VSphereClusterIdentity controller: %v", err)) } - if err := AddVSphereDeploymentZoneControllerToManager(testEnv.GetContext(), testEnv.Manager, controllerOpts); err != nil { + if err := AddVSphereDeploymentZoneControllerToManager(ctx, testEnv.GetContext(), testEnv.Manager, controllerOpts); err != nil { panic(fmt.Sprintf("unable to setup VSphereDeploymentZone controller: %v", err)) } if err := AddServiceAccountProviderControllerToManager(ctx, testEnv.GetContext(), testEnv.Manager, tracker, controllerOpts); err != nil { diff --git a/controllers/vspheredeploymentzone_controller.go b/controllers/vspheredeploymentzone_controller.go index 4a47fc4d8d..5f75bd2aba 100644 --- a/controllers/vspheredeploymentzone_controller.go +++ b/controllers/vspheredeploymentzone_controller.go @@ -57,24 +57,24 @@ import ( // +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=vspherefailuredomains,verbs=get;list;watch;create;update;patch;delete // AddVSphereDeploymentZoneControllerToManager adds the VSphereDeploymentZone controller to the provided manager. -func AddVSphereDeploymentZoneControllerToManager(controllerCtx *capvcontext.ControllerManagerContext, mgr manager.Manager, options controller.Options) error { +func AddVSphereDeploymentZoneControllerToManager(ctx context.Context, controllerManagerCtx *capvcontext.ControllerManagerContext, mgr manager.Manager, options controller.Options) error { var ( controlledType = &infrav1.VSphereDeploymentZone{} controlledTypeName = reflect.TypeOf(controlledType).Elem().Name() controlledTypeGVK = infrav1.GroupVersion.WithKind(controlledTypeName) controllerNameShort = fmt.Sprintf("%s-controller", strings.ToLower(controlledTypeName)) - controllerNameLong = fmt.Sprintf("%s/%s/%s", controllerCtx.Namespace, controllerCtx.Name, controllerNameShort) + controllerNameLong = fmt.Sprintf("%s/%s/%s", controllerManagerCtx.Namespace, controllerManagerCtx.Name, controllerNameShort) ) // Build the controller context. - controllerContext := &capvcontext.ControllerContext{ - ControllerManagerContext: controllerCtx, + controllerCtx := &capvcontext.ControllerContext{ + ControllerManagerContext: controllerManagerCtx, Name: controllerNameShort, Recorder: record.New(mgr.GetEventRecorderFor(controllerNameLong)), - Logger: controllerCtx.Logger.WithName(controllerNameShort), + Logger: controllerManagerCtx.Logger.WithName(controllerNameShort), } - reconciler := vsphereDeploymentZoneReconciler{ControllerContext: controllerContext} + reconciler := vsphereDeploymentZoneReconciler{ControllerContext: controllerCtx} return ctrl.NewControllerManagedBy(mgr). // Watch the controlled, infrastructure resource. @@ -88,10 +88,10 @@ func AddVSphereDeploymentZoneControllerToManager(controllerCtx *capvcontext.Cont // should cause a resource to be synchronized, such as a goroutine // waiting on some asynchronous, external task to complete. WatchesRawSource( - &source.Channel{Source: controllerCtx.GetGenericEventChannelFor(controlledTypeGVK)}, + &source.Channel{Source: controllerManagerCtx.GetGenericEventChannelFor(controlledTypeGVK)}, &handler.EnqueueRequestForObject{}, ). - WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(ctrl.LoggerFrom(controllerCtx), controllerCtx.WatchFilterValue)). + WithEventFilter(predicates.ResourceNotPausedAndHasFilterLabel(ctrl.LoggerFrom(ctx), controllerManagerCtx.WatchFilterValue)). Complete(reconciler) } @@ -100,14 +100,13 @@ type vsphereDeploymentZoneReconciler struct { } func (r vsphereDeploymentZoneReconciler) Reconcile(ctx context.Context, request reconcile.Request) (_ reconcile.Result, reterr error) { - // Note: Just adding VSphereDeploymentZone here explicitly as this reconciler was not refactored - // to use the logger from ctx yet. Once we do that, controller-runtime adds VSphereDeploymentZone for us. - logr := r.Logger.WithValues("VSphereDeploymentZone", klog.KRef(request.Namespace, request.Name)) + log := ctrl.LoggerFrom(ctx) + // Fetch the VSphereDeploymentZone for this request. vsphereDeploymentZone := &infrav1.VSphereDeploymentZone{} if err := r.Client.Get(ctx, request.NamespacedName, vsphereDeploymentZone); err != nil { if apierrors.IsNotFound(err) { - logr.V(4).Info("VSphereDeploymentZone not found, won't reconcile", "key", request.NamespacedName) + log.V(4).Info("VSphereDeploymentZone not found, won't reconcile", "key", request.NamespacedName) return reconcile.Result{}, nil } return reconcile.Result{}, err @@ -117,7 +116,7 @@ func (r vsphereDeploymentZoneReconciler) Reconcile(ctx context.Context, request failureDomainKey := client.ObjectKey{Name: vsphereDeploymentZone.Spec.FailureDomain} if err := r.Client.Get(ctx, failureDomainKey, failureDomain); err != nil { if apierrors.IsNotFound(err) { - logr.V(4).Info("Failure Domain not found, won't reconcile", "key", failureDomainKey) + log.V(4).Info("Failure Domain not found, won't reconcile", "key", failureDomainKey) return reconcile.Result{}, nil } return reconcile.Result{}, err @@ -137,7 +136,7 @@ func (r vsphereDeploymentZoneReconciler) Reconcile(ctx context.Context, request ControllerContext: r.ControllerContext, VSphereDeploymentZone: vsphereDeploymentZone, VSphereFailureDomain: failureDomain, - Logger: logr, + Logger: log, PatchHelper: patchHelper, } defer func() { @@ -147,7 +146,7 @@ func (r vsphereDeploymentZoneReconciler) Reconcile(ctx context.Context, request }() if !vsphereDeploymentZone.DeletionTimestamp.IsZero() { - return ctrl.Result{}, r.reconcileDelete(vsphereDeploymentZoneContext) + return ctrl.Result{}, r.reconcileDelete(ctx, vsphereDeploymentZoneContext) } // If the VSphereDeploymentZone doesn't have our finalizer, add it. @@ -157,11 +156,11 @@ func (r vsphereDeploymentZoneReconciler) Reconcile(ctx context.Context, request return ctrl.Result{}, nil } - return ctrl.Result{}, r.reconcileNormal(vsphereDeploymentZoneContext) + return ctrl.Result{}, r.reconcileNormal(ctx, vsphereDeploymentZoneContext) } -func (r vsphereDeploymentZoneReconciler) reconcileNormal(deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { - authSession, err := r.getVCenterSession(deploymentZoneCtx) +func (r vsphereDeploymentZoneReconciler) reconcileNormal(ctx context.Context, deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { + authSession, err := r.getVCenterSession(ctx, deploymentZoneCtx) if err != nil { deploymentZoneCtx.Logger.V(4).Error(err, "unable to create session") conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VCenterAvailableCondition, infrav1.VCenterUnreachableReason, clusterv1.ConditionSeverityError, err.Error()) @@ -171,14 +170,14 @@ func (r vsphereDeploymentZoneReconciler) reconcileNormal(deploymentZoneCtx *capv deploymentZoneCtx.AuthSession = authSession conditions.MarkTrue(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VCenterAvailableCondition) - if err := r.reconcilePlacementConstraint(deploymentZoneCtx); err != nil { + if err := r.reconcilePlacementConstraint(ctx, deploymentZoneCtx); err != nil { deploymentZoneCtx.VSphereDeploymentZone.Status.Ready = pointer.Bool(false) return errors.Wrap(err, "placement constraint is misconfigured") } conditions.MarkTrue(deploymentZoneCtx.VSphereDeploymentZone, infrav1.PlacementConstraintMetCondition) // reconcile the failure domain - if err := r.reconcileFailureDomain(deploymentZoneCtx); err != nil { + if err := r.reconcileFailureDomain(ctx, deploymentZoneCtx); err != nil { deploymentZoneCtx.Logger.V(4).Error(err, "failed to reconcile failure domain", "failureDomain", deploymentZoneCtx.VSphereDeploymentZone.Spec.FailureDomain) deploymentZoneCtx.VSphereDeploymentZone.Status.Ready = pointer.Bool(false) return errors.Wrapf(err, "failed to reconcile failure domain") @@ -189,11 +188,11 @@ func (r vsphereDeploymentZoneReconciler) reconcileNormal(deploymentZoneCtx *capv return nil } -func (r vsphereDeploymentZoneReconciler) reconcilePlacementConstraint(deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { +func (r vsphereDeploymentZoneReconciler) reconcilePlacementConstraint(ctx context.Context, deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { placementConstraint := deploymentZoneCtx.VSphereDeploymentZone.Spec.PlacementConstraint if resourcePool := placementConstraint.ResourcePool; resourcePool != "" { - if _, err := deploymentZoneCtx.AuthSession.Finder.ResourcePool(deploymentZoneCtx, resourcePool); err != nil { + if _, err := deploymentZoneCtx.AuthSession.Finder.ResourcePool(ctx, resourcePool); err != nil { deploymentZoneCtx.Logger.V(4).Error(err, "unable to find resource pool", "name", resourcePool) conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.PlacementConstraintMetCondition, infrav1.ResourcePoolNotFoundReason, clusterv1.ConditionSeverityError, "resource pool %s is misconfigured", resourcePool) return errors.Wrapf(err, "unable to find resource pool %s", resourcePool) @@ -201,7 +200,7 @@ func (r vsphereDeploymentZoneReconciler) reconcilePlacementConstraint(deployment } if folder := placementConstraint.Folder; folder != "" { - if _, err := deploymentZoneCtx.AuthSession.Finder.Folder(deploymentZoneCtx, placementConstraint.Folder); err != nil { + if _, err := deploymentZoneCtx.AuthSession.Finder.Folder(ctx, placementConstraint.Folder); err != nil { deploymentZoneCtx.Logger.V(4).Error(err, "unable to find folder", "name", folder) conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.PlacementConstraintMetCondition, infrav1.FolderNotFoundReason, clusterv1.ConditionSeverityError, "datastore %s is misconfigured", folder) return errors.Wrapf(err, "unable to find folder %s", folder) @@ -210,7 +209,7 @@ func (r vsphereDeploymentZoneReconciler) reconcilePlacementConstraint(deployment return nil } -func (r vsphereDeploymentZoneReconciler) getVCenterSession(deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) (*session.Session, error) { +func (r vsphereDeploymentZoneReconciler) getVCenterSession(ctx context.Context, deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) (*session.Session, error) { params := session.NewParams(). WithServer(deploymentZoneCtx.VSphereDeploymentZone.Spec.Server). WithDatacenter(deploymentZoneCtx.VSphereFailureDomain.Spec.Topology.Datacenter). @@ -221,7 +220,7 @@ func (r vsphereDeploymentZoneReconciler) getVCenterSession(deploymentZoneCtx *ca }) clusterList := &infrav1.VSphereClusterList{} - if err := r.Client.List(deploymentZoneCtx, clusterList); err != nil { + if err := r.Client.List(ctx, clusterList); err != nil { return nil, err } @@ -232,7 +231,7 @@ func (r vsphereDeploymentZoneReconciler) getVCenterSession(deploymentZoneCtx *ca logger := deploymentZoneCtx.Logger.WithValues("VSphereCluster", klog.KRef(vsphereCluster.Namespace, vsphereCluster.Name)) params = params.WithThumbprint(vsphereCluster.Spec.Thumbprint) clust := vsphereCluster - creds, err := identity.GetCredentials(deploymentZoneCtx, r.Client, &clust, r.Namespace) + creds, err := identity.GetCredentials(ctx, r.Client, &clust, r.Namespace) if err != nil { logger.Error(err, "error retrieving credentials from IdentityRef") continue @@ -244,15 +243,15 @@ func (r vsphereDeploymentZoneReconciler) getVCenterSession(deploymentZoneCtx *ca } // Fallback to using credentials provided to the manager - return session.GetOrCreate(r.Context, + return session.GetOrCreate(ctx, params) } -func (r vsphereDeploymentZoneReconciler) reconcileDelete(deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { +func (r vsphereDeploymentZoneReconciler) reconcileDelete(ctx context.Context, deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { r.Logger.Info("Deleting VSphereDeploymentZone") machines := &clusterv1.MachineList{} - if err := r.Client.List(deploymentZoneCtx, machines); err != nil { + if err := r.Client.List(ctx, machines); err != nil { r.Logger.Error(err, "unable to list machines") return errors.Wrapf(err, "unable to list machines") } @@ -270,7 +269,7 @@ func (r vsphereDeploymentZoneReconciler) reconcileDelete(deploymentZoneCtx *capv return err } - if err := updateOwnerReferences(deploymentZoneCtx, deploymentZoneCtx.VSphereFailureDomain, r.Client, func() []metav1.OwnerReference { + if err := updateOwnerReferences(ctx, deploymentZoneCtx.VSphereFailureDomain, r.Client, func() []metav1.OwnerReference { return clusterutilv1.RemoveOwnerRef(deploymentZoneCtx.VSphereFailureDomain.OwnerReferences, metav1.OwnerReference{ APIVersion: infrav1.GroupVersion.String(), Kind: deploymentZoneCtx.VSphereDeploymentZone.Kind, @@ -282,7 +281,7 @@ func (r vsphereDeploymentZoneReconciler) reconcileDelete(deploymentZoneCtx *capv if len(deploymentZoneCtx.VSphereFailureDomain.OwnerReferences) == 0 { deploymentZoneCtx.Logger.Info("deleting vsphereFailureDomain", "name", deploymentZoneCtx.VSphereFailureDomain.Name) - if err := r.Client.Delete(deploymentZoneCtx, deploymentZoneCtx.VSphereFailureDomain); err != nil && !apierrors.IsNotFound(err) { + if err := r.Client.Delete(ctx, deploymentZoneCtx.VSphereFailureDomain); err != nil && !apierrors.IsNotFound(err) { deploymentZoneCtx.Logger.Error(err, "failed to delete related %s %s", deploymentZoneCtx.VSphereFailureDomain.GroupVersionKind(), deploymentZoneCtx.VSphereFailureDomain.Name) } } diff --git a/controllers/vspheredeploymentzone_controller_domain.go b/controllers/vspheredeploymentzone_controller_domain.go index 5fbc6e2f48..6e425b7f20 100644 --- a/controllers/vspheredeploymentzone_controller_domain.go +++ b/controllers/vspheredeploymentzone_controller_domain.go @@ -17,6 +17,8 @@ limitations under the License. package controllers import ( + "context" + "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kerrors "k8s.io/apimachinery/pkg/util/errors" @@ -33,37 +35,37 @@ import ( "sigs.k8s.io/cluster-api-provider-vsphere/pkg/taggable" ) -func (r vsphereDeploymentZoneReconciler) reconcileFailureDomain(deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { - logger := ctrl.LoggerFrom(deploymentZoneCtx).WithValues("VSphereFailureDomain", klog.KObj(deploymentZoneCtx.VSphereFailureDomain)) +func (r vsphereDeploymentZoneReconciler) reconcileFailureDomain(ctx context.Context, deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { + logger := ctrl.LoggerFrom(ctx).WithValues("VSphereFailureDomain", klog.KObj(deploymentZoneCtx.VSphereFailureDomain)) // verify the failure domain for the region - if err := r.reconcileInfraFailureDomain(deploymentZoneCtx, deploymentZoneCtx.VSphereFailureDomain.Spec.Region); err != nil { + if err := r.reconcileInfraFailureDomain(ctx, deploymentZoneCtx, deploymentZoneCtx.VSphereFailureDomain.Spec.Region); err != nil { conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VSphereFailureDomainValidatedCondition, infrav1.RegionMisconfiguredReason, clusterv1.ConditionSeverityError, err.Error()) logger.Error(err, "region is not configured correctly") return errors.Wrapf(err, "region is not configured correctly") } // verify the failure domain for the zone - if err := r.reconcileInfraFailureDomain(deploymentZoneCtx, deploymentZoneCtx.VSphereFailureDomain.Spec.Zone); err != nil { + if err := r.reconcileInfraFailureDomain(ctx, deploymentZoneCtx, deploymentZoneCtx.VSphereFailureDomain.Spec.Zone); err != nil { conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VSphereFailureDomainValidatedCondition, infrav1.ZoneMisconfiguredReason, clusterv1.ConditionSeverityError, err.Error()) logger.Error(err, "zone is not configured correctly") return errors.Wrapf(err, "zone is not configured correctly") } if computeCluster := deploymentZoneCtx.VSphereFailureDomain.Spec.Topology.ComputeCluster; computeCluster != nil { - if err := r.reconcileComputeCluster(deploymentZoneCtx); err != nil { + if err := r.reconcileComputeCluster(ctx, deploymentZoneCtx); err != nil { logger.Error(err, "compute cluster is not configured correctly", "name", *computeCluster) return errors.Wrap(err, "compute cluster is not configured correctly") } } - if err := r.reconcileTopology(deploymentZoneCtx); err != nil { + if err := r.reconcileTopology(ctx, deploymentZoneCtx); err != nil { logger.Error(err, "topology is not configured correctly") return errors.Wrap(err, "topology is not configured correctly") } // Ensure the VSphereDeploymentZone is marked as an owner of the VSphereFailureDomain. - if err := updateOwnerReferences(deploymentZoneCtx, deploymentZoneCtx.VSphereFailureDomain, r.Client, + if err := updateOwnerReferences(ctx, deploymentZoneCtx.VSphereFailureDomain, r.Client, func() []metav1.OwnerReference { return clusterutilv1.EnsureOwnerRef( deploymentZoneCtx.VSphereFailureDomain.OwnerReferences, @@ -82,37 +84,37 @@ func (r vsphereDeploymentZoneReconciler) reconcileFailureDomain(deploymentZoneCt return nil } -func (r vsphereDeploymentZoneReconciler) reconcileInfraFailureDomain(deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext, failureDomain infrav1.FailureDomain) error { +func (r vsphereDeploymentZoneReconciler) reconcileInfraFailureDomain(ctx context.Context, deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext, failureDomain infrav1.FailureDomain) error { if *failureDomain.AutoConfigure { - return r.createAndAttachMetadata(deploymentZoneCtx, failureDomain) + return r.createAndAttachMetadata(ctx, deploymentZoneCtx, failureDomain) } - return r.verifyFailureDomain(deploymentZoneCtx, failureDomain) + return r.verifyFailureDomain(ctx, deploymentZoneCtx, failureDomain) } -func (r vsphereDeploymentZoneReconciler) reconcileTopology(deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { +func (r vsphereDeploymentZoneReconciler) reconcileTopology(ctx context.Context, deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { topology := deploymentZoneCtx.VSphereFailureDomain.Spec.Topology if datastore := topology.Datastore; datastore != "" { - if _, err := deploymentZoneCtx.AuthSession.Finder.Datastore(deploymentZoneCtx, datastore); err != nil { + if _, err := deploymentZoneCtx.AuthSession.Finder.Datastore(ctx, datastore); err != nil { conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VSphereFailureDomainValidatedCondition, infrav1.DatastoreNotFoundReason, clusterv1.ConditionSeverityError, "datastore %s is misconfigured", datastore) return errors.Wrapf(err, "unable to find datastore %s", datastore) } } for _, network := range topology.Networks { - if _, err := deploymentZoneCtx.AuthSession.Finder.Network(deploymentZoneCtx, network); err != nil { + if _, err := deploymentZoneCtx.AuthSession.Finder.Network(ctx, network); err != nil { conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VSphereFailureDomainValidatedCondition, infrav1.NetworkNotFoundReason, clusterv1.ConditionSeverityError, "network %s is misconfigured", network) return errors.Wrapf(err, "unable to find network %s", network) } } if hostPlacementInfo := topology.Hosts; hostPlacementInfo != nil { - rule, err := cluster.VerifyAffinityRule(deploymentZoneCtx, *topology.ComputeCluster, hostPlacementInfo.HostGroupName, hostPlacementInfo.VMGroupName) + rule, err := cluster.VerifyAffinityRule(ctx, deploymentZoneCtx, *topology.ComputeCluster, hostPlacementInfo.HostGroupName, hostPlacementInfo.VMGroupName) switch { case err != nil: conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VSphereFailureDomainValidatedCondition, infrav1.HostsMisconfiguredReason, clusterv1.ConditionSeverityError, "vm host affinity does not exist") return err case rule.Disabled(): - ctrl.LoggerFrom(deploymentZoneCtx).V(4).Info("warning: vm-host rule for the failure domain is disabled", "hostgroup", hostPlacementInfo.HostGroupName, "vmGroup", hostPlacementInfo.VMGroupName) + ctrl.LoggerFrom(ctx).V(4).Info("warning: vm-host rule for the failure domain is disabled", "hostgroup", hostPlacementInfo.HostGroupName, "vmGroup", hostPlacementInfo.VMGroupName) conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VSphereFailureDomainValidatedCondition, infrav1.HostsAffinityMisconfiguredReason, clusterv1.ConditionSeverityWarning, "vm host affinity is disabled") default: conditions.MarkTrue(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VSphereFailureDomainValidatedCondition) @@ -121,25 +123,25 @@ func (r vsphereDeploymentZoneReconciler) reconcileTopology(deploymentZoneCtx *ca return nil } -func (r vsphereDeploymentZoneReconciler) reconcileComputeCluster(deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { +func (r vsphereDeploymentZoneReconciler) reconcileComputeCluster(ctx context.Context, deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext) error { computeCluster := deploymentZoneCtx.VSphereFailureDomain.Spec.Topology.ComputeCluster if computeCluster == nil { return nil } - ccr, err := deploymentZoneCtx.AuthSession.Finder.ClusterComputeResource(deploymentZoneCtx, *computeCluster) + ccr, err := deploymentZoneCtx.AuthSession.Finder.ClusterComputeResource(ctx, *computeCluster) if err != nil { conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VSphereFailureDomainValidatedCondition, infrav1.ComputeClusterNotFoundReason, clusterv1.ConditionSeverityError, "compute cluster %s not found", *computeCluster) return errors.Wrap(err, "compute cluster not found") } if resourcePool := deploymentZoneCtx.VSphereDeploymentZone.Spec.PlacementConstraint.ResourcePool; resourcePool != "" { - rp, err := deploymentZoneCtx.AuthSession.Finder.ResourcePool(deploymentZoneCtx, resourcePool) + rp, err := deploymentZoneCtx.AuthSession.Finder.ResourcePool(ctx, resourcePool) if err != nil { return errors.Wrapf(err, "unable to find resource pool") } - ref, err := rp.Owner(deploymentZoneCtx) + ref, err := rp.Owner(ctx) if err != nil { conditions.MarkFalse(deploymentZoneCtx.VSphereDeploymentZone, infrav1.VSphereFailureDomainValidatedCondition, infrav1.ComputeClusterNotFoundReason, clusterv1.ConditionSeverityError, "resource pool owner not found") return errors.Wrap(err, "unable to find owner compute resource") @@ -154,19 +156,19 @@ func (r vsphereDeploymentZoneReconciler) reconcileComputeCluster(deploymentZoneC // verifyFailureDomain verifies the Failure Domain. It verifies the existence of tag and category specified and // checks whether the specified tags exist on the DataCenter or Compute Cluster or Hosts (in a HostGroup). -func (r vsphereDeploymentZoneReconciler) verifyFailureDomain(deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext, failureDomain infrav1.FailureDomain) error { - if _, err := deploymentZoneCtx.AuthSession.TagManager.GetTagForCategory(deploymentZoneCtx, failureDomain.Name, failureDomain.TagCategory); err != nil { +func (r vsphereDeploymentZoneReconciler) verifyFailureDomain(ctx context.Context, deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext, failureDomain infrav1.FailureDomain) error { + if _, err := deploymentZoneCtx.AuthSession.TagManager.GetTagForCategory(ctx, failureDomain.Name, failureDomain.TagCategory); err != nil { return errors.Wrapf(err, "failed to verify tag %s and category %s", failureDomain.Name, failureDomain.TagCategory) } - objects, err := taggable.GetObjects(deploymentZoneCtx, failureDomain.Type) + objects, err := taggable.GetObjects(ctx, deploymentZoneCtx, failureDomain.Type) if err != nil { return errors.Wrapf(err, "failed to find object") } // All the objects should be associated to the tag for _, obj := range objects { - hasTag, err := obj.HasTag(deploymentZoneCtx, failureDomain.Name) + hasTag, err := obj.HasTag(ctx, failureDomain.Name) if err != nil { return errors.Wrapf(err, "failed to verify tag association") } @@ -177,21 +179,21 @@ func (r vsphereDeploymentZoneReconciler) verifyFailureDomain(deploymentZoneCtx * return nil } -func (r vsphereDeploymentZoneReconciler) createAndAttachMetadata(deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext, failureDomain infrav1.FailureDomain) error { - logger := ctrl.LoggerFrom(deploymentZoneCtx, "tag", failureDomain.Name, "category", failureDomain.TagCategory) - categoryID, err := metadata.CreateCategory(deploymentZoneCtx, failureDomain.TagCategory, failureDomain.Type) +func (r vsphereDeploymentZoneReconciler) createAndAttachMetadata(ctx context.Context, deploymentZoneCtx *capvcontext.VSphereDeploymentZoneContext, failureDomain infrav1.FailureDomain) error { + logger := ctrl.LoggerFrom(ctx, "tag", failureDomain.Name, "category", failureDomain.TagCategory) + categoryID, err := metadata.CreateCategory(ctx, deploymentZoneCtx, failureDomain.TagCategory, failureDomain.Type) if err != nil { logger.V(4).Error(err, "category creation failed") return errors.Wrapf(err, "failed to create category %s", failureDomain.TagCategory) } - err = metadata.CreateTag(deploymentZoneCtx, failureDomain.Name, categoryID) + err = metadata.CreateTag(ctx, deploymentZoneCtx, failureDomain.Name, categoryID) if err != nil { logger.V(4).Error(err, "tag creation failed") return errors.Wrapf(err, "failed to create tag %s", failureDomain.Name) } logger = logger.WithValues("type", failureDomain.Type) - objects, err := taggable.GetObjects(deploymentZoneCtx, failureDomain.Type) + objects, err := taggable.GetObjects(ctx, deploymentZoneCtx, failureDomain.Type) if err != nil { logger.V(4).Error(err, "failed to find object") return err @@ -200,7 +202,7 @@ func (r vsphereDeploymentZoneReconciler) createAndAttachMetadata(deploymentZoneC var errList []error for _, obj := range objects { logger.V(4).Info("attaching tag to object") - err := obj.AttachTag(deploymentZoneCtx, failureDomain.Name) + err := obj.AttachTag(ctx, failureDomain.Name) if err != nil { logger.V(4).Error(err, "failed to find object") errList = append(errList, errors.Wrapf(err, "failed to attach tag")) diff --git a/controllers/vspheredeploymentzone_controller_domain_test.go b/controllers/vspheredeploymentzone_controller_domain_test.go index bce0507249..8521062980 100644 --- a/controllers/vspheredeploymentzone_controller_domain_test.go +++ b/controllers/vspheredeploymentzone_controller_domain_test.go @@ -95,23 +95,23 @@ func TestVsphereDeploymentZoneReconciler_Reconcile_VerifyFailureDomain_ComputeCl reconciler := vsphereDeploymentZoneReconciler{controllerCtx} - g.Expect(reconciler.verifyFailureDomain(deploymentZoneCtx, vsphereFailureDomain.Spec.Region)).To(Succeed()) + g.Expect(reconciler.verifyFailureDomain(ctx, deploymentZoneCtx, vsphereFailureDomain.Spec.Region)).To(Succeed()) stdout := gbytes.NewBuffer() g.Expect(simr.Run("tags.attached.ls k8s-region-west", stdout)).To(Succeed()) g.Expect(stdout).Should(gbytes.Say("Datacenter")) - g.Expect(reconciler.verifyFailureDomain(deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(Succeed()) + g.Expect(reconciler.verifyFailureDomain(ctx, deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(Succeed()) stdout = gbytes.NewBuffer() g.Expect(simr.Run("tags.attached.ls k8s-region-west-2", stdout)).To(Succeed()) g.Expect(stdout).Should(gbytes.Say("ClusterComputeResource")) vsphereFailureDomain.Spec.Topology.ComputeCluster = pointer.String("DC0_C1") // Since association is verified, the method errors since the tag is not associated to the object. - g.Expect(reconciler.verifyFailureDomain(deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(HaveOccurred()) + g.Expect(reconciler.verifyFailureDomain(ctx, deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(HaveOccurred()) // Since the tag does not belong to the category vsphereFailureDomain.Spec.Zone.TagCategory = "diff-k8s-region" - g.Expect(reconciler.verifyFailureDomain(deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(HaveOccurred()) + g.Expect(reconciler.verifyFailureDomain(ctx, deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(HaveOccurred()) } func TestVsphereDeploymentZoneReconciler_Reconcile_VerifyFailureDomain_HostGroupZone(t *testing.T) { @@ -143,7 +143,7 @@ func TestVsphereDeploymentZoneReconciler_Reconcile_VerifyFailureDomain_HostGroup WithServer(simr.ServerURL().Host). WithUserInfo(simr.Username(), simr.Password()). WithDatacenter("*") - authSession, err := session.GetOrCreate(controllerCtx, params) + authSession, err := session.GetOrCreate(ctx, params) g.Expect(err).NotTo(HaveOccurred()) vsphereFailureDomain := &infrav1.VSphereFailureDomain{ @@ -180,20 +180,20 @@ func TestVsphereDeploymentZoneReconciler_Reconcile_VerifyFailureDomain_HostGroup reconciler := vsphereDeploymentZoneReconciler{controllerCtx} // Fails since no hosts are tagged - g.Expect(reconciler.verifyFailureDomain(deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(HaveOccurred()) + g.Expect(reconciler.verifyFailureDomain(ctx, deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(HaveOccurred()) stdout := gbytes.NewBuffer() g.Expect(simr.Run("tags.attach k8s-region-west-2 /DC0/host/DC0_C0/DC0_C0_H0", stdout)).To(Succeed()) // Fails as not all hosts are tagged - g.Expect(reconciler.verifyFailureDomain(deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(HaveOccurred()) + g.Expect(reconciler.verifyFailureDomain(ctx, deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(HaveOccurred()) g.Expect(simr.Run("tags.attach k8s-region-west-2 /DC0/host/DC0_C0/DC0_C0_H1", stdout)).To(Succeed()) // Succeeds as all hosts are tagged - g.Expect(reconciler.verifyFailureDomain(deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(Succeed()) + g.Expect(reconciler.verifyFailureDomain(ctx, deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(Succeed()) // Since the tag does not belong to the category vsphereFailureDomain.Spec.Zone.TagCategory = "diff-k8s-region" - g.Expect(reconciler.verifyFailureDomain(deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(HaveOccurred()) + g.Expect(reconciler.verifyFailureDomain(ctx, deploymentZoneCtx, vsphereFailureDomain.Spec.Zone)).To(HaveOccurred()) } func TestVsphereDeploymentZoneReconciler_Reconcile_CreateAndAttachMetadata(t *testing.T) { @@ -215,7 +215,7 @@ func TestVsphereDeploymentZoneReconciler_Reconcile_CreateAndAttachMetadata(t *te WithServer(simr.ServerURL().Host). WithUserInfo(simr.Username(), simr.Password()). WithDatacenter("*") - authSession, err := session.GetOrCreate(controllerCtx, params) + authSession, err := session.GetOrCreate(ctx, params) NewWithT(t).Expect(err).NotTo(HaveOccurred()) reconciler := vsphereDeploymentZoneReconciler{controllerCtx} @@ -288,7 +288,7 @@ func TestVsphereDeploymentZoneReconciler_Reconcile_CreateAndAttachMetadata(t *te AuthSession: authSession, } - g.Expect(reconciler.createAndAttachMetadata(deploymentZoneCtx, tests[0].vsphereFailureDomainSpec.Region)).NotTo(HaveOccurred()) + g.Expect(reconciler.createAndAttachMetadata(ctx, deploymentZoneCtx, tests[0].vsphereFailureDomainSpec.Region)).NotTo(HaveOccurred()) stdout := gbytes.NewBuffer() g.Expect(simr.Run("tags.category.info k8s-region", stdout)).To(Succeed()) g.Expect(stdout).To(gbytes.Say("k8s-region")) @@ -309,7 +309,7 @@ func TestVsphereDeploymentZoneReconciler_Reconcile_CreateAndAttachMetadata(t *te AuthSession: authSession, } - g.Expect(reconciler.createAndAttachMetadata(deploymentZoneCtx, tests[1].vsphereFailureDomainSpec.Zone)).NotTo(HaveOccurred()) + g.Expect(reconciler.createAndAttachMetadata(ctx, deploymentZoneCtx, tests[1].vsphereFailureDomainSpec.Zone)).NotTo(HaveOccurred()) stdout := gbytes.NewBuffer() g.Expect(simr.Run("tags.category.info k8s-zone", stdout)).To(Succeed()) g.Expect(stdout).To(gbytes.Say("k8s-zone")) @@ -330,7 +330,7 @@ func TestVsphereDeploymentZoneReconciler_Reconcile_CreateAndAttachMetadata(t *te AuthSession: authSession, } - g.Expect(reconciler.createAndAttachMetadata(deploymentZoneCtx, tests[2].vsphereFailureDomainSpec.Zone)).NotTo(HaveOccurred()) + g.Expect(reconciler.createAndAttachMetadata(ctx, deploymentZoneCtx, tests[2].vsphereFailureDomainSpec.Zone)).NotTo(HaveOccurred()) stdout := gbytes.NewBuffer() g.Expect(simr.Run("tags.category.info foo", stdout)).To(Succeed()) g.Expect(stdout).To(gbytes.Say("foo")) diff --git a/controllers/vspheredeploymentzone_controller_test.go b/controllers/vspheredeploymentzone_controller_test.go index ed664cc6ab..a61422cd14 100644 --- a/controllers/vspheredeploymentzone_controller_test.go +++ b/controllers/vspheredeploymentzone_controller_test.go @@ -43,7 +43,6 @@ import ( var _ = Describe("VSphereDeploymentZoneReconciler", func() { var ( simr *vcsim.Simulator - ctx context.Context failureDomainKey, deploymentZoneKey client.ObjectKey @@ -74,7 +73,6 @@ var _ = Describe("VSphereDeploymentZoneReconciler", func() { Expect(simr.Run(op, gbytes.NewBuffer(), gbytes.NewBuffer())).To(Succeed()) } - ctx = context.Background() }) BeforeEach(func() { @@ -578,7 +576,7 @@ func TestVsphereDeploymentZone_Failed_ReconcilePlacementConstraint(t *testing.T) } reconciler := vsphereDeploymentZoneReconciler{controllerCtx} - err = reconciler.reconcileNormal(deploymentZoneCtx) + err = reconciler.reconcileNormal(ctx, deploymentZoneCtx) g.Expect(err).To(HaveOccurred()) }) } @@ -624,7 +622,7 @@ func TestVSphereDeploymentZoneReconciler_ReconcileDelete(t *testing.T) { g := NewWithT(t) reconciler := vsphereDeploymentZoneReconciler{controllerCtx} - err := reconciler.reconcileDelete(deploymentZoneCtx) + err := reconciler.reconcileDelete(ctx, deploymentZoneCtx) g.Expect(err).To(HaveOccurred()) g.Expect(err.Error()).To(MatchRegexp(".*[is currently in use]{1}.*")) g.Expect(vsphereDeploymentZone.Finalizers).To(HaveLen(1)) @@ -646,7 +644,7 @@ func TestVSphereDeploymentZoneReconciler_ReconcileDelete(t *testing.T) { g := NewWithT(t) reconciler := vsphereDeploymentZoneReconciler{controllerCtx} - err := reconciler.reconcileDelete(deploymentZoneCtx) + err := reconciler.reconcileDelete(ctx, deploymentZoneCtx) g.Expect(err).NotTo(HaveOccurred()) g.Expect(vsphereDeploymentZone.Finalizers).To(BeEmpty()) }) @@ -665,7 +663,7 @@ func TestVSphereDeploymentZoneReconciler_ReconcileDelete(t *testing.T) { g := NewWithT(t) reconciler := vsphereDeploymentZoneReconciler{controllerCtx} - err := reconciler.reconcileDelete(deploymentZoneCtx) + err := reconciler.reconcileDelete(ctx, deploymentZoneCtx) g.Expect(err).NotTo(HaveOccurred()) g.Expect(vsphereDeploymentZone.Finalizers).To(BeEmpty()) }) @@ -682,7 +680,7 @@ func TestVSphereDeploymentZoneReconciler_ReconcileDelete(t *testing.T) { g := NewWithT(t) reconciler := vsphereDeploymentZoneReconciler{controllerCtx} - err := reconciler.reconcileDelete(deploymentZoneCtx) + err := reconciler.reconcileDelete(ctx, deploymentZoneCtx) g.Expect(err).NotTo(HaveOccurred()) g.Expect(vsphereDeploymentZone.Finalizers).To(BeEmpty()) }) @@ -706,7 +704,7 @@ func TestVSphereDeploymentZoneReconciler_ReconcileDelete(t *testing.T) { g := NewWithT(t) reconciler := vsphereDeploymentZoneReconciler{controllerCtx} - err := reconciler.reconcileDelete(deploymentZoneCtx) + err := reconciler.reconcileDelete(ctx, deploymentZoneCtx) g.Expect(err).NotTo(HaveOccurred()) }) @@ -728,7 +726,7 @@ func TestVSphereDeploymentZoneReconciler_ReconcileDelete(t *testing.T) { g := NewWithT(t) reconciler := vsphereDeploymentZoneReconciler{controllerCtx} - err := reconciler.reconcileDelete(deploymentZoneCtx) + err := reconciler.reconcileDelete(ctx, deploymentZoneCtx) g.Expect(err).NotTo(HaveOccurred()) fetchedFailureDomain := &infrav1.VSphereFailureDomain{} diff --git a/main.go b/main.go index ce13739898..88552737ff 100644 --- a/main.go +++ b/main.go @@ -367,7 +367,7 @@ func setupVAPIControllers(ctx context.Context, controllerCtx *capvcontext.Contro return err } - return controllers.AddVSphereDeploymentZoneControllerToManager(controllerCtx, mgr, concurrency(vSphereDeploymentZoneConcurrency)) + return controllers.AddVSphereDeploymentZoneControllerToManager(ctx, controllerCtx, mgr, concurrency(vSphereDeploymentZoneConcurrency)) } func setupSupervisorControllers(ctx context.Context, controllerCtx *capvcontext.ControllerManagerContext, mgr ctrlmgr.Manager, tracker *remote.ClusterCacheTracker) error { diff --git a/pkg/services/govmomi/cluster/rule.go b/pkg/services/govmomi/cluster/rule.go index 2435f51749..a00cfdb11b 100644 --- a/pkg/services/govmomi/cluster/rule.go +++ b/pkg/services/govmomi/cluster/rule.go @@ -17,6 +17,8 @@ limitations under the License. package cluster import ( + "context" + "github.com/pkg/errors" "github.com/vmware/govmomi/vim25/types" "k8s.io/utils/pointer" @@ -47,8 +49,8 @@ func negate(input bool) bool { return !input } -func VerifyAffinityRule(ctx computeClusterContext, clusterName, hostGroupName, vmGroupName string) (Rule, error) { - rules, err := listRules(ctx, clusterName) +func VerifyAffinityRule(ctx context.Context, computeClusterCtx computeClusterContext, clusterName, hostGroupName, vmGroupName string) (Rule, error) { + rules, err := listRules(ctx, computeClusterCtx, clusterName) if err != nil { return nil, errors.Wrapf(err, "unable to list rules for compute cluster %s", clusterName) } @@ -64,8 +66,8 @@ func VerifyAffinityRule(ctx computeClusterContext, clusterName, hostGroupName, v return nil, errors.New("no matching affinity rule found/exists") } -func listRules(ctx computeClusterContext, clusterName string) ([]types.BaseClusterRuleInfo, error) { - ccr, err := ctx.GetSession().Finder.ClusterComputeResource(ctx, clusterName) +func listRules(ctx context.Context, computeClusterCtx computeClusterContext, clusterName string) ([]types.BaseClusterRuleInfo, error) { + ccr, err := computeClusterCtx.GetSession().Finder.ClusterComputeResource(ctx, clusterName) if err != nil { return nil, err } diff --git a/pkg/services/govmomi/cluster/rule_test.go b/pkg/services/govmomi/cluster/rule_test.go index 7c9389f1e2..05b14b6bda 100644 --- a/pkg/services/govmomi/cluster/rule_test.go +++ b/pkg/services/govmomi/cluster/rule_test.go @@ -51,7 +51,7 @@ func TestVerifyAffinityRule(t *testing.T) { finder: finder, } - rule, err := VerifyAffinityRule(computeClusterCtx, "DC0_C0", "blah-host-group", "blah-vm-group") + rule, err := VerifyAffinityRule(ctx, computeClusterCtx, "DC0_C0", "blah-host-group", "blah-vm-group") g.Expect(err).NotTo(HaveOccurred()) g.Expect(rule.IsMandatory()).To(BeTrue()) g.Expect(rule.Disabled()).To(BeFalse()) diff --git a/pkg/services/govmomi/cluster/service.go b/pkg/services/govmomi/cluster/service.go index ebfee4a9fb..d436bdd515 100644 --- a/pkg/services/govmomi/cluster/service.go +++ b/pkg/services/govmomi/cluster/service.go @@ -26,6 +26,7 @@ import ( ) type computeClusterContext interface { + // TODO(zhanggbj): remove context.Context in this interface after refactoring context for all controllers. context.Context GetSession() *session.Session diff --git a/pkg/services/govmomi/cluster/vmgroup.go b/pkg/services/govmomi/cluster/vmgroup.go index ef93c44de1..da56a8c46f 100644 --- a/pkg/services/govmomi/cluster/vmgroup.go +++ b/pkg/services/govmomi/cluster/vmgroup.go @@ -24,13 +24,14 @@ import ( "github.com/vmware/govmomi/vim25/types" ) -func FindVMGroup(ctx computeClusterContext, clusterName, vmGroupName string) (*VMGroup, error) { - ccr, err := ctx.GetSession().Finder.ClusterComputeResource(ctx, clusterName) +// TODO(zhanggbj): add (ctx context.Context) in function signature after refactoring context for pkg/services/govmomi/service.go. +func FindVMGroup(computeClusterCtx computeClusterContext, clusterName, vmGroupName string) (*VMGroup, error) { + ccr, err := computeClusterCtx.GetSession().Finder.ClusterComputeResource(computeClusterCtx, clusterName) if err != nil { return nil, err } - clusterConfigInfoEx, err := ccr.Configuration(ctx) + clusterConfigInfoEx, err := ccr.Configuration(computeClusterCtx) if err != nil { return nil, err } diff --git a/pkg/services/govmomi/metadata/metadata.go b/pkg/services/govmomi/metadata/metadata.go index 0f8785101c..1499c3011a 100644 --- a/pkg/services/govmomi/metadata/metadata.go +++ b/pkg/services/govmomi/metadata/metadata.go @@ -27,8 +27,6 @@ import ( ) type metadataContext interface { - context.Context - GetSession() *session.Session } @@ -46,9 +44,9 @@ func getCategoryAssociableType(domainType infrav1.FailureDomainType) string { } // CreateCategory either creates a new vSphere category or updates the associable type for an existing category. -func CreateCategory(ctx metadataContext, name string, failureDomainType infrav1.FailureDomainType) (string, error) { +func CreateCategory(ctx context.Context, metadataCtx metadataContext, name string, failureDomainType infrav1.FailureDomainType) (string, error) { logger := ctrl.LoggerFrom(ctx, "category", name) - manager := ctx.GetSession().TagManager + manager := metadataCtx.GetSession().TagManager category, err := manager.GetCategory(ctx, name) if err != nil { logger.V(4).Info("failed to find existing category, creating a new category") @@ -75,9 +73,9 @@ func getCategoryObject(name string, failureDomainType infrav1.FailureDomainType) } } -func CreateTag(ctx metadataContext, name, categoryID string) error { +func CreateTag(ctx context.Context, metadataCtx metadataContext, name, categoryID string) error { logger := ctrl.LoggerFrom(ctx, "tag", name, "category", categoryID) - manager := ctx.GetSession().TagManager + manager := metadataCtx.GetSession().TagManager _, err := manager.GetTag(ctx, name) if err != nil { logger.V(4).Info("failed to find existing tag, creating a new tag") diff --git a/pkg/services/govmomi/metadata/metadata_suite_test.go b/pkg/services/govmomi/metadata/metadata_suite_test.go index 682b762d6a..016b7e9399 100644 --- a/pkg/services/govmomi/metadata/metadata_suite_test.go +++ b/pkg/services/govmomi/metadata/metadata_suite_test.go @@ -18,6 +18,7 @@ package metadata import ( "bufio" + "context" "fmt" "testing" @@ -27,7 +28,7 @@ import ( "github.com/pkg/errors" infrav1 "sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1" - "sigs.k8s.io/cluster-api-provider-vsphere/pkg/context" + capvcontext "sigs.k8s.io/cluster-api-provider-vsphere/pkg/context" "sigs.k8s.io/cluster-api-provider-vsphere/pkg/context/fake" "sigs.k8s.io/cluster-api-provider-vsphere/pkg/session" "sigs.k8s.io/cluster-api-provider-vsphere/test/helpers/vcsim" @@ -46,9 +47,9 @@ const ( ) var ( - sim *vcsim.Simulator - ctx *context.VMContext - + sim *vcsim.Simulator + vmCtx *capvcontext.VMContext + ctx = context.Background() existingCategoryID string ) @@ -69,11 +70,11 @@ var _ = Describe("Metadata_CreateCategory", func() { Context("we attempt to create a new category", func() { It("creates a matching category in the context's TagManager", func() { - catID, err := CreateCategory(ctx, testCategory, testCategoryAssocType) + catID, err := CreateCategory(ctx, vmCtx, testCategory, testCategoryAssocType) Expect(err).ToNot(HaveOccurred()) Expect(catID).NotTo(BeEmpty()) - cat, err := ctx.GetSession().TagManager.GetCategory(ctx, catID) + cat, err := vmCtx.GetSession().TagManager.GetCategory(ctx, catID) Expect(err).ToNot(HaveOccurred()) Expect(cat.Name).To(Equal(testCategory)) Expect(cat.AssociableTypes).To(ConsistOf(categoryAssociableTypes()[testCategoryAssocType])) @@ -86,11 +87,11 @@ var _ = Describe("Metadata_CreateCategory", func() { Fail("category required to run this test has not been setup in the VCSim!") } - catID, err := CreateCategory(ctx, existingCategory, existingCategoryNewAssocType) + catID, err := CreateCategory(ctx, vmCtx, existingCategory, existingCategoryNewAssocType) Expect(err).ToNot(HaveOccurred()) Expect(catID).To(Equal(existingCategoryID)) - cat, err := ctx.GetSession().TagManager.GetCategory(ctx, catID) + cat, err := vmCtx.GetSession().TagManager.GetCategory(ctx, catID) Expect(err).ToNot(HaveOccurred()) Expect(cat.Name).To(Equal(existingCategory)) Expect(cat.AssociableTypes).To(ConsistOf( @@ -115,9 +116,9 @@ var _ = Describe("Metadata_CreateTag", func() { Context("we attempt to create a new tag", func() { It("creates a tag in the context's TagManager", func() { - Expect(CreateTag(ctx, testTag, existingCategoryID)).To(Succeed()) + Expect(CreateTag(ctx, vmCtx, testTag, existingCategoryID)).To(Succeed()) - tag, err := ctx.GetSession().TagManager.GetTag(ctx, testTag) + tag, err := vmCtx.GetSession().TagManager.GetTag(ctx, testTag) Expect(err).ToNot(HaveOccurred()) Expect(tag.CategoryID).To(Equal(existingCategoryID)) }) @@ -125,9 +126,9 @@ var _ = Describe("Metadata_CreateTag", func() { Context("we attempt to create a tag which already exists but for a different category ID", func() { It("does not return an error and does not modify the existing tag", func() { - Expect(CreateTag(ctx, existingTag, mockCategoryID)).To(Succeed()) + Expect(CreateTag(ctx, vmCtx, existingTag, mockCategoryID)).To(Succeed()) - tag, err := ctx.GetSession().TagManager.GetTag(ctx, existingTag) + tag, err := vmCtx.GetSession().TagManager.GetTag(ctx, existingTag) Expect(err).ToNot(HaveOccurred()) Expect(tag.CategoryID).To(Equal(existingCategoryID), "the tag's category ID must not change") }) @@ -140,17 +141,17 @@ func configureSimulatorAndContext() (err error) { return } - ctx = fake.NewVMContext(fake.NewControllerContext(fake.NewControllerManagerContext())) - ctx.VSphereVM.Spec.Server = sim.ServerURL().Host + vmCtx = fake.NewVMContext(fake.NewControllerContext(fake.NewControllerManagerContext())) + vmCtx.VSphereVM.Spec.Server = sim.ServerURL().Host authSession, err := session.GetOrCreate( - ctx.Context, + ctx, session.NewParams(). - WithServer(ctx.VSphereVM.Spec.Server). + WithServer(vmCtx.VSphereVM.Spec.Server). WithUserInfo(sim.Username(), sim.Password()). WithDatacenter("*")) - ctx.Session = authSession + vmCtx.Session = authSession return } diff --git a/pkg/services/interfaces.go b/pkg/services/interfaces.go index ae7fa466c1..314455409b 100644 --- a/pkg/services/interfaces.go +++ b/pkg/services/interfaces.go @@ -35,20 +35,20 @@ import ( type VSphereMachineService interface { FetchVSphereMachine(client client.Client, name types.NamespacedName) (capvcontext.MachineContext, error) FetchVSphereCluster(client client.Client, cluster *clusterv1.Cluster, machineContext capvcontext.MachineContext) (capvcontext.MachineContext, error) - ReconcileDelete(ctx capvcontext.MachineContext) error - SyncFailureReason(ctx capvcontext.MachineContext) (bool, error) - ReconcileNormal(ctx capvcontext.MachineContext) (bool, error) - GetHostInfo(ctx capvcontext.MachineContext) (string, error) + ReconcileDelete(machineCtx capvcontext.MachineContext) error + SyncFailureReason(machineCtx capvcontext.MachineContext) (bool, error) + ReconcileNormal(machineCtx capvcontext.MachineContext) (bool, error) + GetHostInfo(machineCtx capvcontext.MachineContext) (string, error) } // VirtualMachineService is a service for creating/updating/deleting virtual // machines on vSphere. type VirtualMachineService interface { // ReconcileVM reconciles a VM with the intended state. - ReconcileVM(ctx *capvcontext.VMContext) (infrav1.VirtualMachine, error) + ReconcileVM(vmCtx *capvcontext.VMContext) (infrav1.VirtualMachine, error) // DestroyVM powers off and removes a VM from the inventory. - DestroyVM(ctx *capvcontext.VMContext) (reconcile.Result, infrav1.VirtualMachine, error) + DestroyVM(vmCtx *capvcontext.VMContext) (reconcile.Result, infrav1.VirtualMachine, error) } // ControlPlaneEndpointService is a service for reconciling load balanced control plane endpoints. diff --git a/pkg/taggable/get.go b/pkg/taggable/get.go index 40dc2833bf..9f1d23ab63 100644 --- a/pkg/taggable/get.go +++ b/pkg/taggable/get.go @@ -27,13 +27,12 @@ import ( ) type taggableContext interface { - context.Context GetSession() *session.Session GetVsphereFailureDomain() infrav1.VSphereFailureDomain } -func GetObjects(ctx taggableContext, fdType infrav1.FailureDomainType) (Objects, error) { - finderFunc := find.ObjectFunc(fdType, ctx.GetVsphereFailureDomain().Spec.Topology, ctx.GetSession().Finder) +func GetObjects(ctx context.Context, taggableCtx taggableContext, fdType infrav1.FailureDomainType) (Objects, error) { + finderFunc := find.ObjectFunc(fdType, taggableCtx.GetVsphereFailureDomain().Spec.Topology, taggableCtx.GetSession().Finder) objRefs, err := finderFunc(ctx) if err != nil { return nil, err @@ -45,7 +44,7 @@ func GetObjects(ctx taggableContext, fdType infrav1.FailureDomainType) (Objects, objects := make(Objects, len(objRefs)) for i, ref := range objRefs { objects[i] = managedObject{ - tagManager: ctx.GetSession().TagManager, + tagManager: taggableCtx.GetSession().TagManager, ref: ref, } }