func()

in build-index/tagserver/server.go [186:258]


func (s *Server) putTagHandler(w http.ResponseWriter, r *http.Request) error {
	ctx, span := s.tracer.Start(r.Context(), "build_index.put_tag",
		trace.WithSpanKind(trace.SpanKindServer),
		trace.WithAttributes(
			attribute.String("component", "build_index"),
			attribute.String("operation", "put_tag"),
		),
	)
	defer span.End()

	tag, err := httputil.ParseParam(r, "tag")
	if err != nil {
		span.RecordError(err)
		span.SetStatus(codes.Error, "parse tag failed")
		return err
	}
	d, err := httputil.ParseDigest(r, "digest")
	if err != nil {
		span.RecordError(err)
		span.SetStatus(codes.Error, "parse digest failed")
		return err
	}
	replicate, err := strconv.ParseBool(httputil.GetQueryArg(r, "replicate", "false"))
	if err != nil {
		span.RecordError(err)
		span.SetStatus(codes.Error, "parse query arg replicate failed")
		return fmt.Errorf("parse query arg `replicate`: %w", err)
	}

	span.SetAttributes(
		attribute.String("tag", tag),
		attribute.String("digest", d.String()),
		attribute.Bool("replicate", replicate),
	)

	log.WithTraceContext(ctx).With("tag", tag, "digest", d.String(), "replicate", replicate).Info("Putting tag")

	deps, err := s.depResolver.Resolve(tag, d)
	if err != nil {
		log.WithTraceContext(ctx).With("tag", tag, "digest", d.String(), "error", err).Error("Failed to resolve dependencies")
		span.RecordError(err)
		span.SetStatus(codes.Error, "resolve dependencies failed")
		return fmt.Errorf("resolve dependencies: %w", err)
	}

	span.SetAttributes(attribute.Int("dependency_count", len(deps)))
	log.WithTraceContext(ctx).With("tag", tag, "digest", d.String(), "dependency_count", len(deps)).Debug("Resolved dependencies")

	if err := s.putTag(ctx, tag, d, deps); err != nil {
		log.WithTraceContext(ctx).With("tag", tag, "digest", d.String(), "error", err).Error("Failed to put tag")
		span.RecordError(err)
		span.SetStatus(codes.Error, "put tag failed")
		return err
	}

	log.WithTraceContext(ctx).With("tag", tag, "digest", d.String()).Info("Successfully put tag")

	if replicate {
		log.WithTraceContext(ctx).With("tag", tag, "digest", d.String()).Info("Starting tag replication")
		if err := s.replicateTag(ctx, tag, d, deps); err != nil {
			log.WithTraceContext(ctx).With("tag", tag, "digest", d.String(), "error", err).Error("Failed to replicate tag")
			span.RecordError(err)
			span.SetStatus(codes.Error, "replicate tag failed")
			return err
		}
		log.WithTraceContext(ctx).With("tag", tag, "digest", d.String()).Info("Successfully replicated tag")
	}

	span.SetStatus(codes.Ok, "tag put successfully")
	span.SetAttributes(attribute.Bool("success", true))
	w.WriteHeader(http.StatusOK)
	return nil
}