diff --git a/pkg/artifactcache/handler.go b/pkg/artifactcache/handler.go index 85a52774..d0fe5b4a 100644 --- a/pkg/artifactcache/handler.go +++ b/pkg/artifactcache/handler.go @@ -38,7 +38,8 @@ type Handler struct { gcing atomic.Bool gcAt time.Time - outboundIP string + outboundIP string + externalAddress string } func StartHandler(dir, outboundIP string, port uint16, logger logrus.FieldLogger) (*Handler, error) { @@ -110,7 +111,63 @@ func StartHandler(dir, outboundIP string, port uint16, logger logrus.FieldLogger return h, nil } +func CreateHandler(dir, externalAddress string, logger logrus.FieldLogger) (*Handler, http.Handler, error) { + h := &Handler{} + + if logger == nil { + discard := logrus.New() + discard.Out = io.Discard + logger = discard + } + logger = logger.WithField("module", "artifactcache") + h.logger = logger + + if dir == "" { + home, err := os.UserHomeDir() + if err != nil { + return nil, nil, err + } + dir = filepath.Join(home, ".cache", "actcache") + } + if err := os.MkdirAll(dir, 0o755); err != nil { + return nil, nil, err + } + + h.dir = dir + + storage, err := NewStorage(filepath.Join(dir, "cache")) + if err != nil { + return nil, nil, err + } + h.storage = storage + + if externalAddress != "" { + h.externalAddress = externalAddress + } else if ip := common.GetOutboundIP(); ip == nil { + return nil, nil, fmt.Errorf("unable to determine outbound IP address") + } else { + h.outboundIP = ip.String() + } + + router := httprouter.New() + router.GET(urlBase+"/cache", h.middleware(h.find)) + router.POST(urlBase+"/caches", h.middleware(h.reserve)) + router.PATCH(urlBase+"/caches/:id", h.middleware(h.upload)) + router.POST(urlBase+"/caches/:id", h.middleware(h.commit)) + router.GET(urlBase+"/artifacts/:id", h.middleware(h.get)) + router.POST(urlBase+"/clean", h.middleware(h.clean)) + + h.router = router + + h.gcCache() + + return h, router, nil +} + func (h *Handler) ExternalURL() string { + if h.externalAddress != "" { + return h.externalAddress + } // TODO: make the external url configurable if necessary return fmt.Sprintf("http://%s:%d", h.outboundIP, diff --git a/pkg/artifactcache/handler_test.go b/pkg/artifactcache/handler_test.go index 252c4209..f6b92bd6 100644 --- a/pkg/artifactcache/handler_test.go +++ b/pkg/artifactcache/handler_test.go @@ -695,3 +695,13 @@ func TestHandler_gcCache(t *testing.T) { } require.NoError(t, db.Close()) } + +func TestCreateHandler(t *testing.T) { + dir := filepath.Join(t.TempDir(), "artifactcache") + handler, router, err := CreateHandler(dir, "http://localhost:8080", nil) + require.NoError(t, err) + require.NotNil(t, handler) + require.NotNil(t, router) + + require.Equal(t, "http://localhost:8080", handler.ExternalURL()) +}