-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
owner.go
71 lines (61 loc) · 2.38 KB
/
owner.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
Copyright 2019 The Skaffold Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package kubernetes
import (
"context"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kubernetesclient "github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/kubernetes/client"
"github.com/GoogleContainerTools/skaffold/v2/pkg/skaffold/output/log"
)
// TopLevelOwnerKey returns a key associated with the top level
// owner of a Kubernetes resource in the form Kind-Name
func TopLevelOwnerKey(ctx context.Context, obj metav1.Object, kubeContext string, kind string) string {
for {
or := obj.GetOwnerReferences()
if or == nil {
return fmt.Sprintf("%s-%s", kind, obj.GetName())
}
var err error
kind = or[0].Kind
obj, err = ownerMetaObject(ctx, obj.GetNamespace(), kubeContext, or[0])
if err != nil {
log.Entry(ctx).Warnf("unable to get owner from reference: %v", or[0])
return ""
}
}
}
func ownerMetaObject(ctx context.Context, ns string, kubeContext string, owner metav1.OwnerReference) (metav1.Object, error) {
client, err := kubernetesclient.Client(kubeContext)
if err != nil {
return nil, err
}
switch owner.Kind {
case "Deployment":
return client.AppsV1().Deployments(ns).Get(ctx, owner.Name, metav1.GetOptions{})
case "ReplicaSet":
return client.AppsV1().ReplicaSets(ns).Get(ctx, owner.Name, metav1.GetOptions{})
case "Job":
return client.BatchV1().Jobs(ns).Get(ctx, owner.Name, metav1.GetOptions{})
case "CronJob":
return client.BatchV1beta1().CronJobs(ns).Get(ctx, owner.Name, metav1.GetOptions{})
case "StatefulSet":
return client.AppsV1().StatefulSets(ns).Get(ctx, owner.Name, metav1.GetOptions{})
case "ReplicationController":
return client.CoreV1().ReplicationControllers(ns).Get(ctx, owner.Name, metav1.GetOptions{})
case "Pod":
return client.CoreV1().Pods(ns).Get(ctx, owner.Name, metav1.GetOptions{})
default:
return nil, fmt.Errorf("kind %s is not supported", owner.Kind)
}
}