{"record":{"id":"370da46de5797a67","repo":"argoproj/argo-workflows","slug":"plugin-s-is-directory-check-failed-s","errorCode":null,"errorMessage":"plugin %s is directory check failed: %s","messagePattern":"plugin (.+?) is directory check failed: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"workflow/artifacts/plugin/plugin.go","lineNumber":366,"sourceCode":"\t\treturn nil, fmt.Errorf(\"plugin %s list objects failed: %w\", d.pluginName, err)\n\t}\n\tif resp.Error != \"\" {\n\t\treturn nil, fmt.Errorf(\"plugin %s list objects failed: %s\", d.pluginName, resp.Error)\n\t}\n\treturn resp.Objects, nil\n}\n\n// IsDirectory implements ArtifactDriver.IsDirectory by calling the plugin service\nfunc (d *Driver) IsDirectory(ctx context.Context, artifactRef *wfv1.Artifact) (bool, error) {\n\tgrpcArtifact := convertToGRPC(artifactRef)\n\tresp, err := d.client.IsDirectory(ctx, &artifact.IsDirectoryRequest{\n\t\tArtifact: grpcArtifact,\n\t})\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"plugin %s is directory check failed: %w\", d.pluginName, err)\n\t}\n\tif resp.Error != \"\" {\n\t\treturn false, fmt.Errorf(\"plugin %s is directory check failed: %s\", d.pluginName, resp.Error)\n\t}\n\treturn resp.IsDirectory, nil\n}\n\n// convertToGRPC converts v1alpha1.Artifact to gRPC Artifact\nfunc convertToGRPC(a *wfv1.Artifact) *artifact.Artifact {\n\tif a == nil {\n\t\treturn nil\n\t}\n\n\tgrpcArtifact := &artifact.Artifact{\n\t\tName:           a.Name,\n\t\tPath:           a.Path,\n\t\tFrom:           a.From,\n\t\tOptional:       a.Optional,\n\t\tSubPath:        a.SubPath,\n\t\tRecurseMode:    a.RecurseMode,\n\t\tFromExpression: a.FromExpression,","sourceCodeStart":348,"sourceCodeEnd":384,"githubUrl":"https://github.com/argoproj/argo-workflows/blob/35bff19146f5a6ada77468c431f2624bd577e373/workflow/artifacts/plugin/plugin.go#L348-L384","documentation":"This error wraps an in-band failure reported by the artifact plugin itself: the gRPC call succeeded, but the plugin set resp.Error to a non-empty message. Argo surfaces the plugin's own error text prefixed with the plugin name, so the root cause description comes from the plugin implementation, not Argo.","triggerScenarios":"Calling Driver.IsDirectory on a plugin artifact where the plugin's server-side IsDirectory handler returned an error payload in the response (resp.Error != \"\") — e.g. the plugin failed to authenticate to its backend storage or rejected the artifact reference.","commonSituations":"Plugin cannot access its backing storage (bad credentials in plugin config); artifact reference invalid for the plugin's expected schema; plugin-side bug or unsupported storage backend; plugin reporting backend 403/404 conditions as errors.","solutions":["Read the trailing %s text — it is the plugin's own error message describing the real failure","Check the plugin's configuration (ConfigMap-based plugin config) for storage credentials/endpoint mistakes","Check the plugin's server logs for the corresponding request failure","Validate the artifact definition (key/path format) against what the plugin expects","Update or fix the plugin if its handler incorrectly flags valid requests"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"ok, err := driver.IsDirectory(ctx, artifact)\nif err != nil {\n    // resp.Error text is embedded after the prefix\n    if strings.Contains(err.Error(), \"is directory check failed\") {\n        log.Error(\"plugin reported failure; inspect plugin logs and its backend storage config\", \"err\", err)\n    }\n    return err\n}","preventionTips":["Validate plugin configuration (credentials, backend endpoints) before deploying workflows","Keep plugin error handling tested — plugin-side failures surface verbatim here","Pin plugin versions compatible with your Argo Workflows release","Check plugin server logs whenever this error appears"],"tags":["grpc","plugin","artifact","rpc-error"],"backgroundTag":"plugin-rpc-error","analyzedSha":"35bff19146f5a6ada77468c431f2624bd577e373","analyzedAt":"2026-09-03T19:34:35.908Z","contentChangedAt":"2026-09-03T19:34:35.908Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}