mirror of https://github.com/kubernetes/kops.git
72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package nodetasks
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/golang/glog"
|
|
"k8s.io/kops/upup/pkg/fi"
|
|
"k8s.io/kops/upup/pkg/fi/hashing"
|
|
"k8s.io/kops/upup/pkg/fi/nodeup/cloudinit"
|
|
"k8s.io/kops/upup/pkg/fi/nodeup/local"
|
|
"k8s.io/kops/upup/pkg/fi/utils"
|
|
"os/exec"
|
|
"path"
|
|
"strings"
|
|
)
|
|
|
|
// LoadImageTask is responsible for downloading a docker image
|
|
type LoadImageTask struct {
|
|
Source string
|
|
Hash string
|
|
}
|
|
|
|
var _ fi.Task = &LoadImageTask{}
|
|
|
|
func (t *LoadImageTask) String() string {
|
|
return fmt.Sprintf("LoadImageTask: %s", t.Source)
|
|
}
|
|
|
|
func (e *LoadImageTask) Find(c *fi.Context) (*LoadImageTask, error) {
|
|
glog.Warningf("LoadImageTask checking if image present not yet implemented")
|
|
return nil, nil
|
|
}
|
|
|
|
func (e *LoadImageTask) Run(c *fi.Context) error {
|
|
return fi.DefaultDeltaRunMethod(e, c)
|
|
}
|
|
|
|
func (_ *LoadImageTask) CheckChanges(a, e, changes *LoadImageTask) error {
|
|
return nil
|
|
}
|
|
|
|
func (_ *LoadImageTask) RenderLocal(t *local.LocalTarget, a, e, changes *LoadImageTask) error {
|
|
hash, err := hashing.FromString(e.Hash)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
url := e.Source
|
|
|
|
localFile := path.Join(t.CacheDir, hash.String()+"_"+utils.SanitizeString(url))
|
|
_, err = fi.DownloadURL(url, localFile, hash)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Load the image into docker
|
|
args := []string{"docker", "load", "-i", localFile}
|
|
human := strings.Join(args, " ")
|
|
|
|
glog.Infof("running command %s", human)
|
|
cmd := exec.Command(args[0], args[1:]...)
|
|
output, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
return fmt.Errorf("error loading docker image with '%s': %v: %s", human, err, string(output))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (_ *LoadImageTask) RenderCloudInit(t *cloudinit.CloudInitTarget, a, e, changes *LoadImageTask) error {
|
|
return fmt.Errorf("LoadImageTask::RenderCloudInit not implemented")
|
|
}
|