{"record":{"id":"0dd4640498ff9707","repo":"docker/cli","slug":"invalid-generic-resource-v-for-service-task","errorCode":null,"errorMessage":"invalid generic-resource `%+v` for service task","messagePattern":"invalid generic-resource `%\\+v` for service task","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/command/service/generic_resource_opts.go","lineNumber":56,"sourceCode":"\t}\n\n\tfor _, res := range swarmResources {\n\t\tif res.NamedResourceSpec != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid generic-resource request `%s=%s`, Named Generic Resources is not supported for service create or update\",\n\t\t\t\tres.NamedResourceSpec.Kind, res.NamedResourceSpec.Value,\n\t\t\t)\n\t\t}\n\t}\n\n\treturn swarmResources, nil\n}\n\nfunc buildGenericResourceMap(genericRes []swarm.GenericResource) (map[string]swarm.GenericResource, error) {\n\tm := make(map[string]swarm.GenericResource)\n\n\tfor _, res := range genericRes {\n\t\tif res.DiscreteResourceSpec == nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid generic-resource `%+v` for service task\", res)\n\t\t}\n\n\t\t_, ok := m[res.DiscreteResourceSpec.Kind]\n\t\tif ok {\n\t\t\treturn nil, fmt.Errorf(\"duplicate generic-resource `%+v` for service task\", res.DiscreteResourceSpec.Kind)\n\t\t}\n\n\t\tm[res.DiscreteResourceSpec.Kind] = res\n\t}\n\n\treturn m, nil\n}\n\nfunc buildGenericResourceList(genericRes map[string]swarm.GenericResource) []swarm.GenericResource {\n\tl := make([]swarm.GenericResource, 0, len(genericRes))\n\n\tfor _, res := range genericRes {\n\t\tl = append(l, res)","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/docker/cli/blob/4f84911bfe8811e9b028e4b1fee8e7510be79387/cli/command/service/generic_resource_opts.go#L38-L74","documentation":"Returned by buildGenericResourceMap (generic_resource_opts.go:56) when a swarm.GenericResource in the parsed list has a nil DiscreteResourceSpec. After ParseGenericResources guarantees no NamedResourceSpec, buildGenericResourceMap expects every resource to be discrete; a resource that is neither named nor discrete violates that invariant and is rejected.","triggerScenarios":"An internal/boundary condition where genericresource.Parse produced a GenericResource with both NamedResourceSpec and DiscreteResourceSpec nil. Not normally reachable from well-formed CLI input post-[378]; indicates a parser change or an empty/malformed resource slipped through.","commonSituations":"Version skew between docker/cli and moby/swarm genericresource parser, an empty entry that passed earlier checks, or programmatic callers constructing swarm.GenericResource structs directly.","solutions":["Update docker/cli and the daemon to matching versions to rule out parser drift.","Re-check the --generic-resource input for empty or malformed entries.","Report as a bug if it reproduces on current versions with valid `name=integer` input."],"exampleFix":"// before: programmatic caller passes a GenericResource with nil DiscreteResourceSpec\nres := swarm.GenericResource{} // both specs nil\n// after\nres := swarm.GenericResource{DiscreteResourceSpec: &swarm.DiscreteGenericResource{Kind: \"GPU\", Value: 2}}","handlingStrategy":"validation","validationCode":"// For programmatic callers, ensure every resource has a discrete spec.\nfunc allDiscrete(res []swarm.GenericResource) error {\n    for _, r := range res {\n        if r.DiscreteResourceSpec == nil {\n            return fmt.Errorf(\"generic resource missing discrete spec: %+v\", r)\n        }\n    }\n    return nil\n}","typeGuard":"// hasDiscreteSpec narrows resources safe for buildGenericResourceMap.\nfunc hasDiscreteSpec(r swarm.GenericResource) bool { return r.DiscreteResourceSpec != nil }","tryCatchPattern":null,"preventionTips":["Always populate DiscreteResourceSpec when constructing resources in code.","Keep CLI and daemon versions aligned to avoid parser drift.","Report reproducible occurrences on current versions as bugs."],"tags":["service","generic-resource","swarm","data-integrity","docker-cli"],"backgroundTag":null,"analyzedSha":"4f84911bfe8811e9b028e4b1fee8e7510be79387","analyzedAt":"2026-08-07T12:15:29.814Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}