github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/cli/cmd/builder/template/k8s_resource.go (about)

     1  /*
     2  Copyright (C) 2022-2023 ApeCloud Co., Ltd
     3  
     4  This file is part of KubeBlocks project
     5  
     6  This program is free software: you can redistribute it and/or modify
     7  it under the terms of the GNU Affero General Public License as published by
     8  the Free Software Foundation, either version 3 of the License, or
     9  (at your option) any later version.
    10  
    11  This program is distributed in the hope that it will be useful
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    14  GNU Affero General Public License for more details.
    15  
    16  You should have received a copy of the GNU Affero General Public License
    17  along with this program.  If not, see <http://www.gnu.org/licenses/>.
    18  */
    19  
    20  package template
    21  
    22  import (
    23  	"bufio"
    24  	"bytes"
    25  	"os"
    26  
    27  	"k8s.io/apimachinery/pkg/util/yaml"
    28  	"sigs.k8s.io/controller-runtime/pkg/client"
    29  
    30  	"github.com/1aal/kubeblocks/pkg/generics"
    31  )
    32  
    33  type MatchResourceFunc func(object client.Object) bool
    34  
    35  func CustomizedObjFromYaml[T generics.Object, PT generics.PObject[T], L generics.ObjList[T], PL generics.PObjList[T, L]](filePath string, signature func(T, PT, L, PL)) (PT, error) {
    36  	objList, err := CustomizedObjectListFromYaml[T, PT, L, PL](filePath, signature)
    37  	if err != nil {
    38  		return nil, err
    39  	}
    40  	if len(objList) == 0 {
    41  		return nil, nil
    42  	}
    43  	return objList[0], nil
    44  }
    45  
    46  func CustomizedObjectListFromYaml[T generics.Object, PT generics.PObject[T], L generics.ObjList[T], PL generics.PObjList[T, L]](yamlfile string, signature func(T, PT, L, PL)) ([]PT, error) {
    47  	objBytes, err := os.ReadFile(yamlfile)
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  	objList := make([]PT, 0)
    52  	reader := bufio.NewReader(bytes.NewReader(objBytes))
    53  	for {
    54  		doc, err := yaml.NewYAMLReader(reader).Read()
    55  		if len(doc) == 0 {
    56  			break
    57  		}
    58  		if err != nil {
    59  			return nil, err
    60  		}
    61  		objList = append(objList, CreateTypedObjectFromYamlByte[T, PT, L, PL](doc, signature))
    62  	}
    63  	return objList, nil
    64  }
    65  
    66  func CreateTypedObjectFromYamlByte[T generics.Object, PT generics.PObject[T], L generics.ObjList[T], PL generics.PObjList[T, L]](yamlBytes []byte, _ func(T, PT, L, PL)) PT {
    67  	var obj PT
    68  	if err := yaml.Unmarshal(yamlBytes, &obj); err != nil {
    69  		return nil
    70  	}
    71  	return obj
    72  }
    73  
    74  func GetTypedResourceObjectBySignature[T generics.Object, PT generics.PObject[T], L generics.ObjList[T], PL generics.PObjList[T, L]](objects []client.Object, _ func(T, PT, L, PL), matchers ...MatchResourceFunc) PT {
    75  	for _, object := range objects {
    76  		obj, ok := object.(PT)
    77  		if !ok {
    78  			continue
    79  		}
    80  		found := true
    81  		for _, matcher := range matchers {
    82  			if !matcher(obj) {
    83  				found = false
    84  				break
    85  			}
    86  		}
    87  		if found {
    88  			return obj
    89  		}
    90  	}
    91  	return nil
    92  }
    93  
    94  func WithResourceName(name string) MatchResourceFunc {
    95  	return func(object client.Object) bool {
    96  		return name == "" || object.GetName() == name
    97  	}
    98  }