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 }