...

Source file src/sigs.k8s.io/cli-utils/pkg/kstatus/polling/statusreaders/deployment.go

Documentation: sigs.k8s.io/cli-utils/pkg/kstatus/polling/statusreaders

     1  // Copyright 2020 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package statusreaders
     5  
     6  import (
     7  	"context"
     8  
     9  	appsv1 "k8s.io/api/apps/v1"
    10  	"k8s.io/apimachinery/pkg/api/meta"
    11  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
    12  	"k8s.io/apimachinery/pkg/runtime/schema"
    13  	"sigs.k8s.io/cli-utils/pkg/kstatus/polling/engine"
    14  	"sigs.k8s.io/cli-utils/pkg/kstatus/polling/event"
    15  	"sigs.k8s.io/cli-utils/pkg/kstatus/status"
    16  	"sigs.k8s.io/cli-utils/pkg/object"
    17  )
    18  
    19  func NewDeploymentResourceReader(mapper meta.RESTMapper, rsStatusReader resourceTypeStatusReader) engine.StatusReader {
    20  	return &baseStatusReader{
    21  		mapper: mapper,
    22  		resourceStatusReader: &deploymentResourceReader{
    23  			mapper:         mapper,
    24  			rsStatusReader: rsStatusReader,
    25  		},
    26  	}
    27  }
    28  
    29  // deploymentResourceReader is a resourceTypeStatusReader that can fetch Deployment
    30  // resources from the cluster, knows how to find any ReplicaSets belonging to the
    31  // Deployment, and compute status for the deployment.
    32  type deploymentResourceReader struct {
    33  	mapper meta.RESTMapper
    34  
    35  	// rsStatusReader is the implementation of the resourceTypeStatusReader
    36  	// the knows how to compute the status for ReplicaSets.
    37  	rsStatusReader resourceTypeStatusReader
    38  }
    39  
    40  var _ resourceTypeStatusReader = &deploymentResourceReader{}
    41  
    42  func (d *deploymentResourceReader) Supports(gk schema.GroupKind) bool {
    43  	return gk == appsv1.SchemeGroupVersion.WithKind("Deployment").GroupKind()
    44  }
    45  
    46  func (d *deploymentResourceReader) ReadStatusForObject(ctx context.Context, reader engine.ClusterReader,
    47  	deployment *unstructured.Unstructured) (*event.ResourceStatus, error) {
    48  	identifier := object.UnstructuredToObjMetadata(deployment)
    49  
    50  	replicaSetStatuses, err := statusForGeneratedResources(ctx, d.mapper, reader, d.rsStatusReader, deployment,
    51  		appsv1.SchemeGroupVersion.WithKind("ReplicaSet").GroupKind(), "spec", "selector")
    52  	if err != nil {
    53  		return errResourceToResourceStatus(err, deployment)
    54  	}
    55  
    56  	// Currently this engine just uses the status library for computing
    57  	// status for the deployment. But we do have the status and state for all
    58  	// ReplicaSets and Pods in the ObservedReplicaSets data structure, so the
    59  	// rules can be improved to take advantage of this information.
    60  	res, err := status.Compute(deployment)
    61  	if err != nil {
    62  		return errResourceToResourceStatus(err, deployment, replicaSetStatuses...)
    63  	}
    64  
    65  	return &event.ResourceStatus{
    66  		Identifier:         identifier,
    67  		Status:             res.Status,
    68  		Resource:           deployment,
    69  		Message:            res.Message,
    70  		GeneratedResources: replicaSetStatuses,
    71  	}, nil
    72  }
    73  

View as plain text