forked from openshift/hive
/
helper.go
108 lines (96 loc) · 3.05 KB
/
helper.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package resource
import (
"fmt"
"io/ioutil"
"os"
log "github.com/sirupsen/logrus"
"k8s.io/client-go/rest"
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
)
const (
defaultCacheDir = "/tmp"
cacheDirEnvKey = "CLI_CACHE_DIR"
)
// Helper contains configuration for apply and patch operations
type Helper struct {
logger log.FieldLogger
cacheDir string
metricsEnabled bool
controllerName string
remote bool
kubeconfig []byte
restConfig *rest.Config
getFactory func(namespace string) (cmdutil.Factory, error)
}
// NewHelperFromRESTConfig returns a new object that allows apply and patch operations
func NewHelperFromRESTConfig(restConfig *rest.Config, logger log.FieldLogger) *Helper {
r := &Helper{
logger: logger,
cacheDir: getCacheDir(logger),
restConfig: restConfig,
}
r.getFactory = r.getRESTConfigFactory
return r
}
// NewHelperWithMetricsFromRESTConfig returns a new object that allows apply and patch operations, with metrics tracking enabled.
func NewHelperWithMetricsFromRESTConfig(restConfig *rest.Config, controllerName string, logger log.FieldLogger) *Helper {
r := &Helper{
logger: logger,
metricsEnabled: true,
controllerName: controllerName,
cacheDir: getCacheDir(logger),
restConfig: restConfig,
}
r.getFactory = r.getRESTConfigFactory
return r
}
// NewHelperWithMetrics returns a new object that allows apply and patch operations, with metrics tracking enabled.
func NewHelperWithMetrics(kubeconfig []byte, controllerName string, remote bool, logger log.FieldLogger) *Helper {
r := &Helper{
logger: logger,
controllerName: controllerName,
metricsEnabled: true,
cacheDir: getCacheDir(logger),
kubeconfig: kubeconfig,
remote: true,
}
r.getFactory = r.getKubeconfigFactory
return r
}
// NewHelper returns a new object that allows apply and patch operations
func NewHelper(kubeconfig []byte, logger log.FieldLogger) *Helper {
r := &Helper{
logger: logger,
cacheDir: getCacheDir(logger),
kubeconfig: kubeconfig,
}
r.getFactory = r.getKubeconfigFactory
return r
}
func getCacheDir(logger log.FieldLogger) string {
if envCacheDir := os.Getenv(cacheDirEnvKey); len(envCacheDir) > 0 {
return envCacheDir
}
return defaultCacheDir
}
func (r *Helper) createTempFile(prefix string, content []byte) (string, error) {
f, err := ioutil.TempFile(r.cacheDir, prefix)
if err != nil {
r.logger.WithError(err).WithField("prefix", prefix).Error("cannot create temporary file")
return "", fmt.Errorf("cannot create temporary file: %v", err)
}
defer f.Close()
if _, err = f.Write(content); err != nil {
r.logger.WithError(err).WithField("file", f.Name()).Error("cannot write to temporary file")
return "", fmt.Errorf("cannot write to temporary file: %v", err)
}
return f.Name(), nil
}
func (r *Helper) deleteTempFile(name string) error {
err := os.Remove(name)
if err != nil {
r.logger.WithError(err).WithField("file", name).Error("cannot delete temp file")
return fmt.Errorf("cannot delete temporary file %s: %v", name, err)
}
return err
}