-
Notifications
You must be signed in to change notification settings - Fork 33
/
Copy pathpuller.go
82 lines (72 loc) · 2.16 KB
/
puller.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
package singlecluster
import (
"log"
"os"
"os/signal"
"path"
"sync"
"syscall"
"time"
"github.com/che-incubator/kubernetes-image-puller/cfg"
"github.com/che-incubator/kubernetes-image-puller/utils"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
// CacheImages starts and maintains a daemonset to ensure images are
// cached.
func CacheImages() {
// Set up kubernetes client
// Look in
// 1) $KUBECONFIG -- For testing
// 2) ~/.kube/config -- For testing
// 3) InClusterConfig
var config *rest.Config
var err error
defaultKubeConfigPath := path.Join(os.Getenv("HOME"), ".kube", "config")
if kubeConfigEnv := os.Getenv("KUBECONFIG"); kubeConfigEnv != "" {
if config, err = clientcmd.BuildConfigFromFlags("", kubeConfigEnv); err != nil {
log.Fatalf("Error building REST Config: %v", err)
}
} else if _, err := os.Stat(defaultKubeConfigPath); err == nil {
if config, err = clientcmd.BuildConfigFromFlags("", defaultKubeConfigPath); err != nil {
log.Fatalf("Error building REST Config: %v", err)
}
} else {
if config, err = rest.InClusterConfig(); err != nil {
log.Fatalf("Error building REST Config: %v", err)
}
}
var wg sync.WaitGroup
wg.Add(1)
shutdownChan := make(chan os.Signal, 1)
signal.Notify(shutdownChan, syscall.SIGTERM)
go cacheImagesLocally(config, shutdownChan, &wg)
wg.Wait()
log.Printf("Shutting down cleanly")
}
func cacheImagesLocally(config *rest.Config,
shutdownChan chan os.Signal,
wg *sync.WaitGroup) {
cfg := cfg.GetConfig()
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
log.Printf("Error creating Clientset: %v", err)
}
// Clean up existing deployment if necessary
utils.DeleteDaemonsetIfExists(clientset)
// Create daemonset to cache images
utils.CacheImages(clientset)
utils.LogNumNodesScheduled(clientset, "(single user mode)")
for {
select {
case <-shutdownChan:
log.Printf("Received SIGTERM, deleting daemonset")
utils.DeleteDaemonsetIfExists(clientset)
wg.Done()
case <-time.After(time.Duration(cfg.CachingInterval) * time.Hour):
utils.RefreshCache(clientset)
utils.LogNumNodesScheduled(clientset, "(single user mode)")
}
}
}