...

Source file src/sigs.k8s.io/cli-utils/pkg/kstatus/polling/statusreaders/generic.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  	"k8s.io/apimachinery/pkg/api/meta"
    10  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
    11  	"k8s.io/apimachinery/pkg/runtime/schema"
    12  	"sigs.k8s.io/cli-utils/pkg/kstatus/polling/engine"
    13  	"sigs.k8s.io/cli-utils/pkg/kstatus/polling/event"
    14  	"sigs.k8s.io/cli-utils/pkg/kstatus/status"
    15  	"sigs.k8s.io/cli-utils/pkg/object"
    16  )
    17  
    18  // StatusFunc returns the status of the given object. This func is passed into
    19  // NewGenericStatusReader so that the returned StatusReader can be used for custom types.
    20  // An example of a StatusFunc is status.Compute.
    21  type StatusFunc func(u *unstructured.Unstructured) (*status.Result, error)
    22  
    23  func NewGenericStatusReader(mapper meta.RESTMapper, statusFunc StatusFunc) engine.StatusReader {
    24  	return &baseStatusReader{
    25  		mapper: mapper,
    26  		resourceStatusReader: &genericStatusReader{
    27  			mapper:     mapper,
    28  			statusFunc: statusFunc,
    29  		},
    30  	}
    31  }
    32  
    33  // genericStatusReader is a resourceTypeStatusReader that will be used for
    34  // any resource that doesn't have a specific engine. It will just delegate
    35  // computation of status to the status library.
    36  // This should work pretty well for resources that doesn't have any
    37  // generated resources and where status can be computed only based on the
    38  // resource itself.
    39  type genericStatusReader struct {
    40  	mapper meta.RESTMapper
    41  
    42  	statusFunc StatusFunc
    43  }
    44  
    45  var _ resourceTypeStatusReader = &genericStatusReader{}
    46  
    47  func (g *genericStatusReader) Supports(schema.GroupKind) bool {
    48  	return true
    49  }
    50  
    51  func (g *genericStatusReader) ReadStatusForObject(_ context.Context, _ engine.ClusterReader, resource *unstructured.Unstructured) (*event.ResourceStatus, error) {
    52  	identifier := object.UnstructuredToObjMetadata(resource)
    53  
    54  	res, err := g.statusFunc(resource)
    55  	if err != nil {
    56  		return errResourceToResourceStatus(err, resource)
    57  	}
    58  
    59  	return &event.ResourceStatus{
    60  		Identifier: identifier,
    61  		Status:     res.Status,
    62  		Resource:   resource,
    63  		Message:    res.Message,
    64  	}, nil
    65  }
    66  

View as plain text