github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/controller/handler/owner_finder.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 handler 21 22 import ( 23 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 24 "k8s.io/apimachinery/pkg/runtime" 25 "k8s.io/apimachinery/pkg/runtime/schema" 26 "k8s.io/apimachinery/pkg/types" 27 "sigs.k8s.io/controller-runtime/pkg/client" 28 29 "github.com/1aal/kubeblocks/pkg/controller/model" 30 ) 31 32 type ownerFinder struct { 33 baseFinder 34 } 35 36 var _ Finder = &ownerFinder{} 37 38 // NewOwnerFinder return a finder which finds the owner of an object 39 func NewOwnerFinder(ownerType runtime.Object) Finder { 40 return &ownerFinder{baseFinder{objectType: ownerType}} 41 } 42 43 func (finder *ownerFinder) Find(ctx *FinderContext, object client.Object) *model.GVKNObjKey { 44 ownerRef := metav1.GetControllerOf(object) 45 if ownerRef == nil { 46 return nil 47 } 48 gv, err := schema.ParseGroupVersion(ownerRef.APIVersion) 49 if err != nil { 50 return nil 51 } 52 gvk := schema.GroupVersionKind{ 53 Group: gv.Group, 54 Version: gv.Version, 55 Kind: ownerRef.Kind, 56 } 57 ownerGVK := finder.getGroupVersionKind(&ctx.Scheme) 58 if ownerGVK == nil { 59 return nil 60 } 61 if gvk.Group != ownerGVK.Group || gvk.Kind != ownerGVK.Kind { 62 return nil 63 } 64 objKey := types.NamespacedName{ 65 Namespace: object.GetNamespace(), 66 Name: ownerRef.Name, 67 } 68 return &model.GVKNObjKey{ 69 GroupVersionKind: gvk, 70 ObjectKey: objKey, 71 } 72 }