{"record":{"id":"d444dd071043df47","repo":"goharbor/harbor","slug":"trace-endpoint-not-set","errorCode":null,"errorMessage":"Trace endpoint not set","messagePattern":"Trace endpoint not set","errorType":"validation","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"make/photon/prepare/models.py","lineNumber":172,"sourceCode":"        if self.endpoint and self.agent_host:\n            raise Exception('Jaeger Colector Endpoint and Agent host both set, only can set one')\n\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')","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/goharbor/harbor/blob/7b2fd08cc568955cca339afeefab27372840d936/make/photon/prepare/models.py#L154-L190","documentation":"ScannerAdapterMetadata.Validate checks the payload served by a scanner adapter's /metadata endpoint. 'invalid scanner in metadata' means the Scanner block is absent, or its Name, Version, or Vendor string is empty — all three are mandatory before the adapter can be registered as a scanner.","triggerScenarios":"client.GetMetadata() followed by meta.Validate() where the adapter's JSON omits scanner, scanner.name, scanner.version, or scanner.vendor.","commonSituations":"Minimal or third-party adapters that fill only a name; adapters built against an older spec revision; JSON field-name casing mismatches in hand-written metadata payloads.","solutions":["Fix the adapter's /metadata payload to include scanner.name, scanner.version and scanner.vendor","Inspect the raw payload (curl the adapter's /metadata endpoint) to see exactly which field is missing","Upgrade the adapter to a spec-compliant release"],"exampleFix":"// before (adapter /metadata response)\n{\"scanner\": {\"name\": \"trivy\"}}\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":"meta, err := c.GetMetadata()\nif err != nil {\n    return err\n}\nif meta.Scanner == nil || meta.Scanner.Name == \"\" || meta.Scanner.Version == \"\" || meta.Scanner.Vendor == \"\" {\n    return fmt.Errorf(\"adapter metadata incomplete: %+v\", meta.Scanner)\n}","typeGuard":null,"tryCatchPattern":"if err := meta.Validate(); err != nil {\n    if strings.Contains(err.Error(), \"invalid scanner in metadata\") {\n        return fmt.Errorf(\"adapter /metadata must set scanner.name, scanner.version, scanner.vendor\")\n    }\n    return err\n}","preventionTips":["curl the adapter's /metadata endpoint during onboarding and eyeball the scanner block","Pin spec-compliant adapter versions","Validate metadata before persisting a scanner registration"],"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"}