func startUpgradeContainer(image string, stage, force, reboot, kexec bool) error { in := bufio.NewReader(os.Stdin) command := []string{ "-t", "rancher-upgrade", "-r", config.VERSION, } if kexec { command = append(command, "-k") } container, err := compose.CreateService(nil, "os-upgrade", &project.ServiceConfig{ LogDriver: "json-file", Privileged: true, Net: "host", Pid: "host", Image: image, Labels: project.NewSliceorMap(map[string]string{ config.SCOPE: config.SYSTEM, }), Command: project.NewCommand(command...), }) if err != nil { return err } if err := container.Pull(); err != nil { return err } if !stage { fmt.Printf("Upgrading to %s\n", image) if !force { if !yes(in, "Continue") { os.Exit(1) } } if err := container.Up(); err != nil { return err } if err := container.Log(); err != nil { return err } if err := container.Delete(); err != nil { return err } if reboot && (force || yes(in, "Continue with reboot")) { log.Info("Rebooting") power.Reboot() } } return nil }
func runInstall(image, installType, cloudConfig, device string, force, reboot bool) error { in := bufio.NewReader(os.Stdin) fmt.Printf("Installing from %s\n", image) if !force { if !yes(in, "Continue") { os.Exit(1) } } if installType == "generic" { cmd := exec.Command("system-docker", "run", "--net=host", "--privileged", "--volumes-from=all-volumes", "--entrypoint=/scripts/set-disk-partitions", image, device) cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr if err := cmd.Run(); err != nil { return err } } cmd := exec.Command("system-docker", "run", "--net=host", "--privileged", "--volumes-from=user-volumes", image, "-d", device, "-t", installType, "-c", cloudConfig) cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr if err := cmd.Run(); err != nil { return err } if reboot && yes(in, "Continue with reboot") { log.Info("Rebooting") power.Reboot() } return nil }
func startUpgradeContainer(image string, stage, force, reboot, kexec bool, kernelArgs string) error { in := bufio.NewReader(os.Stdin) command := []string{ "-t", "rancher-upgrade", "-r", config.VERSION, } if kexec { command = append(command, "-k") kernelArgs = strings.TrimSpace(kernelArgs) if kernelArgs != "" { command = append(command, "-a", kernelArgs) } } container, err := compose.CreateService(nil, "os-upgrade", &project.ServiceConfig{ LogDriver: "json-file", Privileged: true, Net: "host", Pid: "host", Image: image, Labels: project.NewSliceorMap(map[string]string{ config.SCOPE: config.SYSTEM, }), Command: project.NewCommand(command...), }) if err != nil { return err } client, err := docker.NewSystemClient() if err != nil { return err } // Only pull image if not found locally if _, err := client.InspectImage(image); err != nil { if err := container.Pull(); err != nil { return err } } if !stage { imageSplit := strings.Split(image, ":") if len(imageSplit) > 1 && imageSplit[1] == config.VERSION { if !force && !yes(in, fmt.Sprintf("Already at version %s. Continue anyways", imageSplit[1])) { os.Exit(1) } } else { fmt.Printf("Upgrading to %s\n", image) if !force && !yes(in, "Continue") { os.Exit(1) } } // If there is already an upgrade container, delete it // Up() should to this, but currently does not due to a bug if err := container.Delete(); err != nil { return err } if err := container.Up(); err != nil { return err } if err := container.Log(); err != nil { return err } if err := container.Delete(); err != nil { return err } if reboot && (force || yes(in, "Continue with reboot")) { log.Info("Rebooting") power.Reboot() } } return nil }