...

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

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

     1  // Copyright 2021 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package statusreaders
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  
    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  // NewDefaultStatusReader returns a DelegatingStatusReader that wraps a list of
    20  // statusreaders to cover all built-in Kubernetes resources and other CRDs that
    21  // follow known status conventions.
    22  func NewDefaultStatusReader(mapper meta.RESTMapper) engine.StatusReader {
    23  	return NewStatusReader(mapper)
    24  }
    25  
    26  // NewStatusReader returns a DelegatingStatusReader that includes the statusreaders
    27  // for the build-in Kubernetes resources and also any provided custom status readers.
    28  func NewStatusReader(mapper meta.RESTMapper, statusReaders ...engine.StatusReader) engine.StatusReader {
    29  	defaultStatusReader := NewGenericStatusReader(mapper, status.Compute)
    30  
    31  	replicaSetStatusReader := NewReplicaSetStatusReader(mapper, defaultStatusReader)
    32  	deploymentStatusReader := NewDeploymentResourceReader(mapper, replicaSetStatusReader)
    33  	statefulSetStatusReader := NewStatefulSetResourceReader(mapper, defaultStatusReader)
    34  
    35  	statusReaders = append(statusReaders,
    36  		deploymentStatusReader,
    37  		statefulSetStatusReader,
    38  		replicaSetStatusReader,
    39  		defaultStatusReader,
    40  	)
    41  
    42  	return &DelegatingStatusReader{
    43  		StatusReaders: statusReaders,
    44  	}
    45  }
    46  
    47  type DelegatingStatusReader struct {
    48  	StatusReaders []engine.StatusReader
    49  }
    50  
    51  func (dsr *DelegatingStatusReader) Supports(gk schema.GroupKind) bool {
    52  	for _, sr := range dsr.StatusReaders {
    53  		if sr.Supports(gk) {
    54  			return true
    55  		}
    56  	}
    57  	return false
    58  }
    59  
    60  func (dsr *DelegatingStatusReader) ReadStatus(
    61  	ctx context.Context,
    62  	reader engine.ClusterReader,
    63  	id object.ObjMetadata,
    64  ) (*event.ResourceStatus, error) {
    65  	gk := id.GroupKind
    66  	for _, sr := range dsr.StatusReaders {
    67  		if sr.Supports(gk) {
    68  			return sr.ReadStatus(ctx, reader, id)
    69  		}
    70  	}
    71  	return nil, fmt.Errorf("no status reader supports this resource: %v", gk)
    72  }
    73  
    74  func (dsr *DelegatingStatusReader) ReadStatusForObject(
    75  	ctx context.Context,
    76  	reader engine.ClusterReader,
    77  	obj *unstructured.Unstructured,
    78  ) (*event.ResourceStatus, error) {
    79  	gk := obj.GroupVersionKind().GroupKind()
    80  	for _, sr := range dsr.StatusReaders {
    81  		if sr.Supports(gk) {
    82  			return sr.ReadStatusForObject(ctx, reader, obj)
    83  		}
    84  	}
    85  	return nil, fmt.Errorf("no status reader supports this resource: %v", gk)
    86  }
    87  

View as plain text