mirror of
https://github.com/rancher/os.git
synced 2025-05-04 14:16:21 +00:00
130 lines
3.5 KiB
Go
130 lines
3.5 KiB
Go
package install
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/rancher/os/config"
|
|
"github.com/rancher/os/pkg/log"
|
|
"github.com/rancher/os/pkg/util"
|
|
"github.com/rancher/os/pkg/util/network"
|
|
|
|
yaml "github.com/cloudfoundry-incubator/candiedyaml"
|
|
)
|
|
|
|
type ImageConfig struct {
|
|
Image string `yaml:"image,omitempty"`
|
|
}
|
|
|
|
func GetCacheImageList(cloudconfig string, oldcfg *config.CloudConfig) []string {
|
|
savedImages := make([]string, 0)
|
|
bytes, err := readConfigFile(cloudconfig)
|
|
if err != nil {
|
|
log.WithFields(log.Fields{"err": err}).Fatal("Failed to read cloud-config")
|
|
return savedImages
|
|
}
|
|
r := make(map[interface{}]interface{})
|
|
if err := yaml.Unmarshal(bytes, &r); err != nil {
|
|
log.WithFields(log.Fields{"err": err}).Fatal("Failed to unmarshal cloud-config")
|
|
return savedImages
|
|
}
|
|
newcfg := &config.CloudConfig{}
|
|
if err := util.Convert(r, newcfg); err != nil {
|
|
log.WithFields(log.Fields{"err": err}).Fatal("Failed to convert cloud-config")
|
|
return savedImages
|
|
}
|
|
|
|
// services_include
|
|
for key, value := range newcfg.Rancher.ServicesInclude {
|
|
if value {
|
|
serviceImage := getServiceImage(key, "", oldcfg, newcfg)
|
|
if serviceImage != "" {
|
|
savedImages = append(savedImages, serviceImage)
|
|
}
|
|
}
|
|
}
|
|
|
|
// console
|
|
newConsole := newcfg.Rancher.Console
|
|
if newConsole != "" && newConsole != "default" {
|
|
consoleImage := getServiceImage(newConsole, "console", oldcfg, newcfg)
|
|
if consoleImage != "" {
|
|
savedImages = append(savedImages, consoleImage)
|
|
}
|
|
}
|
|
|
|
// docker engine
|
|
newEngine := newcfg.Rancher.Docker.Engine
|
|
if newEngine != "" && newEngine != oldcfg.Rancher.Docker.Engine {
|
|
engineImage := getServiceImage(newEngine, "docker", oldcfg, newcfg)
|
|
if engineImage != "" {
|
|
savedImages = append(savedImages, engineImage)
|
|
}
|
|
|
|
}
|
|
|
|
return savedImages
|
|
}
|
|
|
|
func getServiceImage(service, svctype string, oldcfg, newcfg *config.CloudConfig) string {
|
|
var (
|
|
serviceImage string
|
|
bytes []byte
|
|
err error
|
|
)
|
|
if len(newcfg.Rancher.Repositories.ToArray()) > 0 {
|
|
bytes, err = network.LoadServiceResource(service, true, newcfg)
|
|
} else {
|
|
bytes, err = network.LoadServiceResource(service, true, oldcfg)
|
|
}
|
|
if err != nil {
|
|
log.WithFields(log.Fields{"err": err}).Fatal("Failed to load service resource")
|
|
return serviceImage
|
|
}
|
|
imageConfig := map[interface{}]ImageConfig{}
|
|
if err = yaml.Unmarshal(bytes, &imageConfig); err != nil {
|
|
log.WithFields(log.Fields{"err": err}).Fatal("Failed to unmarshal service")
|
|
return serviceImage
|
|
}
|
|
switch svctype {
|
|
case "console":
|
|
serviceImage = formatImage(imageConfig["console"].Image, oldcfg, newcfg)
|
|
case "docker":
|
|
serviceImage = formatImage(imageConfig["docker"].Image, oldcfg, newcfg)
|
|
default:
|
|
serviceImage = formatImage(imageConfig[service].Image, oldcfg, newcfg)
|
|
}
|
|
|
|
return serviceImage
|
|
}
|
|
|
|
func RunCacheScript(partition string, images []string) error {
|
|
return util.RunScript("/scripts/cache-services.sh", partition, strings.Join(images, " "))
|
|
}
|
|
|
|
func readConfigFile(file string) ([]byte, error) {
|
|
content, err := ioutil.ReadFile(file)
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
err = nil
|
|
content = []byte{}
|
|
} else {
|
|
return nil, err
|
|
}
|
|
}
|
|
return content, err
|
|
}
|
|
|
|
func formatImage(image string, oldcfg, newcfg *config.CloudConfig) string {
|
|
registryDomain := newcfg.Rancher.Environment["REGISTRY_DOMAIN"]
|
|
if registryDomain == "" {
|
|
registryDomain = oldcfg.Rancher.Environment["REGISTRY_DOMAIN"]
|
|
}
|
|
image = strings.Replace(image, "${REGISTRY_DOMAIN}", registryDomain, -1)
|
|
|
|
image = strings.Replace(image, "${SUFFIX}", config.Suffix, -1)
|
|
|
|
return image
|
|
}
|