Skip to content

Commit

Permalink
Introduce GetInfo and UpdateInfo methods and replace naked usages of …
Browse files Browse the repository at this point in the history
…Info in production code
  • Loading branch information
stoyanr committed Aug 2, 2021
1 parent 943bc90 commit 06191ca
Show file tree
Hide file tree
Showing 50 changed files with 358 additions and 299 deletions.
2 changes: 1 addition & 1 deletion pkg/gardenlet/controller/shoot/shoot_care_control.go
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,7 @@ func retrieveSeedConditions(ctx context.Context, operation *operation.Operation)
}

seed := &gardencorev1beta1.Seed{}
if err := operation.K8sGardenClient.Client().Get(ctx, kutil.Key(operation.Shoot.Info.Name), seed); client.IgnoreNotFound(err) != nil {
if err := operation.K8sGardenClient.Client().Get(ctx, kutil.Key(operation.Shoot.GetInfo().Name), seed); client.IgnoreNotFound(err) != nil {
return nil, err
}
return seed.Status.Conditions, nil
Expand Down
14 changes: 7 additions & 7 deletions pkg/gardenlet/controller/shoot/shoot_control_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ func (c *Controller) runDeleteShootFlow(ctx context.Context, o *operation.Operat
err error
)

for _, lastError := range o.Shoot.Info.Status.LastErrors {
for _, lastError := range o.Shoot.GetInfo().Status.LastErrors {
if lastError.TaskID != nil {
tasksWithErrors = append(tasksWithErrors, *lastError.TaskID)
}
Expand Down Expand Up @@ -158,7 +158,7 @@ func (c *Controller) runDeleteShootFlow(ctx context.Context, o *operation.Operat
cleanupShootResources = nonTerminatingNamespace && kubeAPIServerDeploymentFound && infrastructure != nil
defaultInterval = 5 * time.Second
defaultTimeout = 30 * time.Second
staticNodesCIDR = o.Shoot.Info.Spec.Networking.Nodes != nil
staticNodesCIDR = o.Shoot.GetInfo().Spec.Networking.Nodes != nil
useSNI = botanist.APIServerSNIEnabled()
sniPhase = botanist.Shoot.Components.ControlPlane.KubeAPIServerSNIPhase

Expand Down Expand Up @@ -351,7 +351,7 @@ func (c *Controller) runDeleteShootFlow(ctx context.Context, o *operation.Operat
})
cleanExtendedAPIs = g.Add(flow.Task{
Name: "Cleaning extended API groups",
Fn: flow.TaskFn(botanist.CleanExtendedAPIs).Timeout(10 * time.Minute).DoIf(cleanupShootResources && !metav1.HasAnnotation(o.Shoot.Info.ObjectMeta, v1beta1constants.AnnotationShootSkipCleanup)),
Fn: flow.TaskFn(botanist.CleanExtendedAPIs).Timeout(10 * time.Minute).DoIf(cleanupShootResources && !metav1.HasAnnotation(o.Shoot.GetInfo().ObjectMeta, v1beta1constants.AnnotationShootSkipCleanup)),
Dependencies: flow.NewTaskIDs(initializeShootClients, deleteClusterAutoscaler, waitForControllersToBeActive),
})

Expand Down Expand Up @@ -581,17 +581,17 @@ func (c *Controller) runDeleteShootFlow(ctx context.Context, o *operation.Operat
ErrorCleaner: o.CleanShootTaskErrorAndUpdateStatusLabel,
ErrorContext: errorContext,
}); err != nil {
o.Logger.Errorf("Error deleting Shoot %q: %+v", o.Shoot.Info.Name, err)
o.Logger.Errorf("Error deleting Shoot %q: %+v", o.Shoot.GetInfo().Name, err)
return gardencorev1beta1helper.NewWrappedLastErrors(gardencorev1beta1helper.FormatLastErrDescription(err), flow.Errors(err))
}

// ensure that shoot client is invalidated after it has been deleted
if err := o.ClientMap.InvalidateClient(keys.ForShoot(o.Shoot.Info)); err != nil {
if err := o.ClientMap.InvalidateClient(keys.ForShoot(o.Shoot.GetInfo())); err != nil {
err = fmt.Errorf("failed to invalidate shoot client: %w", err)
return gardencorev1beta1helper.NewWrappedLastErrors(gardencorev1beta1helper.FormatLastErrDescription(err), err)
}

o.Logger.Infof("Successfully deleted Shoot %q", o.Shoot.Info.Name)
o.Logger.Infof("Successfully deleted Shoot %q", o.Shoot.GetInfo().Name)
return nil
}

Expand Down Expand Up @@ -626,7 +626,7 @@ func (c *Controller) removeFinalizerFrom(ctx context.Context, gardenClient kuber
func needsControlPlaneDeployment(ctx context.Context, o *operation.Operation, kubeAPIServerDeploymentFound bool, infrastructure *extensionsv1alpha1.Infrastructure) (bool, error) {
var (
namespace = o.Shoot.SeedNamespace
name = o.Shoot.Info.Name
name = o.Shoot.GetInfo().Name
)

// If the `ControlPlane` resource and the kube-apiserver deployment do no longer exist then we don't want to re-deploy it.
Expand Down
8 changes: 4 additions & 4 deletions pkg/gardenlet/controller/shoot/shoot_control_migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func (c *Controller) runPrepareShootControlPlaneMigration(o *operation.Operation
kubeAPIServerDeploymentFound = true
)

for _, lastError := range o.Shoot.Info.Status.LastErrors {
for _, lastError := range o.Shoot.GetInfo().Status.LastErrors {
if lastError.TaskID != nil {
tasksWithErrors = append(tasksWithErrors, *lastError.TaskID)
}
Expand Down Expand Up @@ -145,7 +145,7 @@ func (c *Controller) runPrepareShootControlPlaneMigration(o *operation.Operation
var (
nonTerminatingNamespace = botanist.SeedNamespaceObject.Status.Phase != corev1.NamespaceTerminating
cleanupShootResources = nonTerminatingNamespace && kubeAPIServerDeploymentFound
wakeupRequired = (o.Shoot.Info.Status.IsHibernated || (!o.Shoot.Info.Status.IsHibernated && o.Shoot.HibernationEnabled)) && cleanupShootResources
wakeupRequired = (o.Shoot.GetInfo().Status.IsHibernated || (!o.Shoot.GetInfo().Status.IsHibernated && o.Shoot.HibernationEnabled)) && cleanupShootResources
defaultTimeout = 10 * time.Minute
defaultInterval = 5 * time.Second

Expand Down Expand Up @@ -295,11 +295,11 @@ func (c *Controller) runPrepareShootControlPlaneMigration(o *operation.Operation
ErrorContext: errorContext,
ErrorCleaner: o.CleanShootTaskErrorAndUpdateStatusLabel,
}); err != nil {
o.Logger.Errorf("Failed to prepare Shoot %q for migration: %+v", o.Shoot.Info.Name, err)
o.Logger.Errorf("Failed to prepare Shoot %q for migration: %+v", o.Shoot.GetInfo().Name, err)
return gardencorev1beta1helper.NewWrappedLastErrors(gardencorev1beta1helper.FormatLastErrDescription(err), flow.Errors(err))
}

o.Logger.Infof("Successfully prepared Shoot's control plane for migration %q", o.Shoot.Info.Name)
o.Logger.Infof("Successfully prepared Shoot's control plane for migration %q", o.Shoot.GetInfo().Name)
return nil
}

Expand Down
34 changes: 14 additions & 20 deletions pkg/gardenlet/controller/shoot/shoot_control_reconcile.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,6 @@ import (
"github.com/gardener/gardener/pkg/utils/flow"
kutil "github.com/gardener/gardener/pkg/utils/kubernetes"
retryutils "github.com/gardener/gardener/pkg/utils/retry"

"sigs.k8s.io/controller-runtime/pkg/client"
)

// runReconcileShootFlow reconciles the Shoot cluster's state.
Expand All @@ -45,7 +43,7 @@ func (c *Controller) runReconcileShootFlow(ctx context.Context, o *operation.Ope
err error
)

for _, lastError := range o.Shoot.Info.Status.LastErrors {
for _, lastError := range o.Shoot.GetInfo().Status.LastErrors {
if lastError.TaskID != nil {
tasksWithErrors = append(tasksWithErrors, *lastError.TaskID)
}
Expand Down Expand Up @@ -82,11 +80,11 @@ func (c *Controller) runReconcileShootFlow(ctx context.Context, o *operation.Ope
defaultInterval = 5 * time.Second
dnsEnabled = !o.Shoot.DisableDNS
allowBackup = o.Seed.Info.Spec.Backup != nil
staticNodesCIDR = o.Shoot.Info.Spec.Networking.Nodes != nil
staticNodesCIDR = o.Shoot.GetInfo().Spec.Networking.Nodes != nil
useSNI = botanist.APIServerSNIEnabled()
generation = o.Shoot.Info.Generation
generation = o.Shoot.GetInfo().Generation
sniPhase = botanist.Shoot.Components.ControlPlane.KubeAPIServerSNIPhase
requestControlPlanePodsRestart = controllerutils.HasTask(o.Shoot.Info.Annotations, v1beta1constants.ShootTaskRestartControlPlanePods)
requestControlPlanePodsRestart = controllerutils.HasTask(o.Shoot.GetInfo().Annotations, v1beta1constants.ShootTaskRestartControlPlanePods)

g = flow.NewGraph("Shoot cluster reconciliation")
ensureShootStateExists = g.Add(flow.Task{
Expand Down Expand Up @@ -354,7 +352,7 @@ func (c *Controller) runReconcileShootFlow(ctx context.Context, o *operation.Ope
if err := botanist.DeployManagedResourceForAddons(ctx); err != nil {
return err
}
if controllerutils.HasTask(o.Shoot.Info.Annotations, v1beta1constants.ShootTaskRestartCoreAddons) {
if controllerutils.HasTask(o.Shoot.GetInfo().Annotations, v1beta1constants.ShootTaskRestartCoreAddons) {
return removeTaskAnnotation(ctx, o, generation, v1beta1constants.ShootTaskRestartCoreAddons)
}
return nil
Expand All @@ -378,7 +376,7 @@ func (c *Controller) runReconcileShootFlow(ctx context.Context, o *operation.Ope
})
nginxLBReady = g.Add(flow.Task{
Name: "Waiting until nginx ingress LoadBalancer is ready",
Fn: flow.TaskFn(botanist.WaitUntilNginxIngressServiceIsReady).DoIf(gardencorev1beta1helper.NginxIngressEnabled(botanist.Shoot.Info.Spec.Addons)).SkipIf(o.Shoot.HibernationEnabled),
Fn: flow.TaskFn(botanist.WaitUntilNginxIngressServiceIsReady).DoIf(gardencorev1beta1helper.NginxIngressEnabled(botanist.Shoot.GetInfo().Spec.Addons)).SkipIf(o.Shoot.HibernationEnabled),
Dependencies: flow.NewTaskIDs(deployManagedResourcesForAddons, initializeShootClients, waitUntilWorkerReady, ensureShootClusterIdentity),
})
deployIngressDomainDNSRecord = g.Add(flow.Task{
Expand Down Expand Up @@ -519,40 +517,36 @@ func (c *Controller) runReconcileShootFlow(ctx context.Context, o *operation.Ope
ErrorContext: errorContext,
ErrorCleaner: o.CleanShootTaskErrorAndUpdateStatusLabel,
}); err != nil {
o.Logger.Errorf("Failed to reconcile Shoot %q: %+v", o.Shoot.Info.Name, err)
o.Logger.Errorf("Failed to reconcile Shoot %q: %+v", o.Shoot.GetInfo().Name, err)
return gardencorev1beta1helper.NewWrappedLastErrors(gardencorev1beta1helper.FormatLastErrDescription(err), flow.Errors(err))
}

// ensure that shoot client is invalidated after it has been hibernated
if o.Shoot.HibernationEnabled {
if err := o.ClientMap.InvalidateClient(keys.ForShoot(o.Shoot.Info)); err != nil {
if err := o.ClientMap.InvalidateClient(keys.ForShoot(o.Shoot.GetInfo())); err != nil {
err = fmt.Errorf("failed to invalidate shoot client: %w", err)
return gardencorev1beta1helper.NewWrappedLastErrors(gardencorev1beta1helper.FormatLastErrDescription(err), err)
}
}

o.Logger.Infof("Successfully reconciled Shoot %q", o.Shoot.Info.Name)
o.Logger.Infof("Successfully reconciled Shoot %q", o.Shoot.GetInfo().Name)
return nil
}

func removeTaskAnnotation(ctx context.Context, o *operation.Operation, generation int64, tasksToRemove ...string) error {
// Check if shoot generation was changed mid-air, i.e., whether we need to wait for the next reconciliation until we
// can safely remove the task annotations to ensure all required tasks are executed.
shoot := &gardencorev1beta1.Shoot{}
if err := o.K8sGardenClient.APIReader().Get(ctx, kutil.Key(o.Shoot.Info.Namespace, o.Shoot.Info.Name), shoot); err != nil {
if err := o.K8sGardenClient.APIReader().Get(ctx, kutil.Key(o.Shoot.GetInfo().Namespace, o.Shoot.GetInfo().Name), shoot); err != nil {
return err
}

if shoot.Generation != generation {
return nil
}

shoot = o.Shoot.Info.DeepCopy()
patch := client.MergeFrom(shoot.DeepCopy())
controllerutils.RemoveTasks(shoot.Annotations, tasksToRemove...)
if err := o.K8sGardenClient.Client().Patch(ctx, shoot, patch); err != nil {
return err
}
o.Shoot.Info = shoot
return nil
return o.Shoot.UpdateInfo(ctx, o.K8sGardenClient.Client(), func(shoot *gardencorev1beta1.Shoot) error {
controllerutils.RemoveTasks(shoot.Annotations, tasksToRemove...)
return nil
})
}
48 changes: 24 additions & 24 deletions pkg/operation/botanist/addons.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,16 @@ const (
// the kubernetes-dashboard properly.
func (b *Botanist) GenerateKubernetesDashboardConfig() (map[string]interface{}, error) {
var (
enabled = gardencorev1beta1helper.KubernetesDashboardEnabled(b.Shoot.Info.Spec.Addons)
enabled = gardencorev1beta1helper.KubernetesDashboardEnabled(b.Shoot.GetInfo().Spec.Addons)
values = map[string]interface{}{}
)

if b.APIServerSNIEnabled() {
values["kubeAPIServerHost"] = b.outOfClusterAPIServerFQDN()
}

if enabled && b.Shoot.Info.Spec.Addons.KubernetesDashboard.AuthenticationMode != nil {
values["authenticationMode"] = *b.Shoot.Info.Spec.Addons.KubernetesDashboard.AuthenticationMode
if enabled && b.Shoot.GetInfo().Spec.Addons.KubernetesDashboard.AuthenticationMode != nil {
values["authenticationMode"] = *b.Shoot.GetInfo().Spec.Addons.KubernetesDashboard.AuthenticationMode
}

return common.GenerateAddonConfig(values, enabled), nil
Expand Down Expand Up @@ -136,14 +136,14 @@ func (b *Botanist) DefaultNginxIngressDNSOwner() component.DeployWaiter {

// NeedsIngressDNS returns true if the Shoot cluster needs ingress DNS.
func (b *Botanist) NeedsIngressDNS() bool {
return b.NeedsExternalDNS() && gardencorev1beta1helper.NginxIngressEnabled(b.Shoot.Info.Spec.Addons)
return b.NeedsExternalDNS() && gardencorev1beta1helper.NginxIngressEnabled(b.Shoot.GetInfo().Spec.Addons)
}

// DefaultIngressDNSRecord creates the default deployer for the ingress DNSRecord resource.
func (b *Botanist) DefaultIngressDNSRecord() extensionsdnsrecord.Interface {
values := &extensionsdnsrecord.Values{
Name: b.Shoot.Info.Name + "-" + common.ShootDNSIngressName,
SecretName: b.Shoot.Info.Name + "-" + DNSExternalName,
Name: b.Shoot.GetInfo().Name + "-" + common.ShootDNSIngressName,
SecretName: b.Shoot.GetInfo().Name + "-" + DNSExternalName,
Namespace: b.Shoot.SeedNamespace,
TTL: b.Config.Controllers.Shoot.DNSEntryTTLSeconds,
}
Expand Down Expand Up @@ -200,7 +200,7 @@ func (b *Botanist) MigrateIngressDNSRecord(ctx context.Context) error {
// SetNginxIngressAddress sets the IP address of the API server's LoadBalancer.
func (b *Botanist) SetNginxIngressAddress(address string, seedClient client.Client) {
if b.NeedsIngressDNS() {
ownerID := *b.Shoot.Info.Status.ClusterIdentity + "-" + common.ShootDNSIngressName
ownerID := *b.Shoot.GetInfo().Status.ClusterIdentity + "-" + common.ShootDNSIngressName
b.Shoot.Components.Extensions.DNS.NginxOwner = dns.NewOwner(
seedClient,
b.Shoot.SeedNamespace,
Expand Down Expand Up @@ -232,17 +232,17 @@ func (b *Botanist) SetNginxIngressAddress(address string, seedClient client.Clie
// the nginx-ingress properly.
func (b *Botanist) GenerateNginxIngressConfig() (map[string]interface{}, error) {
var (
enabled = gardencorev1beta1helper.NginxIngressEnabled(b.Shoot.Info.Spec.Addons)
enabled = gardencorev1beta1helper.NginxIngressEnabled(b.Shoot.GetInfo().Spec.Addons)
values map[string]interface{}
)

if enabled {
values = map[string]interface{}{
"controller": map[string]interface{}{
"customConfig": b.Shoot.Info.Spec.Addons.NginxIngress.Config,
"customConfig": b.Shoot.GetInfo().Spec.Addons.NginxIngress.Config,
"service": map[string]interface{}{
"loadBalancerSourceRanges": b.Shoot.Info.Spec.Addons.NginxIngress.LoadBalancerSourceRanges,
"externalTrafficPolicy": *b.Shoot.Info.Spec.Addons.NginxIngress.ExternalTrafficPolicy,
"loadBalancerSourceRanges": b.Shoot.GetInfo().Spec.Addons.NginxIngress.LoadBalancerSourceRanges,
"externalTrafficPolicy": *b.Shoot.GetInfo().Spec.Addons.NginxIngress.ExternalTrafficPolicy,
},
},
}
Expand Down Expand Up @@ -281,7 +281,7 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer.
kasFQDN = b.outOfClusterAPIServerFQDN()
kubeProxySecret = b.Secrets["kube-proxy"]
global = map[string]interface{}{
"kubernetesVersion": b.Shoot.Info.Spec.Kubernetes.Version,
"kubernetesVersion": b.Shoot.GetInfo().Spec.Kubernetes.Version,
"podNetwork": b.Shoot.Networks.Pods.String(),
"vpaEnabled": b.Shoot.WantsVerticalPodAutoscaler,
}
Expand All @@ -301,11 +301,11 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer.
}

podSecurityPolicies = map[string]interface{}{
"allowPrivilegedContainers": *b.Shoot.Info.Spec.Kubernetes.AllowPrivilegedContainers,
"allowPrivilegedContainers": *b.Shoot.GetInfo().Spec.Kubernetes.AllowPrivilegedContainers,
}
kubeProxyConfig = map[string]interface{}{
"kubeconfig": kubeProxySecret.Data["kubeconfig"],
"kubernetesVersion": b.Shoot.Info.Spec.Kubernetes.Version,
"kubernetesVersion": b.Shoot.GetInfo().Spec.Kubernetes.Version,
"podAnnotations": map[string]interface{}{
"checksum/secret-kube-proxy": b.CheckSums["kube-proxy"],
},
Expand All @@ -324,14 +324,14 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer.

shootInfo = map[string]interface{}{
"projectName": b.Garden.Project.Name,
"shootName": b.Shoot.Info.Name,
"provider": b.Shoot.Info.Spec.Provider.Type,
"region": b.Shoot.Info.Spec.Region,
"kubernetesVersion": b.Shoot.Info.Spec.Kubernetes.Version,
"shootName": b.Shoot.GetInfo().Name,
"provider": b.Shoot.GetInfo().Spec.Provider.Type,
"region": b.Shoot.GetInfo().Spec.Region,
"kubernetesVersion": b.Shoot.GetInfo().Spec.Kubernetes.Version,
"podNetwork": b.Shoot.Networks.Pods.String(),
"serviceNetwork": b.Shoot.Networks.Services.String(),
"maintenanceBegin": b.Shoot.Info.Spec.Maintenance.TimeWindow.Begin,
"maintenanceEnd": b.Shoot.Info.Spec.Maintenance.TimeWindow.End,
"maintenanceBegin": b.Shoot.GetInfo().Spec.Maintenance.TimeWindow.Begin,
"maintenanceEnd": b.Shoot.GetInfo().Spec.Maintenance.TimeWindow.End,
}
nodeExporterConfig = map[string]interface{}{}
blackboxExporterConfig = map[string]interface{}{}
Expand Down Expand Up @@ -365,7 +365,7 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer.
verticalPodAutoscaler["admissionController"].(map[string]interface{})["caCert"] = b.Secrets[common.VPASecretName].Data[secrets.DataKeyCertificateCA]
}

proxyConfig := b.Shoot.Info.Spec.Kubernetes.KubeProxy
proxyConfig := b.Shoot.GetInfo().Spec.Kubernetes.KubeProxy
kubeProxyEnabled := true
if proxyConfig != nil {
kubeProxyConfig["featureGates"] = proxyConfig.FeatureGates
Expand Down Expand Up @@ -471,7 +471,7 @@ func (b *Botanist) generateCoreAddonsChart(ctx context.Context) (*chartrenderer.
"podsecuritypolicies": common.GenerateAddonConfig(podSecurityPolicies, true),
"shoot-info": common.GenerateAddonConfig(shootInfo, true),
"vertical-pod-autoscaler": common.GenerateAddonConfig(verticalPodAutoscaler, b.Shoot.WantsVerticalPodAutoscaler),
"cluster-identity": map[string]interface{}{"clusterIdentity": b.Shoot.Info.Status.ClusterIdentity},
"cluster-identity": map[string]interface{}{"clusterIdentity": b.Shoot.GetInfo().Status.ClusterIdentity},
}

if b.Shoot.ReversedVPNEnabled {
Expand Down Expand Up @@ -563,7 +563,7 @@ func (b *Botanist) generateOptionalAddonsChart(_ context.Context) (*chartrendere
}
kubernetesDashboardImagesToInject := []string{charts.ImageNameKubernetesDashboard}

k8sVersionLessThan116, err := versionutils.CompareVersions(b.Shoot.Info.Spec.Kubernetes.Version, "<", "1.16")
k8sVersionLessThan116, err := versionutils.CompareVersions(b.Shoot.GetInfo().Spec.Kubernetes.Version, "<", "1.16")
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -601,7 +601,7 @@ func (b *Botanist) outOfClusterAPIServerFQDN() string {

// getCoreDNSRestartTimestamp returns a timestamp that can potentially restart the CoreDNS deployment.
func (b *Botanist) getCoreDNSRestartTimestamp(ctx context.Context) (string, error) {
if controllerutils.HasTask(b.Shoot.Info.Annotations, v1beta1constants.ShootTaskRestartCoreAddons) {
if controllerutils.HasTask(b.Shoot.GetInfo().Annotations, v1beta1constants.ShootTaskRestartCoreAddons) {
return time.Now().UTC().Format(time.RFC3339), nil
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/operation/botanist/addons_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ var _ = Describe("addons", func() {
})

It("does nothing when nginx is disabled", func() {
b.Shoot.Info.Spec.Addons.NginxIngress.Enabled = false
b.Shoot.GetInfo().Spec.Addons.NginxIngress.Enabled = false

b.SetNginxIngressAddress(address, client)

Expand Down Expand Up @@ -338,7 +338,7 @@ var _ = Describe("addons", func() {

BeforeEach(func() {
b.ShootState = shootState
b.Shoot.Info.Status = gardencorev1beta1.ShootStatus{
b.Shoot.GetInfo().Status = gardencorev1beta1.ShootStatus{
LastOperation: &gardencorev1beta1.LastOperation{
Type: gardencorev1beta1.LastOperationTypeRestore,
},
Expand Down
Loading

0 comments on commit 06191ca

Please sign in to comment.