generated from kubernetes/kubernetes-template-project
/
write.go
76 lines (63 loc) · 2.12 KB
/
write.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
72
73
74
75
76
package report
import (
"context"
"fmt"
"log"
clusterpolicyreport "sigs.k8s.io/wg-policy-prototypes/policy-report/pkg/api/wgpolicyk8s.io/v1alpha2"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/retry"
"k8s.io/klog"
client "sigs.k8s.io/wg-policy-prototypes/policy-report/pkg/generated/v1alpha2/clientset/versioned"
)
func Write(r *clusterpolicyreport.ClusterPolicyReport, kubeconfigPath string) (*clusterpolicyreport.ClusterPolicyReport, error) {
var kubeconfig *rest.Config
cfg, err := rest.InClusterConfig()
if err != nil {
cfg, err = clientcmd.BuildConfigFromFlags("", kubeconfigPath)
if err != nil {
klog.Fatalf("Error building kubeconfig: %s", err.Error())
return nil, err
}
}
kubeconfig = cfg
clientset, err := client.NewForConfig(kubeconfig)
if err != nil {
return nil, err
}
policyReport := clientset.Wgpolicyk8sV1alpha2().ClusterPolicyReports()
// Check for existing Policy Reports
result, getErr := policyReport.Get(context.Background(), r.Name, metav1.GetOptions{})
// Create new Policy Report if not found
if errors.IsNotFound(getErr) {
fmt.Println("creating cluster-wide policy report...")
result, err = policyReport.Create(context.Background(), r, metav1.CreateOptions{})
if err != nil {
return nil, err
}
} else {
// Update existing Policy Report
fmt.Println("updating policy report...")
retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
getObj, err := policyReport.Get(context.Background(), r.GetName(), metav1.GetOptions{})
if errors.IsNotFound(err) {
// This doesnt ever happen even if it is already deleted or not found
log.Printf("%v not found", r.GetName())
return nil
}
if err != nil {
return err
}
r.SetResourceVersion(getObj.GetResourceVersion())
_, updateErr := policyReport.Update(context.Background(), r, metav1.UpdateOptions{})
return updateErr
})
if retryErr != nil {
panic(fmt.Errorf("update failed: %v", retryErr))
}
fmt.Println("updated policy report...")
}
return result, nil
}