MCPcopy Create free account
hub / github.com/coder/envbuilder / serveLocalRegistry

Function serveLocalRegistry

envbuilder.go:1863–1909  ·  view source on GitHub ↗

Allows quick testing of layer caching using a local directory!

(ctx context.Context, logf log.Func, layerCacheDir string)

Source from the content-addressed store, hash-verified

1861
1862// Allows quick testing of layer caching using a local directory!
1863func 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}

Callers 2

runFunction · 0.85
RunCacheProbeFunction · 0.85

Calls 2

ErrorMethod · 0.80
CloseMethod · 0.80

Tested by

no test coverage detected