From ac971c56d114411324175919f82eb0fae3c38117 Mon Sep 17 00:00:00 2001 From: Bruce MacDonald Date: Wed, 9 Aug 2023 10:40:46 -0400 Subject: [PATCH] Update images.go --- server/images.go | 107 ----------------------------------------------- 1 file changed, 107 deletions(-) diff --git a/server/images.go b/server/images.go index 01a71997..22b0a74e 100644 --- a/server/images.go +++ b/server/images.go @@ -14,7 +14,6 @@ import ( "math" "net/http" "os" - "path" "path/filepath" "reflect" "strconv" @@ -1143,112 +1142,6 @@ func uploadBlobChunked(mp ModelPath, url string, layer *Layer, regOpts *Registry return nil } -func downloadBlob(mp ModelPath, digest string, regOpts *RegistryOptions, fn func(api.ProgressResponse)) error { - fp, err := GetBlobsPath(digest) - if err != nil { - return err - } - - if fi, _ := os.Stat(fp); fi != nil { - // we already have the file, so return - fn(api.ProgressResponse{ - Digest: digest, - Total: int(fi.Size()), - Completed: int(fi.Size()), - }) - - return nil - } - - var size int64 - chunkSize := 1024 * 1024 // 1 MiB in bytes - - fi, err := os.Stat(fp + "-partial") - switch { - case errors.Is(err, os.ErrNotExist): - // noop, file doesn't exist so create it - case err != nil: - return fmt.Errorf("stat: %w", err) - default: - size = fi.Size() - // Ensure the size is divisible by the chunk size by removing excess bytes - size -= size % int64(chunkSize) - - err := os.Truncate(fp+"-partial", size) - if err != nil { - return fmt.Errorf("truncate: %w", err) - } - } - - url := fmt.Sprintf("%s/v2/%s/blobs/%s", mp.Registry, mp.GetNamespaceRepository(), digest) - headers := map[string]string{ - "Range": fmt.Sprintf("bytes=%d-", size), - } - - resp, err := makeRequest("GET", url, headers, nil, regOpts) - if err != nil { - log.Printf("couldn't download blob: %v", err) - return err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent { - body, _ := io.ReadAll(resp.Body) - return fmt.Errorf("on download registry responded with code %d: %v", resp.StatusCode, string(body)) - } - - err = os.MkdirAll(path.Dir(fp), 0o700) - if err != nil { - return fmt.Errorf("make blobs directory: %w", err) - } - - out, err := os.OpenFile(fp+"-partial", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o644) - if err != nil { - return fmt.Errorf("open file: %w", err) - } - defer out.Close() - - remaining, _ := strconv.ParseInt(resp.Header.Get("Content-Length"), 10, 64) - completed := size - total := remaining + completed - - for { - fn(api.ProgressResponse{ - Status: fmt.Sprintf("pulling %s...", digest[7:19]), - Digest: digest, - Total: int(total), - Completed: int(completed), - }) - - if completed >= total { - if err := out.Close(); err != nil { - return err - } - - if err := os.Rename(fp+"-partial", fp); err != nil { - fn(api.ProgressResponse{ - Status: fmt.Sprintf("error renaming file: %v", err), - Digest: digest, - Total: int(total), - Completed: int(completed), - }) - return err - } - - break - } - - n, err := io.CopyN(out, resp.Body, int64(chunkSize)) - if err != nil && !errors.Is(err, io.EOF) { - return err - } - completed += n - } - - log.Printf("success getting %s\n", digest) - return nil -} - func makeRequest(method, url string, headers map[string]string, body io.Reader, regOpts *RegistryOptions) (*http.Response, error) { if !strings.HasPrefix(url, "http") { if regOpts.Insecure {