opendal 0.1.6.pre.rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.standard.yml +20 -0
- data/.tool-versions +1 -0
- data/.yardopts +1 -0
- data/Cargo.toml +65 -0
- data/DEPENDENCIES.md +9 -0
- data/DEPENDENCIES.rust.tsv +277 -0
- data/Gemfile +35 -0
- data/README.md +159 -0
- data/Rakefile +149 -0
- data/build.rs +22 -0
- data/core/CHANGELOG.md +4929 -0
- data/core/CONTRIBUTING.md +61 -0
- data/core/Cargo.lock +10259 -0
- data/core/Cargo.toml +437 -0
- data/core/DEPENDENCIES.md +3 -0
- data/core/DEPENDENCIES.rust.tsv +185 -0
- data/core/LICENSE +201 -0
- data/core/README.md +228 -0
- data/core/benches/README.md +18 -0
- data/core/benches/ops/README.md +26 -0
- data/core/benches/ops/main.rs +25 -0
- data/core/benches/ops/read.rs +100 -0
- data/core/benches/ops/utils.rs +59 -0
- data/core/benches/ops/write.rs +106 -0
- data/core/benches/types/README.md +9 -0
- data/core/benches/types/buffer.rs +114 -0
- data/core/benches/types/main.rs +23 -0
- data/core/benches/types/tasks.rs +64 -0
- data/core/benches/vs_fs/Cargo.toml +32 -0
- data/core/benches/vs_fs/README.md +35 -0
- data/core/benches/vs_fs/src/main.rs +83 -0
- data/core/benches/vs_s3/Cargo.toml +38 -0
- data/core/benches/vs_s3/README.md +55 -0
- data/core/benches/vs_s3/src/main.rs +123 -0
- data/core/edge/README.md +3 -0
- data/core/edge/file_write_on_full_disk/Cargo.toml +31 -0
- data/core/edge/file_write_on_full_disk/README.md +14 -0
- data/core/edge/file_write_on_full_disk/src/main.rs +43 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/Cargo.toml +30 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/src/main.rs +34 -0
- data/core/edge/s3_read_on_wasm/.gitignore +3 -0
- data/core/edge/s3_read_on_wasm/Cargo.toml +38 -0
- data/core/edge/s3_read_on_wasm/README.md +42 -0
- data/core/edge/s3_read_on_wasm/src/lib.rs +60 -0
- data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
- data/core/examples/README.md +23 -0
- data/core/examples/basic/Cargo.toml +29 -0
- data/core/examples/basic/README.md +15 -0
- data/core/examples/basic/src/main.rs +51 -0
- data/core/examples/concurrent-upload/Cargo.toml +29 -0
- data/core/examples/concurrent-upload/README.md +15 -0
- data/core/examples/concurrent-upload/src/main.rs +68 -0
- data/core/examples/multipart-upload/Cargo.toml +29 -0
- data/core/examples/multipart-upload/README.md +15 -0
- data/core/examples/multipart-upload/src/main.rs +56 -0
- data/core/fuzz/.gitignore +5 -0
- data/core/fuzz/Cargo.toml +92 -0
- data/core/fuzz/README.md +68 -0
- data/core/fuzz/fuzz_reader.rs +102 -0
- data/core/fuzz/fuzz_writer.rs +123 -0
- data/core/src/blocking/delete.rs +74 -0
- data/core/src/blocking/list.rs +71 -0
- data/core/src/blocking/mod.rs +33 -0
- data/core/src/blocking/operator.rs +729 -0
- data/core/src/blocking/read/buffer_iterator.rs +66 -0
- data/core/src/blocking/read/mod.rs +27 -0
- data/core/src/blocking/read/reader.rs +124 -0
- data/core/src/blocking/read/std_bytes_iterator.rs +69 -0
- data/core/src/blocking/read/std_reader.rs +95 -0
- data/core/src/blocking/write/mod.rs +22 -0
- data/core/src/blocking/write/std_writer.rs +82 -0
- data/core/src/blocking/write/writer.rs +109 -0
- data/core/src/docs/comparisons/mod.rs +30 -0
- data/core/src/docs/comparisons/vs_object_store.md +183 -0
- data/core/src/docs/concepts.rs +135 -0
- data/core/src/docs/internals/accessor.rs +306 -0
- data/core/src/docs/internals/layer.rs +42 -0
- data/core/src/docs/internals/mod.rs +62 -0
- data/core/src/docs/mod.rs +43 -0
- data/core/src/docs/performance/concurrent_write.md +101 -0
- data/core/src/docs/performance/http_optimization.md +124 -0
- data/core/src/docs/performance/mod.rs +32 -0
- data/core/src/docs/rfcs/0000_example.md +74 -0
- data/core/src/docs/rfcs/0000_foyer_integration.md +111 -0
- data/core/src/docs/rfcs/0041_object_native_api.md +185 -0
- data/core/src/docs/rfcs/0044_error_handle.md +198 -0
- data/core/src/docs/rfcs/0057_auto_region.md +160 -0
- data/core/src/docs/rfcs/0069_object_stream.md +145 -0
- data/core/src/docs/rfcs/0090_limited_reader.md +155 -0
- data/core/src/docs/rfcs/0112_path_normalization.md +79 -0
- data/core/src/docs/rfcs/0191_async_streaming_io.md +328 -0
- data/core/src/docs/rfcs/0203_remove_credential.md +96 -0
- data/core/src/docs/rfcs/0221_create_dir.md +89 -0
- data/core/src/docs/rfcs/0247_retryable_error.md +87 -0
- data/core/src/docs/rfcs/0293_object_id.md +67 -0
- data/core/src/docs/rfcs/0337_dir_entry.md +191 -0
- data/core/src/docs/rfcs/0409_accessor_capabilities.md +67 -0
- data/core/src/docs/rfcs/0413_presign.md +154 -0
- data/core/src/docs/rfcs/0423_command_line_interface.md +268 -0
- data/core/src/docs/rfcs/0429_init_from_iter.md +107 -0
- data/core/src/docs/rfcs/0438_multipart.md +163 -0
- data/core/src/docs/rfcs/0443_gateway.md +73 -0
- data/core/src/docs/rfcs/0501_new_builder.md +111 -0
- data/core/src/docs/rfcs/0554_write_refactor.md +96 -0
- data/core/src/docs/rfcs/0561_list_metadata_reuse.md +210 -0
- data/core/src/docs/rfcs/0599_blocking_api.md +157 -0
- data/core/src/docs/rfcs/0623_redis_service.md +300 -0
- data/core/src/docs/rfcs/0627_split_capabilities.md +89 -0
- data/core/src/docs/rfcs/0661_path_in_accessor.md +126 -0
- data/core/src/docs/rfcs/0793_generic_kv_services.md +209 -0
- data/core/src/docs/rfcs/0926_object_reader.md +93 -0
- data/core/src/docs/rfcs/0977_refactor_error.md +151 -0
- data/core/src/docs/rfcs/1085_object_handler.md +73 -0
- data/core/src/docs/rfcs/1391_object_metadataer.md +110 -0
- data/core/src/docs/rfcs/1398_query_based_metadata.md +125 -0
- data/core/src/docs/rfcs/1420_object_writer.md +147 -0
- data/core/src/docs/rfcs/1477_remove_object_concept.md +159 -0
- data/core/src/docs/rfcs/1735_operation_extension.md +117 -0
- data/core/src/docs/rfcs/2083_writer_sink_api.md +106 -0
- data/core/src/docs/rfcs/2133_append_api.md +88 -0
- data/core/src/docs/rfcs/2299_chain_based_operator_api.md +99 -0
- data/core/src/docs/rfcs/2602_object_versioning.md +138 -0
- data/core/src/docs/rfcs/2758_merge_append_into_write.md +79 -0
- data/core/src/docs/rfcs/2774_lister_api.md +66 -0
- data/core/src/docs/rfcs/2779_list_with_metakey.md +143 -0
- data/core/src/docs/rfcs/2852_native_capability.md +58 -0
- data/core/src/docs/rfcs/2884_merge_range_read_into_read.md +80 -0
- data/core/src/docs/rfcs/3017_remove_write_copy_from.md +94 -0
- data/core/src/docs/rfcs/3197_config.md +237 -0
- data/core/src/docs/rfcs/3232_align_list_api.md +69 -0
- data/core/src/docs/rfcs/3243_list_prefix.md +128 -0
- data/core/src/docs/rfcs/3356_lazy_reader.md +111 -0
- data/core/src/docs/rfcs/3526_list_recursive.md +59 -0
- data/core/src/docs/rfcs/3574_concurrent_stat_in_list.md +80 -0
- data/core/src/docs/rfcs/3734_buffered_reader.md +64 -0
- data/core/src/docs/rfcs/3898_concurrent_writer.md +66 -0
- data/core/src/docs/rfcs/3911_deleter_api.md +165 -0
- data/core/src/docs/rfcs/4382_range_based_read.md +213 -0
- data/core/src/docs/rfcs/4638_executor.md +215 -0
- data/core/src/docs/rfcs/5314_remove_metakey.md +120 -0
- data/core/src/docs/rfcs/5444_operator_from_uri.md +162 -0
- data/core/src/docs/rfcs/5479_context.md +140 -0
- data/core/src/docs/rfcs/5485_conditional_reader.md +112 -0
- data/core/src/docs/rfcs/5495_list_with_deleted.md +81 -0
- data/core/src/docs/rfcs/5556_write_returns_metadata.md +121 -0
- data/core/src/docs/rfcs/5871_read_returns_metadata.md +112 -0
- data/core/src/docs/rfcs/6189_remove_native_blocking.md +106 -0
- data/core/src/docs/rfcs/6209_glob_support.md +132 -0
- data/core/src/docs/rfcs/6213_options_api.md +142 -0
- data/core/src/docs/rfcs/README.md +62 -0
- data/core/src/docs/rfcs/mod.rs +278 -0
- data/core/src/docs/upgrade.md +1556 -0
- data/core/src/layers/async_backtrace.rs +174 -0
- data/core/src/layers/await_tree.rs +202 -0
- data/core/src/layers/capability_check.rs +239 -0
- data/core/src/layers/chaos.rs +170 -0
- data/core/src/layers/complete.rs +385 -0
- data/core/src/layers/concurrent_limit.rs +322 -0
- data/core/src/layers/correctness_check.rs +440 -0
- data/core/src/layers/dtrace.rs +294 -0
- data/core/src/layers/error_context.rs +310 -0
- data/core/src/layers/fastmetrics.rs +525 -0
- data/core/src/layers/fastrace.rs +271 -0
- data/core/src/layers/http_client.rs +206 -0
- data/core/src/layers/immutable_index.rs +408 -0
- data/core/src/layers/logging.rs +842 -0
- data/core/src/layers/metrics.rs +182 -0
- data/core/src/layers/mime_guess.rs +199 -0
- data/core/src/layers/mod.rs +130 -0
- data/core/src/layers/observe/metrics.rs +936 -0
- data/core/src/layers/observe/mod.rs +93 -0
- data/core/src/layers/otelmetrics.rs +496 -0
- data/core/src/layers/oteltrace.rs +203 -0
- data/core/src/layers/prometheus.rs +686 -0
- data/core/src/layers/prometheus_client.rs +519 -0
- data/core/src/layers/retry.rs +933 -0
- data/core/src/layers/throttle.rs +204 -0
- data/core/src/layers/timeout.rs +513 -0
- data/core/src/layers/tracing.rs +349 -0
- data/core/src/layers/type_eraser.rs +91 -0
- data/core/src/lib.rs +204 -0
- data/core/src/raw/accessor.rs +856 -0
- data/core/src/raw/adapters/kv/api.rs +164 -0
- data/core/src/raw/adapters/kv/backend.rs +253 -0
- data/core/src/raw/adapters/kv/mod.rs +31 -0
- data/core/src/raw/adapters/mod.rs +50 -0
- data/core/src/raw/adapters/typed_kv/api.rs +171 -0
- data/core/src/raw/adapters/typed_kv/backend.rs +279 -0
- data/core/src/raw/adapters/typed_kv/mod.rs +29 -0
- data/core/src/raw/atomic_util.rs +57 -0
- data/core/src/raw/azure.rs +570 -0
- data/core/src/raw/chrono_util.rs +109 -0
- data/core/src/raw/enum_utils.rs +201 -0
- data/core/src/raw/futures_util.rs +470 -0
- data/core/src/raw/http_util/body.rs +144 -0
- data/core/src/raw/http_util/bytes_content_range.rs +239 -0
- data/core/src/raw/http_util/bytes_range.rs +260 -0
- data/core/src/raw/http_util/client.rs +276 -0
- data/core/src/raw/http_util/error.rs +68 -0
- data/core/src/raw/http_util/header.rs +356 -0
- data/core/src/raw/http_util/mod.rs +78 -0
- data/core/src/raw/http_util/multipart.rs +1180 -0
- data/core/src/raw/http_util/uri.rs +190 -0
- data/core/src/raw/layer.rs +295 -0
- data/core/src/raw/mod.rs +101 -0
- data/core/src/raw/oio/buf/flex_buf.rs +118 -0
- data/core/src/raw/oio/buf/mod.rs +25 -0
- data/core/src/raw/oio/buf/pooled_buf.rs +126 -0
- data/core/src/raw/oio/buf/queue_buf.rs +117 -0
- data/core/src/raw/oio/delete/api.rs +102 -0
- data/core/src/raw/oio/delete/batch_delete.rs +127 -0
- data/core/src/raw/oio/delete/mod.rs +30 -0
- data/core/src/raw/oio/delete/one_shot_delete.rs +79 -0
- data/core/src/raw/oio/entry.rs +89 -0
- data/core/src/raw/oio/list/api.rs +69 -0
- data/core/src/raw/oio/list/flat_list.rs +137 -0
- data/core/src/raw/oio/list/hierarchy_list.rs +135 -0
- data/core/src/raw/oio/list/mod.rs +35 -0
- data/core/src/raw/oio/list/page_list.rs +105 -0
- data/core/src/raw/oio/list/prefix_list.rs +64 -0
- data/core/src/raw/oio/mod.rs +40 -0
- data/core/src/raw/oio/read/api.rs +119 -0
- data/core/src/raw/oio/read/mod.rs +21 -0
- data/core/src/raw/oio/write/api.rs +103 -0
- data/core/src/raw/oio/write/append_write.rs +111 -0
- data/core/src/raw/oio/write/block_write.rs +405 -0
- data/core/src/raw/oio/write/mod.rs +42 -0
- data/core/src/raw/oio/write/multipart_write.rs +518 -0
- data/core/src/raw/oio/write/one_shot_write.rs +77 -0
- data/core/src/raw/oio/write/position_write.rs +284 -0
- data/core/src/raw/operation.rs +88 -0
- data/core/src/raw/ops.rs +917 -0
- data/core/src/raw/path.rs +451 -0
- data/core/src/raw/path_cache.rs +244 -0
- data/core/src/raw/rps.rs +249 -0
- data/core/src/raw/serde_util.rs +423 -0
- data/core/src/raw/std_io_util.rs +65 -0
- data/core/src/raw/tests/mod.rs +30 -0
- data/core/src/raw/tests/read.rs +116 -0
- data/core/src/raw/tests/utils.rs +80 -0
- data/core/src/raw/tests/write.rs +79 -0
- data/core/src/raw/tokio_util.rs +24 -0
- data/core/src/raw/version.rs +19 -0
- data/core/src/services/aliyun_drive/backend.rs +421 -0
- data/core/src/services/aliyun_drive/config.rs +72 -0
- data/core/src/services/aliyun_drive/core.rs +651 -0
- data/core/src/services/aliyun_drive/delete.rs +51 -0
- data/core/src/services/aliyun_drive/docs.md +61 -0
- data/core/src/services/aliyun_drive/error.rs +56 -0
- data/core/src/services/aliyun_drive/lister.rs +134 -0
- data/core/src/services/aliyun_drive/mod.rs +39 -0
- data/core/src/services/aliyun_drive/writer.rs +114 -0
- data/core/src/services/alluxio/backend.rs +257 -0
- data/core/src/services/alluxio/config.rs +50 -0
- data/core/src/services/alluxio/core.rs +367 -0
- data/core/src/services/alluxio/delete.rs +38 -0
- data/core/src/services/alluxio/docs.md +45 -0
- data/core/src/services/alluxio/error.rs +99 -0
- data/core/src/services/alluxio/lister.rs +73 -0
- data/core/src/services/alluxio/mod.rs +39 -0
- data/core/src/services/alluxio/writer.rs +74 -0
- data/core/src/services/azblob/backend.rs +594 -0
- data/core/src/services/azblob/config.rs +220 -0
- data/core/src/services/azblob/core.rs +937 -0
- data/core/src/services/azblob/delete.rs +108 -0
- data/core/src/services/azblob/docs.md +77 -0
- data/core/src/services/azblob/error.rs +164 -0
- data/core/src/services/azblob/lister.rs +107 -0
- data/core/src/services/azblob/mod.rs +38 -0
- data/core/src/services/azblob/writer.rs +177 -0
- data/core/src/services/azdls/backend.rs +435 -0
- data/core/src/services/azdls/config.rs +89 -0
- data/core/src/services/azdls/core.rs +388 -0
- data/core/src/services/azdls/delete.rs +48 -0
- data/core/src/services/azdls/docs.md +73 -0
- data/core/src/services/azdls/error.rs +107 -0
- data/core/src/services/azdls/lister.rs +165 -0
- data/core/src/services/azdls/mod.rs +38 -0
- data/core/src/services/azdls/writer.rs +129 -0
- data/core/src/services/azfile/backend.rs +373 -0
- data/core/src/services/azfile/config.rs +61 -0
- data/core/src/services/azfile/core.rs +435 -0
- data/core/src/services/azfile/delete.rs +51 -0
- data/core/src/services/azfile/docs.md +65 -0
- data/core/src/services/azfile/error.rs +108 -0
- data/core/src/services/azfile/lister.rs +217 -0
- data/core/src/services/azfile/mod.rs +39 -0
- data/core/src/services/azfile/writer.rs +92 -0
- data/core/src/services/b2/backend.rs +434 -0
- data/core/src/services/b2/config.rs +64 -0
- data/core/src/services/b2/core.rs +742 -0
- data/core/src/services/b2/delete.rs +56 -0
- data/core/src/services/b2/docs.md +54 -0
- data/core/src/services/b2/error.rs +132 -0
- data/core/src/services/b2/lister.rs +110 -0
- data/core/src/services/b2/mod.rs +39 -0
- data/core/src/services/b2/writer.rs +189 -0
- data/core/src/services/cacache/backend.rs +160 -0
- data/core/src/services/cacache/config.rs +28 -0
- data/core/src/services/cacache/core.rs +96 -0
- data/core/src/services/cacache/delete.rs +39 -0
- data/core/src/services/cacache/docs.md +38 -0
- data/core/src/services/cacache/mod.rs +34 -0
- data/core/src/services/cacache/writer.rs +61 -0
- data/core/src/services/cloudflare_kv/backend.rs +513 -0
- data/core/src/services/cloudflare_kv/config.rs +55 -0
- data/core/src/services/cloudflare_kv/core.rs +168 -0
- data/core/src/services/cloudflare_kv/delete.rs +119 -0
- data/core/src/services/cloudflare_kv/docs.md +21 -0
- data/core/src/services/cloudflare_kv/error.rs +79 -0
- data/core/src/services/cloudflare_kv/lister.rs +170 -0
- data/core/src/services/cloudflare_kv/mod.rs +39 -0
- data/core/src/services/cloudflare_kv/model.rs +76 -0
- data/core/src/services/cloudflare_kv/writer.rs +68 -0
- data/core/src/services/compfs/backend.rs +290 -0
- data/core/src/services/compfs/config.rs +30 -0
- data/core/src/services/compfs/core.rs +159 -0
- data/core/src/services/compfs/delete.rs +53 -0
- data/core/src/services/compfs/lister.rs +98 -0
- data/core/src/services/compfs/mod.rs +38 -0
- data/core/src/services/compfs/reader.rs +79 -0
- data/core/src/services/compfs/writer.rs +90 -0
- data/core/src/services/cos/backend.rs +442 -0
- data/core/src/services/cos/config.rs +54 -0
- data/core/src/services/cos/core.rs +761 -0
- data/core/src/services/cos/delete.rs +48 -0
- data/core/src/services/cos/docs.md +55 -0
- data/core/src/services/cos/error.rs +105 -0
- data/core/src/services/cos/lister.rs +237 -0
- data/core/src/services/cos/mod.rs +39 -0
- data/core/src/services/cos/writer.rs +234 -0
- data/core/src/services/d1/backend.rs +330 -0
- data/core/src/services/d1/config.rs +55 -0
- data/core/src/services/d1/docs.md +48 -0
- data/core/src/services/d1/error.rs +79 -0
- data/core/src/services/d1/mod.rs +29 -0
- data/core/src/services/d1/model.rs +125 -0
- data/core/src/services/dashmap/backend.rs +203 -0
- data/core/src/services/dashmap/config.rs +37 -0
- data/core/src/services/dashmap/core.rs +61 -0
- data/core/src/services/dashmap/delete.rs +40 -0
- data/core/src/services/dashmap/docs.md +38 -0
- data/core/src/services/dashmap/lister.rs +63 -0
- data/core/src/services/dashmap/mod.rs +36 -0
- data/core/src/services/dashmap/writer.rs +87 -0
- data/core/src/services/dbfs/backend.rs +258 -0
- data/core/src/services/dbfs/config.rs +48 -0
- data/core/src/services/dbfs/core.rs +191 -0
- data/core/src/services/dbfs/delete.rs +49 -0
- data/core/src/services/dbfs/docs.md +57 -0
- data/core/src/services/dbfs/error.rs +74 -0
- data/core/src/services/dbfs/lister.rs +96 -0
- data/core/src/services/dbfs/mod.rs +38 -0
- data/core/src/services/dbfs/writer.rs +64 -0
- data/core/src/services/dropbox/backend.rs +187 -0
- data/core/src/services/dropbox/builder.rs +222 -0
- data/core/src/services/dropbox/config.rs +47 -0
- data/core/src/services/dropbox/core.rs +496 -0
- data/core/src/services/dropbox/delete.rs +54 -0
- data/core/src/services/dropbox/docs.md +64 -0
- data/core/src/services/dropbox/error.rs +85 -0
- data/core/src/services/dropbox/lister.rs +117 -0
- data/core/src/services/dropbox/mod.rs +40 -0
- data/core/src/services/dropbox/writer.rs +51 -0
- data/core/src/services/etcd/backend.rs +345 -0
- data/core/src/services/etcd/config.rs +86 -0
- data/core/src/services/etcd/core.rs +143 -0
- data/core/src/services/etcd/deleter.rs +41 -0
- data/core/src/services/etcd/docs.md +45 -0
- data/core/src/services/etcd/error.rs +26 -0
- data/core/src/services/etcd/lister.rs +79 -0
- data/core/src/services/etcd/mod.rs +36 -0
- data/core/src/services/etcd/writer.rs +61 -0
- data/core/src/services/foundationdb/backend.rs +171 -0
- data/core/src/services/foundationdb/config.rs +45 -0
- data/core/src/services/foundationdb/docs.md +42 -0
- data/core/src/services/foundationdb/mod.rs +24 -0
- data/core/src/services/fs/backend.rs +299 -0
- data/core/src/services/fs/config.rs +33 -0
- data/core/src/services/fs/core.rs +227 -0
- data/core/src/services/fs/delete.rs +53 -0
- data/core/src/services/fs/docs.md +49 -0
- data/core/src/services/fs/error.rs +31 -0
- data/core/src/services/fs/lister.rs +81 -0
- data/core/src/services/fs/mod.rs +40 -0
- data/core/src/services/fs/reader.rs +83 -0
- data/core/src/services/fs/writer.rs +212 -0
- data/core/src/services/ftp/backend.rs +388 -0
- data/core/src/services/ftp/config.rs +46 -0
- data/core/src/services/ftp/core.rs +136 -0
- data/core/src/services/ftp/delete.rs +62 -0
- data/core/src/services/ftp/docs.md +42 -0
- data/core/src/services/ftp/err.rs +47 -0
- data/core/src/services/ftp/lister.rs +72 -0
- data/core/src/services/ftp/mod.rs +41 -0
- data/core/src/services/ftp/reader.rs +84 -0
- data/core/src/services/ftp/writer.rs +122 -0
- data/core/src/services/gcs/backend.rs +499 -0
- data/core/src/services/gcs/config.rs +168 -0
- data/core/src/services/gcs/core.rs +1079 -0
- data/core/src/services/gcs/delete.rs +98 -0
- data/core/src/services/gcs/docs.md +76 -0
- data/core/src/services/gcs/error.rs +122 -0
- data/core/src/services/gcs/lister.rs +136 -0
- data/core/src/services/gcs/mod.rs +40 -0
- data/core/src/services/gcs/uri.rs +75 -0
- data/core/src/services/gcs/writer.rs +163 -0
- data/core/src/services/gdrive/backend.rs +176 -0
- data/core/src/services/gdrive/builder.rs +228 -0
- data/core/src/services/gdrive/config.rs +47 -0
- data/core/src/services/gdrive/core.rs +499 -0
- data/core/src/services/gdrive/delete.rs +57 -0
- data/core/src/services/gdrive/docs.md +65 -0
- data/core/src/services/gdrive/error.rs +80 -0
- data/core/src/services/gdrive/lister.rs +110 -0
- data/core/src/services/gdrive/mod.rs +40 -0
- data/core/src/services/gdrive/writer.rs +77 -0
- data/core/src/services/ghac/backend.rs +285 -0
- data/core/src/services/ghac/config.rs +36 -0
- data/core/src/services/ghac/core.rs +459 -0
- data/core/src/services/ghac/docs.md +84 -0
- data/core/src/services/ghac/error.rs +52 -0
- data/core/src/services/ghac/mod.rs +35 -0
- data/core/src/services/ghac/writer.rs +201 -0
- data/core/src/services/github/backend.rs +285 -0
- data/core/src/services/github/config.rs +59 -0
- data/core/src/services/github/core.rs +351 -0
- data/core/src/services/github/delete.rs +41 -0
- data/core/src/services/github/docs.md +52 -0
- data/core/src/services/github/error.rs +101 -0
- data/core/src/services/github/lister.rs +112 -0
- data/core/src/services/github/mod.rs +38 -0
- data/core/src/services/github/writer.rs +51 -0
- data/core/src/services/gridfs/backend.rs +166 -0
- data/core/src/services/gridfs/config.rs +50 -0
- data/core/src/services/gridfs/core.rs +154 -0
- data/core/src/services/gridfs/docs.md +46 -0
- data/core/src/services/gridfs/mod.rs +26 -0
- data/core/src/services/hdfs/backend.rs +413 -0
- data/core/src/services/hdfs/config.rs +59 -0
- data/core/src/services/hdfs/delete.rs +62 -0
- data/core/src/services/hdfs/docs.md +140 -0
- data/core/src/services/hdfs/lister.rs +70 -0
- data/core/src/services/hdfs/mod.rs +36 -0
- data/core/src/services/hdfs/reader.rs +79 -0
- data/core/src/services/hdfs/writer.rs +104 -0
- data/core/src/services/hdfs_native/backend.rs +340 -0
- data/core/src/services/hdfs_native/config.rs +45 -0
- data/core/src/services/hdfs_native/delete.rs +47 -0
- data/core/src/services/hdfs_native/docs.md +35 -0
- data/core/src/services/hdfs_native/error.rs +59 -0
- data/core/src/services/hdfs_native/lister.rs +85 -0
- data/core/src/services/hdfs_native/mod.rs +39 -0
- data/core/src/services/hdfs_native/reader.rs +62 -0
- data/core/src/services/hdfs_native/writer.rs +61 -0
- data/core/src/services/http/backend.rs +291 -0
- data/core/src/services/http/config.rs +49 -0
- data/core/src/services/http/core.rs +125 -0
- data/core/src/services/http/docs.md +45 -0
- data/core/src/services/http/error.rs +53 -0
- data/core/src/services/http/mod.rs +32 -0
- data/core/src/services/huggingface/backend.rs +289 -0
- data/core/src/services/huggingface/config.rs +75 -0
- data/core/src/services/huggingface/core.rs +406 -0
- data/core/src/services/huggingface/docs.md +61 -0
- data/core/src/services/huggingface/error.rs +93 -0
- data/core/src/services/huggingface/lister.rs +91 -0
- data/core/src/services/huggingface/mod.rs +34 -0
- data/core/src/services/ipfs/backend.rs +257 -0
- data/core/src/services/ipfs/config.rs +32 -0
- data/core/src/services/ipfs/core.rs +239 -0
- data/core/src/services/ipfs/docs.md +45 -0
- data/core/src/services/ipfs/error.rs +52 -0
- data/core/src/services/ipfs/ipld.rs +162 -0
- data/core/src/services/ipfs/mod.rs +34 -0
- data/core/src/services/ipmfs/backend.rs +147 -0
- data/core/src/services/ipmfs/builder.rs +166 -0
- data/core/src/services/ipmfs/config.rs +32 -0
- data/core/src/services/ipmfs/core.rs +142 -0
- data/core/src/services/ipmfs/delete.rs +48 -0
- data/core/src/services/ipmfs/docs.md +14 -0
- data/core/src/services/ipmfs/error.rs +83 -0
- data/core/src/services/ipmfs/lister.rs +135 -0
- data/core/src/services/ipmfs/mod.rs +40 -0
- data/core/src/services/ipmfs/writer.rs +49 -0
- data/core/src/services/koofr/backend.rs +361 -0
- data/core/src/services/koofr/config.rs +50 -0
- data/core/src/services/koofr/core.rs +458 -0
- data/core/src/services/koofr/delete.rs +50 -0
- data/core/src/services/koofr/docs.md +51 -0
- data/core/src/services/koofr/error.rs +72 -0
- data/core/src/services/koofr/lister.rs +88 -0
- data/core/src/services/koofr/mod.rs +38 -0
- data/core/src/services/koofr/writer.rs +53 -0
- data/core/src/services/lakefs/backend.rs +309 -0
- data/core/src/services/lakefs/config.rs +81 -0
- data/core/src/services/lakefs/core.rs +261 -0
- data/core/src/services/lakefs/delete.rs +54 -0
- data/core/src/services/lakefs/docs.md +62 -0
- data/core/src/services/lakefs/error.rs +93 -0
- data/core/src/services/lakefs/lister.rs +120 -0
- data/core/src/services/lakefs/mod.rs +38 -0
- data/core/src/services/lakefs/writer.rs +50 -0
- data/core/src/services/memcached/backend.rs +284 -0
- data/core/src/services/memcached/binary.rs +289 -0
- data/core/src/services/memcached/config.rs +43 -0
- data/core/src/services/memcached/docs.md +47 -0
- data/core/src/services/memcached/mod.rs +27 -0
- data/core/src/services/memory/backend.rs +205 -0
- data/core/src/services/memory/config.rs +30 -0
- data/core/src/services/memory/core.rs +80 -0
- data/core/src/services/memory/delete.rs +42 -0
- data/core/src/services/memory/docs.md +36 -0
- data/core/src/services/memory/lister.rs +56 -0
- data/core/src/services/memory/mod.rs +36 -0
- data/core/src/services/memory/writer.rs +85 -0
- data/core/src/services/mini_moka/backend.rs +260 -0
- data/core/src/services/mini_moka/config.rs +56 -0
- data/core/src/services/mini_moka/core.rs +52 -0
- data/core/src/services/mini_moka/delete.rs +42 -0
- data/core/src/services/mini_moka/docs.md +19 -0
- data/core/src/services/mini_moka/lister.rs +68 -0
- data/core/src/services/mini_moka/mod.rs +36 -0
- data/core/src/services/mini_moka/writer.rs +84 -0
- data/core/src/services/mod.rs +206 -0
- data/core/src/services/moka/backend.rs +326 -0
- data/core/src/services/moka/config.rs +59 -0
- data/core/src/services/moka/core.rs +62 -0
- data/core/src/services/moka/delete.rs +42 -0
- data/core/src/services/moka/docs.md +42 -0
- data/core/src/services/moka/lister.rs +65 -0
- data/core/src/services/moka/mod.rs +41 -0
- data/core/src/services/moka/writer.rs +83 -0
- data/core/src/services/mongodb/backend.rs +291 -0
- data/core/src/services/mongodb/config.rs +54 -0
- data/core/src/services/mongodb/docs.md +49 -0
- data/core/src/services/mongodb/mod.rs +24 -0
- data/core/src/services/monoiofs/backend.rs +238 -0
- data/core/src/services/monoiofs/config.rs +34 -0
- data/core/src/services/monoiofs/core.rs +313 -0
- data/core/src/services/monoiofs/delete.rs +64 -0
- data/core/src/services/monoiofs/docs.md +46 -0
- data/core/src/services/monoiofs/mod.rs +36 -0
- data/core/src/services/monoiofs/reader.rs +147 -0
- data/core/src/services/monoiofs/writer.rs +189 -0
- data/core/src/services/mysql/backend.rs +256 -0
- data/core/src/services/mysql/config.rs +66 -0
- data/core/src/services/mysql/docs.md +47 -0
- data/core/src/services/mysql/mod.rs +24 -0
- data/core/src/services/obs/backend.rs +442 -0
- data/core/src/services/obs/config.rs +53 -0
- data/core/src/services/obs/core.rs +608 -0
- data/core/src/services/obs/delete.rs +48 -0
- data/core/src/services/obs/docs.md +54 -0
- data/core/src/services/obs/error.rs +106 -0
- data/core/src/services/obs/lister.rs +101 -0
- data/core/src/services/obs/mod.rs +38 -0
- data/core/src/services/obs/writer.rs +235 -0
- data/core/src/services/onedrive/backend.rs +127 -0
- data/core/src/services/onedrive/builder.rs +236 -0
- data/core/src/services/onedrive/config.rs +49 -0
- data/core/src/services/onedrive/core.rs +691 -0
- data/core/src/services/onedrive/delete.rs +47 -0
- data/core/src/services/onedrive/docs.md +115 -0
- data/core/src/services/onedrive/error.rs +61 -0
- data/core/src/services/onedrive/graph_model.rs +425 -0
- data/core/src/services/onedrive/lister.rs +150 -0
- data/core/src/services/onedrive/mod.rs +42 -0
- data/core/src/services/onedrive/writer.rs +168 -0
- data/core/src/services/opfs/backend.rs +50 -0
- data/core/src/services/opfs/config.rs +25 -0
- data/core/src/services/opfs/core.rs +74 -0
- data/core/src/services/opfs/docs.md +18 -0
- data/core/src/services/opfs/error.rs +27 -0
- data/core/src/services/opfs/mod.rs +30 -0
- data/core/src/services/opfs/utils.rs +70 -0
- data/core/src/services/oss/backend.rs +734 -0
- data/core/src/services/oss/config.rs +113 -0
- data/core/src/services/oss/core.rs +1088 -0
- data/core/src/services/oss/delete.rs +109 -0
- data/core/src/services/oss/docs.md +74 -0
- data/core/src/services/oss/error.rs +109 -0
- data/core/src/services/oss/lister.rs +256 -0
- data/core/src/services/oss/mod.rs +38 -0
- data/core/src/services/oss/writer.rs +228 -0
- data/core/src/services/pcloud/backend.rs +358 -0
- data/core/src/services/pcloud/config.rs +51 -0
- data/core/src/services/pcloud/core.rs +461 -0
- data/core/src/services/pcloud/delete.rs +66 -0
- data/core/src/services/pcloud/docs.md +51 -0
- data/core/src/services/pcloud/error.rs +88 -0
- data/core/src/services/pcloud/lister.rs +95 -0
- data/core/src/services/pcloud/mod.rs +38 -0
- data/core/src/services/pcloud/writer.rs +66 -0
- data/core/src/services/persy/backend.rs +226 -0
- data/core/src/services/persy/config.rs +32 -0
- data/core/src/services/persy/docs.md +43 -0
- data/core/src/services/persy/mod.rs +24 -0
- data/core/src/services/postgresql/backend.rs +258 -0
- data/core/src/services/postgresql/config.rs +66 -0
- data/core/src/services/postgresql/docs.md +47 -0
- data/core/src/services/postgresql/mod.rs +24 -0
- data/core/src/services/redb/backend.rs +280 -0
- data/core/src/services/redb/config.rs +34 -0
- data/core/src/services/redb/docs.md +41 -0
- data/core/src/services/redb/mod.rs +24 -0
- data/core/src/services/redis/backend.rs +442 -0
- data/core/src/services/redis/config.rs +79 -0
- data/core/src/services/redis/core.rs +209 -0
- data/core/src/services/redis/delete.rs +40 -0
- data/core/src/services/redis/docs.md +43 -0
- data/core/src/services/redis/mod.rs +34 -0
- data/core/src/services/redis/writer.rs +57 -0
- data/core/src/services/rocksdb/backend.rs +159 -0
- data/core/src/services/rocksdb/config.rs +34 -0
- data/core/src/services/rocksdb/docs.md +54 -0
- data/core/src/services/rocksdb/mod.rs +24 -0
- data/core/src/services/s3/backend.rs +1293 -0
- data/core/src/services/s3/compatible_services.md +126 -0
- data/core/src/services/s3/config.rs +327 -0
- data/core/src/services/s3/core.rs +1741 -0
- data/core/src/services/s3/delete.rs +109 -0
- data/core/src/services/s3/docs.md +244 -0
- data/core/src/services/s3/error.rs +171 -0
- data/core/src/services/s3/lister.rs +405 -0
- data/core/src/services/s3/mod.rs +38 -0
- data/core/src/services/s3/writer.rs +262 -0
- data/core/src/services/seafile/backend.rs +297 -0
- data/core/src/services/seafile/config.rs +56 -0
- data/core/src/services/seafile/core.rs +475 -0
- data/core/src/services/seafile/delete.rs +40 -0
- data/core/src/services/seafile/docs.md +54 -0
- data/core/src/services/seafile/error.rs +86 -0
- data/core/src/services/seafile/lister.rs +83 -0
- data/core/src/services/seafile/mod.rs +38 -0
- data/core/src/services/seafile/writer.rs +55 -0
- data/core/src/services/sftp/backend.rs +397 -0
- data/core/src/services/sftp/config.rs +50 -0
- data/core/src/services/sftp/core.rs +154 -0
- data/core/src/services/sftp/delete.rs +55 -0
- data/core/src/services/sftp/docs.md +49 -0
- data/core/src/services/sftp/error.rs +57 -0
- data/core/src/services/sftp/lister.rs +88 -0
- data/core/src/services/sftp/mod.rs +42 -0
- data/core/src/services/sftp/reader.rs +78 -0
- data/core/src/services/sftp/utils.rs +51 -0
- data/core/src/services/sftp/writer.rs +67 -0
- data/core/src/services/sled/backend.rs +194 -0
- data/core/src/services/sled/config.rs +45 -0
- data/core/src/services/sled/docs.md +39 -0
- data/core/src/services/sled/mod.rs +24 -0
- data/core/src/services/sqlite/backend.rs +326 -0
- data/core/src/services/sqlite/config.rs +70 -0
- data/core/src/services/sqlite/docs.md +46 -0
- data/core/src/services/sqlite/mod.rs +24 -0
- data/core/src/services/surrealdb/backend.rs +365 -0
- data/core/src/services/surrealdb/config.rs +64 -0
- data/core/src/services/surrealdb/docs.md +54 -0
- data/core/src/services/surrealdb/mod.rs +24 -0
- data/core/src/services/swift/backend.rs +275 -0
- data/core/src/services/swift/compatible_services.md +53 -0
- data/core/src/services/swift/config.rs +53 -0
- data/core/src/services/swift/core.rs +310 -0
- data/core/src/services/swift/delete.rs +49 -0
- data/core/src/services/swift/docs.md +52 -0
- data/core/src/services/swift/error.rs +90 -0
- data/core/src/services/swift/lister.rs +119 -0
- data/core/src/services/swift/mod.rs +38 -0
- data/core/src/services/swift/writer.rs +53 -0
- data/core/src/services/tikv/backend.rs +237 -0
- data/core/src/services/tikv/config.rs +52 -0
- data/core/src/services/tikv/docs.md +43 -0
- data/core/src/services/tikv/mod.rs +24 -0
- data/core/src/services/upyun/backend.rs +317 -0
- data/core/src/services/upyun/config.rs +51 -0
- data/core/src/services/upyun/core.rs +521 -0
- data/core/src/services/upyun/delete.rs +50 -0
- data/core/src/services/upyun/docs.md +51 -0
- data/core/src/services/upyun/error.rs +97 -0
- data/core/src/services/upyun/lister.rs +101 -0
- data/core/src/services/upyun/mod.rs +38 -0
- data/core/src/services/upyun/writer.rs +127 -0
- data/core/src/services/vercel_artifacts/backend.rs +99 -0
- data/core/src/services/vercel_artifacts/builder.rs +117 -0
- data/core/src/services/vercel_artifacts/config.rs +39 -0
- data/core/src/services/vercel_artifacts/core.rs +112 -0
- data/core/src/services/vercel_artifacts/docs.md +40 -0
- data/core/src/services/vercel_artifacts/error.rs +50 -0
- data/core/src/services/vercel_artifacts/mod.rs +36 -0
- data/core/src/services/vercel_artifacts/writer.rs +58 -0
- data/core/src/services/vercel_blob/backend.rs +251 -0
- data/core/src/services/vercel_blob/config.rs +45 -0
- data/core/src/services/vercel_blob/core.rs +449 -0
- data/core/src/services/vercel_blob/delete.rs +38 -0
- data/core/src/services/vercel_blob/docs.md +45 -0
- data/core/src/services/vercel_blob/error.rs +110 -0
- data/core/src/services/vercel_blob/lister.rs +69 -0
- data/core/src/services/vercel_blob/mod.rs +38 -0
- data/core/src/services/vercel_blob/writer.rs +143 -0
- data/core/src/services/webdav/backend.rs +318 -0
- data/core/src/services/webdav/config.rs +53 -0
- data/core/src/services/webdav/core.rs +859 -0
- data/core/src/services/webdav/delete.rs +47 -0
- data/core/src/services/webdav/docs.md +49 -0
- data/core/src/services/webdav/error.rs +53 -0
- data/core/src/services/webdav/lister.rs +106 -0
- data/core/src/services/webdav/mod.rs +38 -0
- data/core/src/services/webdav/writer.rs +56 -0
- data/core/src/services/webhdfs/backend.rs +376 -0
- data/core/src/services/webhdfs/config.rs +52 -0
- data/core/src/services/webhdfs/core.rs +398 -0
- data/core/src/services/webhdfs/delete.rs +46 -0
- data/core/src/services/webhdfs/docs.md +90 -0
- data/core/src/services/webhdfs/error.rs +126 -0
- data/core/src/services/webhdfs/lister.rs +130 -0
- data/core/src/services/webhdfs/message.rs +249 -0
- data/core/src/services/webhdfs/mod.rs +41 -0
- data/core/src/services/webhdfs/writer.rs +177 -0
- data/core/src/services/yandex_disk/backend.rs +267 -0
- data/core/src/services/yandex_disk/config.rs +45 -0
- data/core/src/services/yandex_disk/core.rs +340 -0
- data/core/src/services/yandex_disk/delete.rs +54 -0
- data/core/src/services/yandex_disk/docs.md +45 -0
- data/core/src/services/yandex_disk/error.rs +104 -0
- data/core/src/services/yandex_disk/lister.rs +113 -0
- data/core/src/services/yandex_disk/mod.rs +38 -0
- data/core/src/services/yandex_disk/writer.rs +52 -0
- data/core/src/types/buffer.rs +991 -0
- data/core/src/types/builder.rs +152 -0
- data/core/src/types/capability.rs +209 -0
- data/core/src/types/context/mod.rs +22 -0
- data/core/src/types/context/read.rs +231 -0
- data/core/src/types/context/write.rs +441 -0
- data/core/src/types/delete/deleter.rs +220 -0
- data/core/src/types/delete/futures_delete_sink.rs +176 -0
- data/core/src/types/delete/input.rs +97 -0
- data/core/src/types/delete/mod.rs +26 -0
- data/core/src/types/entry.rs +69 -0
- data/core/src/types/error.rs +570 -0
- data/core/src/types/execute/api.rs +110 -0
- data/core/src/types/execute/executor.rs +96 -0
- data/core/src/types/execute/executors/mod.rs +27 -0
- data/core/src/types/execute/executors/tokio_executor.rs +60 -0
- data/core/src/types/execute/mod.rs +25 -0
- data/core/src/types/list.rs +137 -0
- data/core/src/types/metadata.rs +436 -0
- data/core/src/types/mod.rs +72 -0
- data/core/src/types/mode.rs +68 -0
- data/core/src/types/operator/builder.rs +535 -0
- data/core/src/types/operator/info.rs +63 -0
- data/core/src/types/operator/mod.rs +33 -0
- data/core/src/types/operator/operator.rs +2236 -0
- data/core/src/types/operator/operator_futures.rs +1430 -0
- data/core/src/types/operator/registry.rs +129 -0
- data/core/src/types/options.rs +548 -0
- data/core/src/types/read/buffer_stream.rs +273 -0
- data/core/src/types/read/futures_async_reader.rs +289 -0
- data/core/src/types/read/futures_bytes_stream.rs +157 -0
- data/core/src/types/read/mod.rs +29 -0
- data/core/src/types/read/reader.rs +604 -0
- data/core/src/types/scheme.rs +475 -0
- data/core/src/types/write/buffer_sink.rs +188 -0
- data/core/src/types/write/futures_async_writer.rs +136 -0
- data/core/src/types/write/futures_bytes_sink.rs +103 -0
- data/core/src/types/write/mod.rs +26 -0
- data/core/src/types/write/writer.rs +411 -0
- data/core/tests/behavior/README.md +77 -0
- data/core/tests/behavior/async_copy.rs +314 -0
- data/core/tests/behavior/async_create_dir.rs +53 -0
- data/core/tests/behavior/async_delete.rs +354 -0
- data/core/tests/behavior/async_list.rs +739 -0
- data/core/tests/behavior/async_presign.rs +175 -0
- data/core/tests/behavior/async_read.rs +871 -0
- data/core/tests/behavior/async_rename.rs +210 -0
- data/core/tests/behavior/async_stat.rs +628 -0
- data/core/tests/behavior/async_write.rs +819 -0
- data/core/tests/behavior/main.rs +78 -0
- data/core/tests/behavior/utils.rs +187 -0
- data/core/tests/data/normal_dir/.gitkeep +0 -0
- data/core/tests/data/normal_file.txt +1041 -0
- data/core/tests/data/special_dir !@#$%^&()_+-=;',/.gitkeep +0 -0
- data/core/tests/data/special_file !@#$%^&()_+-=;',.txt +1041 -0
- data/core/users.md +13 -0
- data/extconf.rb +24 -0
- data/lib/opendal.rb +25 -0
- data/lib/opendal_ruby/entry.rb +35 -0
- data/lib/opendal_ruby/io.rb +70 -0
- data/lib/opendal_ruby/metadata.rb +44 -0
- data/lib/opendal_ruby/operator.rb +29 -0
- data/lib/opendal_ruby/operator_info.rb +26 -0
- data/src/capability.rs +146 -0
- data/src/io.rs +464 -0
- data/src/lib.rs +63 -0
- data/src/lister.rs +141 -0
- data/src/metadata.rs +111 -0
- data/src/middlewares.rs +174 -0
- data/src/operator.rs +310 -0
- data/src/operator_info.rs +83 -0
- data/test/blocking_op_test.rb +112 -0
- data/test/capability_test.rb +42 -0
- data/test/io_test.rb +172 -0
- data/test/lister_test.rb +77 -0
- data/test/metadata_test.rb +78 -0
- data/test/middlewares_test.rb +46 -0
- data/test/operator_info_test.rb +35 -0
- data/test/test_helper.rb +36 -0
- metadata +857 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
- Proposal Name: `command_line_interface`
|
|
2
|
+
- Start Date: 2022-07-08
|
|
3
|
+
- RFC PR: [apache/opendal#423](https://github.com/apache/opendal/pull/423)
|
|
4
|
+
- Tracking Issue: [apache/opendal#422](https://github.com/apache/opendal/issues/422)
|
|
5
|
+
|
|
6
|
+
# Summary
|
|
7
|
+
|
|
8
|
+
Add command line interface for OpenDAL.
|
|
9
|
+
|
|
10
|
+
# Motivation
|
|
11
|
+
|
|
12
|
+
> **Q**: There are so many cli out there, why we still need a cli for OpenDAL?
|
|
13
|
+
>
|
|
14
|
+
> **A**: Because there are so many cli out there.
|
|
15
|
+
|
|
16
|
+
To manipulate our date store in different could service, we need to install different clis:
|
|
17
|
+
|
|
18
|
+
- [`aws-cli`]/[`s3cmd`]/... for AWS (S3)
|
|
19
|
+
- [`azcopy`] for Azure Storage Service
|
|
20
|
+
- [`gcloud`] for Google Cloud
|
|
21
|
+
|
|
22
|
+
Those clis provide native and seamless experiences for their own products but also lock us and our data.
|
|
23
|
+
|
|
24
|
+
However, for 80% cases, we just want to do simple jobs like `cp`, `mv` and `rm`. It's boring to figure out how to use them:
|
|
25
|
+
|
|
26
|
+
- `aws --endpoint-url http://127.0.0.1:9900/ s3 cp data s3://testbucket/data --recursive`
|
|
27
|
+
- `azcopy copy 'C:\myDirectory' 'https://mystorageaccount.blob.core.windows.net/mycontainer' --recursive`
|
|
28
|
+
- `gsutil cp data gs://testbucket/`
|
|
29
|
+
|
|
30
|
+
Can we use them in the same way? Can we let the data flow freely?
|
|
31
|
+
|
|
32
|
+
Let's look back OpenDAL's slogan:
|
|
33
|
+
|
|
34
|
+
**Open Data Access Layer that connect the whole world together**
|
|
35
|
+
|
|
36
|
+
This is a natural extension for OpenDAL: providing a command line interface!
|
|
37
|
+
|
|
38
|
+
# Guide-level explanation
|
|
39
|
+
|
|
40
|
+
OpenDAL will provide a new cli called: `oli`. It's a shortcut of `OpenDAL Command Line Interface`.
|
|
41
|
+
|
|
42
|
+
Users can install this cli via:
|
|
43
|
+
|
|
44
|
+
```shell
|
|
45
|
+
cargo install oli
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Or using they favourite package management:
|
|
49
|
+
|
|
50
|
+
```shell
|
|
51
|
+
# Archlinux
|
|
52
|
+
pacman -S oli
|
|
53
|
+
# Debian / Ubuntu
|
|
54
|
+
apt install oli
|
|
55
|
+
# Rocky Linux / Fedora
|
|
56
|
+
dnf install oli
|
|
57
|
+
# macOS
|
|
58
|
+
brew install oli
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
With `oli`, users can:
|
|
62
|
+
|
|
63
|
+
- Upload files to s3: `oli cp books.csv s3://bucket/books.csv`
|
|
64
|
+
- Download files from azblob: `oli cp azblob://bucket/books.csv /tmp/books.csv`
|
|
65
|
+
- Move data between storage services: `oli mv s3://bucket/dir azblob://bucket/dir`
|
|
66
|
+
- Delete all files: `oli rm -rf s3://bucket`
|
|
67
|
+
|
|
68
|
+
`oli` also provide alias to make cloud data manipulating even natural:
|
|
69
|
+
|
|
70
|
+
- `ocp` for `oli cp`
|
|
71
|
+
- `ols` for `oli ls`
|
|
72
|
+
- `omv` for `oli mv`
|
|
73
|
+
- `orm` for `oli rm`
|
|
74
|
+
- `ostat` for `oli stat`
|
|
75
|
+
|
|
76
|
+
`oli` will provide profile management so users don't need to provide credential every time:
|
|
77
|
+
|
|
78
|
+
- `oli profile add my_s3 --bucket test --access-key-id=example --secret-access-key=example`
|
|
79
|
+
- `ocp my_s3://dir /tmp/dir`
|
|
80
|
+
|
|
81
|
+
# Reference-level explanation
|
|
82
|
+
|
|
83
|
+
`oli` will be a separate crate apart from `opendal` so we will not pollute the dependencies of `opendal`. But `oli` will be releases at the same time with the same version of `opendal`. That means `oli` will always use the same (latest) version of opendal.
|
|
84
|
+
|
|
85
|
+
Most operations of `oli` should be trivial, we will propose new RFCs if requiring big changes.
|
|
86
|
+
|
|
87
|
+
`oli` won't keep configuration. All config will go through environment, for example:
|
|
88
|
+
|
|
89
|
+
- `OIL_COLOR=always`
|
|
90
|
+
- `OIL_CONCURRENCY=16`
|
|
91
|
+
|
|
92
|
+
Besides, `oil` will read profile from env like `cargo`:
|
|
93
|
+
|
|
94
|
+
- `OIL_PROFILE_TEST_TYPE=s3`
|
|
95
|
+
- `OIL_PROFILE_TEST_ENDPOINT=http://127.0.0.1:1090`
|
|
96
|
+
- `OIL_PROFILE_TEST_BUCKET=test_bucket`
|
|
97
|
+
- `OIL_PROFILE_TEST_ACCESS_KEPT_ID=access_key_id`
|
|
98
|
+
- `OIL_PROFILE_TEST_SECRET_ACCESS_KEY=secret_access_key`
|
|
99
|
+
|
|
100
|
+
With those environments, we can:
|
|
101
|
+
|
|
102
|
+
```shell
|
|
103
|
+
ocp path/to/dir test://test/to/dir
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
# Drawbacks
|
|
107
|
+
|
|
108
|
+
None
|
|
109
|
+
|
|
110
|
+
# Rationale and alternatives
|
|
111
|
+
|
|
112
|
+
## s3cmd
|
|
113
|
+
|
|
114
|
+
[s3cmd](https://s3tools.org/s3cmd) is a command line s3 client for Linux and Mac.
|
|
115
|
+
|
|
116
|
+
```shell
|
|
117
|
+
Usage: s3cmd [options] COMMAND [parameters]
|
|
118
|
+
|
|
119
|
+
S3cmd is a tool for managing objects in Amazon S3 storage. It allows for
|
|
120
|
+
making and removing "buckets" and uploading, downloading and removing
|
|
121
|
+
"objects" from these buckets.
|
|
122
|
+
|
|
123
|
+
Commands:
|
|
124
|
+
Make bucket
|
|
125
|
+
s3cmd mb s3://BUCKET
|
|
126
|
+
Remove bucket
|
|
127
|
+
s3cmd rb s3://BUCKET
|
|
128
|
+
List objects or buckets
|
|
129
|
+
s3cmd ls [s3://BUCKET[/PREFIX]]
|
|
130
|
+
List all object in all buckets
|
|
131
|
+
s3cmd la
|
|
132
|
+
Put file into bucket
|
|
133
|
+
s3cmd put FILE [FILE...] s3://BUCKET[/PREFIX]
|
|
134
|
+
Get file from bucket
|
|
135
|
+
s3cmd get s3://BUCKET/OBJECT LOCAL_FILE
|
|
136
|
+
Delete file from bucket
|
|
137
|
+
s3cmd del s3://BUCKET/OBJECT
|
|
138
|
+
Delete file from bucket (alias for del)
|
|
139
|
+
s3cmd rm s3://BUCKET/OBJECT
|
|
140
|
+
Restore file from Glacier storage
|
|
141
|
+
s3cmd restore s3://BUCKET/OBJECT
|
|
142
|
+
Synchronize a directory tree to S3 (checks files freshness using
|
|
143
|
+
size and md5 checksum, unless overridden by options, see below)
|
|
144
|
+
s3cmd sync LOCAL_DIR s3://BUCKET[/PREFIX] or s3://BUCKET[/PREFIX] LOCAL_DIR
|
|
145
|
+
Disk usage by buckets
|
|
146
|
+
s3cmd du [s3://BUCKET[/PREFIX]]
|
|
147
|
+
Get various information about Buckets or Files
|
|
148
|
+
s3cmd info s3://BUCKET[/OBJECT]
|
|
149
|
+
Copy object
|
|
150
|
+
s3cmd cp s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]
|
|
151
|
+
Modify object metadata
|
|
152
|
+
s3cmd modify s3://BUCKET1/OBJECT
|
|
153
|
+
Move object
|
|
154
|
+
s3cmd mv s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]
|
|
155
|
+
Modify Access control list for Bucket or Files
|
|
156
|
+
s3cmd setacl s3://BUCKET[/OBJECT]
|
|
157
|
+
Modify Bucket Policy
|
|
158
|
+
s3cmd setpolicy FILE s3://BUCKET
|
|
159
|
+
Delete Bucket Policy
|
|
160
|
+
s3cmd delpolicy s3://BUCKET
|
|
161
|
+
Modify Bucket CORS
|
|
162
|
+
s3cmd setcors FILE s3://BUCKET
|
|
163
|
+
Delete Bucket CORS
|
|
164
|
+
s3cmd delcors s3://BUCKET
|
|
165
|
+
Modify Bucket Requester Pays policy
|
|
166
|
+
s3cmd payer s3://BUCKET
|
|
167
|
+
Show multipart uploads
|
|
168
|
+
s3cmd multipart s3://BUCKET [Id]
|
|
169
|
+
Abort a multipart upload
|
|
170
|
+
s3cmd abortmp s3://BUCKET/OBJECT Id
|
|
171
|
+
List parts of a multipart upload
|
|
172
|
+
s3cmd listmp s3://BUCKET/OBJECT Id
|
|
173
|
+
Enable/disable bucket access logging
|
|
174
|
+
s3cmd accesslog s3://BUCKET
|
|
175
|
+
Sign arbitrary string using the secret key
|
|
176
|
+
s3cmd sign STRING-TO-SIGN
|
|
177
|
+
Sign an S3 URL to provide limited public access with expiry
|
|
178
|
+
s3cmd signurl s3://BUCKET/OBJECT <expiry_epoch|+expiry_offset>
|
|
179
|
+
Fix invalid file names in a bucket
|
|
180
|
+
s3cmd fixbucket s3://BUCKET[/PREFIX]
|
|
181
|
+
Create Website from bucket
|
|
182
|
+
s3cmd ws-create s3://BUCKET
|
|
183
|
+
Delete Website
|
|
184
|
+
s3cmd ws-delete s3://BUCKET
|
|
185
|
+
Info about Website
|
|
186
|
+
s3cmd ws-info s3://BUCKET
|
|
187
|
+
Set or delete expiration rule for the bucket
|
|
188
|
+
s3cmd expire s3://BUCKET
|
|
189
|
+
Upload a lifecycle policy for the bucket
|
|
190
|
+
s3cmd setlifecycle FILE s3://BUCKET
|
|
191
|
+
Get a lifecycle policy for the bucket
|
|
192
|
+
s3cmd getlifecycle s3://BUCKET
|
|
193
|
+
Remove a lifecycle policy for the bucket
|
|
194
|
+
s3cmd dellifecycle s3://BUCKET
|
|
195
|
+
List CloudFront distribution points
|
|
196
|
+
s3cmd cflist
|
|
197
|
+
Display CloudFront distribution point parameters
|
|
198
|
+
s3cmd cfinfo [cf://DIST_ID]
|
|
199
|
+
Create CloudFront distribution point
|
|
200
|
+
s3cmd cfcreate s3://BUCKET
|
|
201
|
+
Delete CloudFront distribution point
|
|
202
|
+
s3cmd cfdelete cf://DIST_ID
|
|
203
|
+
Change CloudFront distribution point parameters
|
|
204
|
+
s3cmd cfmodify cf://DIST_ID
|
|
205
|
+
Display CloudFront invalidation request(s) status
|
|
206
|
+
s3cmd cfinvalinfo cf://DIST_ID[/INVAL_ID]
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## aws-cli
|
|
210
|
+
|
|
211
|
+
[aws-cli](https://aws.amazon.com/cli/) is the official cli provided by AWS.
|
|
212
|
+
|
|
213
|
+
```shell
|
|
214
|
+
$ aws s3 ls s3://mybucket
|
|
215
|
+
LastWriteTime Length Name
|
|
216
|
+
------------ ------ ----
|
|
217
|
+
PRE myfolder/
|
|
218
|
+
2013-09-03 10:00:00 1234 myfile.txt
|
|
219
|
+
|
|
220
|
+
$ aws s3 cp myfolder s3://mybucket/myfolder --recursive
|
|
221
|
+
upload: myfolder/file1.txt to s3://mybucket/myfolder/file1.txt
|
|
222
|
+
upload: myfolder/subfolder/file1.txt to s3://mybucket/myfolder/subfolder/file1.txt
|
|
223
|
+
|
|
224
|
+
$ aws s3 sync myfolder s3://mybucket/myfolder --exclude *.tmp
|
|
225
|
+
upload: myfolder/newfile.txt to s3://mybucket/myfolder/newfile.txt
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## azcopy
|
|
229
|
+
|
|
230
|
+
[azcopy](https://github.com/Azure/azure-storage-azcopy) is the new Azure Storage data transfer utility.
|
|
231
|
+
|
|
232
|
+
```shell
|
|
233
|
+
azcopy copy 'C:\myDirectory\myTextFile.txt' 'https://mystorageaccount.blob.core.windows.net/mycontainer/myTextFile.txt'
|
|
234
|
+
|
|
235
|
+
azcopy copy 'https://mystorageaccount.blob.core.windows.net/mycontainer/myTextFile.txt' 'C:\myDirectory\myTextFile.txt'
|
|
236
|
+
|
|
237
|
+
azcopy sync 'C:\myDirectory' 'https://mystorageaccount.blob.core.windows.net/mycontainer' --recursive
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## gsutil
|
|
241
|
+
|
|
242
|
+
[gsutil](https://cloud.google.com/storage/docs/gsutil) is a Python application that lets you access Cloud Storage from the command line.
|
|
243
|
+
|
|
244
|
+
```shell
|
|
245
|
+
gsutil cp [OPTION]... src_url dst_url
|
|
246
|
+
gsutil cp [OPTION]... src_url... dst_url
|
|
247
|
+
gsutil cp [OPTION]... -I dst_url
|
|
248
|
+
|
|
249
|
+
gsutil mv [-p] src_url dst_url
|
|
250
|
+
gsutil mv [-p] src_url... dst_url
|
|
251
|
+
gsutil mv [-p] -I dst_url
|
|
252
|
+
|
|
253
|
+
gsutil rm [-f] [-r] url...
|
|
254
|
+
gsutil rm [-f] [-r] -I
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
# Unresolved questions
|
|
258
|
+
|
|
259
|
+
None.
|
|
260
|
+
|
|
261
|
+
# Future possibilities
|
|
262
|
+
|
|
263
|
+
None.
|
|
264
|
+
|
|
265
|
+
[`aws-cli`]: https://github.com/aws/aws-cli
|
|
266
|
+
[`s3cmd`]: https://s3tools.org/s3cmd
|
|
267
|
+
[`azcopy`]: https://github.com/Azure/azure-storage-azcopy
|
|
268
|
+
[`gcloud`]: https://cloud.google.com/sdk/docs/install
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
- Proposal Name: `init_from_iter`
|
|
2
|
+
- Start Date: 2022-07-10
|
|
3
|
+
- RFC PR: [apache/opendal#429](https://github.com/apache/opendal/pull/429)
|
|
4
|
+
- Tracking Issue: [apache/opendal#430](https://github.com/apache/opendal/issues/430)
|
|
5
|
+
|
|
6
|
+
# Summary
|
|
7
|
+
|
|
8
|
+
Allow initializing opendal operators from an iterator.
|
|
9
|
+
|
|
10
|
+
# Motivation
|
|
11
|
+
|
|
12
|
+
To init OpenDAL operators, users have to init an accessor first.
|
|
13
|
+
|
|
14
|
+
```rust
|
|
15
|
+
let root = &env::var("OPENDAL_S3_ROOT").unwrap_or_else(|_| "/".to_string());
|
|
16
|
+
let root = format!("/{}/{}", root, uuid::Uuid::new_v4());
|
|
17
|
+
|
|
18
|
+
let mut builder = opendal::services::s3::Backend::build();
|
|
19
|
+
builder.root(&root);
|
|
20
|
+
builder.bucket(&env::var("OPENDAL_S3_BUCKET").expect("OPENDAL_S3_BUCKET must set"));
|
|
21
|
+
builder.endpoint(&env::var("OPENDAL_S3_ENDPOINT").unwrap_or_default());
|
|
22
|
+
builder.access_key_id(&env::var("OPENDAL_S3_ACCESS_KEY_ID").unwrap_or_default());
|
|
23
|
+
builder.secret_access_key(&env::var("OPENDAL_S3_SECRET_ACCESS_KEY").unwrap_or_default());
|
|
24
|
+
builder
|
|
25
|
+
.server_side_encryption(&env::var("OPENDAL_S3_SERVER_SIDE_ENCRYPTION").unwrap_or_default());
|
|
26
|
+
builder.server_side_encryption_customer_algorithm(
|
|
27
|
+
&env::var("OPENDAL_S3_SERVER_SIDE_ENCRYPTION_CUSTOMER_ALGORITHM").unwrap_or_default(),
|
|
28
|
+
);
|
|
29
|
+
builder.server_side_encryption_customer_key(
|
|
30
|
+
&env::var("OPENDAL_S3_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY").unwrap_or_default(),
|
|
31
|
+
);
|
|
32
|
+
builder.server_side_encryption_customer_key_md5(
|
|
33
|
+
&env::var("OPENDAL_S3_SERVER_SIDE_ENCRYPTION_CUSTOMER_KEY_MD5").unwrap_or_default(),
|
|
34
|
+
);
|
|
35
|
+
builder.server_side_encryption_aws_kms_key_id(
|
|
36
|
+
&env::var("OPENDAL_S3_SERVER_SIDE_ENCRYPTION_AWS_KMS_KEY_ID").unwrap_or_default(),
|
|
37
|
+
);
|
|
38
|
+
if env::var("OPENDAL_S3_ENABLE_VIRTUAL_HOST_STYLE").unwrap_or_default() == "on" {
|
|
39
|
+
builder.enable_virtual_host_style();
|
|
40
|
+
}
|
|
41
|
+
Ok(Some(builder.finish().await?))
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
We can simplify this logic if opendal has its native `from_iter` support.
|
|
45
|
+
|
|
46
|
+
# Guide-level explanation
|
|
47
|
+
|
|
48
|
+
Users can init an operator like the following:
|
|
49
|
+
|
|
50
|
+
```rust
|
|
51
|
+
// OPENDAL_S3_BUCKET = <bucket>
|
|
52
|
+
// OPENDAL_S3_ENDPOINT = <endpoint>
|
|
53
|
+
let op = Operator::from_env(Scheme::S3)?;
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Or from a prefixed env:
|
|
57
|
+
|
|
58
|
+
```rust
|
|
59
|
+
// OIL_PROFILE_<name>_S3_BUCKET = <bucket>
|
|
60
|
+
// OIL_PROFILE_<name>_S3_ENDPOINT = <endpoint>
|
|
61
|
+
let op = Operator::from_env(Scheme::S3, "OIL_PROFILE_<name>")?;
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Also, we call the underlying function directly:
|
|
65
|
+
|
|
66
|
+
```rust
|
|
67
|
+
// var it: impl Iterator<Item=(String, String)>
|
|
68
|
+
let op = Operator::from_iter(Scheme::S3, it)?;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
# Reference-level explanation
|
|
72
|
+
|
|
73
|
+
Internally, every service's backend will implement the following functions:
|
|
74
|
+
|
|
75
|
+
```rust
|
|
76
|
+
fn from_iter(it: impl Iterator<Item=(String, String)>) -> Backend {}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Note: it's not a public API of `Accessor`, and it will never be. Instead, we will use this function inside the crate to keep the ability to refactor or even remove it.
|
|
80
|
+
|
|
81
|
+
# Drawbacks
|
|
82
|
+
|
|
83
|
+
None.
|
|
84
|
+
|
|
85
|
+
# Rationale and alternatives
|
|
86
|
+
|
|
87
|
+
None
|
|
88
|
+
|
|
89
|
+
# Prior art
|
|
90
|
+
|
|
91
|
+
None
|
|
92
|
+
|
|
93
|
+
# Unresolved questions
|
|
94
|
+
|
|
95
|
+
None
|
|
96
|
+
|
|
97
|
+
# Future possibilities
|
|
98
|
+
|
|
99
|
+
## Connection string
|
|
100
|
+
|
|
101
|
+
It sounds a good idea to implement something like:
|
|
102
|
+
|
|
103
|
+
```rust
|
|
104
|
+
let op = Operator::open("s3://bucket?region=test")?
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
But there are no valid use cases. Let's implement this in the future if needed.
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
- Proposal Name: `multipart`
|
|
2
|
+
- Start Date: 2022-07-11
|
|
3
|
+
- RFC PR: [apache/opendal#438](https://github.com/apache/opendal/pull/438)
|
|
4
|
+
- Tracking Issue: [apache/opendal#439](https://github.com/apache/opendal/issues/439)
|
|
5
|
+
|
|
6
|
+
# Summary
|
|
7
|
+
|
|
8
|
+
Add multipart support in OpenDAL.
|
|
9
|
+
|
|
10
|
+
# Motivation
|
|
11
|
+
|
|
12
|
+
[Multipart Upload](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html) APIs are widely used in object storage services to upload large files concurrently and resumable.
|
|
13
|
+
|
|
14
|
+
A successful multipart upload includes the following steps:
|
|
15
|
+
|
|
16
|
+
- `CreateMultipartUpload`: Start a new multipart upload.
|
|
17
|
+
- `UploadPart`: Upload a single part with the previously uploaded id.
|
|
18
|
+
- `CompleteMultipartUpload`: Complete a multipart upload to get a regular object.
|
|
19
|
+
|
|
20
|
+
To cancel a multipart upload, users need to call `AbortMultipartUpload`.
|
|
21
|
+
|
|
22
|
+
Apart from those APIs, most object services also provide a list API to get the current multipart uploads status:
|
|
23
|
+
|
|
24
|
+
- `ListMultipartUploads`: List current ongoing multipart uploads
|
|
25
|
+
- `ListParts`: List already uploaded parts.
|
|
26
|
+
|
|
27
|
+
Before `CompleteMultipartUpload` has been called, users can't read already uploaded parts.
|
|
28
|
+
|
|
29
|
+
After `CompleteMultipartUpload` or `AbortMultipartUpload` has been called, all uploaded parts will be removed.
|
|
30
|
+
|
|
31
|
+
Object storage services commonly allow 10000 parts, and every part will allow up to 5 GiB. This way, users can upload a file up to 48.8 TiB.
|
|
32
|
+
|
|
33
|
+
OpenDAL users can upload objects larger than 5 GiB via supporting multipart uploads.
|
|
34
|
+
|
|
35
|
+
# Guide-level explanation
|
|
36
|
+
|
|
37
|
+
Users can start a multipart upload via:
|
|
38
|
+
|
|
39
|
+
```rust
|
|
40
|
+
let mp = op.object("path/to/file").create_multipart().await?;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Or build a multipart via already known upload id:
|
|
44
|
+
|
|
45
|
+
```rust
|
|
46
|
+
let mp = op.object("path/to/file").into_multipart("<upload_id>");
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
With `Multipart`, we can upload a new part:
|
|
50
|
+
|
|
51
|
+
```rust
|
|
52
|
+
let part = mp.write(part_number, content).await?;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
After all parts have been uploaded, we can finish this upload:
|
|
56
|
+
|
|
57
|
+
```rust
|
|
58
|
+
let _ = mp.complete(parts).await?;
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Or, we can abort already uploaded parts:
|
|
62
|
+
|
|
63
|
+
```rust
|
|
64
|
+
let _ = mp.abort().await?;
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
# Reference-level explanation
|
|
68
|
+
|
|
69
|
+
`Accessor` will add the following APIs:
|
|
70
|
+
|
|
71
|
+
```rust
|
|
72
|
+
pub trait Accessor: Send + Sync + Debug {
|
|
73
|
+
async fn create_multipart(&self, args: &OpCreateMultipart) -> Result<String> {
|
|
74
|
+
let _ = args;
|
|
75
|
+
unimplemented!()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async fn write_multipart(&self, args: &OpWriteMultipart) -> Result<PartWriter> {
|
|
79
|
+
let _ = args;
|
|
80
|
+
unimplemented!()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
async fn complete_multipart(&self, args: &OpCompleteMultipart) -> Result<()> {
|
|
84
|
+
let _ = args;
|
|
85
|
+
unimplemented!()
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async fn abort_multipart(&self, args: &OpAbortMultipart) -> Result<()> {
|
|
89
|
+
let _ = args;
|
|
90
|
+
unimplemented!()
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
While closing a `PartWriter`, a `Part` will be generated.
|
|
96
|
+
|
|
97
|
+
`Operator` will build APIs based on `Accessor`:
|
|
98
|
+
|
|
99
|
+
```rust
|
|
100
|
+
impl Object {
|
|
101
|
+
async fn create_multipart(&self) -> Result<Multipart> {}
|
|
102
|
+
fn into_multipart(&self, upload_id: &str) -> Multipart {}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
impl Multipart {
|
|
106
|
+
async fn write(&self, part_number: usize, bs: impl AsRef<[u8]>) -> Result<Part> {}
|
|
107
|
+
async fn writer(&self, part_number: usize, size: u64) -> Result<impl PartWrite> {}
|
|
108
|
+
async fn complete(&self, ps: &[Part]) -> Result<()> {}
|
|
109
|
+
async fn abort(&self) -> Result<()> {}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
# Drawbacks
|
|
114
|
+
|
|
115
|
+
None.
|
|
116
|
+
|
|
117
|
+
# Rationale and alternatives
|
|
118
|
+
|
|
119
|
+
## Why not add new object modes?
|
|
120
|
+
|
|
121
|
+
It seems natural to add a new object mode like `multipart`.
|
|
122
|
+
|
|
123
|
+
```rust
|
|
124
|
+
pub enum ObjectMode {
|
|
125
|
+
FILE,
|
|
126
|
+
DIR,
|
|
127
|
+
MULTIPART,
|
|
128
|
+
Unknown,
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
However, to make this work, we need big API breaks that introduce `mode` in Object.
|
|
133
|
+
|
|
134
|
+
And we need to change every API call to accept `mode` as args.
|
|
135
|
+
|
|
136
|
+
For example:
|
|
137
|
+
|
|
138
|
+
```rust
|
|
139
|
+
let _ = op.object("path/to/dir/").list(ObjectMODE::MULTIPART);
|
|
140
|
+
let _ = op.object("path/to/file").stat(ObjectMODE::MULTIPART)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Why not split Object into File and Dir?
|
|
144
|
+
|
|
145
|
+
We can split `Object` into `File` and `Dir` to avoid requiring `mode` in API. There is a vast API breakage too.
|
|
146
|
+
|
|
147
|
+
# Prior art
|
|
148
|
+
|
|
149
|
+
None.
|
|
150
|
+
|
|
151
|
+
# Unresolved questions
|
|
152
|
+
|
|
153
|
+
None.
|
|
154
|
+
|
|
155
|
+
# Future possibilities
|
|
156
|
+
|
|
157
|
+
## Support list multipart uploads
|
|
158
|
+
|
|
159
|
+
We can support listing multipart uploads to list ongoing multipart uploads so we can resume an upload or abort them.
|
|
160
|
+
|
|
161
|
+
## Support list part
|
|
162
|
+
|
|
163
|
+
We can support listing parts to list already uploaded parts for an upload.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
- Proposal Name: `gateway`
|
|
2
|
+
- Start Date: 2022-07-18
|
|
3
|
+
- RFC PR: [apache/opendal#443](https://github.com/apache/opendal/pull/443)
|
|
4
|
+
- Tracking Issue: [apache/opendal#444](https://github.com/apache/opendal/issues/444)
|
|
5
|
+
|
|
6
|
+
# Summary
|
|
7
|
+
|
|
8
|
+
Add Gateway for OpenDAL.
|
|
9
|
+
|
|
10
|
+
# Motivation
|
|
11
|
+
|
|
12
|
+
Our users want features like [S3 Proxy](https://github.com/gaul/s3proxy) and [minio Gateway](https://blog.min.io/deprecation-of-the-minio-gateway/) so that they can access all their data in the same way.
|
|
13
|
+
|
|
14
|
+
By providing a native gateway, we can empower users to access different storage in the same API.
|
|
15
|
+
|
|
16
|
+
# Guide-level explanation
|
|
17
|
+
|
|
18
|
+
OpenDAL will provide a new binary called: `oay`. It's a shortcut of `OpenDAL Gateway`.
|
|
19
|
+
|
|
20
|
+
Uses can install this binary via:
|
|
21
|
+
|
|
22
|
+
```shell
|
|
23
|
+
cargo install oay
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Or using they favourite package management:
|
|
27
|
+
|
|
28
|
+
```shell
|
|
29
|
+
# Archlinux
|
|
30
|
+
pacman -S oay
|
|
31
|
+
# Debian / Ubuntu
|
|
32
|
+
apt install oay
|
|
33
|
+
# Rocky Linux / Fedora
|
|
34
|
+
dnf install oay
|
|
35
|
+
# macOS
|
|
36
|
+
brew install oay
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
With `oay`, users can:
|
|
40
|
+
|
|
41
|
+
- Serve `fs` backend with S3 compatible API.
|
|
42
|
+
- Serve `s3` backend with Azblob API
|
|
43
|
+
- Serve as a s3 signing services
|
|
44
|
+
|
|
45
|
+
# Reference-level explanation
|
|
46
|
+
|
|
47
|
+
`oay` will be a separate crate apart from `opendal` so we will not pollute the dependencies of `opendal`. But `oay` will be releases at the same time with the same version of `opendal`. That means `oay` will always use the same (latest) version of opendal.
|
|
48
|
+
|
|
49
|
+
Most operations of `oay` should be trivial, we will propose new RFCs if requiring big changes.
|
|
50
|
+
|
|
51
|
+
`oay` won't keep configuration. All config will go through environment.
|
|
52
|
+
|
|
53
|
+
# Drawbacks
|
|
54
|
+
|
|
55
|
+
None
|
|
56
|
+
|
|
57
|
+
# Rationale and alternatives
|
|
58
|
+
|
|
59
|
+
None
|
|
60
|
+
|
|
61
|
+
# Prior art
|
|
62
|
+
|
|
63
|
+
- [S3 Proxy](https://github.com/gaul/s3proxy)
|
|
64
|
+
- [minio Gateway](https://blog.min.io/deprecation-of-the-minio-gateway/)
|
|
65
|
+
- [oxyno-zeta/s3-proxy](https://github.com/oxyno-zeta/s3-proxy)
|
|
66
|
+
|
|
67
|
+
# Unresolved questions
|
|
68
|
+
|
|
69
|
+
None
|
|
70
|
+
|
|
71
|
+
# Future possibilities
|
|
72
|
+
|
|
73
|
+
None
|