about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <tazjin@google.com>2019-09-30T16·38+0100
committerVincent Ambo <github@tazj.in>2019-10-03T12·21+0100
commit61269175c046681711cf88370d220eb97cd621cf (patch)
tree5027172f72c2b36440279970afa2dcf0acccb557
parent6e2b84f475fb302bf6d8a43c2f7497040ad82cac (diff)
refactor(server): Introduce a state type to carry runtime state
The state type contains things such as the bucket handle and Nixery's
configuration which need to be passed around in the builder.

This is only added for convenience.
-rw-r--r--tools/nixery/server/builder/state.go24
-rw-r--r--tools/nixery/server/main.go18
2 files changed, 31 insertions, 11 deletions
diff --git a/tools/nixery/server/builder/state.go b/tools/nixery/server/builder/state.go
new file mode 100644
index 0000000000..1c7f58821b
--- /dev/null
+++ b/tools/nixery/server/builder/state.go
@@ -0,0 +1,24 @@
+package builder
+
+import (
+	"cloud.google.com/go/storage"
+	"github.com/google/nixery/config"
+	"github.com/google/nixery/layers"
+)
+
+// State holds the runtime state that is carried around in Nixery and
+// passed to builder functions.
+type State struct {
+	Bucket *storage.BucketHandle
+	Cache  LocalCache
+	Cfg    config.Config
+	Pop    layers.Popularity
+}
+
+func NewState(bucket *storage.BucketHandle, cfg config.Config) State {
+	return State{
+		Bucket: bucket,
+		Cfg:    cfg,
+		Cache:  NewCache(),
+	}
+}
diff --git a/tools/nixery/server/main.go b/tools/nixery/server/main.go
index 9242a3731a..ae8dd3ab2d 100644
--- a/tools/nixery/server/main.go
+++ b/tools/nixery/server/main.go
@@ -122,10 +122,8 @@ func writeError(w http.ResponseWriter, status int, code, message string) {
 }
 
 type registryHandler struct {
-	cfg    *config.Config
-	ctx    *context.Context
-	bucket *storage.BucketHandle
-	cache  *builder.LocalCache
+	ctx   *context.Context
+	state *builder.State
 }
 
 func (h *registryHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@@ -141,7 +139,7 @@ func (h *registryHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 		imageTag := manifestMatches[2]
 		log.Printf("Requesting manifest for image %q at tag %q", imageName, imageTag)
 		image := builder.ImageFromName(imageName, imageTag)
-		buildResult, err := builder.BuildImage(h.ctx, h.cfg, h.cache, &image, h.bucket)
+		buildResult, err := builder.BuildImage(h.ctx, h.state, &image)
 
 		if err != nil {
 			writeError(w, 500, "UNKNOWN", "image build failure")
@@ -172,7 +170,7 @@ func (h *registryHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 	layerMatches := layerRegex.FindStringSubmatch(r.RequestURI)
 	if len(layerMatches) == 3 {
 		digest := layerMatches[2]
-		url, err := constructLayerUrl(h.cfg, digest)
+		url, err := constructLayerUrl(&h.state.Cfg, digest)
 
 		if err != nil {
 			log.Printf("Failed to sign GCS URL: %s\n", err)
@@ -197,16 +195,14 @@ func main() {
 
 	ctx := context.Background()
 	bucket := prepareBucket(&ctx, cfg)
-	cache := builder.NewCache()
+	state := builder.NewState(bucket, *cfg)
 
 	log.Printf("Starting Nixery on port %s\n", cfg.Port)
 
 	// All /v2/ requests belong to the registry handler.
 	http.Handle("/v2/", &registryHandler{
-		cfg:    cfg,
-		ctx:    &ctx,
-		bucket: bucket,
-		cache:  &cache,
+		ctx:   &ctx,
+		state: &state,
 	})
 
 	// All other roots are served by the static file server.