{"record":{"id":"fbb91ada494be642","repo":"goharbor/harbor","slug":"trace-url-path-not-set","errorCode":null,"errorMessage":"Trace url path not set","messagePattern":"Trace url path not set","errorType":"validation","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"make/photon/prepare/models.py","lineNumber":174,"sourceCode":"\n\nclass OtelExporter:\n    def __init__(self, config: dict):\n        if not config:\n            self.enabled = False\n            return\n        self.enabled = True\n        self.endpoint = config.get('endpoint')\n        self.url_path = config.get('url_path')\n        self.compression = config.get('compression') or False\n        self.insecure = config.get('insecure') or False\n        self.timeout = config.get('timeout') or '10'\n\n    def validate(self):\n        if not self.endpoint:\n            raise Exception('Trace endpoint not set')\n        if not self.url_path:\n            raise Exception('Trace url path not set')\n\n\nclass Trace:\n    def __init__(self, config: dict):\n        self.enabled = config.get('enabled') or False\n        self.sample_rate = config.get('sample_rate', 1)\n        self.namespace = config.get('namespace') or ''\n        self.jaeger = JaegerExporter(config.get('jaeger'))\n        self.otel = OtelExporter(config.get('otel'))\n        self.attributes = config.get('attributes') or {}\n\n    def validate(self):\n        if not self.enabled:\n            return\n        if not self.jaeger.enabled and not self.otel.enabled:\n            raise Exception('Trace enabled but no trace exporter set')\n        elif self.jaeger.enabled and self.otel.enabled:\n            raise Exception('Only can have one trace exporter at a time')","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/goharbor/harbor/blob/7b2fd08cc568955cca339afeefab27372840d936/make/photon/prepare/models.py#L156-L192","documentation":"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.","triggerScenarios":"meta.Validate() on metadata whose JSON has no capabilities key or an empty array — the adapter metadata endpoint returned only the scanner block.","commonSituations":"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.","solutions":["Declare at least one capability that consumes MimeTypeDockerArtifact and produces a supported report mime (native or generic vulnerability report)","Verify the payload against the adapter's /metadata endpoint and its API spec","Re-register the scanner once the adapter serves complete metadata"],"exampleFix":"// before (adapter /metadata response)\n{\"scanner\": {\"name\": \"trivy\", \"version\": \"0.50.0\", \"vendor\": \"Aqua Security\"}}\n\n// after\n{\"scanner\": {\"name\": \"trivy\", \"version\": \"0.50.0\", \"vendor\": \"Aqua Security\"},\n \"capabilities\": [{\"consumes_mime_types\": [\"application/vnd.docker.distribution.manifest.v2+json\"],\n                  \"produces_mime_types\": [\"application/vnd.scanner.adapter.vuln.report.harbor+json\"]}]}","handlingStrategy":"validation","validationCode":"if len(meta.Capabilities) == 0 {\n    return errors.New(\"adapter declares no capabilities; cannot register\")\n}","typeGuard":null,"tryCatchPattern":"if err := meta.Validate(); err != nil {\n    if strings.Contains(err.Error(), \"invalid capabilities in metadata\") {\n        return errors.New(\"adapter /metadata needs a non-empty capabilities array\")\n    }\n    return err\n}","preventionTips":["Require at least one capability consuming MimeTypeDockerArtifact in adapter acceptance tests","Validate metadata responses during adapter upgrades","Do not register scanners whose capabilities list is empty"],"tags":["go","harbor","scanner-adapter","metadata","validation"],"backgroundTag":null,"analyzedSha":"7b2fd08cc568955cca339afeefab27372840d936","analyzedAt":"2026-08-16T00:00:10.961Z","schemaVersion":2},"datasetVersion":"2026-08-16T03:17:38.424Z"}