-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathapply.go
More file actions
81 lines (69 loc) · 2.3 KB
/
apply.go
File metadata and controls
81 lines (69 loc) · 2.3 KB
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
77
78
79
80
81
package klient
import (
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
"k8s.io/cli-runtime/pkg/resource"
"k8s.io/kubectl/pkg/util"
)
// Apply creates a resource with the given content
func (c *Client) Apply(content []byte) error {
r := c.ResultForContent(content, nil)
return c.ApplyResource(r)
}
// ApplyFiles create the resource(s) from the given filenames (file, directory or STDIN) or HTTP URLs
func (c *Client) ApplyFiles(filenames ...string) error {
r := c.ResultForFilenameParam(filenames, nil)
return c.ApplyResource(r)
}
// ApplyResource applies the given resource. Create the resources with `ResultForFilenameParam` or `ResultForContent`
func (c *Client) ApplyResource(r *resource.Result) error {
if err := r.Err(); err != nil {
return err
}
// Is ServerSideApply requested
if c.ServerSideApply {
return r.Visit(serverSideApply)
}
return r.Visit(apply)
}
func apply(info *resource.Info, err error) error {
if err != nil {
return failedTo("apply", info, err)
}
// If it does not exists, just create it
current, err := resource.NewHelper(info.Client, info.Mapping).Get(info.Namespace, info.Name, info.Export)
if err != nil {
if !errors.IsNotFound(err) {
return failedTo("retrieve current configuration", info, err)
}
if err := util.CreateApplyAnnotation(info.Object, unstructured.UnstructuredJSONScheme); err != nil {
return failedTo("set annotation", info, err)
}
return create(info, nil)
}
// If exists, patch it
return patch(info, current)
}
func serverSideApply(info *resource.Info, err error) error {
if err != nil {
return failedTo("serverside apply", info, err)
}
data, err := runtime.Encode(unstructured.UnstructuredJSONScheme, info.Object)
if err != nil {
return failedTo("encode for the serverside apply", info, err)
}
options := metav1.PatchOptions{
// TODO: Find out how to get the force conflict flag
// Force: &forceConflicts,
// FieldManager: FieldManager,
}
obj, err := resource.NewHelper(info.Client, info.Mapping).Patch(info.Namespace, info.Name, types.ApplyPatchType, data, &options)
if err != nil {
return failedTo("serverside patch", info, err)
}
info.Refresh(obj, true)
return nil
}