...
1
16
17 package configfiles
18
19 import (
20 "fmt"
21 "path/filepath"
22
23 "k8s.io/apimachinery/pkg/runtime/serializer"
24 kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config"
25 kubeletscheme "k8s.io/kubernetes/pkg/kubelet/apis/config/scheme"
26 utilcodec "k8s.io/kubernetes/pkg/kubelet/kubeletconfig/util/codec"
27 utilfs "k8s.io/kubernetes/pkg/util/filesystem"
28 )
29
30
31 type Loader interface {
32
33 Load() (*kubeletconfig.KubeletConfiguration, error)
34
35
36 LoadIntoJSON() ([]byte, error)
37 }
38
39
40 type fsLoader struct {
41
42 fs utilfs.Filesystem
43
44 kubeletCodecs *serializer.CodecFactory
45
46 kubeletFile string
47 }
48
49
50 func NewFsLoader(fs utilfs.Filesystem, kubeletFile string) (Loader, error) {
51 _, kubeletCodecs, err := kubeletscheme.NewSchemeAndCodecs(serializer.EnableStrict)
52 if err != nil {
53 return nil, err
54 }
55
56 return &fsLoader{
57 fs: fs,
58 kubeletCodecs: kubeletCodecs,
59 kubeletFile: kubeletFile,
60 }, nil
61 }
62
63 func (loader *fsLoader) Load() (*kubeletconfig.KubeletConfiguration, error) {
64 data, err := loader.fs.ReadFile(loader.kubeletFile)
65 if err != nil {
66 return nil, fmt.Errorf("failed to read kubelet config file %q, error: %v", loader.kubeletFile, err)
67 }
68
69
70 if len(data) == 0 {
71 return nil, fmt.Errorf("kubelet config file %q was empty", loader.kubeletFile)
72 }
73
74 kc, err := utilcodec.DecodeKubeletConfiguration(loader.kubeletCodecs, data)
75 if err != nil {
76 return nil, err
77 }
78
79
80 resolveRelativePaths(kubeletconfig.KubeletConfigurationPathRefs(kc), filepath.Dir(loader.kubeletFile))
81 return kc, nil
82 }
83
84 func (loader *fsLoader) LoadIntoJSON() ([]byte, error) {
85 data, err := loader.fs.ReadFile(loader.kubeletFile)
86 if err != nil {
87 return nil, fmt.Errorf("failed to read drop-in kubelet config file %q, error: %v", loader.kubeletFile, err)
88 }
89
90
91 if len(data) == 0 {
92 return nil, fmt.Errorf("kubelet config file %q was empty", loader.kubeletFile)
93 }
94
95 return utilcodec.DecodeKubeletConfigurationIntoJSON(loader.kubeletCodecs, data)
96 }
97
98
99 func resolveRelativePaths(paths []*string, root string) {
100 for _, path := range paths {
101
102
103 if len(*path) > 0 && !utilfs.IsAbs(*path) {
104 *path = filepath.Join(root, *path)
105 }
106 }
107 }
108
View as plain text