package runner import ( "compress/gzip" "errors" "git.0x7f.app/WOJ/woj-server/internal/e" "git.0x7f.app/WOJ/woj-server/pkg/file" "git.0x7f.app/WOJ/woj-server/pkg/utils" "github.com/containerd/containerd" "go.uber.org/zap" "os" "path/filepath" ) type depConfig struct { tarball string image string } func (s *service) LoadImageFromTarball(path string) error { if !file.Exist(path) { return errors.New("tarball not exists") } f, err := os.Open(path) if err != nil { return err } defer func(f *os.File) { _ = f.Close() }(f) g, err := gzip.NewReader(f) if err != nil { return err } defer func(g *gzip.Reader) { _ = g.Close() }(g) _, err = s.container.client.Import(s.container.ctx, g) return err } func (s *service) LoadImageFromRegistry(image string) error { _, err := s.container.client.Pull(s.container.ctx, image, containerd.WithPullUnpack) return err } func (s *service) LoadImage(cfg *depConfig) e.Status { err := utils.NewTryErr(). Try(func() error { return s.LoadImageFromTarball(cfg.tarball) }). Or(func() error { return s.LoadImageFromRegistry(cfg.image) }). Done() if err != nil { s.log.Warn("[deps] load image failed", zap.Error(err)) return e.RunnerDepsBuildFailed } return e.Success } func (s *service) EnsureDeps() e.Status { // full fullImage := &depConfig{ tarball: filepath.Join(TmpDir, "ubuntu-full.tar.gz"), image: ContainerImageFull, } if s.LoadImage(fullImage) != e.Success { return e.RunnerDepsBuildFailed } // tiny tinyImage := &depConfig{ tarball: filepath.Join(TmpDir, "ubuntu-tiny.tar.gz"), image: ContainerImageRun, } if s.LoadImage(tinyImage) != e.Success { return e.RunnerDepsBuildFailed } return e.Success }