goharbor/harbor · error · Exception

Trace url path not set

Error message

Trace url path not set

What it means

The second check in ScannerAdapterMetadata.Validate: the capabilities array must be present and non-empty. Each declared capability must also consume MimeTypeDockerArtifact and produce at least one supported report mime, but 'invalid capabilities in metadata' specifically means zero capabilities were declared, so the adapter advertises no scan abilities at all.

Source

Thrown at make/photon/prepare/models.py:174


class OtelExporter:
    def __init__(self, config: dict):
        if not config:
            self.enabled = False
            return
        self.enabled = True
        self.endpoint = config.get('endpoint')
        self.url_path = config.get('url_path')
        self.compression = config.get('compression') or False
        self.insecure = config.get('insecure') or False
        self.timeout = config.get('timeout') or '10'

    def validate(self):
        if not self.endpoint:
            raise Exception('Trace endpoint not set')
        if not self.url_path:
            raise Exception('Trace url path not set')


class Trace:
    def __init__(self, config: dict):
        self.enabled = config.get('enabled') or False
        self.sample_rate = config.get('sample_rate', 1)
        self.namespace = config.get('namespace') or ''
        self.jaeger = JaegerExporter(config.get('jaeger'))
        self.otel = OtelExporter(config.get('otel'))
        self.attributes = config.get('attributes') or {}

    def validate(self):
        if not self.enabled:
            return
        if not self.jaeger.enabled and not self.otel.enabled:
            raise Exception('Trace enabled but no trace exporter set')
        elif self.jaeger.enabled and self.otel.enabled:
            raise Exception('Only can have one trace exporter at a time')

View on GitHub (pinned to 7b2fd08cc5)

Solutions

  1. Declare at least one capability that consumes MimeTypeDockerArtifact and produces a supported report mime (native or generic vulnerability report)
  2. Verify the payload against the adapter's /metadata endpoint and its API spec
  3. Re-register the scanner once the adapter serves complete metadata

Example fix

// before (adapter /metadata response)
{"scanner": {"name": "trivy", "version": "0.50.0", "vendor": "Aqua Security"}}

// after
{"scanner": {"name": "trivy", "version": "0.50.0", "vendor": "Aqua Security"},
 "capabilities": [{"consumes_mime_types": ["application/vnd.docker.distribution.manifest.v2+json"],
                  "produces_mime_types": ["application/vnd.scanner.adapter.vuln.report.harbor+json"]}]}
Defensive patterns

Strategy: validation

Validate before calling

if len(meta.Capabilities) == 0 {
    return errors.New("adapter declares no capabilities; cannot register")
}

Try / catch

if err := meta.Validate(); err != nil {
    if strings.Contains(err.Error(), "invalid capabilities in metadata") {
        return errors.New("adapter /metadata needs a non-empty capabilities array")
    }
    return err
}

Prevention

When it happens

Trigger: meta.Validate() on metadata whose JSON has no capabilities key or an empty array — the adapter metadata endpoint returned only the scanner block.

Common situations: Adapters trimmed down for testing that drop the capabilities block; partial metadata after an interrupted adapter upgrade; copy/paste metadata samples missing the capabilities section.

Related errors


AI-assisted analysis of goharbor/harbor@7b2fd08cc5 (2026-08-16). Data as JSON: /api/errors/fbb91ada494be642. Report an issue: GitHub.