1package containerized
2
3import (
4	"encoding/json"
5	"io/ioutil"
6	"os"
7	"path/filepath"
8)
9
10var (
11	proxydir = "/etc/containerd-proxy"
12)
13
14type proxyConfig struct {
15	ID        string   `json:"-"`
16	Namespace string   `json:"namespace"`
17	Image     string   `json:"image"`
18	ImagePath string   `json:"imagePath"`
19	Args      []string `json:"args"`
20	Scope     string   `json:"scope"`
21}
22
23func updateConfig(name, newImage string) error {
24	cfg, err := loadConfig(name)
25	if err != nil && os.IsNotExist(err) {
26		return nil
27	}
28	if err != nil {
29		return err
30	}
31	cfg.Image = newImage
32	cfg.ImagePath = ""
33	return storeConfig(name, cfg)
34}
35
36func loadConfig(name string) (*proxyConfig, error) {
37	configFile := filepath.Join(proxydir, name+".json")
38	data, err := ioutil.ReadFile(configFile)
39	if err != nil {
40		return nil, err
41	}
42	var cfg proxyConfig
43	err = json.Unmarshal(data, &cfg)
44	if err != nil {
45		return nil, err
46	}
47	return &cfg, nil
48}
49
50// storeConfig will write out the config only if it already exists
51func storeConfig(name string, cfg *proxyConfig) error {
52	configFile := filepath.Join(proxydir, name+".json")
53	fd, err := os.OpenFile(configFile, os.O_RDWR, 0644)
54	if err != nil && os.IsNotExist(err) {
55		return nil
56	}
57	if err != nil {
58		return err
59	}
60	err = fd.Truncate(0)
61	if err != nil {
62		return err
63	}
64	enc := json.NewEncoder(fd)
65	return enc.Encode(cfg)
66}
67