Allows quick testing of layer caching using a local directory!
(ctx context.Context, logf log.Func, layerCacheDir string)
| 1861 | |
| 1862 | // Allows quick testing of layer caching using a local directory! |
| 1863 | func serveLocalRegistry(ctx context.Context, logf log.Func, layerCacheDir string) (string, func(), error) { |
| 1864 | noop := func() {} |
| 1865 | if layerCacheDir == "" { |
| 1866 | return "", noop, nil |
| 1867 | } |
| 1868 | cfg := &configuration.Configuration{ |
| 1869 | Storage: configuration.Storage{ |
| 1870 | "filesystem": configuration.Parameters{ |
| 1871 | "rootdirectory": layerCacheDir, |
| 1872 | }, |
| 1873 | }, |
| 1874 | } |
| 1875 | cfg.Log.Level = "error" |
| 1876 | |
| 1877 | // Spawn an in-memory registry to cache built layers... |
| 1878 | registry := handlers.NewApp(ctx, cfg) |
| 1879 | |
| 1880 | listener, err := net.Listen("tcp", "127.0.0.1:0") |
| 1881 | if err != nil { |
| 1882 | return "", nil, fmt.Errorf("start listener for in-memory registry: %w", err) |
| 1883 | } |
| 1884 | tcpAddr, ok := listener.Addr().(*net.TCPAddr) |
| 1885 | if !ok { |
| 1886 | return "", noop, fmt.Errorf("listener addr was of wrong type: %T", listener.Addr()) |
| 1887 | } |
| 1888 | srv := &http.Server{ |
| 1889 | Handler: registry, |
| 1890 | } |
| 1891 | done := make(chan struct{}) |
| 1892 | go func() { |
| 1893 | defer close(done) |
| 1894 | err := srv.Serve(listener) |
| 1895 | if err != nil && !errors.Is(err, http.ErrServerClosed) { |
| 1896 | logf(log.LevelError, "Failed to serve registry: %s", err.Error()) |
| 1897 | } |
| 1898 | }() |
| 1899 | var closeOnce sync.Once |
| 1900 | closer := func() { |
| 1901 | closeOnce.Do(func() { |
| 1902 | _ = srv.Close() |
| 1903 | _ = listener.Close() |
| 1904 | <-done |
| 1905 | }) |
| 1906 | } |
| 1907 | addr := fmt.Sprintf("localhost:%d/local/cache", tcpAddr.Port) |
| 1908 | return addr, closer, nil |
| 1909 | } |
no test coverage detected