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,459 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use std::env;
|
|
19
|
+
use std::fmt::Debug;
|
|
20
|
+
use std::fmt::Formatter;
|
|
21
|
+
use std::str::FromStr;
|
|
22
|
+
use std::sync::Arc;
|
|
23
|
+
|
|
24
|
+
use ::ghac::v1 as ghac_types;
|
|
25
|
+
use bytes::Buf;
|
|
26
|
+
use bytes::Bytes;
|
|
27
|
+
use http::header::ACCEPT;
|
|
28
|
+
use http::header::AUTHORIZATION;
|
|
29
|
+
use http::header::CONTENT_LENGTH;
|
|
30
|
+
use http::header::CONTENT_RANGE;
|
|
31
|
+
use http::header::CONTENT_TYPE;
|
|
32
|
+
use http::header::{self};
|
|
33
|
+
use http::Request;
|
|
34
|
+
use http::Response;
|
|
35
|
+
use http::StatusCode;
|
|
36
|
+
use http::Uri;
|
|
37
|
+
use prost::Message;
|
|
38
|
+
use serde::Deserialize;
|
|
39
|
+
use serde::Serialize;
|
|
40
|
+
|
|
41
|
+
use super::error::parse_error;
|
|
42
|
+
use crate::raw::*;
|
|
43
|
+
use crate::*;
|
|
44
|
+
|
|
45
|
+
/// The base url for cache url.
|
|
46
|
+
pub const CACHE_URL_BASE: &str = "_apis/artifactcache";
|
|
47
|
+
/// The base url for cache service v2.
|
|
48
|
+
pub const CACHE_URL_BASE_V2: &str = "twirp/github.actions.results.api.v1.CacheService";
|
|
49
|
+
/// Cache API requires to provide an accept header.
|
|
50
|
+
pub const CACHE_HEADER_ACCEPT: &str = "application/json;api-version=6.0-preview.1";
|
|
51
|
+
/// The cache url env for ghac.
|
|
52
|
+
///
|
|
53
|
+
/// The url will be like `https://artifactcache.actions.githubusercontent.com/<id>/`
|
|
54
|
+
pub const ACTIONS_CACHE_URL: &str = "ACTIONS_CACHE_URL";
|
|
55
|
+
/// The runtime token env for ghac.
|
|
56
|
+
///
|
|
57
|
+
/// This token will be valid for 6h and github action will running for 6
|
|
58
|
+
/// hours at most. So we don't need to refetch it again.
|
|
59
|
+
pub const ACTIONS_RUNTIME_TOKEN: &str = "ACTIONS_RUNTIME_TOKEN";
|
|
60
|
+
/// The cache service version env for ghac.
|
|
61
|
+
pub const ACTIONS_CACHE_SERVICE_V2: &str = "ACTIONS_CACHE_SERVICE_V2";
|
|
62
|
+
/// The results url env for ghac.
|
|
63
|
+
pub const ACTIONS_RESULTS_URL: &str = "ACTIONS_RESULTS_URL";
|
|
64
|
+
/// The content type for protobuf.
|
|
65
|
+
pub const CONTENT_TYPE_JSON: &str = "application/json";
|
|
66
|
+
/// The content type for protobuf.
|
|
67
|
+
pub const CONTENT_TYPE_PROTOBUF: &str = "application/protobuf";
|
|
68
|
+
|
|
69
|
+
/// The version of github action cache.
|
|
70
|
+
#[derive(Clone, Copy, Debug)]
|
|
71
|
+
pub enum GhacVersion {
|
|
72
|
+
V1,
|
|
73
|
+
V2,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/// Core for github action cache services.
|
|
77
|
+
#[derive(Clone)]
|
|
78
|
+
pub struct GhacCore {
|
|
79
|
+
pub info: Arc<AccessorInfo>,
|
|
80
|
+
|
|
81
|
+
// root should end with "/"
|
|
82
|
+
pub root: String,
|
|
83
|
+
|
|
84
|
+
pub cache_url: String,
|
|
85
|
+
pub catch_token: String,
|
|
86
|
+
pub version: String,
|
|
87
|
+
|
|
88
|
+
pub service_version: GhacVersion,
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
impl Debug for GhacCore {
|
|
92
|
+
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
93
|
+
f.debug_struct("GhacCore")
|
|
94
|
+
.field("root", &self.root)
|
|
95
|
+
.field("cache_url", &self.cache_url)
|
|
96
|
+
.field("version", &self.version)
|
|
97
|
+
.field("service_version", &self.service_version)
|
|
98
|
+
.finish_non_exhaustive()
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
impl GhacCore {
|
|
103
|
+
async fn ghac_get_download_url(&self, path: &str) -> Result<String> {
|
|
104
|
+
let p = build_abs_path(&self.root, path);
|
|
105
|
+
|
|
106
|
+
match self.service_version {
|
|
107
|
+
GhacVersion::V1 => {
|
|
108
|
+
let url = format!(
|
|
109
|
+
"{}{CACHE_URL_BASE}/cache?keys={}&version={}",
|
|
110
|
+
self.cache_url,
|
|
111
|
+
percent_encode_path(&p),
|
|
112
|
+
self.version
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
let mut req = Request::get(&url);
|
|
116
|
+
req = req.header(AUTHORIZATION, format!("Bearer {}", self.catch_token));
|
|
117
|
+
req = req.header(ACCEPT, CACHE_HEADER_ACCEPT);
|
|
118
|
+
|
|
119
|
+
let req = req
|
|
120
|
+
.extension(Operation::Read)
|
|
121
|
+
.body(Buffer::new())
|
|
122
|
+
.map_err(new_request_build_error)?;
|
|
123
|
+
let resp = self.info.http_client().send(req).await?;
|
|
124
|
+
let location = if resp.status() == StatusCode::OK {
|
|
125
|
+
let slc = resp.into_body();
|
|
126
|
+
let query_resp: GhacQueryResponse = serde_json::from_reader(slc.reader())
|
|
127
|
+
.map_err(new_json_deserialize_error)?;
|
|
128
|
+
query_resp.archive_location
|
|
129
|
+
} else {
|
|
130
|
+
return Err(parse_error(resp));
|
|
131
|
+
};
|
|
132
|
+
Ok(location)
|
|
133
|
+
}
|
|
134
|
+
GhacVersion::V2 => {
|
|
135
|
+
let url = format!(
|
|
136
|
+
"{}{CACHE_URL_BASE_V2}/GetCacheEntryDownloadURL",
|
|
137
|
+
self.cache_url,
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
let req = ghac_types::GetCacheEntryDownloadUrlRequest {
|
|
141
|
+
key: p,
|
|
142
|
+
version: self.version.clone(),
|
|
143
|
+
|
|
144
|
+
metadata: None,
|
|
145
|
+
restore_keys: vec![],
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
let body = Buffer::from(req.encode_to_vec());
|
|
149
|
+
|
|
150
|
+
let req = Request::post(&url)
|
|
151
|
+
.header(AUTHORIZATION, format!("Bearer {}", self.catch_token))
|
|
152
|
+
.header(CONTENT_TYPE, CONTENT_TYPE_PROTOBUF)
|
|
153
|
+
.header(CONTENT_LENGTH, body.len())
|
|
154
|
+
.extension(Operation::Read)
|
|
155
|
+
.body(body)
|
|
156
|
+
.map_err(new_request_build_error)?;
|
|
157
|
+
let resp = self.info.http_client().send(req).await?;
|
|
158
|
+
let location = if resp.status() == StatusCode::OK {
|
|
159
|
+
let slc = resp.into_body();
|
|
160
|
+
let query_resp = ghac_types::GetCacheEntryDownloadUrlResponse::decode(slc)
|
|
161
|
+
.map_err(new_prost_decode_error)?;
|
|
162
|
+
if !query_resp.ok {
|
|
163
|
+
let mut err = Error::new(
|
|
164
|
+
ErrorKind::NotFound,
|
|
165
|
+
"GetCacheEntryDownloadURL returns non-ok, the key doesn't exist",
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
// GHAC is a cache service, so it's acceptable for it to occasionally not contain
|
|
169
|
+
// data that users have just written. However, we don't want users to always have
|
|
170
|
+
// to retry reading it, nor do we want our CI to fail constantly.
|
|
171
|
+
//
|
|
172
|
+
// Here's the trick: we check if the environment variable `OPENDAL_TEST` is set to `ghac`.
|
|
173
|
+
// If it is, we mark the error as temporary to allow retries in the test CI.
|
|
174
|
+
if env::var("OPENDAL_TEST") == Ok("ghac".to_string()) {
|
|
175
|
+
err = err.set_temporary();
|
|
176
|
+
}
|
|
177
|
+
return Err(err);
|
|
178
|
+
}
|
|
179
|
+
query_resp.signed_download_url
|
|
180
|
+
} else {
|
|
181
|
+
return Err(parse_error(resp));
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
Ok(location)
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
pub async fn ghac_stat(&self, path: &str) -> Result<Response<Buffer>> {
|
|
190
|
+
let location = self.ghac_get_download_url(path).await?;
|
|
191
|
+
|
|
192
|
+
let req = Request::get(location)
|
|
193
|
+
.header(header::RANGE, "bytes=0-0")
|
|
194
|
+
.extension(Operation::Stat)
|
|
195
|
+
.body(Buffer::new())
|
|
196
|
+
.map_err(new_request_build_error)?;
|
|
197
|
+
|
|
198
|
+
self.info.http_client().send(req).await
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
pub async fn ghac_read(&self, path: &str, range: BytesRange) -> Result<Response<HttpBody>> {
|
|
202
|
+
let location = self.ghac_get_download_url(path).await?;
|
|
203
|
+
|
|
204
|
+
let mut req = Request::get(location);
|
|
205
|
+
|
|
206
|
+
if !range.is_full() {
|
|
207
|
+
req = req.header(header::RANGE, range.to_header());
|
|
208
|
+
}
|
|
209
|
+
let req = req
|
|
210
|
+
.extension(Operation::Read)
|
|
211
|
+
.body(Buffer::new())
|
|
212
|
+
.map_err(new_request_build_error)?;
|
|
213
|
+
|
|
214
|
+
self.info.http_client().fetch(req).await
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
pub async fn ghac_get_upload_url(&self, path: &str) -> Result<String> {
|
|
218
|
+
let p = build_abs_path(&self.root, path);
|
|
219
|
+
|
|
220
|
+
match self.service_version {
|
|
221
|
+
GhacVersion::V1 => {
|
|
222
|
+
let url = format!("{}{CACHE_URL_BASE}/caches", self.cache_url);
|
|
223
|
+
|
|
224
|
+
let bs = serde_json::to_vec(&GhacReserveRequest {
|
|
225
|
+
key: p,
|
|
226
|
+
version: self.version.to_string(),
|
|
227
|
+
})
|
|
228
|
+
.map_err(new_json_serialize_error)?;
|
|
229
|
+
|
|
230
|
+
let mut req = Request::post(&url);
|
|
231
|
+
req = req.header(AUTHORIZATION, format!("Bearer {}", self.catch_token));
|
|
232
|
+
req = req.header(ACCEPT, CACHE_HEADER_ACCEPT);
|
|
233
|
+
req = req.header(CONTENT_TYPE, CONTENT_TYPE_JSON);
|
|
234
|
+
req = req.header(CONTENT_LENGTH, bs.len());
|
|
235
|
+
|
|
236
|
+
let req = req
|
|
237
|
+
.extension(Operation::Write)
|
|
238
|
+
.body(Buffer::from(Bytes::from(bs)))
|
|
239
|
+
.map_err(new_request_build_error)?;
|
|
240
|
+
let resp = self.info.http_client().send(req).await?;
|
|
241
|
+
let cache_id = if resp.status().is_success() {
|
|
242
|
+
let slc = resp.into_body();
|
|
243
|
+
let reserve_resp: GhacReserveResponse = serde_json::from_reader(slc.reader())
|
|
244
|
+
.map_err(new_json_deserialize_error)?;
|
|
245
|
+
reserve_resp.cache_id
|
|
246
|
+
} else {
|
|
247
|
+
return Err(
|
|
248
|
+
parse_error(resp).map(|err| err.with_operation("Backend::ghac_reserve"))
|
|
249
|
+
);
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
let url = format!("{}{CACHE_URL_BASE}/caches/{cache_id}", self.cache_url);
|
|
253
|
+
Ok(url)
|
|
254
|
+
}
|
|
255
|
+
GhacVersion::V2 => {
|
|
256
|
+
let url = format!("{}{CACHE_URL_BASE_V2}/CreateCacheEntry", self.cache_url,);
|
|
257
|
+
|
|
258
|
+
let req = ghac_types::CreateCacheEntryRequest {
|
|
259
|
+
key: p,
|
|
260
|
+
version: self.version.clone(),
|
|
261
|
+
metadata: None,
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
let body = Buffer::from(req.encode_to_vec());
|
|
265
|
+
|
|
266
|
+
let req = Request::post(&url)
|
|
267
|
+
.header(AUTHORIZATION, format!("Bearer {}", self.catch_token))
|
|
268
|
+
.header(CONTENT_TYPE, CONTENT_TYPE_PROTOBUF)
|
|
269
|
+
.header(CONTENT_LENGTH, body.len())
|
|
270
|
+
.extension(Operation::Write)
|
|
271
|
+
.body(body)
|
|
272
|
+
.map_err(new_request_build_error)?;
|
|
273
|
+
let resp = self.info.http_client().send(req).await?;
|
|
274
|
+
let location = if resp.status() == StatusCode::OK {
|
|
275
|
+
let (parts, slc) = resp.into_parts();
|
|
276
|
+
let query_resp = ghac_types::CreateCacheEntryResponse::decode(slc)
|
|
277
|
+
.map_err(new_prost_decode_error)?;
|
|
278
|
+
if !query_resp.ok {
|
|
279
|
+
return Err(Error::new(
|
|
280
|
+
ErrorKind::Unexpected,
|
|
281
|
+
"create cache entry returns non-ok",
|
|
282
|
+
)
|
|
283
|
+
.with_context("parts", format!("{parts:?}")));
|
|
284
|
+
}
|
|
285
|
+
query_resp.signed_upload_url
|
|
286
|
+
} else {
|
|
287
|
+
return Err(parse_error(resp));
|
|
288
|
+
};
|
|
289
|
+
Ok(location)
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
pub async fn ghac_v1_write(
|
|
295
|
+
&self,
|
|
296
|
+
upload_url: &str,
|
|
297
|
+
size: u64,
|
|
298
|
+
offset: u64,
|
|
299
|
+
body: Buffer,
|
|
300
|
+
) -> Result<Response<Buffer>> {
|
|
301
|
+
let mut req = Request::patch(upload_url);
|
|
302
|
+
req = req.header(AUTHORIZATION, format!("Bearer {}", self.catch_token));
|
|
303
|
+
req = req.header(ACCEPT, CACHE_HEADER_ACCEPT);
|
|
304
|
+
req = req.header(CONTENT_LENGTH, size);
|
|
305
|
+
req = req.header(CONTENT_TYPE, "application/octet-stream");
|
|
306
|
+
req = req.header(
|
|
307
|
+
CONTENT_RANGE,
|
|
308
|
+
BytesContentRange::default()
|
|
309
|
+
.with_range(offset, offset + size - 1)
|
|
310
|
+
.to_header(),
|
|
311
|
+
);
|
|
312
|
+
let req = req
|
|
313
|
+
.extension(Operation::Write)
|
|
314
|
+
.body(body)
|
|
315
|
+
.map_err(new_request_build_error)?;
|
|
316
|
+
|
|
317
|
+
self.info.http_client().send(req).await
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
pub async fn ghac_finalize_upload(&self, path: &str, url: &str, size: u64) -> Result<()> {
|
|
321
|
+
let p = build_abs_path(&self.root, path);
|
|
322
|
+
|
|
323
|
+
match self.service_version {
|
|
324
|
+
GhacVersion::V1 => {
|
|
325
|
+
let bs = serde_json::to_vec(&GhacCommitRequest { size })
|
|
326
|
+
.map_err(new_json_serialize_error)?;
|
|
327
|
+
|
|
328
|
+
let req = Request::post(url)
|
|
329
|
+
.header(AUTHORIZATION, format!("Bearer {}", self.catch_token))
|
|
330
|
+
.header(ACCEPT, CACHE_HEADER_ACCEPT)
|
|
331
|
+
.header(CONTENT_TYPE, CONTENT_TYPE_JSON)
|
|
332
|
+
.header(CONTENT_LENGTH, bs.len())
|
|
333
|
+
.extension(Operation::Write)
|
|
334
|
+
.body(Buffer::from(bs))
|
|
335
|
+
.map_err(new_request_build_error)?;
|
|
336
|
+
let resp = self.info.http_client().send(req).await?;
|
|
337
|
+
if resp.status().is_success() {
|
|
338
|
+
Ok(())
|
|
339
|
+
} else {
|
|
340
|
+
Err(parse_error(resp))
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
GhacVersion::V2 => {
|
|
344
|
+
let url = format!(
|
|
345
|
+
"{}{CACHE_URL_BASE_V2}/FinalizeCacheEntryUpload",
|
|
346
|
+
self.cache_url,
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
let req = ghac_types::FinalizeCacheEntryUploadRequest {
|
|
350
|
+
key: p,
|
|
351
|
+
version: self.version.clone(),
|
|
352
|
+
size_bytes: size as i64,
|
|
353
|
+
|
|
354
|
+
metadata: None,
|
|
355
|
+
};
|
|
356
|
+
let body = Buffer::from(req.encode_to_vec());
|
|
357
|
+
|
|
358
|
+
let req = Request::post(&url)
|
|
359
|
+
.header(AUTHORIZATION, format!("Bearer {}", self.catch_token))
|
|
360
|
+
.header(CONTENT_TYPE, CONTENT_TYPE_PROTOBUF)
|
|
361
|
+
.header(CONTENT_LENGTH, body.len())
|
|
362
|
+
.extension(Operation::Write)
|
|
363
|
+
.body(body)
|
|
364
|
+
.map_err(new_request_build_error)?;
|
|
365
|
+
let resp = self.info.http_client().send(req).await?;
|
|
366
|
+
if resp.status() != StatusCode::OK {
|
|
367
|
+
return Err(parse_error(resp));
|
|
368
|
+
};
|
|
369
|
+
Ok(())
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/// Determines if the current environment is GitHub Enterprise Server (GHES)
|
|
376
|
+
///
|
|
377
|
+
/// We need to know this since GHES doesn't support ghac v2 yet.
|
|
378
|
+
pub fn is_ghes() -> bool {
|
|
379
|
+
// Fetch GitHub Server URL with fallback to "https://github.com"
|
|
380
|
+
let server_url =
|
|
381
|
+
env::var("GITHUB_SERVER_URL").unwrap_or_else(|_| "https://github.com".to_string());
|
|
382
|
+
|
|
383
|
+
let Ok(url) = Uri::from_str(&server_url) else {
|
|
384
|
+
// We just return false if the URL is invalid
|
|
385
|
+
return false;
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
// Check against known non-GHES host patterns
|
|
389
|
+
let hostname = url.host().unwrap_or("").trim_end().to_lowercase();
|
|
390
|
+
|
|
391
|
+
let is_github_host = hostname == "github.com";
|
|
392
|
+
let is_ghe_host = hostname.ends_with(".ghe.com");
|
|
393
|
+
let is_localhost = hostname.ends_with(".localhost");
|
|
394
|
+
|
|
395
|
+
!is_github_host && !is_ghe_host && !is_localhost
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/// Determines the cache service version based on environment
|
|
399
|
+
pub fn get_cache_service_version() -> GhacVersion {
|
|
400
|
+
if is_ghes() {
|
|
401
|
+
// GHES only supports v1 regardless of feature flags
|
|
402
|
+
GhacVersion::V1
|
|
403
|
+
} else {
|
|
404
|
+
// Check for presence of non-empty ACTIONS_CACHE_SERVICE_V2
|
|
405
|
+
let value = env::var(ACTIONS_CACHE_SERVICE_V2).unwrap_or_default();
|
|
406
|
+
if value.is_empty() {
|
|
407
|
+
GhacVersion::V1
|
|
408
|
+
} else {
|
|
409
|
+
GhacVersion::V2
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/// Returns the appropriate cache service URL based on version
|
|
415
|
+
pub fn get_cache_service_url(version: GhacVersion) -> String {
|
|
416
|
+
match version {
|
|
417
|
+
GhacVersion::V1 => {
|
|
418
|
+
// Priority order for v1: CACHE_URL -> RESULTS_URL
|
|
419
|
+
env::var(ACTIONS_CACHE_URL)
|
|
420
|
+
.or_else(|_| env::var(ACTIONS_RESULTS_URL))
|
|
421
|
+
.unwrap_or_default()
|
|
422
|
+
}
|
|
423
|
+
GhacVersion::V2 => {
|
|
424
|
+
// Only RESULTS_URL is used for v2
|
|
425
|
+
env::var(ACTIONS_RESULTS_URL).unwrap_or_default()
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/// Parse prost decode error into opendal::Error.
|
|
431
|
+
pub fn new_prost_decode_error(e: prost::DecodeError) -> Error {
|
|
432
|
+
Error::new(ErrorKind::Unexpected, "deserialize protobuf").set_source(e)
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
#[derive(Deserialize)]
|
|
436
|
+
#[serde(rename_all = "camelCase")]
|
|
437
|
+
pub struct GhacQueryResponse {
|
|
438
|
+
// Not used fields.
|
|
439
|
+
// cache_key: String,
|
|
440
|
+
// scope: String,
|
|
441
|
+
pub archive_location: String,
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
#[derive(Serialize)]
|
|
445
|
+
pub struct GhacReserveRequest {
|
|
446
|
+
pub key: String,
|
|
447
|
+
pub version: String,
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
#[derive(Deserialize)]
|
|
451
|
+
#[serde(rename_all = "camelCase")]
|
|
452
|
+
pub struct GhacReserveResponse {
|
|
453
|
+
pub cache_id: i64,
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
#[derive(Serialize)]
|
|
457
|
+
pub struct GhacCommitRequest {
|
|
458
|
+
pub size: u64,
|
|
459
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
## Capabilities
|
|
2
|
+
|
|
3
|
+
This service can be used to:
|
|
4
|
+
|
|
5
|
+
- [x] stat
|
|
6
|
+
- [x] read
|
|
7
|
+
- [x] write
|
|
8
|
+
- [x] create_dir
|
|
9
|
+
- [x] delete
|
|
10
|
+
- [x] copy
|
|
11
|
+
- [ ] rename
|
|
12
|
+
- [ ] list
|
|
13
|
+
- [ ] presign
|
|
14
|
+
- [ ] blocking
|
|
15
|
+
|
|
16
|
+
## Notes
|
|
17
|
+
|
|
18
|
+
This service is mainly provided by GitHub actions.
|
|
19
|
+
|
|
20
|
+
Refer to [Caching dependencies to speed up workflows](https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows) for more information.
|
|
21
|
+
|
|
22
|
+
To make this service work as expected, please make sure to either call `endpoint` and `token` to
|
|
23
|
+
configure the URL and credentials, or that the following environment has been setup correctly:
|
|
24
|
+
|
|
25
|
+
- `ACTIONS_CACHE_URL`
|
|
26
|
+
- `ACTIONS_RUNTIME_TOKEN`
|
|
27
|
+
|
|
28
|
+
They can be exposed by following action:
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
- name: Configure Cache Env
|
|
32
|
+
uses: actions/github-script@v6
|
|
33
|
+
with:
|
|
34
|
+
script: |
|
|
35
|
+
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
|
|
36
|
+
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
To make `delete` work as expected, `GITHUB_TOKEN` should also be set via:
|
|
40
|
+
|
|
41
|
+
```yaml
|
|
42
|
+
env:
|
|
43
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Limitations
|
|
47
|
+
|
|
48
|
+
Unlike other services, ghac doesn't support create empty files.
|
|
49
|
+
We provide a `enable_create_simulation()` to support this operation but may result unexpected side effects.
|
|
50
|
+
|
|
51
|
+
Also, `ghac` is a cache service which means the data store inside could
|
|
52
|
+
be automatically evicted at any time.
|
|
53
|
+
|
|
54
|
+
## Configuration
|
|
55
|
+
|
|
56
|
+
- `root`: Set the work dir for backend.
|
|
57
|
+
|
|
58
|
+
Refer to [`GhacBuilder`]'s public API docs for more information.
|
|
59
|
+
|
|
60
|
+
## Example
|
|
61
|
+
|
|
62
|
+
### Via Builder
|
|
63
|
+
|
|
64
|
+
```no_run
|
|
65
|
+
use std::sync::Arc;
|
|
66
|
+
|
|
67
|
+
use anyhow::Result;
|
|
68
|
+
use opendal::services::Ghac;
|
|
69
|
+
use opendal::Operator;
|
|
70
|
+
|
|
71
|
+
#[tokio::main]
|
|
72
|
+
async fn main() -> Result<()> {
|
|
73
|
+
// Create ghac backend builder.
|
|
74
|
+
let mut builder = Ghac::default()
|
|
75
|
+
// Set the root for ghac, all operations will happen under this root.
|
|
76
|
+
//
|
|
77
|
+
// NOTE: the root must be absolute path.
|
|
78
|
+
.root("/path/to/dir");
|
|
79
|
+
|
|
80
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
81
|
+
|
|
82
|
+
Ok(())
|
|
83
|
+
}
|
|
84
|
+
```
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
use http::Response;
|
|
19
|
+
use http::StatusCode;
|
|
20
|
+
|
|
21
|
+
use crate::raw::*;
|
|
22
|
+
use crate::*;
|
|
23
|
+
|
|
24
|
+
/// Parse error response into Error.
|
|
25
|
+
pub(super) fn parse_error(resp: Response<Buffer>) -> Error {
|
|
26
|
+
let (parts, body) = resp.into_parts();
|
|
27
|
+
|
|
28
|
+
let (kind, retryable) = match parts.status {
|
|
29
|
+
StatusCode::NOT_FOUND | StatusCode::NO_CONTENT => (ErrorKind::NotFound, false),
|
|
30
|
+
StatusCode::CONFLICT => (ErrorKind::AlreadyExists, false),
|
|
31
|
+
StatusCode::FORBIDDEN => (ErrorKind::PermissionDenied, false),
|
|
32
|
+
StatusCode::TOO_MANY_REQUESTS => (ErrorKind::RateLimited, true),
|
|
33
|
+
StatusCode::INTERNAL_SERVER_ERROR
|
|
34
|
+
| StatusCode::BAD_GATEWAY
|
|
35
|
+
| StatusCode::SERVICE_UNAVAILABLE
|
|
36
|
+
| StatusCode::GATEWAY_TIMEOUT => (ErrorKind::Unexpected, true),
|
|
37
|
+
_ => (ErrorKind::Unexpected, false),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
let bs = body.to_bytes();
|
|
41
|
+
let message = String::from_utf8_lossy(&bs);
|
|
42
|
+
|
|
43
|
+
let mut err = Error::new(kind, message);
|
|
44
|
+
|
|
45
|
+
err = with_error_response_context(err, parts);
|
|
46
|
+
|
|
47
|
+
if retryable {
|
|
48
|
+
err = err.set_temporary();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
err
|
|
52
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Licensed to the Apache Software Foundation (ASF) under one
|
|
2
|
+
// or more contributor license agreements. See the NOTICE file
|
|
3
|
+
// distributed with this work for additional information
|
|
4
|
+
// regarding copyright ownership. The ASF licenses this file
|
|
5
|
+
// to you under the Apache License, Version 2.0 (the
|
|
6
|
+
// "License"); you may not use this file except in compliance
|
|
7
|
+
// with the License. You may obtain a copy of the License at
|
|
8
|
+
//
|
|
9
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
//
|
|
11
|
+
// Unless required by applicable law or agreed to in writing,
|
|
12
|
+
// software distributed under the License is distributed on an
|
|
13
|
+
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
// KIND, either express or implied. See the License for the
|
|
15
|
+
// specific language governing permissions and limitations
|
|
16
|
+
// under the License.
|
|
17
|
+
|
|
18
|
+
/// Default scheme for ghac service.
|
|
19
|
+
#[cfg(feature = "services-ghac")]
|
|
20
|
+
pub(super) const DEFAULT_SCHEME: &str = "ghac";
|
|
21
|
+
#[cfg(feature = "services-ghac")]
|
|
22
|
+
mod error;
|
|
23
|
+
#[cfg(feature = "services-ghac")]
|
|
24
|
+
mod writer;
|
|
25
|
+
|
|
26
|
+
#[cfg(feature = "services-ghac")]
|
|
27
|
+
mod backend;
|
|
28
|
+
#[cfg(feature = "services-ghac")]
|
|
29
|
+
pub use backend::GhacBuilder as Ghac;
|
|
30
|
+
|
|
31
|
+
#[cfg(feature = "services-ghac")]
|
|
32
|
+
mod core;
|
|
33
|
+
|
|
34
|
+
mod config;
|
|
35
|
+
pub use config::GhacConfig;
|