From ba4c7928e6d6c0641d5b7c9e6e8d3e0c04cafde1 Mon Sep 17 00:00:00 2001 From: ddl-rliu Date: Thu, 5 Mar 2026 14:36:55 -0800 Subject: [PATCH 1/7] Add file_extension, enable_legacy_filename fields to BlobType Add a new `file_extension` string field to the BlobType protobuf message, allowing FlyteFile to optionally specify a file extension (e.g. "csv") that flytecopilot appends when writing blobs to local disk during the download phase (e.g. "data.csv"). When empty (the default), behavior is unchanged. Add a new `enable_legacy_filename` bool field to the BlobType protobuf message, allowing FlyteFile to optionally specify whether to preserve backward compatibility for tasks that read from the extensionless path. Regenerated all protobuf bindings (Go, Python, JS, Rust, ES, Swagger). Signed-off-by: ddl-rliu --- flytecopilot/cmd/download.go | 10 +- flytecopilot/cmd/download_test.go | 78 ++++++ flytecopilot/data/download.go | 72 ++++- flytecopilot/data/download_test.go | 4 +- flytecopilot/data/upload.go | 4 +- flyteidl/.gitignore | 3 + flyteidl/clients/go/assets/admin.swagger.json | 4 + flyteidl/clients/go/coreutils/literals.go | 10 +- .../clients/go/coreutils/literals_test.go | 12 +- flyteidl/gen/pb-es/flyteidl/core/types_pb.ts | 21 ++ flyteidl/gen/pb-go/flyteidl/core/types.pb.go | 253 ++++++++++-------- .../cacheservice/cacheservice.swagger.json | 8 + .../datacatalog/datacatalog.swagger.json | 8 + .../flyteidl/service/admin.swagger.json | 8 + .../flyteidl/service/agent.swagger.json | 8 + .../flyteidl/service/dataproxy.swagger.json | 8 + .../external_plugin_service.swagger.json | 8 + .../flyteidl/service/signal.swagger.json | 8 + flyteidl/gen/pb-js/flyteidl.d.ts | 12 + flyteidl/gen/pb-js/flyteidl.js | 34 +++ .../gen/pb_python/flyteidl/core/types_pb2.py | 48 ++-- .../gen/pb_python/flyteidl/core/types_pb2.pyi | 8 +- flyteidl/gen/pb_rust/flyteidl.core.rs | 11 + flyteidl/protos/flyteidl/core/types.proto | 14 + 24 files changed, 493 insertions(+), 161 deletions(-) diff --git a/flytecopilot/cmd/download.go b/flytecopilot/cmd/download.go index 3827308c335..42b1f8d9cde 100644 --- a/flytecopilot/cmd/download.go +++ b/flytecopilot/cmd/download.go @@ -5,6 +5,7 @@ import ( "fmt" "time" + "github.com/golang/protobuf/proto" "github.com/spf13/cobra" "github.com/flyteorg/flyte/flytecopilot/data" @@ -49,6 +50,11 @@ func GetUploadModeVals() []string { } func (d *DownloadOptions) Download(ctx context.Context) error { + inputInterface := &core.VariableMap{} + if err := proto.Unmarshal(d.inputInterface, inputInterface); err != nil { + logger.Warnf(ctx, "Bad input interface passed, failed to unmarshal err: %s", err) + } + if d.remoteOutputsPrefix == "" { return fmt.Errorf("to-output-prefix is required") } @@ -77,7 +83,7 @@ func (d *DownloadOptions) Download(ctx context.Context) error { childCtx, cancelFn = context.WithTimeout(ctx, d.timeout) } defer cancelFn() - err := dl.DownloadInputs(childCtx, storage.DataReference(d.remoteInputsPath), d.localDirectoryPath) + err := dl.DownloadInputs(childCtx, inputInterface, storage.DataReference(d.remoteInputsPath), d.localDirectoryPath) if err != nil { logger.Errorf(ctx, "Downloading failed, err %s", err) return err @@ -116,6 +122,6 @@ func NewDownloadCommand(opts *RootOptions) *cobra.Command { downloadCmd.Flags().StringVarP(&downloadOpts.metadataFormat, "format", "m", core.DataLoadingConfig_JSON.String(), fmt.Sprintf("What should be the output format for the primitive and structured types. Options [%v]", GetFormatVals())) downloadCmd.Flags().StringVarP(&downloadOpts.downloadMode, "download-mode", "d", core.IOStrategy_DOWNLOAD_EAGER.String(), fmt.Sprintf("Download mode to use. Options [%v]", GetDownloadModeVals())) downloadCmd.Flags().DurationVarP(&downloadOpts.timeout, "timeout", "t", time.Hour*1, "Max time to allow for downloads to complete, default is 1H") - downloadCmd.Flags().BytesBase64VarP(&downloadOpts.inputInterface, "input-interface", "i", nil, "Input interface proto message - core.VariableMap, base64 encoced string") + downloadCmd.Flags().BytesBase64VarP(&downloadOpts.inputInterface, "input-interface", "i", nil, "Input interface proto message - core.VariableMap, base64 encoded string") return downloadCmd } diff --git a/flytecopilot/cmd/download_test.go b/flytecopilot/cmd/download_test.go index b96ffd46a60..f9e2c436c2f 100644 --- a/flytecopilot/cmd/download_test.go +++ b/flytecopilot/cmd/download_test.go @@ -10,6 +10,7 @@ import ( "strings" "testing" + "github.com/golang/protobuf/proto" "github.com/stretchr/testify/assert" "github.com/flyteorg/flyte/flyteidl/clients/go/coreutils" @@ -137,6 +138,83 @@ func TestDownloadOptions_Download(t *testing.T) { assert.ElementsMatch(t, []string{"inputs.json", "inputs.pb", "x", "y", "blob"}, collectFile(tmpDir)) }) + t.Run("primitiveAndBlobInputsWithFileExtension", func(t *testing.T) { + tmpDir, err := ioutil.TempDir(tmpFolderLocation, tmpPrefix) + assert.NoError(t, err) + defer func() { + assert.NoError(t, os.RemoveAll(tmpDir)) + }() + dopts.localDirectoryPath = tmpDir + + s := promutils.NewTestScope() + store, err := storage.NewDataStore(&storage.Config{Type: storage.TypeMemory}, s.NewSubScope("storage")) + assert.NoError(t, err) + dopts.RootOptions = &RootOptions{ + Scope: s, + Store: store, + } + + iface := &core.VariableMap{ + Variables: map[string]*core.Variable{ + "blob": { + Type: &core.LiteralType{Type: &core.LiteralType_Blob{Blob: &core.BlobType{Dimensionality: core.BlobType_SINGLE, Format: "xyz", FileExtension: "xyz", EnableLegacyFilename: false}}}, + }, + "legacy_blob": { + Type: &core.LiteralType{Type: &core.LiteralType_Blob{Blob: &core.BlobType{Dimensionality: core.BlobType_SINGLE, Format: "xyz", FileExtension: "xyz", EnableLegacyFilename: true}}}, + }, + }, + } + d, err := proto.Marshal(iface) + assert.NoError(t, err) + dopts.inputInterface = d + + blobLoc := storage.DataReference("blob-loc") + br := bytes.NewBuffer([]byte("Hello World!")) + assert.NoError(t, store.WriteRaw(ctx, blobLoc, int64(br.Len()), storage.Options{}, br)) + assert.NoError(t, store.WriteProtobuf(ctx, storage.DataReference(inputPath), storage.Options{}, &core.LiteralMap{ + Literals: map[string]*core.Literal{ + "x": coreutils.MustMakePrimitiveLiteral(1), + "y": coreutils.MustMakePrimitiveLiteral("hello"), + "blob": {Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Blob{ + Blob: &core.Blob{ + Uri: blobLoc.String(), + Metadata: &core.BlobMetadata{ + Type: &core.BlobType{ + Dimensionality: core.BlobType_SINGLE, + Format: "xyz", + FileExtension: "xyz", + EnableLegacyFilename: false, + }, + }, + }, + }, + }, + }}, + "legacy_blob": {Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Blob{ + Blob: &core.Blob{ + Uri: blobLoc.String(), + Metadata: &core.BlobMetadata{ + Type: &core.BlobType{ + Dimensionality: core.BlobType_SINGLE, + Format: "xyz", + FileExtension: "xyz", + EnableLegacyFilename: true, + }, + }, + }, + }, + }, + }}, + }, + })) + assert.NoError(t, dopts.Download(ctx), "Download Operation failed") + assert.ElementsMatch(t, []string{"inputs.json", "inputs.pb", "x", "y", "blob.xyz", "legacy_blob", "legacy_blob.xyz"}, collectFile(tmpDir)) + }) + t.Run("primitiveAndMissingBlobInputs", func(t *testing.T) { tmpDir, err := ioutil.TempDir(tmpFolderLocation, tmpPrefix) assert.NoError(t, err) diff --git a/flytecopilot/data/download.go b/flytecopilot/data/download.go index 084469faed2..9a424077807 100644 --- a/flytecopilot/data/download.go +++ b/flytecopilot/data/download.go @@ -33,6 +33,42 @@ type Downloader struct { mode core.IOStrategy_DownloadMode } +// By default, blobs (FlyteFiles) were not and still are not written with a file extension. +// For example, a data: FlyteFile["csv"] blob should be written to "data", even though +// Format="csv". +// +// When FileExtension="" (the default), this old behavior is preserved. +// +// However, a data: Annotated[FlyteFile["csv"], FileDownloadConfig(file_extension="csv")] +// blob should be written to "data.csv" - both Format="csv" and FileExtension="csv" (new behavior). +// +// So when e.g. FileExtension="csv", the file is written to "data.csv". +// Also, when e.g. FileExtension="csv" and EnableLegacyFilename=true, the file is written to +// "data" and "data.csv" (partially new behavior, bridges the gap of backward compatibility). +func resolveVarFilenames(vars *core.VariableMap) (map[string][]string, error) { + varFilenames := make(map[string][]string, len(vars.GetVariables())) + for varName, variable := range vars.GetVariables() { + varType := variable.GetType() + switch varType.GetType().(type) { + case *core.LiteralType_Blob: + if varType.GetBlob().GetFileExtension() == "" { + varFilenames[varName] = append(varFilenames[varName], varName) + } else { + varFilenames[varName] = append(varFilenames[varName], varName+"."+varType.GetBlob().GetFileExtension()) + if varType.GetBlob().GetEnableLegacyFilename() { + varFilenames[varName] = append(varFilenames[varName], varName) + } + } + case *core.LiteralType_Simple: + varFilenames[varName] = append(varFilenames[varName], varName) + default: + return nil, fmt.Errorf("currently CoPilot downloader does not support [%s], system error", varType) + } + } + logger.Infof(context.Background(), "varFilenames: %v", varFilenames) + return varFilenames, nil +} + // TODO add timeout and rate limit // TODO use chunk to download func (d Downloader) handleBlob(ctx context.Context, blob *core.Blob, toPath string) (interface{}, error) { @@ -432,7 +468,7 @@ func (d Downloader) handleLiteral(ctx context.Context, lit *core.Literal, filePa if err != nil { return nil, nil, errors.Wrapf(err, "failed to create directory [%s]", filePath) } - v, m, err := d.RecursiveDownload(ctx, lit.GetMap(), filePath, writeToFile) + v, m, err := d.RecursiveDownload(ctx, lit.GetMap(), filePath, make(map[string][]string), writeToFile) if err != nil { return nil, nil, err } @@ -468,7 +504,7 @@ type downloadedResult struct { v interface{} } -func (d Downloader) RecursiveDownload(ctx context.Context, inputs *core.LiteralMap, dir string, writePrimitiveToFile bool) (VarMap, *core.LiteralMap, error) { +func (d Downloader) RecursiveDownload(ctx context.Context, inputs *core.LiteralMap, dir string, varFilenames map[string][]string, writePrimitiveToFile bool) (VarMap, *core.LiteralMap, error) { childCtx, cancel := context.WithCancel(ctx) defer cancel() if inputs == nil || len(inputs.GetLiterals()) == 0 { @@ -486,14 +522,26 @@ func (d Downloader) RecursiveDownload(ctx context.Context, inputs *core.LiteralM } logger.Infof(ctx, "read object at location [%s]", offloadedMetadataURI) } - varPath := path.Join(dir, variable) lit := literal f[variable] = futures.NewAsyncFuture(childCtx, func(ctx2 context.Context) (interface{}, error) { - v, lit, err := d.handleLiteral(ctx2, lit, varPath, writePrimitiveToFile) - if err != nil { - return nil, err + var filenames []string + var resultLit *core.Literal + var resultV interface{} + var err error + if len(varFilenames[variable]) == 0 { + filenames = []string{variable} + } else { + filenames = varFilenames[variable] } - return downloadedResult{lit: lit, v: v}, nil + for _, filename := range filenames { + varPath := path.Join(dir, filename) + // TODO: Refactor handleLiteral to accept a list of file paths and return a list of downloaded results + resultV, resultLit, err = d.handleLiteral(ctx2, lit, varPath, writePrimitiveToFile) + if err != nil { + return nil, err + } + } + return downloadedResult{lit: resultLit, v: resultV}, nil }) } @@ -520,7 +568,7 @@ func (d Downloader) RecursiveDownload(ctx context.Context, inputs *core.LiteralM return vmap, m, nil } -func (d Downloader) DownloadInputs(ctx context.Context, inputRef storage.DataReference, outputDir string) error { +func (d Downloader) DownloadInputs(ctx context.Context, vars *core.VariableMap, inputRef storage.DataReference, outputDir string) error { logger.Infof(ctx, "Downloading inputs from [%s]", inputRef) defer logger.Infof(ctx, "Exited downloading inputs from [%s]", inputRef) if err := os.MkdirAll(outputDir, os.ModePerm); err != nil { @@ -533,7 +581,13 @@ func (d Downloader) DownloadInputs(ctx context.Context, inputRef storage.DataRef logger.Errorf(ctx, "Failed to download inputs from [%s], err [%s]", inputRef, err) return errors.Wrapf(err, "failed to download input metadata message from remote store") } - varMap, lMap, err := d.RecursiveDownload(ctx, inputs, outputDir, true) + + varFilenames, err := resolveVarFilenames(vars) + if err != nil { + return errors.Wrapf(err, "failed to resolve variable filenames") + } + + varMap, lMap, err := d.RecursiveDownload(ctx, inputs, outputDir, varFilenames, true) if err != nil { return errors.Wrapf(err, "failed to download input variable from remote store") } diff --git a/flytecopilot/data/download_test.go b/flytecopilot/data/download_test.go index 1da5602e2c9..df38fdb0c82 100644 --- a/flytecopilot/data/download_test.go +++ b/flytecopilot/data/download_test.go @@ -231,7 +231,7 @@ func TestRecursiveDownload(t *testing.T) { } }() - varMap, lMap, err := d.RecursiveDownload(context.Background(), inputs, toPath, true) + varMap, lMap, err := d.RecursiveDownload(context.Background(), inputs, toPath, map[string][]string{}, true) assert.NoError(t, err) assert.NotNil(t, varMap) assert.NotNil(t, lMap) @@ -309,7 +309,7 @@ func TestRecursiveDownload(t *testing.T) { } }() - varMap, lMap, err := d.RecursiveDownload(context.Background(), inputs, toPath, true) + varMap, lMap, err := d.RecursiveDownload(context.Background(), inputs, toPath, map[string][]string{}, true) assert.NoError(t, err) assert.NotNil(t, varMap) assert.NotNil(t, lMap) diff --git a/flytecopilot/data/upload.go b/flytecopilot/data/upload.go index 2103028d287..6c8e3600683 100644 --- a/flytecopilot/data/upload.go +++ b/flytecopilot/data/upload.go @@ -107,11 +107,11 @@ func (u Uploader) handleBlobType(ctx context.Context, localPath string, toPath s } } - return coreutils.MakeLiteralForBlob(toPath, false, ""), nil + return coreutils.MakeLiteralForBlob(toPath, false, "", "", false), nil } size := info.Size() // Should we make this a go routine as well, so that we can introduce timeouts - return coreutils.MakeLiteralForBlob(toPath, false, ""), UploadFileToStorage(ctx, fpath, toPath, size, u.store) + return coreutils.MakeLiteralForBlob(toPath, false, "", "", false), UploadFileToStorage(ctx, fpath, toPath, size, u.store) } func (u Uploader) RecursiveUpload(ctx context.Context, vars *core.VariableMap, fromPath string, metaOutputPath, dataRawPath storage.DataReference) error { diff --git a/flyteidl/.gitignore b/flyteidl/.gitignore index f7a920620fd..a666666dbbc 100644 --- a/flyteidl/.gitignore +++ b/flyteidl/.gitignore @@ -8,6 +8,9 @@ vendor dist gen/pb_python/flyteidl.egg-info/ +gen/pb_python/flyteidl/**/__pycache__/ +pip-wheel-metadata/*.dist-info/ +*.egg-info/ .virtualgo docs/build/ diff --git a/flyteidl/clients/go/assets/admin.swagger.json b/flyteidl/clients/go/assets/admin.swagger.json index 6e3aa65f81c..a3f2468e1e7 100644 --- a/flyteidl/clients/go/assets/admin.swagger.json +++ b/flyteidl/clients/go/assets/admin.swagger.json @@ -6857,6 +6857,10 @@ }, "dimensionality": { "$ref": "#/definitions/BlobTypeBlobDimensionality" + }, + "file_extension": { + "type": "string", + "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/clients/go/coreutils/literals.go b/flyteidl/clients/go/coreutils/literals.go index 310e389c733..0874d3c015b 100644 --- a/flyteidl/clients/go/coreutils/literals.go +++ b/flyteidl/clients/go/coreutils/literals.go @@ -485,7 +485,7 @@ func MakeLiteralForStructuredDataSet(path storage.DataReference, columns []*core } } -func MakeLiteralForBlob(path storage.DataReference, isDir bool, format string) *core.Literal { +func MakeLiteralForBlob(path storage.DataReference, isDir bool, format string, fileExtension string, enableLegacyFilename bool) *core.Literal { dim := core.BlobType_SINGLE if isDir { dim = core.BlobType_MULTIPART @@ -498,8 +498,10 @@ func MakeLiteralForBlob(path storage.DataReference, isDir bool, format string) * Uri: path.String(), Metadata: &core.BlobMetadata{ Type: &core.BlobType{ - Dimensionality: dim, - Format: format, + Dimensionality: dim, + Format: format, + FileExtension: fileExtension, + EnableLegacyFilename: enableLegacyFilename, }, }, }, @@ -601,7 +603,7 @@ func MakeLiteralForType(t *core.LiteralType, v interface{}) (*core.Literal, erro case *core.LiteralType_Blob: isDir := newT.Blob.GetDimensionality() == core.BlobType_MULTIPART - lv := MakeLiteralForBlob(storage.DataReference(fmt.Sprintf("%v", v)), isDir, newT.Blob.GetFormat()) + lv := MakeLiteralForBlob(storage.DataReference(fmt.Sprintf("%v", v)), isDir, newT.Blob.GetFormat(), newT.Blob.GetFileExtension(), newT.Blob.GetEnableLegacyFilename()) return lv, nil case *core.LiteralType_Schema: diff --git a/flyteidl/clients/go/coreutils/literals_test.go b/flyteidl/clients/go/coreutils/literals_test.go index 3586e0e02fc..9d5967da9b0 100644 --- a/flyteidl/clients/go/coreutils/literals_test.go +++ b/flyteidl/clients/go/coreutils/literals_test.go @@ -388,9 +388,11 @@ func TestMakeLiteralForSimpleType(t *testing.T) { func TestMakeLiteralForBlob(t *testing.T) { type args struct { - path storage.DataReference - isDir bool - format string + path storage.DataReference + isDir bool + format string + fileExtension string + enableLegacyFilename bool } tests := []struct { name string @@ -399,10 +401,12 @@ func TestMakeLiteralForBlob(t *testing.T) { }{ {"simple-key", args{path: "/key", isDir: false, format: "xyz"}, &core.Blob{Uri: "/key", Metadata: &core.BlobMetadata{Type: &core.BlobType{Format: "xyz", Dimensionality: core.BlobType_SINGLE}}}}, {"simple-dir", args{path: "/key", isDir: true, format: "xyz"}, &core.Blob{Uri: "/key", Metadata: &core.BlobMetadata{Type: &core.BlobType{Format: "xyz", Dimensionality: core.BlobType_MULTIPART}}}}, + {"simple-key-with-extension", args{path: "/key", isDir: false, format: "xyz", fileExtension: "xyz", enableLegacyFilename: false}, &core.Blob{Uri: "/key", Metadata: &core.BlobMetadata{Type: &core.BlobType{Format: "xyz", Dimensionality: core.BlobType_SINGLE, FileExtension: "xyz", EnableLegacyFilename: false}}}}, + {"simple-key-with-extension-and-legacy-filename", args{path: "/key", isDir: false, format: "xyz", fileExtension: "xyz", enableLegacyFilename: true}, &core.Blob{Uri: "/key", Metadata: &core.BlobMetadata{Type: &core.BlobType{Format: "xyz", Dimensionality: core.BlobType_SINGLE, FileExtension: "xyz", EnableLegacyFilename: true}}}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := MakeLiteralForBlob(tt.args.path, tt.args.isDir, tt.args.format); !reflect.DeepEqual(got.GetScalar().GetBlob(), tt.want) { + if got := MakeLiteralForBlob(tt.args.path, tt.args.isDir, tt.args.format, tt.args.fileExtension, tt.args.enableLegacyFilename); !reflect.DeepEqual(got.GetScalar().GetBlob(), tt.want) { t.Errorf("MakeLiteralForBlob() = %v, want %v", got, tt.want) } }) diff --git a/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts b/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts index f311fa0692b..76f0bc0fb72 100644 --- a/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts +++ b/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts @@ -341,6 +341,25 @@ export class BlobType extends Message { */ dimensionality = BlobType_BlobDimensionality.SINGLE; + /** + * Optional file extension (without leading dot) to use when materializing + * the blob to local disk during copilot download, e.g. "csv", "parquet". + * When empty, no extension is appended. + * + * @generated from field: string file_extension = 3; + */ + fileExtension = ""; + + /** + * When true and file_extension is non-empty, the copilot download phase + * writes the blob to both the extended path (with extension) and the + * base path (without extension), preserving backward compatibility for + * tasks that read from the extensionless path. Default is false. + * + * @generated from field: bool enable_legacy_filename = 4; + */ + enableLegacyFilename = false; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -351,6 +370,8 @@ export class BlobType extends Message { static readonly fields: FieldList = proto3.util.newFieldList(() => [ { no: 1, name: "format", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 2, name: "dimensionality", kind: "enum", T: proto3.getEnumType(BlobType_BlobDimensionality) }, + { no: 3, name: "file_extension", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "enable_legacy_filename", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): BlobType { diff --git a/flyteidl/gen/pb-go/flyteidl/core/types.pb.go b/flyteidl/gen/pb-go/flyteidl/core/types.pb.go index b844e951c93..c870b6c63de 100644 --- a/flyteidl/gen/pb-go/flyteidl/core/types.pb.go +++ b/flyteidl/gen/pb-go/flyteidl/core/types.pb.go @@ -334,6 +334,15 @@ type BlobType struct { // csv, parquet etc Format string `protobuf:"bytes,1,opt,name=format,proto3" json:"format,omitempty"` Dimensionality BlobType_BlobDimensionality `protobuf:"varint,2,opt,name=dimensionality,proto3,enum=flyteidl.core.BlobType_BlobDimensionality" json:"dimensionality,omitempty"` + // Optional file extension (without leading dot) to use when materializing + // the blob to local disk during copilot download, e.g. "csv", "parquet". + // When empty, no extension is appended. + FileExtension string `protobuf:"bytes,3,opt,name=file_extension,json=fileExtension,proto3" json:"file_extension,omitempty"` + // When true and file_extension is non-empty, the copilot download phase + // writes the blob to both the extended path (with extension) and the + // base path (without extension), preserving backward compatibility for + // tasks that read from the extensionless path. Default is false. + EnableLegacyFilename bool `protobuf:"varint,4,opt,name=enable_legacy_filename,json=enableLegacyFilename,proto3" json:"enable_legacy_filename,omitempty"` } func (x *BlobType) Reset() { @@ -382,6 +391,20 @@ func (x *BlobType) GetDimensionality() BlobType_BlobDimensionality { return BlobType_SINGLE } +func (x *BlobType) GetFileExtension() string { + if x != nil { + return x.FileExtension + } + return "" +} + +func (x *BlobType) GetEnableLegacyFilename() bool { + if x != nil { + return x.EnableLegacyFilename + } + return false +} + // Enables declaring enum types, with predefined string values // For len(values) > 0, the first value in the ordered list is regarded as the default value. If you wish // To provide no defaults, make the first value as undefined. @@ -1176,125 +1199,131 @@ var file_flyteidl_core_types_proto_rawDesc = []byte{ 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x6c, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x22, 0xa7, 0x01, 0x0a, 0x08, 0x42, 0x6c, 0x6f, 0x62, 0x54, + 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x22, 0x84, 0x02, 0x0a, 0x08, 0x42, 0x6c, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x52, 0x0a, 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, - 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, - 0x2f, 0x0a, 0x12, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, - 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x41, 0x52, 0x54, 0x10, 0x01, - 0x22, 0x22, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x22, 0x43, 0x0a, 0x09, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x36, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x0d, 0x54, 0x79, - 0x70, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, - 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x56, 0x0a, - 0x0e, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x54, 0x79, 0x70, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x5c, 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, - 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, - 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x0e, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0xbc, 0x05, 0x0a, 0x0b, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x33, 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x06, 0x73, - 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, - 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, - 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x48, - 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x6d, 0x61, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, + 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, + 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x65, + 0x67, 0x61, 0x63, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x0a, 0x12, + 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x41, 0x52, 0x54, 0x10, 0x01, 0x22, 0x22, 0x0a, + 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x22, 0x43, 0x0a, 0x09, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, + 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x0d, 0x54, 0x79, 0x70, 0x65, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x56, 0x0a, 0x0e, 0x64, 0x61, + 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x54, 0x79, + 0x70, 0x65, 0x1a, 0x5c, 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x54, + 0x79, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, - 0x6c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, - 0x6f, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x04, - 0x62, 0x6c, 0x6f, 0x62, 0x12, 0x36, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, - 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, - 0x48, 0x00, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5e, 0x0a, 0x17, - 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x73, - 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x15, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x64, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, - 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x09, 0x75, 0x6e, - 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3d, 0x0a, 0x0a, - 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, - 0x79, 0x70, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x7a, 0x0a, 0x0f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, - 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, 0x61, 0x72, 0x12, 0x3c, 0x0a, - 0x09, 0x61, 0x74, 0x74, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x65, 0x52, 0x08, 0x61, 0x74, 0x74, 0x72, 0x50, 0x61, 0x74, 0x68, 0x22, 0x5f, 0x0a, 0x10, 0x50, - 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, - 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x47, 0x0a, 0x05, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x86, 0x01, 0x0a, 0x0a, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x46, - 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, - 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x04, 0x12, - 0x0c, 0x0a, 0x08, 0x44, 0x41, 0x54, 0x45, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x05, 0x12, 0x0c, 0x0a, - 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x42, - 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x10, 0x09, 0x42, 0xb0, - 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x42, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, - 0x6c, 0x79, 0x74, 0x65, 0x6f, 0x72, 0x67, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, - 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, - 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0xa2, 0x02, - 0x03, 0x46, 0x43, 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, - 0x43, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0d, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, - 0x43, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x19, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, - 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0xea, 0x02, 0x0e, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x72, - 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x4b, 0x0a, 0x0e, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xbc, 0x05, + 0x0a, 0x0b, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, + 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, + 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x69, + 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, + 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, + 0x72, 0x65, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, + 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0e, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x42, + 0x0a, 0x0e, 0x6d, 0x61, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, + 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, + 0x70, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, + 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6c, 0x6f, + 0x62, 0x12, 0x36, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, + 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5e, 0x0a, 0x17, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x66, 0x6c, 0x79, + 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x48, 0x00, 0x52, 0x15, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x6e, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x6e, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x09, 0x75, 0x6e, 0x69, 0x6f, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x79, + 0x70, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, + 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x7a, 0x0a, 0x0f, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, 0x61, 0x72, 0x12, 0x3c, 0x0a, 0x09, 0x61, 0x74, + 0x74, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, + 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x08, + 0x61, 0x74, 0x74, 0x72, 0x50, 0x61, 0x74, 0x68, 0x22, 0x5f, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x6d, + 0x69, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0c, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x47, 0x0a, 0x05, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x2a, 0x86, 0x01, 0x0a, 0x0a, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, + 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x4c, 0x4f, 0x41, + 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, + 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, + 0x44, 0x41, 0x54, 0x45, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, + 0x52, 0x59, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x08, 0x12, + 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x10, 0x09, 0x42, 0xb0, 0x01, 0x0a, 0x11, + 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, + 0x65, 0x42, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x79, 0x74, + 0x65, 0x6f, 0x72, 0x67, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, + 0x69, 0x64, 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x46, 0x43, + 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x43, 0x6f, 0x72, + 0x65, 0xca, 0x02, 0x0d, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x43, 0x6f, 0x72, + 0x65, 0xe2, 0x02, 0x19, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x43, 0x6f, 0x72, + 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, + 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json index 204e9e71223..8a2815c8e4f 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json @@ -156,6 +156,14 @@ }, "dimensionality": { "$ref": "#/definitions/BlobTypeBlobDimensionality" + }, + "file_extension": { + "type": "string", + "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + }, + "enable_legacy_filename": { + "type": "boolean", + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json index 990cc1ec4ae..9aa3f4dfcf8 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json @@ -130,6 +130,14 @@ }, "dimensionality": { "$ref": "#/definitions/BlobTypeBlobDimensionality" + }, + "file_extension": { + "type": "string", + "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + }, + "enable_legacy_filename": { + "type": "boolean", + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json index 6e3aa65f81c..c098d00c308 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json @@ -6857,6 +6857,14 @@ }, "dimensionality": { "$ref": "#/definitions/BlobTypeBlobDimensionality" + }, + "file_extension": { + "type": "string", + "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + }, + "enable_legacy_filename": { + "type": "boolean", + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json index 7752341446a..958148eae97 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json @@ -1024,6 +1024,14 @@ }, "dimensionality": { "$ref": "#/definitions/BlobTypeBlobDimensionality" + }, + "file_extension": { + "type": "string", + "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + }, + "enable_legacy_filename": { + "type": "boolean", + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json index 20f32b743d0..f768d0a2b08 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json @@ -246,6 +246,14 @@ }, "dimensionality": { "$ref": "#/definitions/BlobTypeBlobDimensionality" + }, + "file_extension": { + "type": "string", + "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + }, + "enable_legacy_filename": { + "type": "boolean", + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json index 468030f76d2..dac2c4779bd 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json @@ -272,6 +272,14 @@ }, "dimensionality": { "$ref": "#/definitions/BlobTypeBlobDimensionality" + }, + "file_extension": { + "type": "string", + "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + }, + "enable_legacy_filename": { + "type": "boolean", + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json index 841cb04f267..ffe42f78782 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json @@ -322,6 +322,14 @@ }, "dimensionality": { "$ref": "#/definitions/BlobTypeBlobDimensionality" + }, + "file_extension": { + "type": "string", + "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + }, + "enable_legacy_filename": { + "type": "boolean", + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-js/flyteidl.d.ts b/flyteidl/gen/pb-js/flyteidl.d.ts index d42bc601f07..d268bd5e4f2 100644 --- a/flyteidl/gen/pb-js/flyteidl.d.ts +++ b/flyteidl/gen/pb-js/flyteidl.d.ts @@ -2174,6 +2174,12 @@ export namespace flyteidl { /** BlobType dimensionality */ dimensionality?: (flyteidl.core.BlobType.BlobDimensionality|null); + + /** BlobType fileExtension */ + fileExtension?: (string|null); + + /** BlobType enableLegacyFilename */ + enableLegacyFilename?: (boolean|null); } /** Represents a BlobType. */ @@ -2191,6 +2197,12 @@ export namespace flyteidl { /** BlobType dimensionality. */ public dimensionality: flyteidl.core.BlobType.BlobDimensionality; + /** BlobType fileExtension. */ + public fileExtension: string; + + /** BlobType enableLegacyFilename. */ + public enableLegacyFilename: boolean; + /** * Creates a new BlobType instance using the specified properties. * @param [properties] Properties to set diff --git a/flyteidl/gen/pb-js/flyteidl.js b/flyteidl/gen/pb-js/flyteidl.js index 7e35168f471..eb13bb0da02 100644 --- a/flyteidl/gen/pb-js/flyteidl.js +++ b/flyteidl/gen/pb-js/flyteidl.js @@ -5147,6 +5147,8 @@ * @interface IBlobType * @property {string|null} [format] BlobType format * @property {flyteidl.core.BlobType.BlobDimensionality|null} [dimensionality] BlobType dimensionality + * @property {string|null} [fileExtension] BlobType fileExtension + * @property {boolean|null} [enableLegacyFilename] BlobType enableLegacyFilename */ /** @@ -5180,6 +5182,22 @@ */ BlobType.prototype.dimensionality = 0; + /** + * BlobType fileExtension. + * @member {string} fileExtension + * @memberof flyteidl.core.BlobType + * @instance + */ + BlobType.prototype.fileExtension = ""; + + /** + * BlobType enableLegacyFilename. + * @member {boolean} enableLegacyFilename + * @memberof flyteidl.core.BlobType + * @instance + */ + BlobType.prototype.enableLegacyFilename = false; + /** * Creates a new BlobType instance using the specified properties. * @function create @@ -5208,6 +5226,10 @@ writer.uint32(/* id 1, wireType 2 =*/10).string(message.format); if (message.dimensionality != null && message.hasOwnProperty("dimensionality")) writer.uint32(/* id 2, wireType 0 =*/16).int32(message.dimensionality); + if (message.fileExtension != null && message.hasOwnProperty("fileExtension")) + writer.uint32(/* id 3, wireType 2 =*/26).string(message.fileExtension); + if (message.enableLegacyFilename != null && message.hasOwnProperty("enableLegacyFilename")) + writer.uint32(/* id 4, wireType 0 =*/32).bool(message.enableLegacyFilename); return writer; }; @@ -5235,6 +5257,12 @@ case 2: message.dimensionality = reader.int32(); break; + case 3: + message.fileExtension = reader.string(); + break; + case 4: + message.enableLegacyFilename = reader.bool(); + break; default: reader.skipType(tag & 7); break; @@ -5265,6 +5293,12 @@ case 1: break; } + if (message.fileExtension != null && message.hasOwnProperty("fileExtension")) + if (!$util.isString(message.fileExtension)) + return "fileExtension: string expected"; + if (message.enableLegacyFilename != null && message.hasOwnProperty("enableLegacyFilename")) + if (typeof message.enableLegacyFilename !== "boolean") + return "enableLegacyFilename: boolean expected"; return null; }; diff --git a/flyteidl/gen/pb_python/flyteidl/core/types_pb2.py b/flyteidl/gen/pb_python/flyteidl/core/types_pb2.py index 3043a0cf6b8..549ba55fd00 100644 --- a/flyteidl/gen/pb_python/flyteidl/core/types_pb2.py +++ b/flyteidl/gen/pb_python/flyteidl/core/types_pb2.py @@ -14,7 +14,7 @@ from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x66lyteidl/core/types.proto\x12\rflyteidl.core\x1a\x1cgoogle/protobuf/struct.proto\"\xa1\x02\n\nSchemaType\x12@\n\x07\x63olumns\x18\x03 \x03(\x0b\x32&.flyteidl.core.SchemaType.SchemaColumnR\x07\x63olumns\x1a\xd0\x01\n\x0cSchemaColumn\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12K\n\x04type\x18\x02 \x01(\x0e\x32\x37.flyteidl.core.SchemaType.SchemaColumn.SchemaColumnTypeR\x04type\"_\n\x10SchemaColumnType\x12\x0b\n\x07INTEGER\x10\x00\x12\t\n\x05\x46LOAT\x10\x01\x12\n\n\x06STRING\x10\x02\x12\x0b\n\x07\x42OOLEAN\x10\x03\x12\x0c\n\x08\x44\x41TETIME\x10\x04\x12\x0c\n\x08\x44URATION\x10\x05\"\xc7\x02\n\x15StructuredDatasetType\x12L\n\x07\x63olumns\x18\x01 \x03(\x0b\x32\x32.flyteidl.core.StructuredDatasetType.DatasetColumnR\x07\x63olumns\x12\x16\n\x06\x66ormat\x18\x02 \x01(\tR\x06\x66ormat\x12\x30\n\x14\x65xternal_schema_type\x18\x03 \x01(\tR\x12\x65xternalSchemaType\x12\x32\n\x15\x65xternal_schema_bytes\x18\x04 \x01(\x0cR\x13\x65xternalSchemaBytes\x1a\x62\n\rDatasetColumn\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12=\n\x0cliteral_type\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x0bliteralType\"\xa7\x01\n\x08\x42lobType\x12\x16\n\x06\x66ormat\x18\x01 \x01(\tR\x06\x66ormat\x12R\n\x0e\x64imensionality\x18\x02 \x01(\x0e\x32*.flyteidl.core.BlobType.BlobDimensionalityR\x0e\x64imensionality\"/\n\x12\x42lobDimensionality\x12\n\n\x06SINGLE\x10\x00\x12\r\n\tMULTIPART\x10\x01\"\"\n\x08\x45numType\x12\x16\n\x06values\x18\x01 \x03(\tR\x06values\"C\n\tUnionType\x12\x36\n\x08variants\x18\x01 \x03(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x08variants\"\xd7\x01\n\rTypeStructure\x12\x10\n\x03tag\x18\x01 \x01(\tR\x03tag\x12V\n\x0e\x64\x61taclass_type\x18\x02 \x03(\x0b\x32/.flyteidl.core.TypeStructure.DataclassTypeEntryR\rdataclassType\x1a\\\n\x12\x44\x61taclassTypeEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x30\n\x05value\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x05value:\x02\x38\x01\"K\n\x0eTypeAnnotation\x12\x39\n\x0b\x61nnotations\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x0b\x61nnotations\"\xbc\x05\n\x0bLiteralType\x12\x33\n\x06simple\x18\x01 \x01(\x0e\x32\x19.flyteidl.core.SimpleTypeH\x00R\x06simple\x12\x33\n\x06schema\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.SchemaTypeH\x00R\x06schema\x12\x45\n\x0f\x63ollection_type\x18\x03 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeH\x00R\x0e\x63ollectionType\x12\x42\n\x0emap_value_type\x18\x04 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeH\x00R\x0cmapValueType\x12-\n\x04\x62lob\x18\x05 \x01(\x0b\x32\x17.flyteidl.core.BlobTypeH\x00R\x04\x62lob\x12\x36\n\tenum_type\x18\x07 \x01(\x0b\x32\x17.flyteidl.core.EnumTypeH\x00R\x08\x65numType\x12^\n\x17structured_dataset_type\x18\x08 \x01(\x0b\x32$.flyteidl.core.StructuredDatasetTypeH\x00R\x15structuredDatasetType\x12\x39\n\nunion_type\x18\n \x01(\x0b\x32\x18.flyteidl.core.UnionTypeH\x00R\tunionType\x12\x33\n\x08metadata\x18\x06 \x01(\x0b\x32\x17.google.protobuf.StructR\x08metadata\x12=\n\nannotation\x18\t \x01(\x0b\x32\x1d.flyteidl.core.TypeAnnotationR\nannotation\x12:\n\tstructure\x18\x0b \x01(\x0b\x32\x1c.flyteidl.core.TypeStructureR\tstructureB\x06\n\x04type\"z\n\x0fOutputReference\x12\x17\n\x07node_id\x18\x01 \x01(\tR\x06nodeId\x12\x10\n\x03var\x18\x02 \x01(\tR\x03var\x12<\n\tattr_path\x18\x03 \x03(\x0b\x32\x1f.flyteidl.core.PromiseAttributeR\x08\x61ttrPath\"_\n\x10PromiseAttribute\x12#\n\x0cstring_value\x18\x01 \x01(\tH\x00R\x0bstringValue\x12\x1d\n\tint_value\x18\x02 \x01(\x05H\x00R\x08intValueB\x07\n\x05value\"G\n\x05\x45rror\x12$\n\x0e\x66\x61iled_node_id\x18\x01 \x01(\tR\x0c\x66\x61iledNodeId\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message*\x86\x01\n\nSimpleType\x12\x08\n\x04NONE\x10\x00\x12\x0b\n\x07INTEGER\x10\x01\x12\t\n\x05\x46LOAT\x10\x02\x12\n\n\x06STRING\x10\x03\x12\x0b\n\x07\x42OOLEAN\x10\x04\x12\x0c\n\x08\x44\x41TETIME\x10\x05\x12\x0c\n\x08\x44URATION\x10\x06\x12\n\n\x06\x42INARY\x10\x07\x12\t\n\x05\x45RROR\x10\x08\x12\n\n\x06STRUCT\x10\tB\xb0\x01\n\x11\x63om.flyteidl.coreB\nTypesProtoP\x01Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\xa2\x02\x03\x46\x43X\xaa\x02\rFlyteidl.Core\xca\x02\rFlyteidl\\Core\xe2\x02\x19\x46lyteidl\\Core\\GPBMetadata\xea\x02\x0e\x46lyteidl::Coreb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x66lyteidl/core/types.proto\x12\rflyteidl.core\x1a\x1cgoogle/protobuf/struct.proto\"\xa1\x02\n\nSchemaType\x12@\n\x07\x63olumns\x18\x03 \x03(\x0b\x32&.flyteidl.core.SchemaType.SchemaColumnR\x07\x63olumns\x1a\xd0\x01\n\x0cSchemaColumn\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12K\n\x04type\x18\x02 \x01(\x0e\x32\x37.flyteidl.core.SchemaType.SchemaColumn.SchemaColumnTypeR\x04type\"_\n\x10SchemaColumnType\x12\x0b\n\x07INTEGER\x10\x00\x12\t\n\x05\x46LOAT\x10\x01\x12\n\n\x06STRING\x10\x02\x12\x0b\n\x07\x42OOLEAN\x10\x03\x12\x0c\n\x08\x44\x41TETIME\x10\x04\x12\x0c\n\x08\x44URATION\x10\x05\"\xc7\x02\n\x15StructuredDatasetType\x12L\n\x07\x63olumns\x18\x01 \x03(\x0b\x32\x32.flyteidl.core.StructuredDatasetType.DatasetColumnR\x07\x63olumns\x12\x16\n\x06\x66ormat\x18\x02 \x01(\tR\x06\x66ormat\x12\x30\n\x14\x65xternal_schema_type\x18\x03 \x01(\tR\x12\x65xternalSchemaType\x12\x32\n\x15\x65xternal_schema_bytes\x18\x04 \x01(\x0cR\x13\x65xternalSchemaBytes\x1a\x62\n\rDatasetColumn\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12=\n\x0cliteral_type\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x0bliteralType\"\x84\x02\n\x08\x42lobType\x12\x16\n\x06\x66ormat\x18\x01 \x01(\tR\x06\x66ormat\x12R\n\x0e\x64imensionality\x18\x02 \x01(\x0e\x32*.flyteidl.core.BlobType.BlobDimensionalityR\x0e\x64imensionality\x12%\n\x0e\x66ile_extension\x18\x03 \x01(\tR\rfileExtension\x12\x34\n\x16\x65nable_legacy_filename\x18\x04 \x01(\x08R\x14\x65nableLegacyFilename\"/\n\x12\x42lobDimensionality\x12\n\n\x06SINGLE\x10\x00\x12\r\n\tMULTIPART\x10\x01\"\"\n\x08\x45numType\x12\x16\n\x06values\x18\x01 \x03(\tR\x06values\"C\n\tUnionType\x12\x36\n\x08variants\x18\x01 \x03(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x08variants\"\xd7\x01\n\rTypeStructure\x12\x10\n\x03tag\x18\x01 \x01(\tR\x03tag\x12V\n\x0e\x64\x61taclass_type\x18\x02 \x03(\x0b\x32/.flyteidl.core.TypeStructure.DataclassTypeEntryR\rdataclassType\x1a\\\n\x12\x44\x61taclassTypeEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x30\n\x05value\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x05value:\x02\x38\x01\"K\n\x0eTypeAnnotation\x12\x39\n\x0b\x61nnotations\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x0b\x61nnotations\"\xbc\x05\n\x0bLiteralType\x12\x33\n\x06simple\x18\x01 \x01(\x0e\x32\x19.flyteidl.core.SimpleTypeH\x00R\x06simple\x12\x33\n\x06schema\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.SchemaTypeH\x00R\x06schema\x12\x45\n\x0f\x63ollection_type\x18\x03 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeH\x00R\x0e\x63ollectionType\x12\x42\n\x0emap_value_type\x18\x04 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeH\x00R\x0cmapValueType\x12-\n\x04\x62lob\x18\x05 \x01(\x0b\x32\x17.flyteidl.core.BlobTypeH\x00R\x04\x62lob\x12\x36\n\tenum_type\x18\x07 \x01(\x0b\x32\x17.flyteidl.core.EnumTypeH\x00R\x08\x65numType\x12^\n\x17structured_dataset_type\x18\x08 \x01(\x0b\x32$.flyteidl.core.StructuredDatasetTypeH\x00R\x15structuredDatasetType\x12\x39\n\nunion_type\x18\n \x01(\x0b\x32\x18.flyteidl.core.UnionTypeH\x00R\tunionType\x12\x33\n\x08metadata\x18\x06 \x01(\x0b\x32\x17.google.protobuf.StructR\x08metadata\x12=\n\nannotation\x18\t \x01(\x0b\x32\x1d.flyteidl.core.TypeAnnotationR\nannotation\x12:\n\tstructure\x18\x0b \x01(\x0b\x32\x1c.flyteidl.core.TypeStructureR\tstructureB\x06\n\x04type\"z\n\x0fOutputReference\x12\x17\n\x07node_id\x18\x01 \x01(\tR\x06nodeId\x12\x10\n\x03var\x18\x02 \x01(\tR\x03var\x12<\n\tattr_path\x18\x03 \x03(\x0b\x32\x1f.flyteidl.core.PromiseAttributeR\x08\x61ttrPath\"_\n\x10PromiseAttribute\x12#\n\x0cstring_value\x18\x01 \x01(\tH\x00R\x0bstringValue\x12\x1d\n\tint_value\x18\x02 \x01(\x05H\x00R\x08intValueB\x07\n\x05value\"G\n\x05\x45rror\x12$\n\x0e\x66\x61iled_node_id\x18\x01 \x01(\tR\x0c\x66\x61iledNodeId\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message*\x86\x01\n\nSimpleType\x12\x08\n\x04NONE\x10\x00\x12\x0b\n\x07INTEGER\x10\x01\x12\t\n\x05\x46LOAT\x10\x02\x12\n\n\x06STRING\x10\x03\x12\x0b\n\x07\x42OOLEAN\x10\x04\x12\x0c\n\x08\x44\x41TETIME\x10\x05\x12\x0c\n\x08\x44URATION\x10\x06\x12\n\n\x06\x42INARY\x10\x07\x12\t\n\x05\x45RROR\x10\x08\x12\n\n\x06STRUCT\x10\tB\xb0\x01\n\x11\x63om.flyteidl.coreB\nTypesProtoP\x01Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\xa2\x02\x03\x46\x43X\xaa\x02\rFlyteidl.Core\xca\x02\rFlyteidl\\Core\xe2\x02\x19\x46lyteidl\\Core\\GPBMetadata\xea\x02\x0e\x46lyteidl::Coreb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -25,8 +25,8 @@ DESCRIPTOR._serialized_options = b'\n\021com.flyteidl.coreB\nTypesProtoP\001Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\242\002\003FCX\252\002\rFlyteidl.Core\312\002\rFlyteidl\\Core\342\002\031Flyteidl\\Core\\GPBMetadata\352\002\016Flyteidl::Core' _TYPESTRUCTURE_DATACLASSTYPEENTRY._options = None _TYPESTRUCTURE_DATACLASSTYPEENTRY._serialized_options = b'8\001' - _globals['_SIMPLETYPE']._serialized_start=2264 - _globals['_SIMPLETYPE']._serialized_end=2398 + _globals['_SIMPLETYPE']._serialized_start=2357 + _globals['_SIMPLETYPE']._serialized_end=2491 _globals['_SCHEMATYPE']._serialized_start=75 _globals['_SCHEMATYPE']._serialized_end=364 _globals['_SCHEMATYPE_SCHEMACOLUMN']._serialized_start=156 @@ -38,25 +38,25 @@ _globals['_STRUCTUREDDATASETTYPE_DATASETCOLUMN']._serialized_start=596 _globals['_STRUCTUREDDATASETTYPE_DATASETCOLUMN']._serialized_end=694 _globals['_BLOBTYPE']._serialized_start=697 - _globals['_BLOBTYPE']._serialized_end=864 - _globals['_BLOBTYPE_BLOBDIMENSIONALITY']._serialized_start=817 - _globals['_BLOBTYPE_BLOBDIMENSIONALITY']._serialized_end=864 - _globals['_ENUMTYPE']._serialized_start=866 - _globals['_ENUMTYPE']._serialized_end=900 - _globals['_UNIONTYPE']._serialized_start=902 - _globals['_UNIONTYPE']._serialized_end=969 - _globals['_TYPESTRUCTURE']._serialized_start=972 - _globals['_TYPESTRUCTURE']._serialized_end=1187 - _globals['_TYPESTRUCTURE_DATACLASSTYPEENTRY']._serialized_start=1095 - _globals['_TYPESTRUCTURE_DATACLASSTYPEENTRY']._serialized_end=1187 - _globals['_TYPEANNOTATION']._serialized_start=1189 - _globals['_TYPEANNOTATION']._serialized_end=1264 - _globals['_LITERALTYPE']._serialized_start=1267 - _globals['_LITERALTYPE']._serialized_end=1967 - _globals['_OUTPUTREFERENCE']._serialized_start=1969 - _globals['_OUTPUTREFERENCE']._serialized_end=2091 - _globals['_PROMISEATTRIBUTE']._serialized_start=2093 - _globals['_PROMISEATTRIBUTE']._serialized_end=2188 - _globals['_ERROR']._serialized_start=2190 - _globals['_ERROR']._serialized_end=2261 + _globals['_BLOBTYPE']._serialized_end=957 + _globals['_BLOBTYPE_BLOBDIMENSIONALITY']._serialized_start=910 + _globals['_BLOBTYPE_BLOBDIMENSIONALITY']._serialized_end=957 + _globals['_ENUMTYPE']._serialized_start=959 + _globals['_ENUMTYPE']._serialized_end=993 + _globals['_UNIONTYPE']._serialized_start=995 + _globals['_UNIONTYPE']._serialized_end=1062 + _globals['_TYPESTRUCTURE']._serialized_start=1065 + _globals['_TYPESTRUCTURE']._serialized_end=1280 + _globals['_TYPESTRUCTURE_DATACLASSTYPEENTRY']._serialized_start=1188 + _globals['_TYPESTRUCTURE_DATACLASSTYPEENTRY']._serialized_end=1280 + _globals['_TYPEANNOTATION']._serialized_start=1282 + _globals['_TYPEANNOTATION']._serialized_end=1357 + _globals['_LITERALTYPE']._serialized_start=1360 + _globals['_LITERALTYPE']._serialized_end=2060 + _globals['_OUTPUTREFERENCE']._serialized_start=2062 + _globals['_OUTPUTREFERENCE']._serialized_end=2184 + _globals['_PROMISEATTRIBUTE']._serialized_start=2186 + _globals['_PROMISEATTRIBUTE']._serialized_end=2281 + _globals['_ERROR']._serialized_start=2283 + _globals['_ERROR']._serialized_end=2354 # @@protoc_insertion_point(module_scope) diff --git a/flyteidl/gen/pb_python/flyteidl/core/types_pb2.pyi b/flyteidl/gen/pb_python/flyteidl/core/types_pb2.pyi index 9028afabd55..ec8dba49eec 100644 --- a/flyteidl/gen/pb_python/flyteidl/core/types_pb2.pyi +++ b/flyteidl/gen/pb_python/flyteidl/core/types_pb2.pyi @@ -77,7 +77,7 @@ class StructuredDatasetType(_message.Message): def __init__(self, columns: _Optional[_Iterable[_Union[StructuredDatasetType.DatasetColumn, _Mapping]]] = ..., format: _Optional[str] = ..., external_schema_type: _Optional[str] = ..., external_schema_bytes: _Optional[bytes] = ...) -> None: ... class BlobType(_message.Message): - __slots__ = ["format", "dimensionality"] + __slots__ = ["format", "dimensionality", "file_extension", "enable_legacy_filename"] class BlobDimensionality(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): __slots__ = [] SINGLE: _ClassVar[BlobType.BlobDimensionality] @@ -86,9 +86,13 @@ class BlobType(_message.Message): MULTIPART: BlobType.BlobDimensionality FORMAT_FIELD_NUMBER: _ClassVar[int] DIMENSIONALITY_FIELD_NUMBER: _ClassVar[int] + FILE_EXTENSION_FIELD_NUMBER: _ClassVar[int] + ENABLE_LEGACY_FILENAME_FIELD_NUMBER: _ClassVar[int] format: str dimensionality: BlobType.BlobDimensionality - def __init__(self, format: _Optional[str] = ..., dimensionality: _Optional[_Union[BlobType.BlobDimensionality, str]] = ...) -> None: ... + file_extension: str + enable_legacy_filename: bool + def __init__(self, format: _Optional[str] = ..., dimensionality: _Optional[_Union[BlobType.BlobDimensionality, str]] = ..., file_extension: _Optional[str] = ..., enable_legacy_filename: bool = ...) -> None: ... class EnumType(_message.Message): __slots__ = ["values"] diff --git a/flyteidl/gen/pb_rust/flyteidl.core.rs b/flyteidl/gen/pb_rust/flyteidl.core.rs index 4975baeb564..873b28bb56b 100644 --- a/flyteidl/gen/pb_rust/flyteidl.core.rs +++ b/flyteidl/gen/pb_rust/flyteidl.core.rs @@ -105,6 +105,17 @@ pub struct BlobType { pub format: ::prost::alloc::string::String, #[prost(enumeration="blob_type::BlobDimensionality", tag="2")] pub dimensionality: i32, + /// Optional file extension (without leading dot) to use when materializing + /// the blob to local disk during copilot download, e.g. "csv", "parquet". + /// When empty, no extension is appended. + #[prost(string, tag="3")] + pub file_extension: ::prost::alloc::string::String, + /// When true and file_extension is non-empty, the copilot download phase + /// writes the blob to both the extended path (with extension) and the + /// base path (without extension), preserving backward compatibility for + /// tasks that read from the extensionless path. Default is false. + #[prost(bool, tag="4")] + pub enable_legacy_filename: bool, } /// Nested message and enum types in `BlobType`. pub mod blob_type { diff --git a/flyteidl/protos/flyteidl/core/types.proto b/flyteidl/protos/flyteidl/core/types.proto index 3580eea9f00..c575901a6ca 100644 --- a/flyteidl/protos/flyteidl/core/types.proto +++ b/flyteidl/protos/flyteidl/core/types.proto @@ -80,6 +80,20 @@ message BlobType { // csv, parquet etc string format = 1; BlobDimensionality dimensionality = 2; + + // Optional file extension (e.g. "csv", "parquet") to use during copilot download. + // Default is "", which means no extension is appended. + // Differences from "format": + // 1. "format" is used for type validation in flytekit, "file_extension" is not. + // 2. "file_extension" controls the file extension of the blob when materializing + // to local disk during copilot download, unlike "format". + string file_extension = 3; + + // When true and file_extension is non-empty, the copilot download phase + // writes the blob to both the full path (with extension) and the + // old path (without extension), preserving backward compatibility for + // workflows with tasks that may read from both. Default is false. + bool enable_legacy_filename = 4; } // Enables declaring enum types, with predefined string values From cd7111abdd5636e53efa1fdd86c036eacb4a521d Mon Sep 17 00:00:00 2001 From: ddl-rliu Date: Thu, 12 Mar 2026 16:26:54 -0700 Subject: [PATCH 2/7] Regenerate protobuf Signed-off-by: ddl-rliu --- flyteidl/clients/go/assets/admin.swagger.json | 6 +++++- flyteidl/gen/pb-es/flyteidl/core/types_pb.ts | 15 +++++++++------ flyteidl/gen/pb-go/flyteidl/core/types.pb.go | 15 +++++++++------ .../cacheservice/cacheservice.swagger.json | 4 ++-- .../flyteidl/datacatalog/datacatalog.swagger.json | 4 ++-- .../gateway/flyteidl/service/admin.swagger.json | 4 ++-- .../gateway/flyteidl/service/agent.swagger.json | 4 ++-- .../flyteidl/service/dataproxy.swagger.json | 4 ++-- .../service/external_plugin_service.swagger.json | 4 ++-- .../gateway/flyteidl/service/signal.swagger.json | 4 ++-- flyteidl/gen/pb_rust/flyteidl.core.rs | 15 +++++++++------ 11 files changed, 46 insertions(+), 33 deletions(-) diff --git a/flyteidl/clients/go/assets/admin.swagger.json b/flyteidl/clients/go/assets/admin.swagger.json index a3f2468e1e7..e8c0f7dd5b3 100644 --- a/flyteidl/clients/go/assets/admin.swagger.json +++ b/flyteidl/clients/go/assets/admin.swagger.json @@ -6860,7 +6860,11 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." + }, + "enable_legacy_filename": { + "type": "boolean", + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts b/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts index 76f0bc0fb72..5b0344c65b2 100644 --- a/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts +++ b/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts @@ -342,9 +342,12 @@ export class BlobType extends Message { dimensionality = BlobType_BlobDimensionality.SINGLE; /** - * Optional file extension (without leading dot) to use when materializing - * the blob to local disk during copilot download, e.g. "csv", "parquet". - * When empty, no extension is appended. + * Optional file extension (e.g. "csv", "parquet") to use during copilot download. + * Default is "", which means no extension is appended. + * Differences from "format": + * 1. "format" is used for type validation in flytekit, "file_extension" is not. + * 2. "file_extension" controls the file extension of the blob when materializing + * to local disk during copilot download, unlike "format". * * @generated from field: string file_extension = 3; */ @@ -352,9 +355,9 @@ export class BlobType extends Message { /** * When true and file_extension is non-empty, the copilot download phase - * writes the blob to both the extended path (with extension) and the - * base path (without extension), preserving backward compatibility for - * tasks that read from the extensionless path. Default is false. + * writes the blob to both the full path (with extension) and the + * old path (without extension), preserving backward compatibility for + * workflows with tasks that may read from both. Default is false. * * @generated from field: bool enable_legacy_filename = 4; */ diff --git a/flyteidl/gen/pb-go/flyteidl/core/types.pb.go b/flyteidl/gen/pb-go/flyteidl/core/types.pb.go index c870b6c63de..8563add7080 100644 --- a/flyteidl/gen/pb-go/flyteidl/core/types.pb.go +++ b/flyteidl/gen/pb-go/flyteidl/core/types.pb.go @@ -334,14 +334,17 @@ type BlobType struct { // csv, parquet etc Format string `protobuf:"bytes,1,opt,name=format,proto3" json:"format,omitempty"` Dimensionality BlobType_BlobDimensionality `protobuf:"varint,2,opt,name=dimensionality,proto3,enum=flyteidl.core.BlobType_BlobDimensionality" json:"dimensionality,omitempty"` - // Optional file extension (without leading dot) to use when materializing - // the blob to local disk during copilot download, e.g. "csv", "parquet". - // When empty, no extension is appended. + // Optional file extension (e.g. "csv", "parquet") to use during copilot download. + // Default is "", which means no extension is appended. + // Differences from "format": + // 1. "format" is used for type validation in flytekit, "file_extension" is not. + // 2. "file_extension" controls the file extension of the blob when materializing + // to local disk during copilot download, unlike "format". FileExtension string `protobuf:"bytes,3,opt,name=file_extension,json=fileExtension,proto3" json:"file_extension,omitempty"` // When true and file_extension is non-empty, the copilot download phase - // writes the blob to both the extended path (with extension) and the - // base path (without extension), preserving backward compatibility for - // tasks that read from the extensionless path. Default is false. + // writes the blob to both the full path (with extension) and the + // old path (without extension), preserving backward compatibility for + // workflows with tasks that may read from both. Default is false. EnableLegacyFilename bool `protobuf:"varint,4,opt,name=enable_legacy_filename,json=enableLegacyFilename,proto3" json:"enable_legacy_filename,omitempty"` } diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json index 8a2815c8e4f..ccd899c1966 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json @@ -159,11 +159,11 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." }, "enable_legacy_filename": { "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json index 9aa3f4dfcf8..d870ad8d8dc 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json @@ -133,11 +133,11 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." }, "enable_legacy_filename": { "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json index c098d00c308..e8c0f7dd5b3 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json @@ -6860,11 +6860,11 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." }, "enable_legacy_filename": { "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json index 958148eae97..f7484cce141 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json @@ -1027,11 +1027,11 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." }, "enable_legacy_filename": { "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json index f768d0a2b08..1c39db41cd9 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json @@ -249,11 +249,11 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." }, "enable_legacy_filename": { "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json index dac2c4779bd..0c6616f0b72 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json @@ -275,11 +275,11 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." }, "enable_legacy_filename": { "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json index ffe42f78782..4ec586f89c2 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json @@ -325,11 +325,11 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (without leading dot) to use when materializing\nthe blob to local disk during copilot download, e.g. \"csv\", \"parquet\".\nWhen empty, no extension is appended." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." }, "enable_legacy_filename": { "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the extended path (with extension) and the\nbase path (without extension), preserving backward compatibility for\ntasks that read from the extensionless path. Default is false." + "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb_rust/flyteidl.core.rs b/flyteidl/gen/pb_rust/flyteidl.core.rs index 873b28bb56b..14b1838114a 100644 --- a/flyteidl/gen/pb_rust/flyteidl.core.rs +++ b/flyteidl/gen/pb_rust/flyteidl.core.rs @@ -105,15 +105,18 @@ pub struct BlobType { pub format: ::prost::alloc::string::String, #[prost(enumeration="blob_type::BlobDimensionality", tag="2")] pub dimensionality: i32, - /// Optional file extension (without leading dot) to use when materializing - /// the blob to local disk during copilot download, e.g. "csv", "parquet". - /// When empty, no extension is appended. + /// Optional file extension (e.g. "csv", "parquet") to use during copilot download. + /// Default is "", which means no extension is appended. + /// Differences from "format": + /// 1. "format" is used for type validation in flytekit, "file_extension" is not. + /// 2. "file_extension" controls the file extension of the blob when materializing + /// to local disk during copilot download, unlike "format". #[prost(string, tag="3")] pub file_extension: ::prost::alloc::string::String, /// When true and file_extension is non-empty, the copilot download phase - /// writes the blob to both the extended path (with extension) and the - /// base path (without extension), preserving backward compatibility for - /// tasks that read from the extensionless path. Default is false. + /// writes the blob to both the full path (with extension) and the + /// old path (without extension), preserving backward compatibility for + /// workflows with tasks that may read from both. Default is false. #[prost(bool, tag="4")] pub enable_legacy_filename: bool, } From c203375eae7d0c9961db28c442f699dc5e52f058 Mon Sep 17 00:00:00 2001 From: ddl-rliu Date: Wed, 25 Mar 2026 14:24:18 -0700 Subject: [PATCH 3/7] Refactor resolveVarFilenames Signed-off-by: ddl-rliu --- flytecopilot/data/download.go | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/flytecopilot/data/download.go b/flytecopilot/data/download.go index 9a424077807..effb63686ff 100644 --- a/flytecopilot/data/download.go +++ b/flytecopilot/data/download.go @@ -45,7 +45,7 @@ type Downloader struct { // So when e.g. FileExtension="csv", the file is written to "data.csv". // Also, when e.g. FileExtension="csv" and EnableLegacyFilename=true, the file is written to // "data" and "data.csv" (partially new behavior, bridges the gap of backward compatibility). -func resolveVarFilenames(vars *core.VariableMap) (map[string][]string, error) { +func resolveVarFilenames(vars *core.VariableMap) map[string][]string { varFilenames := make(map[string][]string, len(vars.GetVariables())) for varName, variable := range vars.GetVariables() { varType := variable.GetType() @@ -59,14 +59,11 @@ func resolveVarFilenames(vars *core.VariableMap) (map[string][]string, error) { varFilenames[varName] = append(varFilenames[varName], varName) } } - case *core.LiteralType_Simple: - varFilenames[varName] = append(varFilenames[varName], varName) default: - return nil, fmt.Errorf("currently CoPilot downloader does not support [%s], system error", varType) + varFilenames[varName] = append(varFilenames[varName], varName) } } - logger.Infof(context.Background(), "varFilenames: %v", varFilenames) - return varFilenames, nil + return varFilenames } // TODO add timeout and rate limit @@ -582,11 +579,7 @@ func (d Downloader) DownloadInputs(ctx context.Context, vars *core.VariableMap, return errors.Wrapf(err, "failed to download input metadata message from remote store") } - varFilenames, err := resolveVarFilenames(vars) - if err != nil { - return errors.Wrapf(err, "failed to resolve variable filenames") - } - + varFilenames := resolveVarFilenames(vars) varMap, lMap, err := d.RecursiveDownload(ctx, inputs, outputDir, varFilenames, true) if err != nil { return errors.Wrapf(err, "failed to download input variable from remote store") From 9327eb02af6acac3d31c844413583cd9d13a74d0 Mon Sep 17 00:00:00 2001 From: ddl-rliu Date: Mon, 30 Mar 2026 10:15:31 -0700 Subject: [PATCH 4/7] Rename inputInterface Signed-off-by: ddl-rliu --- flytecopilot/cmd/download.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flytecopilot/cmd/download.go b/flytecopilot/cmd/download.go index 42b1f8d9cde..abf3531e8ce 100644 --- a/flytecopilot/cmd/download.go +++ b/flytecopilot/cmd/download.go @@ -50,8 +50,8 @@ func GetUploadModeVals() []string { } func (d *DownloadOptions) Download(ctx context.Context) error { - inputInterface := &core.VariableMap{} - if err := proto.Unmarshal(d.inputInterface, inputInterface); err != nil { + variableMap := &core.VariableMap{} + if err := proto.Unmarshal(d.inputInterface, variableMap); err != nil { logger.Warnf(ctx, "Bad input interface passed, failed to unmarshal err: %s", err) } @@ -83,7 +83,7 @@ func (d *DownloadOptions) Download(ctx context.Context) error { childCtx, cancelFn = context.WithTimeout(ctx, d.timeout) } defer cancelFn() - err := dl.DownloadInputs(childCtx, inputInterface, storage.DataReference(d.remoteInputsPath), d.localDirectoryPath) + err := dl.DownloadInputs(childCtx, variableMap, storage.DataReference(d.remoteInputsPath), d.localDirectoryPath) if err != nil { logger.Errorf(ctx, "Downloading failed, err %s", err) return err From 32627a18c89c18482e5492168aaffc2fc773da9d Mon Sep 17 00:00:00 2001 From: ddl-rliu Date: Wed, 8 Apr 2026 15:03:06 -0700 Subject: [PATCH 5/7] Remove enableLegacyFilename Signed-off-by: ddl-rliu --- flytecopilot/cmd/download_test.go | 24 +- flytecopilot/data/download.go | 58 ++--- flytecopilot/data/download_test.go | 4 +- flytecopilot/data/upload.go | 4 +- flyteidl/clients/go/assets/admin.swagger.json | 6 +- flyteidl/clients/go/coreutils/literals.go | 11 +- .../clients/go/coreutils/literals_test.go | 14 +- flyteidl/gen/pb-es/flyteidl/core/types_pb.ts | 13 +- flyteidl/gen/pb-go/flyteidl/core/types.pb.go | 240 ++++++++---------- .../cacheservice/cacheservice.swagger.json | 6 +- .../datacatalog/datacatalog.swagger.json | 6 +- .../flyteidl/service/admin.swagger.json | 6 +- .../flyteidl/service/agent.swagger.json | 6 +- .../flyteidl/service/dataproxy.swagger.json | 6 +- .../external_plugin_service.swagger.json | 6 +- .../flyteidl/service/signal.swagger.json | 6 +- flyteidl/gen/pb-js/flyteidl.d.ts | 6 - flyteidl/gen/pb-js/flyteidl.js | 17 -- .../gen/pb_python/flyteidl/core/types_pb2.py | 48 ++-- .../gen/pb_python/flyteidl/core/types_pb2.pyi | 6 +- flyteidl/gen/pb_rust/flyteidl.core.rs | 8 +- flyteidl/protos/flyteidl/core/types.proto | 8 +- 22 files changed, 197 insertions(+), 312 deletions(-) diff --git a/flytecopilot/cmd/download_test.go b/flytecopilot/cmd/download_test.go index f9e2c436c2f..7b4684f1c54 100644 --- a/flytecopilot/cmd/download_test.go +++ b/flytecopilot/cmd/download_test.go @@ -157,10 +157,10 @@ func TestDownloadOptions_Download(t *testing.T) { iface := &core.VariableMap{ Variables: map[string]*core.Variable{ "blob": { - Type: &core.LiteralType{Type: &core.LiteralType_Blob{Blob: &core.BlobType{Dimensionality: core.BlobType_SINGLE, Format: "xyz", FileExtension: "xyz", EnableLegacyFilename: false}}}, + Type: &core.LiteralType{Type: &core.LiteralType_Blob{Blob: &core.BlobType{Dimensionality: core.BlobType_SINGLE, Format: "xyz", FileExtension: "xyz"}}}, }, - "legacy_blob": { - Type: &core.LiteralType{Type: &core.LiteralType_Blob{Blob: &core.BlobType{Dimensionality: core.BlobType_SINGLE, Format: "xyz", FileExtension: "xyz", EnableLegacyFilename: true}}}, + "csv_blob": { + Type: &core.LiteralType{Type: &core.LiteralType_Blob{Blob: &core.BlobType{Dimensionality: core.BlobType_SINGLE, Format: "csv", FileExtension: "csv"}}}, }, }, } @@ -182,27 +182,25 @@ func TestDownloadOptions_Download(t *testing.T) { Uri: blobLoc.String(), Metadata: &core.BlobMetadata{ Type: &core.BlobType{ - Dimensionality: core.BlobType_SINGLE, - Format: "xyz", - FileExtension: "xyz", - EnableLegacyFilename: false, + Dimensionality: core.BlobType_SINGLE, + Format: "xyz", + FileExtension: "xyz", }, }, }, }, }, }}, - "legacy_blob": {Value: &core.Literal_Scalar{ + "csv_blob": {Value: &core.Literal_Scalar{ Scalar: &core.Scalar{ Value: &core.Scalar_Blob{ Blob: &core.Blob{ Uri: blobLoc.String(), Metadata: &core.BlobMetadata{ Type: &core.BlobType{ - Dimensionality: core.BlobType_SINGLE, - Format: "xyz", - FileExtension: "xyz", - EnableLegacyFilename: true, + Dimensionality: core.BlobType_SINGLE, + Format: "xyz", + FileExtension: "xyz", }, }, }, @@ -212,7 +210,7 @@ func TestDownloadOptions_Download(t *testing.T) { }, })) assert.NoError(t, dopts.Download(ctx), "Download Operation failed") - assert.ElementsMatch(t, []string{"inputs.json", "inputs.pb", "x", "y", "blob.xyz", "legacy_blob", "legacy_blob.xyz"}, collectFile(tmpDir)) + assert.ElementsMatch(t, []string{"inputs.json", "inputs.pb", "x", "y", "blob.xyz", "csv_blob.csv"}, collectFile(tmpDir)) }) t.Run("primitiveAndMissingBlobInputs", func(t *testing.T) { diff --git a/flytecopilot/data/download.go b/flytecopilot/data/download.go index effb63686ff..7b0e8ce7c15 100644 --- a/flytecopilot/data/download.go +++ b/flytecopilot/data/download.go @@ -33,34 +33,28 @@ type Downloader struct { mode core.IOStrategy_DownloadMode } -// By default, blobs (FlyteFiles) were not and still are not written with a file extension. -// For example, a data: FlyteFile["csv"] blob should be written to "data", even though -// Format="csv". +// By default, blobs (FlyteFiles) were not and still are not written with a +// file extension. For example, a data: FlyteFile["csv"] blob is written +// to "inputs/data", even though Format="csv". // // When FileExtension="" (the default), this old behavior is preserved. // -// However, a data: Annotated[FlyteFile["csv"], FileDownloadConfig(file_extension="csv")] -// blob should be written to "data.csv" - both Format="csv" and FileExtension="csv" (new behavior). -// -// So when e.g. FileExtension="csv", the file is written to "data.csv". -// Also, when e.g. FileExtension="csv" and EnableLegacyFilename=true, the file is written to -// "data" and "data.csv" (partially new behavior, bridges the gap of backward compatibility). -func resolveVarFilenames(vars *core.VariableMap) map[string][]string { - varFilenames := make(map[string][]string, len(vars.GetVariables())) +// However, an input blob +// `data: Annotated[FlyteFile["csv"], FileDownloadConfig(file_extension="csv")]` +// should be written to "inputs/data.csv" (when FileExtension="csv" - new behavior). +func resolveVarFilenames(vars *core.VariableMap) map[string]string { + varFilenames := make(map[string]string, len(vars.GetVariables())) for varName, variable := range vars.GetVariables() { varType := variable.GetType() switch varType.GetType().(type) { case *core.LiteralType_Blob: if varType.GetBlob().GetFileExtension() == "" { - varFilenames[varName] = append(varFilenames[varName], varName) + varFilenames[varName] = varName } else { - varFilenames[varName] = append(varFilenames[varName], varName+"."+varType.GetBlob().GetFileExtension()) - if varType.GetBlob().GetEnableLegacyFilename() { - varFilenames[varName] = append(varFilenames[varName], varName) - } + varFilenames[varName] = varName + "." + varType.GetBlob().GetFileExtension() } default: - varFilenames[varName] = append(varFilenames[varName], varName) + varFilenames[varName] = varName } } return varFilenames @@ -465,7 +459,7 @@ func (d Downloader) handleLiteral(ctx context.Context, lit *core.Literal, filePa if err != nil { return nil, nil, errors.Wrapf(err, "failed to create directory [%s]", filePath) } - v, m, err := d.RecursiveDownload(ctx, lit.GetMap(), filePath, make(map[string][]string), writeToFile) + v, m, err := d.RecursiveDownload(ctx, lit.GetMap(), filePath, make(map[string]string), writeToFile) if err != nil { return nil, nil, err } @@ -501,7 +495,7 @@ type downloadedResult struct { v interface{} } -func (d Downloader) RecursiveDownload(ctx context.Context, inputs *core.LiteralMap, dir string, varFilenames map[string][]string, writePrimitiveToFile bool) (VarMap, *core.LiteralMap, error) { +func (d Downloader) RecursiveDownload(ctx context.Context, inputs *core.LiteralMap, dir string, varFilenames map[string]string, writePrimitiveToFile bool) (VarMap, *core.LiteralMap, error) { childCtx, cancel := context.WithCancel(ctx) defer cancel() if inputs == nil || len(inputs.GetLiterals()) == 0 { @@ -519,26 +513,18 @@ func (d Downloader) RecursiveDownload(ctx context.Context, inputs *core.LiteralM } logger.Infof(ctx, "read object at location [%s]", offloadedMetadataURI) } + filename := variable + if varFilename, ok := varFilenames[variable]; ok { + filename = varFilename + } + varPath := path.Join(dir, filename) lit := literal f[variable] = futures.NewAsyncFuture(childCtx, func(ctx2 context.Context) (interface{}, error) { - var filenames []string - var resultLit *core.Literal - var resultV interface{} - var err error - if len(varFilenames[variable]) == 0 { - filenames = []string{variable} - } else { - filenames = varFilenames[variable] - } - for _, filename := range filenames { - varPath := path.Join(dir, filename) - // TODO: Refactor handleLiteral to accept a list of file paths and return a list of downloaded results - resultV, resultLit, err = d.handleLiteral(ctx2, lit, varPath, writePrimitiveToFile) - if err != nil { - return nil, err - } + v, lit, err := d.handleLiteral(ctx2, lit, varPath, writePrimitiveToFile) + if err != nil { + return nil, err } - return downloadedResult{lit: resultLit, v: resultV}, nil + return downloadedResult{lit: lit, v: v}, nil }) } diff --git a/flytecopilot/data/download_test.go b/flytecopilot/data/download_test.go index df38fdb0c82..0a1481fcefa 100644 --- a/flytecopilot/data/download_test.go +++ b/flytecopilot/data/download_test.go @@ -231,7 +231,7 @@ func TestRecursiveDownload(t *testing.T) { } }() - varMap, lMap, err := d.RecursiveDownload(context.Background(), inputs, toPath, map[string][]string{}, true) + varMap, lMap, err := d.RecursiveDownload(context.Background(), inputs, toPath, make(map[string]string), true) assert.NoError(t, err) assert.NotNil(t, varMap) assert.NotNil(t, lMap) @@ -309,7 +309,7 @@ func TestRecursiveDownload(t *testing.T) { } }() - varMap, lMap, err := d.RecursiveDownload(context.Background(), inputs, toPath, map[string][]string{}, true) + varMap, lMap, err := d.RecursiveDownload(context.Background(), inputs, toPath, make(map[string]string), true) assert.NoError(t, err) assert.NotNil(t, varMap) assert.NotNil(t, lMap) diff --git a/flytecopilot/data/upload.go b/flytecopilot/data/upload.go index 6c8e3600683..0362a78038a 100644 --- a/flytecopilot/data/upload.go +++ b/flytecopilot/data/upload.go @@ -107,11 +107,11 @@ func (u Uploader) handleBlobType(ctx context.Context, localPath string, toPath s } } - return coreutils.MakeLiteralForBlob(toPath, false, "", "", false), nil + return coreutils.MakeLiteralForBlob(toPath, false, "", ""), nil } size := info.Size() // Should we make this a go routine as well, so that we can introduce timeouts - return coreutils.MakeLiteralForBlob(toPath, false, "", "", false), UploadFileToStorage(ctx, fpath, toPath, size, u.store) + return coreutils.MakeLiteralForBlob(toPath, false, "", ""), UploadFileToStorage(ctx, fpath, toPath, size, u.store) } func (u Uploader) RecursiveUpload(ctx context.Context, vars *core.VariableMap, fromPath string, metaOutputPath, dataRawPath storage.DataReference) error { diff --git a/flyteidl/clients/go/assets/admin.swagger.json b/flyteidl/clients/go/assets/admin.swagger.json index e8c0f7dd5b3..1b4a536b717 100644 --- a/flyteidl/clients/go/assets/admin.swagger.json +++ b/flyteidl/clients/go/assets/admin.swagger.json @@ -6860,11 +6860,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." - }, - "enable_legacy_filename": { - "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/clients/go/coreutils/literals.go b/flyteidl/clients/go/coreutils/literals.go index 0874d3c015b..a5c8d18ac07 100644 --- a/flyteidl/clients/go/coreutils/literals.go +++ b/flyteidl/clients/go/coreutils/literals.go @@ -485,7 +485,7 @@ func MakeLiteralForStructuredDataSet(path storage.DataReference, columns []*core } } -func MakeLiteralForBlob(path storage.DataReference, isDir bool, format string, fileExtension string, enableLegacyFilename bool) *core.Literal { +func MakeLiteralForBlob(path storage.DataReference, isDir bool, format string, fileExtension string) *core.Literal { dim := core.BlobType_SINGLE if isDir { dim = core.BlobType_MULTIPART @@ -498,10 +498,9 @@ func MakeLiteralForBlob(path storage.DataReference, isDir bool, format string, f Uri: path.String(), Metadata: &core.BlobMetadata{ Type: &core.BlobType{ - Dimensionality: dim, - Format: format, - FileExtension: fileExtension, - EnableLegacyFilename: enableLegacyFilename, + Dimensionality: dim, + Format: format, + FileExtension: fileExtension, }, }, }, @@ -603,7 +602,7 @@ func MakeLiteralForType(t *core.LiteralType, v interface{}) (*core.Literal, erro case *core.LiteralType_Blob: isDir := newT.Blob.GetDimensionality() == core.BlobType_MULTIPART - lv := MakeLiteralForBlob(storage.DataReference(fmt.Sprintf("%v", v)), isDir, newT.Blob.GetFormat(), newT.Blob.GetFileExtension(), newT.Blob.GetEnableLegacyFilename()) + lv := MakeLiteralForBlob(storage.DataReference(fmt.Sprintf("%v", v)), isDir, newT.Blob.GetFormat(), newT.Blob.GetFileExtension()) return lv, nil case *core.LiteralType_Schema: diff --git a/flyteidl/clients/go/coreutils/literals_test.go b/flyteidl/clients/go/coreutils/literals_test.go index 9d5967da9b0..fe06d4dc416 100644 --- a/flyteidl/clients/go/coreutils/literals_test.go +++ b/flyteidl/clients/go/coreutils/literals_test.go @@ -388,11 +388,10 @@ func TestMakeLiteralForSimpleType(t *testing.T) { func TestMakeLiteralForBlob(t *testing.T) { type args struct { - path storage.DataReference - isDir bool - format string - fileExtension string - enableLegacyFilename bool + path storage.DataReference + isDir bool + format string + fileExtension string } tests := []struct { name string @@ -401,12 +400,11 @@ func TestMakeLiteralForBlob(t *testing.T) { }{ {"simple-key", args{path: "/key", isDir: false, format: "xyz"}, &core.Blob{Uri: "/key", Metadata: &core.BlobMetadata{Type: &core.BlobType{Format: "xyz", Dimensionality: core.BlobType_SINGLE}}}}, {"simple-dir", args{path: "/key", isDir: true, format: "xyz"}, &core.Blob{Uri: "/key", Metadata: &core.BlobMetadata{Type: &core.BlobType{Format: "xyz", Dimensionality: core.BlobType_MULTIPART}}}}, - {"simple-key-with-extension", args{path: "/key", isDir: false, format: "xyz", fileExtension: "xyz", enableLegacyFilename: false}, &core.Blob{Uri: "/key", Metadata: &core.BlobMetadata{Type: &core.BlobType{Format: "xyz", Dimensionality: core.BlobType_SINGLE, FileExtension: "xyz", EnableLegacyFilename: false}}}}, - {"simple-key-with-extension-and-legacy-filename", args{path: "/key", isDir: false, format: "xyz", fileExtension: "xyz", enableLegacyFilename: true}, &core.Blob{Uri: "/key", Metadata: &core.BlobMetadata{Type: &core.BlobType{Format: "xyz", Dimensionality: core.BlobType_SINGLE, FileExtension: "xyz", EnableLegacyFilename: true}}}}, + {"simple-key-with-extension", args{path: "/key", isDir: false, format: "xyz", fileExtension: "xyz"}, &core.Blob{Uri: "/key", Metadata: &core.BlobMetadata{Type: &core.BlobType{Format: "xyz", Dimensionality: core.BlobType_SINGLE, FileExtension: "xyz"}}}}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := MakeLiteralForBlob(tt.args.path, tt.args.isDir, tt.args.format, tt.args.fileExtension, tt.args.enableLegacyFilename); !reflect.DeepEqual(got.GetScalar().GetBlob(), tt.want) { + if got := MakeLiteralForBlob(tt.args.path, tt.args.isDir, tt.args.format, tt.args.fileExtension); !reflect.DeepEqual(got.GetScalar().GetBlob(), tt.want) { t.Errorf("MakeLiteralForBlob() = %v, want %v", got, tt.want) } }) diff --git a/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts b/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts index 5b0344c65b2..f770019272a 100644 --- a/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts +++ b/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts @@ -347,22 +347,12 @@ export class BlobType extends Message { * Differences from "format": * 1. "format" is used for type validation in flytekit, "file_extension" is not. * 2. "file_extension" controls the file extension of the blob when materializing - * to local disk during copilot download, unlike "format". + * to local disk during e.g. flytecopilot download, unlike "format". * * @generated from field: string file_extension = 3; */ fileExtension = ""; - /** - * When true and file_extension is non-empty, the copilot download phase - * writes the blob to both the full path (with extension) and the - * old path (without extension), preserving backward compatibility for - * workflows with tasks that may read from both. Default is false. - * - * @generated from field: bool enable_legacy_filename = 4; - */ - enableLegacyFilename = false; - constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -374,7 +364,6 @@ export class BlobType extends Message { { no: 1, name: "format", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 2, name: "dimensionality", kind: "enum", T: proto3.getEnumType(BlobType_BlobDimensionality) }, { no: 3, name: "file_extension", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "enable_legacy_filename", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): BlobType { diff --git a/flyteidl/gen/pb-go/flyteidl/core/types.pb.go b/flyteidl/gen/pb-go/flyteidl/core/types.pb.go index 8563add7080..0a7fc7534fe 100644 --- a/flyteidl/gen/pb-go/flyteidl/core/types.pb.go +++ b/flyteidl/gen/pb-go/flyteidl/core/types.pb.go @@ -339,13 +339,8 @@ type BlobType struct { // Differences from "format": // 1. "format" is used for type validation in flytekit, "file_extension" is not. // 2. "file_extension" controls the file extension of the blob when materializing - // to local disk during copilot download, unlike "format". + // to local disk during e.g. flytecopilot download, unlike "format". FileExtension string `protobuf:"bytes,3,opt,name=file_extension,json=fileExtension,proto3" json:"file_extension,omitempty"` - // When true and file_extension is non-empty, the copilot download phase - // writes the blob to both the full path (with extension) and the - // old path (without extension), preserving backward compatibility for - // workflows with tasks that may read from both. Default is false. - EnableLegacyFilename bool `protobuf:"varint,4,opt,name=enable_legacy_filename,json=enableLegacyFilename,proto3" json:"enable_legacy_filename,omitempty"` } func (x *BlobType) Reset() { @@ -401,13 +396,6 @@ func (x *BlobType) GetFileExtension() string { return "" } -func (x *BlobType) GetEnableLegacyFilename() bool { - if x != nil { - return x.EnableLegacyFilename - } - return false -} - // Enables declaring enum types, with predefined string values // For len(values) > 0, the first value in the ordered list is regarded as the default value. If you wish // To provide no defaults, make the first value as undefined. @@ -1202,7 +1190,7 @@ var file_flyteidl_core_types_proto_rawDesc = []byte{ 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x6c, 0x69, 0x74, 0x65, 0x72, - 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x22, 0x84, 0x02, 0x0a, 0x08, 0x42, 0x6c, 0x6f, 0x62, 0x54, + 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x22, 0xce, 0x01, 0x0a, 0x08, 0x42, 0x6c, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x52, 0x0a, 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, @@ -1212,121 +1200,117 @@ var file_flyteidl_core_types_proto_rawDesc = []byte{ 0x0e, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x65, - 0x67, 0x61, 0x63, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x0a, 0x12, - 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x50, 0x41, 0x52, 0x54, 0x10, 0x01, 0x22, 0x22, 0x0a, - 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x22, 0x43, 0x0a, 0x09, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, - 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x76, 0x61, - 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x0d, 0x54, 0x79, 0x70, 0x65, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x56, 0x0a, 0x0e, 0x64, 0x61, - 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x54, 0x79, - 0x70, 0x65, 0x1a, 0x5c, 0x0a, 0x12, 0x44, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x54, - 0x79, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, - 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, - 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x4b, 0x0a, 0x0e, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xbc, 0x05, - 0x0a, 0x0b, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, - 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, - 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x69, - 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, - 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, - 0x72, 0x65, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, - 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x2f, 0x0a, 0x12, 0x42, 0x6c, 0x6f, 0x62, 0x44, 0x69, + 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x0a, 0x0a, 0x06, + 0x53, 0x49, 0x4e, 0x47, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x55, 0x4c, 0x54, + 0x49, 0x50, 0x41, 0x52, 0x54, 0x10, 0x01, 0x22, 0x22, 0x0a, 0x08, 0x45, 0x6e, 0x75, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x43, 0x0a, 0x09, 0x55, + 0x6e, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x69, + 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, + 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, + 0x22, 0xd7, 0x01, 0x0a, 0x0d, 0x54, 0x79, 0x70, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x74, 0x61, 0x67, 0x12, 0x56, 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x66, + 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, + 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x64, + 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x5c, 0x0a, 0x12, + 0x44, 0x61, 0x74, 0x61, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, + 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x0e, 0x54, 0x79, + 0x70, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0b, + 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xbc, 0x05, 0x0a, 0x0b, 0x4c, 0x69, 0x74, 0x65, + 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x48, 0x00, 0x52, 0x06, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x33, 0x0a, 0x06, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x66, + 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x12, 0x45, 0x0a, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, + 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, + 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x42, 0x0a, 0x0e, 0x6d, 0x61, 0x70, 0x5f, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0e, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x42, - 0x0a, 0x0e, 0x6d, 0x61, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, - 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, - 0x70, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x6d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, - 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6c, 0x6f, - 0x62, 0x12, 0x36, 0x0a, 0x09, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, - 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, - 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5e, 0x0a, 0x17, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x66, 0x6c, 0x79, - 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x48, 0x00, 0x52, 0x15, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x44, 0x61, - 0x74, 0x61, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x6e, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x6e, - 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x09, 0x75, 0x6e, 0x69, 0x6f, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x79, - 0x70, 0x65, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, - 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x7a, 0x0a, 0x0f, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x76, 0x61, 0x72, 0x12, 0x3c, 0x0a, 0x09, 0x61, 0x74, - 0x74, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, - 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x08, - 0x61, 0x74, 0x74, 0x72, 0x50, 0x61, 0x74, 0x68, 0x22, 0x5f, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x6d, - 0x69, 0x73, 0x65, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0c, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x47, 0x0a, 0x05, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x2a, 0x86, 0x01, 0x0a, 0x0a, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, - 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x4c, 0x4f, 0x41, - 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, - 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, - 0x44, 0x41, 0x54, 0x45, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, - 0x52, 0x59, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x08, 0x12, - 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x10, 0x09, 0x42, 0xb0, 0x01, 0x0a, 0x11, - 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, - 0x65, 0x42, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x79, 0x74, - 0x65, 0x6f, 0x72, 0x67, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, - 0x69, 0x64, 0x6c, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x6c, - 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x46, 0x43, - 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x43, 0x6f, 0x72, - 0x65, 0xca, 0x02, 0x0d, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x43, 0x6f, 0x72, - 0x65, 0xe2, 0x02, 0x19, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x43, 0x6f, 0x72, - 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, - 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x4c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0c, + 0x6d, 0x61, 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x04, + 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x66, 0x6c, 0x79, + 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x62, 0x54, + 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6c, 0x6f, 0x62, 0x12, 0x36, 0x0a, 0x09, 0x65, + 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x45, + 0x6e, 0x75, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x08, 0x65, 0x6e, 0x75, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x5e, 0x0a, 0x17, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, + 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x44, + 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x15, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x48, 0x00, 0x52, 0x09, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x3d, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, + 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x75, 0x72, 0x65, 0x52, 0x09, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x75, 0x72, 0x65, 0x42, 0x06, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x7a, 0x0a, 0x0f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, + 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x76, 0x61, 0x72, 0x12, 0x3c, 0x0a, 0x09, 0x61, 0x74, 0x74, 0x72, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x41, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x52, 0x08, 0x61, 0x74, 0x74, 0x72, 0x50, 0x61, + 0x74, 0x68, 0x22, 0x5f, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x41, 0x74, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x69, + 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, + 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x47, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0e, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x86, 0x01, 0x0a, + 0x0a, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, + 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, + 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, + 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x41, 0x54, 0x45, 0x54, 0x49, + 0x4d, 0x45, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x06, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x07, 0x12, 0x09, + 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, + 0x55, 0x43, 0x54, 0x10, 0x09, 0x42, 0xb0, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x42, 0x0a, 0x54, 0x79, 0x70, + 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x6f, 0x72, 0x67, 0x2f, 0x66, + 0x6c, 0x79, 0x74, 0x65, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x70, 0x62, 0x2d, 0x67, 0x6f, 0x2f, 0x66, 0x6c, 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0xa2, 0x02, 0x03, 0x46, 0x43, 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0xca, 0x02, 0x0d, 0x46, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0xe2, 0x02, 0x19, 0x46, 0x6c, + 0x79, 0x74, 0x65, 0x69, 0x64, 0x6c, 0x5c, 0x43, 0x6f, 0x72, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x46, 0x6c, 0x79, 0x74, 0x65, 0x69, + 0x64, 0x6c, 0x3a, 0x3a, 0x43, 0x6f, 0x72, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json index ccd899c1966..5b47397ae3e 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json @@ -159,11 +159,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." - }, - "enable_legacy_filename": { - "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json index d870ad8d8dc..93177349954 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json @@ -133,11 +133,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." - }, - "enable_legacy_filename": { - "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json index e8c0f7dd5b3..1b4a536b717 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json @@ -6860,11 +6860,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." - }, - "enable_legacy_filename": { - "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json index f7484cce141..625bf381575 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json @@ -1027,11 +1027,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." - }, - "enable_legacy_filename": { - "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json index 1c39db41cd9..ae10b4567d7 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json @@ -249,11 +249,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." - }, - "enable_legacy_filename": { - "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json index 0c6616f0b72..40e6d02b961 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json @@ -275,11 +275,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." - }, - "enable_legacy_filename": { - "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json index 4ec586f89c2..597a92f2337 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json @@ -325,11 +325,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during copilot download, unlike \"format\"." - }, - "enable_legacy_filename": { - "type": "boolean", - "description": "When true and file_extension is non-empty, the copilot download phase\nwrites the blob to both the full path (with extension) and the\nold path (without extension), preserving backward compatibility for\nworkflows with tasks that may read from both. Default is false." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-js/flyteidl.d.ts b/flyteidl/gen/pb-js/flyteidl.d.ts index d268bd5e4f2..1b27a3fabff 100644 --- a/flyteidl/gen/pb-js/flyteidl.d.ts +++ b/flyteidl/gen/pb-js/flyteidl.d.ts @@ -2177,9 +2177,6 @@ export namespace flyteidl { /** BlobType fileExtension */ fileExtension?: (string|null); - - /** BlobType enableLegacyFilename */ - enableLegacyFilename?: (boolean|null); } /** Represents a BlobType. */ @@ -2200,9 +2197,6 @@ export namespace flyteidl { /** BlobType fileExtension. */ public fileExtension: string; - /** BlobType enableLegacyFilename. */ - public enableLegacyFilename: boolean; - /** * Creates a new BlobType instance using the specified properties. * @param [properties] Properties to set diff --git a/flyteidl/gen/pb-js/flyteidl.js b/flyteidl/gen/pb-js/flyteidl.js index eb13bb0da02..4ee140d396a 100644 --- a/flyteidl/gen/pb-js/flyteidl.js +++ b/flyteidl/gen/pb-js/flyteidl.js @@ -5148,7 +5148,6 @@ * @property {string|null} [format] BlobType format * @property {flyteidl.core.BlobType.BlobDimensionality|null} [dimensionality] BlobType dimensionality * @property {string|null} [fileExtension] BlobType fileExtension - * @property {boolean|null} [enableLegacyFilename] BlobType enableLegacyFilename */ /** @@ -5190,14 +5189,6 @@ */ BlobType.prototype.fileExtension = ""; - /** - * BlobType enableLegacyFilename. - * @member {boolean} enableLegacyFilename - * @memberof flyteidl.core.BlobType - * @instance - */ - BlobType.prototype.enableLegacyFilename = false; - /** * Creates a new BlobType instance using the specified properties. * @function create @@ -5228,8 +5219,6 @@ writer.uint32(/* id 2, wireType 0 =*/16).int32(message.dimensionality); if (message.fileExtension != null && message.hasOwnProperty("fileExtension")) writer.uint32(/* id 3, wireType 2 =*/26).string(message.fileExtension); - if (message.enableLegacyFilename != null && message.hasOwnProperty("enableLegacyFilename")) - writer.uint32(/* id 4, wireType 0 =*/32).bool(message.enableLegacyFilename); return writer; }; @@ -5260,9 +5249,6 @@ case 3: message.fileExtension = reader.string(); break; - case 4: - message.enableLegacyFilename = reader.bool(); - break; default: reader.skipType(tag & 7); break; @@ -5296,9 +5282,6 @@ if (message.fileExtension != null && message.hasOwnProperty("fileExtension")) if (!$util.isString(message.fileExtension)) return "fileExtension: string expected"; - if (message.enableLegacyFilename != null && message.hasOwnProperty("enableLegacyFilename")) - if (typeof message.enableLegacyFilename !== "boolean") - return "enableLegacyFilename: boolean expected"; return null; }; diff --git a/flyteidl/gen/pb_python/flyteidl/core/types_pb2.py b/flyteidl/gen/pb_python/flyteidl/core/types_pb2.py index 549ba55fd00..ffc8d641418 100644 --- a/flyteidl/gen/pb_python/flyteidl/core/types_pb2.py +++ b/flyteidl/gen/pb_python/flyteidl/core/types_pb2.py @@ -14,7 +14,7 @@ from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x66lyteidl/core/types.proto\x12\rflyteidl.core\x1a\x1cgoogle/protobuf/struct.proto\"\xa1\x02\n\nSchemaType\x12@\n\x07\x63olumns\x18\x03 \x03(\x0b\x32&.flyteidl.core.SchemaType.SchemaColumnR\x07\x63olumns\x1a\xd0\x01\n\x0cSchemaColumn\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12K\n\x04type\x18\x02 \x01(\x0e\x32\x37.flyteidl.core.SchemaType.SchemaColumn.SchemaColumnTypeR\x04type\"_\n\x10SchemaColumnType\x12\x0b\n\x07INTEGER\x10\x00\x12\t\n\x05\x46LOAT\x10\x01\x12\n\n\x06STRING\x10\x02\x12\x0b\n\x07\x42OOLEAN\x10\x03\x12\x0c\n\x08\x44\x41TETIME\x10\x04\x12\x0c\n\x08\x44URATION\x10\x05\"\xc7\x02\n\x15StructuredDatasetType\x12L\n\x07\x63olumns\x18\x01 \x03(\x0b\x32\x32.flyteidl.core.StructuredDatasetType.DatasetColumnR\x07\x63olumns\x12\x16\n\x06\x66ormat\x18\x02 \x01(\tR\x06\x66ormat\x12\x30\n\x14\x65xternal_schema_type\x18\x03 \x01(\tR\x12\x65xternalSchemaType\x12\x32\n\x15\x65xternal_schema_bytes\x18\x04 \x01(\x0cR\x13\x65xternalSchemaBytes\x1a\x62\n\rDatasetColumn\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12=\n\x0cliteral_type\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x0bliteralType\"\x84\x02\n\x08\x42lobType\x12\x16\n\x06\x66ormat\x18\x01 \x01(\tR\x06\x66ormat\x12R\n\x0e\x64imensionality\x18\x02 \x01(\x0e\x32*.flyteidl.core.BlobType.BlobDimensionalityR\x0e\x64imensionality\x12%\n\x0e\x66ile_extension\x18\x03 \x01(\tR\rfileExtension\x12\x34\n\x16\x65nable_legacy_filename\x18\x04 \x01(\x08R\x14\x65nableLegacyFilename\"/\n\x12\x42lobDimensionality\x12\n\n\x06SINGLE\x10\x00\x12\r\n\tMULTIPART\x10\x01\"\"\n\x08\x45numType\x12\x16\n\x06values\x18\x01 \x03(\tR\x06values\"C\n\tUnionType\x12\x36\n\x08variants\x18\x01 \x03(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x08variants\"\xd7\x01\n\rTypeStructure\x12\x10\n\x03tag\x18\x01 \x01(\tR\x03tag\x12V\n\x0e\x64\x61taclass_type\x18\x02 \x03(\x0b\x32/.flyteidl.core.TypeStructure.DataclassTypeEntryR\rdataclassType\x1a\\\n\x12\x44\x61taclassTypeEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x30\n\x05value\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x05value:\x02\x38\x01\"K\n\x0eTypeAnnotation\x12\x39\n\x0b\x61nnotations\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x0b\x61nnotations\"\xbc\x05\n\x0bLiteralType\x12\x33\n\x06simple\x18\x01 \x01(\x0e\x32\x19.flyteidl.core.SimpleTypeH\x00R\x06simple\x12\x33\n\x06schema\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.SchemaTypeH\x00R\x06schema\x12\x45\n\x0f\x63ollection_type\x18\x03 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeH\x00R\x0e\x63ollectionType\x12\x42\n\x0emap_value_type\x18\x04 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeH\x00R\x0cmapValueType\x12-\n\x04\x62lob\x18\x05 \x01(\x0b\x32\x17.flyteidl.core.BlobTypeH\x00R\x04\x62lob\x12\x36\n\tenum_type\x18\x07 \x01(\x0b\x32\x17.flyteidl.core.EnumTypeH\x00R\x08\x65numType\x12^\n\x17structured_dataset_type\x18\x08 \x01(\x0b\x32$.flyteidl.core.StructuredDatasetTypeH\x00R\x15structuredDatasetType\x12\x39\n\nunion_type\x18\n \x01(\x0b\x32\x18.flyteidl.core.UnionTypeH\x00R\tunionType\x12\x33\n\x08metadata\x18\x06 \x01(\x0b\x32\x17.google.protobuf.StructR\x08metadata\x12=\n\nannotation\x18\t \x01(\x0b\x32\x1d.flyteidl.core.TypeAnnotationR\nannotation\x12:\n\tstructure\x18\x0b \x01(\x0b\x32\x1c.flyteidl.core.TypeStructureR\tstructureB\x06\n\x04type\"z\n\x0fOutputReference\x12\x17\n\x07node_id\x18\x01 \x01(\tR\x06nodeId\x12\x10\n\x03var\x18\x02 \x01(\tR\x03var\x12<\n\tattr_path\x18\x03 \x03(\x0b\x32\x1f.flyteidl.core.PromiseAttributeR\x08\x61ttrPath\"_\n\x10PromiseAttribute\x12#\n\x0cstring_value\x18\x01 \x01(\tH\x00R\x0bstringValue\x12\x1d\n\tint_value\x18\x02 \x01(\x05H\x00R\x08intValueB\x07\n\x05value\"G\n\x05\x45rror\x12$\n\x0e\x66\x61iled_node_id\x18\x01 \x01(\tR\x0c\x66\x61iledNodeId\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message*\x86\x01\n\nSimpleType\x12\x08\n\x04NONE\x10\x00\x12\x0b\n\x07INTEGER\x10\x01\x12\t\n\x05\x46LOAT\x10\x02\x12\n\n\x06STRING\x10\x03\x12\x0b\n\x07\x42OOLEAN\x10\x04\x12\x0c\n\x08\x44\x41TETIME\x10\x05\x12\x0c\n\x08\x44URATION\x10\x06\x12\n\n\x06\x42INARY\x10\x07\x12\t\n\x05\x45RROR\x10\x08\x12\n\n\x06STRUCT\x10\tB\xb0\x01\n\x11\x63om.flyteidl.coreB\nTypesProtoP\x01Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\xa2\x02\x03\x46\x43X\xaa\x02\rFlyteidl.Core\xca\x02\rFlyteidl\\Core\xe2\x02\x19\x46lyteidl\\Core\\GPBMetadata\xea\x02\x0e\x46lyteidl::Coreb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19\x66lyteidl/core/types.proto\x12\rflyteidl.core\x1a\x1cgoogle/protobuf/struct.proto\"\xa1\x02\n\nSchemaType\x12@\n\x07\x63olumns\x18\x03 \x03(\x0b\x32&.flyteidl.core.SchemaType.SchemaColumnR\x07\x63olumns\x1a\xd0\x01\n\x0cSchemaColumn\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12K\n\x04type\x18\x02 \x01(\x0e\x32\x37.flyteidl.core.SchemaType.SchemaColumn.SchemaColumnTypeR\x04type\"_\n\x10SchemaColumnType\x12\x0b\n\x07INTEGER\x10\x00\x12\t\n\x05\x46LOAT\x10\x01\x12\n\n\x06STRING\x10\x02\x12\x0b\n\x07\x42OOLEAN\x10\x03\x12\x0c\n\x08\x44\x41TETIME\x10\x04\x12\x0c\n\x08\x44URATION\x10\x05\"\xc7\x02\n\x15StructuredDatasetType\x12L\n\x07\x63olumns\x18\x01 \x03(\x0b\x32\x32.flyteidl.core.StructuredDatasetType.DatasetColumnR\x07\x63olumns\x12\x16\n\x06\x66ormat\x18\x02 \x01(\tR\x06\x66ormat\x12\x30\n\x14\x65xternal_schema_type\x18\x03 \x01(\tR\x12\x65xternalSchemaType\x12\x32\n\x15\x65xternal_schema_bytes\x18\x04 \x01(\x0cR\x13\x65xternalSchemaBytes\x1a\x62\n\rDatasetColumn\x12\x12\n\x04name\x18\x01 \x01(\tR\x04name\x12=\n\x0cliteral_type\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x0bliteralType\"\xce\x01\n\x08\x42lobType\x12\x16\n\x06\x66ormat\x18\x01 \x01(\tR\x06\x66ormat\x12R\n\x0e\x64imensionality\x18\x02 \x01(\x0e\x32*.flyteidl.core.BlobType.BlobDimensionalityR\x0e\x64imensionality\x12%\n\x0e\x66ile_extension\x18\x03 \x01(\tR\rfileExtension\"/\n\x12\x42lobDimensionality\x12\n\n\x06SINGLE\x10\x00\x12\r\n\tMULTIPART\x10\x01\"\"\n\x08\x45numType\x12\x16\n\x06values\x18\x01 \x03(\tR\x06values\"C\n\tUnionType\x12\x36\n\x08variants\x18\x01 \x03(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x08variants\"\xd7\x01\n\rTypeStructure\x12\x10\n\x03tag\x18\x01 \x01(\tR\x03tag\x12V\n\x0e\x64\x61taclass_type\x18\x02 \x03(\x0b\x32/.flyteidl.core.TypeStructure.DataclassTypeEntryR\rdataclassType\x1a\\\n\x12\x44\x61taclassTypeEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x30\n\x05value\x18\x02 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeR\x05value:\x02\x38\x01\"K\n\x0eTypeAnnotation\x12\x39\n\x0b\x61nnotations\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x0b\x61nnotations\"\xbc\x05\n\x0bLiteralType\x12\x33\n\x06simple\x18\x01 \x01(\x0e\x32\x19.flyteidl.core.SimpleTypeH\x00R\x06simple\x12\x33\n\x06schema\x18\x02 \x01(\x0b\x32\x19.flyteidl.core.SchemaTypeH\x00R\x06schema\x12\x45\n\x0f\x63ollection_type\x18\x03 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeH\x00R\x0e\x63ollectionType\x12\x42\n\x0emap_value_type\x18\x04 \x01(\x0b\x32\x1a.flyteidl.core.LiteralTypeH\x00R\x0cmapValueType\x12-\n\x04\x62lob\x18\x05 \x01(\x0b\x32\x17.flyteidl.core.BlobTypeH\x00R\x04\x62lob\x12\x36\n\tenum_type\x18\x07 \x01(\x0b\x32\x17.flyteidl.core.EnumTypeH\x00R\x08\x65numType\x12^\n\x17structured_dataset_type\x18\x08 \x01(\x0b\x32$.flyteidl.core.StructuredDatasetTypeH\x00R\x15structuredDatasetType\x12\x39\n\nunion_type\x18\n \x01(\x0b\x32\x18.flyteidl.core.UnionTypeH\x00R\tunionType\x12\x33\n\x08metadata\x18\x06 \x01(\x0b\x32\x17.google.protobuf.StructR\x08metadata\x12=\n\nannotation\x18\t \x01(\x0b\x32\x1d.flyteidl.core.TypeAnnotationR\nannotation\x12:\n\tstructure\x18\x0b \x01(\x0b\x32\x1c.flyteidl.core.TypeStructureR\tstructureB\x06\n\x04type\"z\n\x0fOutputReference\x12\x17\n\x07node_id\x18\x01 \x01(\tR\x06nodeId\x12\x10\n\x03var\x18\x02 \x01(\tR\x03var\x12<\n\tattr_path\x18\x03 \x03(\x0b\x32\x1f.flyteidl.core.PromiseAttributeR\x08\x61ttrPath\"_\n\x10PromiseAttribute\x12#\n\x0cstring_value\x18\x01 \x01(\tH\x00R\x0bstringValue\x12\x1d\n\tint_value\x18\x02 \x01(\x05H\x00R\x08intValueB\x07\n\x05value\"G\n\x05\x45rror\x12$\n\x0e\x66\x61iled_node_id\x18\x01 \x01(\tR\x0c\x66\x61iledNodeId\x12\x18\n\x07message\x18\x02 \x01(\tR\x07message*\x86\x01\n\nSimpleType\x12\x08\n\x04NONE\x10\x00\x12\x0b\n\x07INTEGER\x10\x01\x12\t\n\x05\x46LOAT\x10\x02\x12\n\n\x06STRING\x10\x03\x12\x0b\n\x07\x42OOLEAN\x10\x04\x12\x0c\n\x08\x44\x41TETIME\x10\x05\x12\x0c\n\x08\x44URATION\x10\x06\x12\n\n\x06\x42INARY\x10\x07\x12\t\n\x05\x45RROR\x10\x08\x12\n\n\x06STRUCT\x10\tB\xb0\x01\n\x11\x63om.flyteidl.coreB\nTypesProtoP\x01Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\xa2\x02\x03\x46\x43X\xaa\x02\rFlyteidl.Core\xca\x02\rFlyteidl\\Core\xe2\x02\x19\x46lyteidl\\Core\\GPBMetadata\xea\x02\x0e\x46lyteidl::Coreb\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -25,8 +25,8 @@ DESCRIPTOR._serialized_options = b'\n\021com.flyteidl.coreB\nTypesProtoP\001Z:github.com/flyteorg/flyte/flyteidl/gen/pb-go/flyteidl/core\242\002\003FCX\252\002\rFlyteidl.Core\312\002\rFlyteidl\\Core\342\002\031Flyteidl\\Core\\GPBMetadata\352\002\016Flyteidl::Core' _TYPESTRUCTURE_DATACLASSTYPEENTRY._options = None _TYPESTRUCTURE_DATACLASSTYPEENTRY._serialized_options = b'8\001' - _globals['_SIMPLETYPE']._serialized_start=2357 - _globals['_SIMPLETYPE']._serialized_end=2491 + _globals['_SIMPLETYPE']._serialized_start=2303 + _globals['_SIMPLETYPE']._serialized_end=2437 _globals['_SCHEMATYPE']._serialized_start=75 _globals['_SCHEMATYPE']._serialized_end=364 _globals['_SCHEMATYPE_SCHEMACOLUMN']._serialized_start=156 @@ -38,25 +38,25 @@ _globals['_STRUCTUREDDATASETTYPE_DATASETCOLUMN']._serialized_start=596 _globals['_STRUCTUREDDATASETTYPE_DATASETCOLUMN']._serialized_end=694 _globals['_BLOBTYPE']._serialized_start=697 - _globals['_BLOBTYPE']._serialized_end=957 - _globals['_BLOBTYPE_BLOBDIMENSIONALITY']._serialized_start=910 - _globals['_BLOBTYPE_BLOBDIMENSIONALITY']._serialized_end=957 - _globals['_ENUMTYPE']._serialized_start=959 - _globals['_ENUMTYPE']._serialized_end=993 - _globals['_UNIONTYPE']._serialized_start=995 - _globals['_UNIONTYPE']._serialized_end=1062 - _globals['_TYPESTRUCTURE']._serialized_start=1065 - _globals['_TYPESTRUCTURE']._serialized_end=1280 - _globals['_TYPESTRUCTURE_DATACLASSTYPEENTRY']._serialized_start=1188 - _globals['_TYPESTRUCTURE_DATACLASSTYPEENTRY']._serialized_end=1280 - _globals['_TYPEANNOTATION']._serialized_start=1282 - _globals['_TYPEANNOTATION']._serialized_end=1357 - _globals['_LITERALTYPE']._serialized_start=1360 - _globals['_LITERALTYPE']._serialized_end=2060 - _globals['_OUTPUTREFERENCE']._serialized_start=2062 - _globals['_OUTPUTREFERENCE']._serialized_end=2184 - _globals['_PROMISEATTRIBUTE']._serialized_start=2186 - _globals['_PROMISEATTRIBUTE']._serialized_end=2281 - _globals['_ERROR']._serialized_start=2283 - _globals['_ERROR']._serialized_end=2354 + _globals['_BLOBTYPE']._serialized_end=903 + _globals['_BLOBTYPE_BLOBDIMENSIONALITY']._serialized_start=856 + _globals['_BLOBTYPE_BLOBDIMENSIONALITY']._serialized_end=903 + _globals['_ENUMTYPE']._serialized_start=905 + _globals['_ENUMTYPE']._serialized_end=939 + _globals['_UNIONTYPE']._serialized_start=941 + _globals['_UNIONTYPE']._serialized_end=1008 + _globals['_TYPESTRUCTURE']._serialized_start=1011 + _globals['_TYPESTRUCTURE']._serialized_end=1226 + _globals['_TYPESTRUCTURE_DATACLASSTYPEENTRY']._serialized_start=1134 + _globals['_TYPESTRUCTURE_DATACLASSTYPEENTRY']._serialized_end=1226 + _globals['_TYPEANNOTATION']._serialized_start=1228 + _globals['_TYPEANNOTATION']._serialized_end=1303 + _globals['_LITERALTYPE']._serialized_start=1306 + _globals['_LITERALTYPE']._serialized_end=2006 + _globals['_OUTPUTREFERENCE']._serialized_start=2008 + _globals['_OUTPUTREFERENCE']._serialized_end=2130 + _globals['_PROMISEATTRIBUTE']._serialized_start=2132 + _globals['_PROMISEATTRIBUTE']._serialized_end=2227 + _globals['_ERROR']._serialized_start=2229 + _globals['_ERROR']._serialized_end=2300 # @@protoc_insertion_point(module_scope) diff --git a/flyteidl/gen/pb_python/flyteidl/core/types_pb2.pyi b/flyteidl/gen/pb_python/flyteidl/core/types_pb2.pyi index ec8dba49eec..8cf40aa4927 100644 --- a/flyteidl/gen/pb_python/flyteidl/core/types_pb2.pyi +++ b/flyteidl/gen/pb_python/flyteidl/core/types_pb2.pyi @@ -77,7 +77,7 @@ class StructuredDatasetType(_message.Message): def __init__(self, columns: _Optional[_Iterable[_Union[StructuredDatasetType.DatasetColumn, _Mapping]]] = ..., format: _Optional[str] = ..., external_schema_type: _Optional[str] = ..., external_schema_bytes: _Optional[bytes] = ...) -> None: ... class BlobType(_message.Message): - __slots__ = ["format", "dimensionality", "file_extension", "enable_legacy_filename"] + __slots__ = ["format", "dimensionality", "file_extension"] class BlobDimensionality(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): __slots__ = [] SINGLE: _ClassVar[BlobType.BlobDimensionality] @@ -87,12 +87,10 @@ class BlobType(_message.Message): FORMAT_FIELD_NUMBER: _ClassVar[int] DIMENSIONALITY_FIELD_NUMBER: _ClassVar[int] FILE_EXTENSION_FIELD_NUMBER: _ClassVar[int] - ENABLE_LEGACY_FILENAME_FIELD_NUMBER: _ClassVar[int] format: str dimensionality: BlobType.BlobDimensionality file_extension: str - enable_legacy_filename: bool - def __init__(self, format: _Optional[str] = ..., dimensionality: _Optional[_Union[BlobType.BlobDimensionality, str]] = ..., file_extension: _Optional[str] = ..., enable_legacy_filename: bool = ...) -> None: ... + def __init__(self, format: _Optional[str] = ..., dimensionality: _Optional[_Union[BlobType.BlobDimensionality, str]] = ..., file_extension: _Optional[str] = ...) -> None: ... class EnumType(_message.Message): __slots__ = ["values"] diff --git a/flyteidl/gen/pb_rust/flyteidl.core.rs b/flyteidl/gen/pb_rust/flyteidl.core.rs index 14b1838114a..b6e1ff519e3 100644 --- a/flyteidl/gen/pb_rust/flyteidl.core.rs +++ b/flyteidl/gen/pb_rust/flyteidl.core.rs @@ -110,15 +110,9 @@ pub struct BlobType { /// Differences from "format": /// 1. "format" is used for type validation in flytekit, "file_extension" is not. /// 2. "file_extension" controls the file extension of the blob when materializing - /// to local disk during copilot download, unlike "format". + /// to local disk during e.g. flytecopilot download, unlike "format". #[prost(string, tag="3")] pub file_extension: ::prost::alloc::string::String, - /// When true and file_extension is non-empty, the copilot download phase - /// writes the blob to both the full path (with extension) and the - /// old path (without extension), preserving backward compatibility for - /// workflows with tasks that may read from both. Default is false. - #[prost(bool, tag="4")] - pub enable_legacy_filename: bool, } /// Nested message and enum types in `BlobType`. pub mod blob_type { diff --git a/flyteidl/protos/flyteidl/core/types.proto b/flyteidl/protos/flyteidl/core/types.proto index c575901a6ca..f52b9cd38f6 100644 --- a/flyteidl/protos/flyteidl/core/types.proto +++ b/flyteidl/protos/flyteidl/core/types.proto @@ -86,14 +86,8 @@ message BlobType { // Differences from "format": // 1. "format" is used for type validation in flytekit, "file_extension" is not. // 2. "file_extension" controls the file extension of the blob when materializing - // to local disk during copilot download, unlike "format". + // to local disk during e.g. flytecopilot download, unlike "format". string file_extension = 3; - - // When true and file_extension is non-empty, the copilot download phase - // writes the blob to both the full path (with extension) and the - // old path (without extension), preserving backward compatibility for - // workflows with tasks that may read from both. Default is false. - bool enable_legacy_filename = 4; } // Enables declaring enum types, with predefined string values From 1ba7c1545198a2820348323e64c23a41a19e7a7d Mon Sep 17 00:00:00 2001 From: ddl-rliu <140021987+ddl-rliu@users.noreply.github.com> Date: Thu, 9 Apr 2026 13:43:23 -0700 Subject: [PATCH 6/7] Update flyteidl/protos/flyteidl/core/types.proto Co-authored-by: Nary Yeh <60069744+machichima@users.noreply.github.com> Signed-off-by: ddl-rliu <140021987+ddl-rliu@users.noreply.github.com> --- flyteidl/protos/flyteidl/core/types.proto | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/flyteidl/protos/flyteidl/core/types.proto b/flyteidl/protos/flyteidl/core/types.proto index f52b9cd38f6..330d38836c3 100644 --- a/flyteidl/protos/flyteidl/core/types.proto +++ b/flyteidl/protos/flyteidl/core/types.proto @@ -81,12 +81,9 @@ message BlobType { string format = 1; BlobDimensionality dimensionality = 2; - // Optional file extension (e.g. "csv", "parquet") to use during copilot download. - // Default is "", which means no extension is appended. - // Differences from "format": - // 1. "format" is used for type validation in flytekit, "file_extension" is not. - // 2. "file_extension" controls the file extension of the blob when materializing - // to local disk during e.g. flytecopilot download, unlike "format". + // Optional file extension (e.g. "csv", "parquet") appended to the blob filename during flytecopilot download. + // Unlike "format", this field is not used for type validation in SDK. + // It only controls the local filename when materializing to disk. string file_extension = 3; } From 5a0bb8361e53ffe07d79b0aa2cc006ed5c7481aa Mon Sep 17 00:00:00 2001 From: ddl-rliu Date: Thu, 9 Apr 2026 15:30:47 -0700 Subject: [PATCH 7/7] Update proto, add file extension check Signed-off-by: ddl-rliu --- flytecopilot/cmd/download_test.go | 21 ++++++++++++++++++- flytecopilot/data/download.go | 15 +++++++++---- flyteidl/clients/go/assets/admin.swagger.json | 2 +- flyteidl/gen/pb-es/flyteidl/core/types_pb.ts | 9 +++----- flyteidl/gen/pb-go/flyteidl/core/types.pb.go | 9 +++----- .../cacheservice/cacheservice.swagger.json | 2 +- .../datacatalog/datacatalog.swagger.json | 2 +- .../flyteidl/service/admin.swagger.json | 2 +- .../flyteidl/service/agent.swagger.json | 2 +- .../flyteidl/service/dataproxy.swagger.json | 2 +- .../external_plugin_service.swagger.json | 2 +- .../flyteidl/service/signal.swagger.json | 2 +- flyteidl/gen/pb_rust/flyteidl.core.rs | 9 +++----- 13 files changed, 48 insertions(+), 31 deletions(-) diff --git a/flytecopilot/cmd/download_test.go b/flytecopilot/cmd/download_test.go index 7b4684f1c54..d30bd7b63c2 100644 --- a/flytecopilot/cmd/download_test.go +++ b/flytecopilot/cmd/download_test.go @@ -162,6 +162,9 @@ func TestDownloadOptions_Download(t *testing.T) { "csv_blob": { Type: &core.LiteralType{Type: &core.LiteralType_Blob{Blob: &core.BlobType{Dimensionality: core.BlobType_SINGLE, Format: "csv", FileExtension: "csv"}}}, }, + "invalid_extension_blob": { + Type: &core.LiteralType{Type: &core.LiteralType_Blob{Blob: &core.BlobType{Dimensionality: core.BlobType_SINGLE, Format: "xyz", FileExtension: "/../../../invalid"}}}, + }, }, } d, err := proto.Marshal(iface) @@ -207,10 +210,26 @@ func TestDownloadOptions_Download(t *testing.T) { }, }, }}, + "invalid_extension_blob": {Value: &core.Literal_Scalar{ + Scalar: &core.Scalar{ + Value: &core.Scalar_Blob{ + Blob: &core.Blob{ + Uri: blobLoc.String(), + Metadata: &core.BlobMetadata{ + Type: &core.BlobType{ + Dimensionality: core.BlobType_SINGLE, + Format: "xyz", + FileExtension: "/../../../invalid", + }, + }, + }, + }, + }, + }}, }, })) assert.NoError(t, dopts.Download(ctx), "Download Operation failed") - assert.ElementsMatch(t, []string{"inputs.json", "inputs.pb", "x", "y", "blob.xyz", "csv_blob.csv"}, collectFile(tmpDir)) + assert.ElementsMatch(t, []string{"inputs.json", "inputs.pb", "x", "y", "blob.xyz", "csv_blob.csv", "invalid_extension_blob"}, collectFile(tmpDir)) }) t.Run("primitiveAndMissingBlobInputs", func(t *testing.T) { diff --git a/flytecopilot/data/download.go b/flytecopilot/data/download.go index 7b0e8ce7c15..025b895e718 100644 --- a/flytecopilot/data/download.go +++ b/flytecopilot/data/download.go @@ -9,6 +9,7 @@ import ( "path" "path/filepath" "reflect" + "regexp" "strconv" "strings" "sync" @@ -26,6 +27,8 @@ import ( "github.com/flyteorg/flyte/flytestdlib/storage" ) +var validFileExtensionRe = regexp.MustCompile(`^[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*$`) + type Downloader struct { format core.DataLoadingConfig_LiteralMapFormat store *storage.DataStore @@ -42,16 +45,20 @@ type Downloader struct { // However, an input blob // `data: Annotated[FlyteFile["csv"], FileDownloadConfig(file_extension="csv")]` // should be written to "inputs/data.csv" (when FileExtension="csv" - new behavior). -func resolveVarFilenames(vars *core.VariableMap) map[string]string { +func resolveVarFilenames(ctx context.Context, vars *core.VariableMap) map[string]string { varFilenames := make(map[string]string, len(vars.GetVariables())) for varName, variable := range vars.GetVariables() { varType := variable.GetType() switch varType.GetType().(type) { case *core.LiteralType_Blob: - if varType.GetBlob().GetFileExtension() == "" { + ext := varType.GetBlob().GetFileExtension() + if ext == "" { + varFilenames[varName] = varName + } else if !validFileExtensionRe.MatchString(ext) { + logger.Warnf(ctx, "invalid file extension for variable %q [%q], ignoring...", varName, ext) varFilenames[varName] = varName } else { - varFilenames[varName] = varName + "." + varType.GetBlob().GetFileExtension() + varFilenames[varName] = varName + "." + ext } default: varFilenames[varName] = varName @@ -565,7 +572,7 @@ func (d Downloader) DownloadInputs(ctx context.Context, vars *core.VariableMap, return errors.Wrapf(err, "failed to download input metadata message from remote store") } - varFilenames := resolveVarFilenames(vars) + varFilenames := resolveVarFilenames(ctx, vars) varMap, lMap, err := d.RecursiveDownload(ctx, inputs, outputDir, varFilenames, true) if err != nil { return errors.Wrapf(err, "failed to download input variable from remote store") diff --git a/flyteidl/clients/go/assets/admin.swagger.json b/flyteidl/clients/go/assets/admin.swagger.json index 1b4a536b717..d6672d14505 100644 --- a/flyteidl/clients/go/assets/admin.swagger.json +++ b/flyteidl/clients/go/assets/admin.swagger.json @@ -6860,7 +6860,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") appended to the blob filename during flytecopilot download.\nUnlike \"format\", this field is not used for type validation in SDK.\nIt only controls the local filename when materializing to disk." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts b/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts index f770019272a..97b669b0aba 100644 --- a/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts +++ b/flyteidl/gen/pb-es/flyteidl/core/types_pb.ts @@ -342,12 +342,9 @@ export class BlobType extends Message { dimensionality = BlobType_BlobDimensionality.SINGLE; /** - * Optional file extension (e.g. "csv", "parquet") to use during copilot download. - * Default is "", which means no extension is appended. - * Differences from "format": - * 1. "format" is used for type validation in flytekit, "file_extension" is not. - * 2. "file_extension" controls the file extension of the blob when materializing - * to local disk during e.g. flytecopilot download, unlike "format". + * Optional file extension (e.g. "csv", "parquet") appended to the blob filename during flytecopilot download. + * Unlike "format", this field is not used for type validation in SDK. + * It only controls the local filename when materializing to disk. * * @generated from field: string file_extension = 3; */ diff --git a/flyteidl/gen/pb-go/flyteidl/core/types.pb.go b/flyteidl/gen/pb-go/flyteidl/core/types.pb.go index 0a7fc7534fe..ae1010e8a72 100644 --- a/flyteidl/gen/pb-go/flyteidl/core/types.pb.go +++ b/flyteidl/gen/pb-go/flyteidl/core/types.pb.go @@ -334,12 +334,9 @@ type BlobType struct { // csv, parquet etc Format string `protobuf:"bytes,1,opt,name=format,proto3" json:"format,omitempty"` Dimensionality BlobType_BlobDimensionality `protobuf:"varint,2,opt,name=dimensionality,proto3,enum=flyteidl.core.BlobType_BlobDimensionality" json:"dimensionality,omitempty"` - // Optional file extension (e.g. "csv", "parquet") to use during copilot download. - // Default is "", which means no extension is appended. - // Differences from "format": - // 1. "format" is used for type validation in flytekit, "file_extension" is not. - // 2. "file_extension" controls the file extension of the blob when materializing - // to local disk during e.g. flytecopilot download, unlike "format". + // Optional file extension (e.g. "csv", "parquet") appended to the blob filename during flytecopilot download. + // Unlike "format", this field is not used for type validation in SDK. + // It only controls the local filename when materializing to disk. FileExtension string `protobuf:"bytes,3,opt,name=file_extension,json=fileExtension,proto3" json:"file_extension,omitempty"` } diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json index 5b47397ae3e..ffaa2b701b8 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/cacheservice/cacheservice.swagger.json @@ -159,7 +159,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") appended to the blob filename during flytecopilot download.\nUnlike \"format\", this field is not used for type validation in SDK.\nIt only controls the local filename when materializing to disk." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json index 93177349954..7991be94fb6 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/datacatalog/datacatalog.swagger.json @@ -133,7 +133,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") appended to the blob filename during flytecopilot download.\nUnlike \"format\", this field is not used for type validation in SDK.\nIt only controls the local filename when materializing to disk." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json index 1b4a536b717..d6672d14505 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/admin.swagger.json @@ -6860,7 +6860,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") appended to the blob filename during flytecopilot download.\nUnlike \"format\", this field is not used for type validation in SDK.\nIt only controls the local filename when materializing to disk." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json index 625bf381575..bbba1f620cb 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/agent.swagger.json @@ -1027,7 +1027,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") appended to the blob filename during flytecopilot download.\nUnlike \"format\", this field is not used for type validation in SDK.\nIt only controls the local filename when materializing to disk." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json index ae10b4567d7..f8637e59fc5 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/dataproxy.swagger.json @@ -249,7 +249,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") appended to the blob filename during flytecopilot download.\nUnlike \"format\", this field is not used for type validation in SDK.\nIt only controls the local filename when materializing to disk." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json index 40e6d02b961..12826f2ee38 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/external_plugin_service.swagger.json @@ -275,7 +275,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") appended to the blob filename during flytecopilot download.\nUnlike \"format\", this field is not used for type validation in SDK.\nIt only controls the local filename when materializing to disk." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json b/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json index 597a92f2337..6dda2afc15f 100644 --- a/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json +++ b/flyteidl/gen/pb-go/gateway/flyteidl/service/signal.swagger.json @@ -325,7 +325,7 @@ }, "file_extension": { "type": "string", - "description": "Optional file extension (e.g. \"csv\", \"parquet\") to use during copilot download.\nDefault is \"\", which means no extension is appended.\nDifferences from \"format\":\n 1. \"format\" is used for type validation in flytekit, \"file_extension\" is not.\n 2. \"file_extension\" controls the file extension of the blob when materializing\n to local disk during e.g. flytecopilot download, unlike \"format\"." + "description": "Optional file extension (e.g. \"csv\", \"parquet\") appended to the blob filename during flytecopilot download.\nUnlike \"format\", this field is not used for type validation in SDK.\nIt only controls the local filename when materializing to disk." } }, "title": "Defines type behavior for blob objects" diff --git a/flyteidl/gen/pb_rust/flyteidl.core.rs b/flyteidl/gen/pb_rust/flyteidl.core.rs index b6e1ff519e3..726caa29938 100644 --- a/flyteidl/gen/pb_rust/flyteidl.core.rs +++ b/flyteidl/gen/pb_rust/flyteidl.core.rs @@ -105,12 +105,9 @@ pub struct BlobType { pub format: ::prost::alloc::string::String, #[prost(enumeration="blob_type::BlobDimensionality", tag="2")] pub dimensionality: i32, - /// Optional file extension (e.g. "csv", "parquet") to use during copilot download. - /// Default is "", which means no extension is appended. - /// Differences from "format": - /// 1. "format" is used for type validation in flytekit, "file_extension" is not. - /// 2. "file_extension" controls the file extension of the blob when materializing - /// to local disk during e.g. flytecopilot download, unlike "format". + /// Optional file extension (e.g. "csv", "parquet") appended to the blob filename during flytecopilot download. + /// Unlike "format", this field is not used for type validation in SDK. + /// It only controls the local filename when materializing to disk. #[prost(string, tag="3")] pub file_extension: ::prost::alloc::string::String, }