opendal 0.1.6.pre.rc.1-aarch64-linux
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/DEPENDENCIES.md +9 -0
- data/DEPENDENCIES.rust.tsv +277 -0
- data/Gemfile +35 -0
- data/README.md +159 -0
- data/Rakefile +149 -0
- data/core/CHANGELOG.md +4929 -0
- data/core/CONTRIBUTING.md +61 -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/types/README.md +9 -0
- data/core/benches/vs_fs/README.md +35 -0
- data/core/benches/vs_s3/README.md +55 -0
- data/core/edge/README.md +3 -0
- data/core/edge/file_write_on_full_disk/README.md +14 -0
- data/core/edge/s3_aws_assume_role_with_web_identity/README.md +18 -0
- data/core/edge/s3_read_on_wasm/.gitignore +3 -0
- data/core/edge/s3_read_on_wasm/README.md +42 -0
- data/core/edge/s3_read_on_wasm/webdriver.json +15 -0
- data/core/examples/README.md +23 -0
- data/core/examples/basic/README.md +15 -0
- data/core/examples/concurrent-upload/README.md +15 -0
- data/core/examples/multipart-upload/README.md +15 -0
- data/core/fuzz/.gitignore +5 -0
- data/core/fuzz/README.md +68 -0
- data/core/src/docs/comparisons/vs_object_store.md +183 -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/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/upgrade.md +1556 -0
- data/core/src/services/aliyun_drive/docs.md +61 -0
- data/core/src/services/alluxio/docs.md +45 -0
- data/core/src/services/azblob/docs.md +77 -0
- data/core/src/services/azdls/docs.md +73 -0
- data/core/src/services/azfile/docs.md +65 -0
- data/core/src/services/b2/docs.md +54 -0
- data/core/src/services/cacache/docs.md +38 -0
- data/core/src/services/cloudflare_kv/docs.md +21 -0
- data/core/src/services/cos/docs.md +55 -0
- data/core/src/services/d1/docs.md +48 -0
- data/core/src/services/dashmap/docs.md +38 -0
- data/core/src/services/dbfs/docs.md +57 -0
- data/core/src/services/dropbox/docs.md +64 -0
- data/core/src/services/etcd/docs.md +45 -0
- data/core/src/services/foundationdb/docs.md +42 -0
- data/core/src/services/fs/docs.md +49 -0
- data/core/src/services/ftp/docs.md +42 -0
- data/core/src/services/gcs/docs.md +76 -0
- data/core/src/services/gdrive/docs.md +65 -0
- data/core/src/services/ghac/docs.md +84 -0
- data/core/src/services/github/docs.md +52 -0
- data/core/src/services/gridfs/docs.md +46 -0
- data/core/src/services/hdfs/docs.md +140 -0
- data/core/src/services/hdfs_native/docs.md +35 -0
- data/core/src/services/http/docs.md +45 -0
- data/core/src/services/huggingface/docs.md +61 -0
- data/core/src/services/ipfs/docs.md +45 -0
- data/core/src/services/ipmfs/docs.md +14 -0
- data/core/src/services/koofr/docs.md +51 -0
- data/core/src/services/lakefs/docs.md +62 -0
- data/core/src/services/memcached/docs.md +47 -0
- data/core/src/services/memory/docs.md +36 -0
- data/core/src/services/mini_moka/docs.md +19 -0
- data/core/src/services/moka/docs.md +42 -0
- data/core/src/services/mongodb/docs.md +49 -0
- data/core/src/services/monoiofs/docs.md +46 -0
- data/core/src/services/mysql/docs.md +47 -0
- data/core/src/services/obs/docs.md +54 -0
- data/core/src/services/onedrive/docs.md +115 -0
- data/core/src/services/opfs/docs.md +18 -0
- data/core/src/services/oss/docs.md +74 -0
- data/core/src/services/pcloud/docs.md +51 -0
- data/core/src/services/persy/docs.md +43 -0
- data/core/src/services/postgresql/docs.md +47 -0
- data/core/src/services/redb/docs.md +41 -0
- data/core/src/services/redis/docs.md +43 -0
- data/core/src/services/rocksdb/docs.md +54 -0
- data/core/src/services/s3/compatible_services.md +126 -0
- data/core/src/services/s3/docs.md +244 -0
- data/core/src/services/seafile/docs.md +54 -0
- data/core/src/services/sftp/docs.md +49 -0
- data/core/src/services/sled/docs.md +39 -0
- data/core/src/services/sqlite/docs.md +46 -0
- data/core/src/services/surrealdb/docs.md +54 -0
- data/core/src/services/swift/compatible_services.md +53 -0
- data/core/src/services/swift/docs.md +52 -0
- data/core/src/services/tikv/docs.md +43 -0
- data/core/src/services/upyun/docs.md +51 -0
- data/core/src/services/vercel_artifacts/docs.md +40 -0
- data/core/src/services/vercel_blob/docs.md +45 -0
- data/core/src/services/webdav/docs.md +49 -0
- data/core/src/services/webhdfs/docs.md +90 -0
- data/core/src/services/yandex_disk/docs.md +45 -0
- data/core/tests/behavior/README.md +77 -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/opendal_ruby.so +0 -0
- data/lib/opendal_ruby/operator.rb +29 -0
- data/lib/opendal_ruby/operator_info.rb +26 -0
- data/opendal.gemspec +91 -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 +240 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
## Capabilities
|
|
2
|
+
|
|
3
|
+
This service can be used to:
|
|
4
|
+
|
|
5
|
+
- [x] stat
|
|
6
|
+
- [x] read
|
|
7
|
+
- [x] write
|
|
8
|
+
- [x] append
|
|
9
|
+
- [x] create_dir
|
|
10
|
+
- [x] delete
|
|
11
|
+
- [x] copy
|
|
12
|
+
- [ ] rename
|
|
13
|
+
- [x] list
|
|
14
|
+
- [x] presign
|
|
15
|
+
- [ ] blocking
|
|
16
|
+
|
|
17
|
+
## Configuration
|
|
18
|
+
|
|
19
|
+
- `root`: Set the work dir for backend.
|
|
20
|
+
- `bucket`: Set the container name for backend.
|
|
21
|
+
- `endpoint`: Set the endpoint for backend.
|
|
22
|
+
- `region`: Set the region for backend.
|
|
23
|
+
- `access_key_id`: Set the access_key_id for backend.
|
|
24
|
+
- `secret_access_key`: Set the secret_access_key for backend.
|
|
25
|
+
- `session_token`: Set the session_token for backend.
|
|
26
|
+
- `default_storage_class`: Set the default storage_class for backend.
|
|
27
|
+
- `server_side_encryption`: Set the server_side_encryption for backend.
|
|
28
|
+
- `server_side_encryption_aws_kms_key_id`: Set the server_side_encryption_aws_kms_key_id for backend.
|
|
29
|
+
- `server_side_encryption_customer_algorithm`: Set the server_side_encryption_customer_algorithm for backend.
|
|
30
|
+
- `server_side_encryption_customer_key`: Set the server_side_encryption_customer_key for backend.
|
|
31
|
+
- `server_side_encryption_customer_key_md5`: Set the server_side_encryption_customer_key_md5 for backend.
|
|
32
|
+
- `disable_config_load`: Disable aws config load from env.
|
|
33
|
+
- `enable_virtual_host_style`: Enable virtual host style.
|
|
34
|
+
- `disable_write_with_if_match`: Disable write with if match.
|
|
35
|
+
- `enable_request_payer`: Enable the request payer for backend.
|
|
36
|
+
|
|
37
|
+
Refer to [`S3Builder`]'s public API docs for more information.
|
|
38
|
+
|
|
39
|
+
## Temporary security credentials
|
|
40
|
+
|
|
41
|
+
OpenDAL now provides support for S3 temporary security credentials in IAM.
|
|
42
|
+
|
|
43
|
+
The way to take advantage of this feature is to build your S3 backend with `Builder::session_token`.
|
|
44
|
+
|
|
45
|
+
But OpenDAL will not refresh the temporary security credentials, please keep in mind to refresh those credentials in time.
|
|
46
|
+
|
|
47
|
+
## Server Side Encryption
|
|
48
|
+
|
|
49
|
+
OpenDAL provides full support of S3 Server Side Encryption(SSE) features.
|
|
50
|
+
|
|
51
|
+
The easiest way to configure them is to use helper functions like
|
|
52
|
+
|
|
53
|
+
- SSE-KMS: `server_side_encryption_with_aws_managed_kms_key`
|
|
54
|
+
- SSE-KMS: `server_side_encryption_with_customer_managed_kms_key`
|
|
55
|
+
- SSE-S3: `server_side_encryption_with_s3_key`
|
|
56
|
+
- SSE-C: `server_side_encryption_with_customer_key`
|
|
57
|
+
|
|
58
|
+
If those functions don't fulfill need, low-level options are also provided:
|
|
59
|
+
|
|
60
|
+
- Use service managed kms key
|
|
61
|
+
- `server_side_encryption="aws:kms"`
|
|
62
|
+
- Use customer provided kms key
|
|
63
|
+
- `server_side_encryption="aws:kms"`
|
|
64
|
+
- `server_side_encryption_aws_kms_key_id="your-kms-key"`
|
|
65
|
+
- Use S3 managed key
|
|
66
|
+
- `server_side_encryption="AES256"`
|
|
67
|
+
- Use customer key
|
|
68
|
+
- `server_side_encryption_customer_algorithm="AES256"`
|
|
69
|
+
- `server_side_encryption_customer_key="base64-of-your-aes256-key"`
|
|
70
|
+
- `server_side_encryption_customer_key_md5="base64-of-your-aes256-key-md5"`
|
|
71
|
+
|
|
72
|
+
After SSE have been configured, all requests send by this backed will attach those headers.
|
|
73
|
+
|
|
74
|
+
Reference: [Protecting data using server-side encryption](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)
|
|
75
|
+
|
|
76
|
+
## Example
|
|
77
|
+
|
|
78
|
+
## Via Builder
|
|
79
|
+
|
|
80
|
+
### Basic Setup
|
|
81
|
+
|
|
82
|
+
```rust,no_run
|
|
83
|
+
use std::sync::Arc;
|
|
84
|
+
|
|
85
|
+
use anyhow::Result;
|
|
86
|
+
use opendal::services::S3;
|
|
87
|
+
use opendal::Operator;
|
|
88
|
+
|
|
89
|
+
#[tokio::main]
|
|
90
|
+
async fn main() -> Result<()> {
|
|
91
|
+
// Create s3 backend builder.
|
|
92
|
+
let mut builder = S3::default()
|
|
93
|
+
// Set the root for s3, all operations will happen under this root.
|
|
94
|
+
//
|
|
95
|
+
// NOTE: the root must be absolute path.
|
|
96
|
+
.root("/path/to/dir")
|
|
97
|
+
// Set the bucket name. This is required.
|
|
98
|
+
.bucket("test")
|
|
99
|
+
// Set the region. This is required for some services, if you don't care about it, for example Minio service, just set it to "auto", it will be ignored.
|
|
100
|
+
.region("us-east-1")
|
|
101
|
+
// Set the endpoint.
|
|
102
|
+
//
|
|
103
|
+
// For examples:
|
|
104
|
+
// - "https://s3.amazonaws.com"
|
|
105
|
+
// - "http://127.0.0.1:9000"
|
|
106
|
+
// - "https://oss-ap-northeast-1.aliyuncs.com"
|
|
107
|
+
// - "https://cos.ap-seoul.myqcloud.com"
|
|
108
|
+
//
|
|
109
|
+
// Default to "https://s3.amazonaws.com"
|
|
110
|
+
.endpoint("https://s3.amazonaws.com")
|
|
111
|
+
// Set the access_key_id and secret_access_key.
|
|
112
|
+
//
|
|
113
|
+
// OpenDAL will try load credential from the env.
|
|
114
|
+
// If credential not set and no valid credential in env, OpenDAL will
|
|
115
|
+
// send request without signing like anonymous user.
|
|
116
|
+
.access_key_id("access_key_id")
|
|
117
|
+
.secret_access_key("secret_access_key");
|
|
118
|
+
|
|
119
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
120
|
+
|
|
121
|
+
Ok(())
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### S3 with SSE-C
|
|
127
|
+
|
|
128
|
+
```rust,no_run
|
|
129
|
+
use anyhow::Result;
|
|
130
|
+
use log::info;
|
|
131
|
+
use opendal::services::S3;
|
|
132
|
+
use opendal::Operator;
|
|
133
|
+
|
|
134
|
+
#[tokio::main]
|
|
135
|
+
async fn main() -> Result<()> {
|
|
136
|
+
let mut builder = S3::default()
|
|
137
|
+
.root("/path/to/dir")
|
|
138
|
+
.bucket("test")
|
|
139
|
+
.region("us-east-1")
|
|
140
|
+
.endpoint("https://s3.amazonaws.com")
|
|
141
|
+
.access_key_id("access_key_id")
|
|
142
|
+
.secret_access_key("secret_access_key")
|
|
143
|
+
// Enable SSE-C
|
|
144
|
+
.server_side_encryption_with_customer_key("AES256", "customer_key".as_bytes());
|
|
145
|
+
|
|
146
|
+
let op = Operator::new(builder)?.finish();
|
|
147
|
+
info!("operator: {:?}", op);
|
|
148
|
+
|
|
149
|
+
// Writing your testing code here.
|
|
150
|
+
|
|
151
|
+
Ok(())
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### S3 with SSE-KMS and aws managed kms key
|
|
156
|
+
|
|
157
|
+
```rust,no_run
|
|
158
|
+
use anyhow::Result;
|
|
159
|
+
use log::info;
|
|
160
|
+
use opendal::services::S3;
|
|
161
|
+
use opendal::Operator;
|
|
162
|
+
|
|
163
|
+
#[tokio::main]
|
|
164
|
+
async fn main() -> Result<()> {
|
|
165
|
+
let mut builder = S3::default()
|
|
166
|
+
// Setup builders
|
|
167
|
+
.root("/path/to/dir")
|
|
168
|
+
.bucket("test")
|
|
169
|
+
.region("us-east-1")
|
|
170
|
+
.endpoint("https://s3.amazonaws.com")
|
|
171
|
+
.access_key_id("access_key_id")
|
|
172
|
+
.secret_access_key("secret_access_key")
|
|
173
|
+
// Enable SSE-KMS with aws managed kms key
|
|
174
|
+
.server_side_encryption_with_aws_managed_kms_key();
|
|
175
|
+
|
|
176
|
+
let op = Operator::new(builder)?.finish();
|
|
177
|
+
info!("operator: {:?}", op);
|
|
178
|
+
|
|
179
|
+
// Writing your testing code here.
|
|
180
|
+
|
|
181
|
+
Ok(())
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### S3 with SSE-KMS and customer managed kms key
|
|
186
|
+
|
|
187
|
+
```rust,no_run
|
|
188
|
+
use anyhow::Result;
|
|
189
|
+
use log::info;
|
|
190
|
+
use opendal::services::S3;
|
|
191
|
+
use opendal::Operator;
|
|
192
|
+
|
|
193
|
+
#[tokio::main]
|
|
194
|
+
async fn main() -> Result<()> {
|
|
195
|
+
let mut builder = S3::default()
|
|
196
|
+
// Setup builders
|
|
197
|
+
.root("/path/to/dir")
|
|
198
|
+
.bucket("test")
|
|
199
|
+
.region("us-east-1")
|
|
200
|
+
.endpoint("https://s3.amazonaws.com")
|
|
201
|
+
.access_key_id("access_key_id")
|
|
202
|
+
.secret_access_key("secret_access_key")
|
|
203
|
+
// Enable SSE-KMS with customer managed kms key
|
|
204
|
+
.server_side_encryption_with_customer_managed_kms_key("aws_kms_key_id");
|
|
205
|
+
|
|
206
|
+
let op = Operator::new(builder)?.finish();
|
|
207
|
+
info!("operator: {:?}", op);
|
|
208
|
+
|
|
209
|
+
// Writing your testing code here.
|
|
210
|
+
|
|
211
|
+
Ok(())
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### S3 with SSE-S3
|
|
216
|
+
|
|
217
|
+
```rust,no_run
|
|
218
|
+
use anyhow::Result;
|
|
219
|
+
use log::info;
|
|
220
|
+
use opendal::services::S3;
|
|
221
|
+
use opendal::Operator;
|
|
222
|
+
|
|
223
|
+
#[tokio::main]
|
|
224
|
+
async fn main() -> Result<()> {
|
|
225
|
+
let mut builder = S3::default()
|
|
226
|
+
// Setup builders
|
|
227
|
+
.root("/path/to/dir")
|
|
228
|
+
.bucket("test")
|
|
229
|
+
.region("us-east-1")
|
|
230
|
+
.endpoint("https://s3.amazonaws.com")
|
|
231
|
+
.access_key_id("access_key_id")
|
|
232
|
+
.secret_access_key("secret_access_key")
|
|
233
|
+
// Enable SSE-S3
|
|
234
|
+
.server_side_encryption_with_s3_key();
|
|
235
|
+
|
|
236
|
+
let op = Operator::new(builder)?.finish();
|
|
237
|
+
info!("operator: {:?}", op);
|
|
238
|
+
|
|
239
|
+
// Writing your testing code here.
|
|
240
|
+
|
|
241
|
+
Ok(())
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
- [ ] copy
|
|
11
|
+
- [ ] rename
|
|
12
|
+
- [x] list
|
|
13
|
+
- [ ] presign
|
|
14
|
+
- [ ] blocking
|
|
15
|
+
|
|
16
|
+
## Configuration
|
|
17
|
+
|
|
18
|
+
- `root`: Set the work directory for backend
|
|
19
|
+
- `endpoint`: Seafile endpoint address
|
|
20
|
+
- `username` Seafile username
|
|
21
|
+
- `password` Seafile password
|
|
22
|
+
- `repo_name` Seafile repo name
|
|
23
|
+
|
|
24
|
+
You can refer to [`SeafileBuilder`]'s docs for more information
|
|
25
|
+
|
|
26
|
+
## Example
|
|
27
|
+
|
|
28
|
+
### Via Builder
|
|
29
|
+
|
|
30
|
+
```rust,no_run
|
|
31
|
+
use anyhow::Result;
|
|
32
|
+
use opendal::services::Seafile;
|
|
33
|
+
use opendal::Operator;
|
|
34
|
+
|
|
35
|
+
#[tokio::main]
|
|
36
|
+
async fn main() -> Result<()> {
|
|
37
|
+
// create backend builder
|
|
38
|
+
let mut builder = Seafile::default()
|
|
39
|
+
// set the storage bucket for OpenDAL
|
|
40
|
+
.root("/")
|
|
41
|
+
// set the endpoint for OpenDAL
|
|
42
|
+
.endpoint("http://127.0.0.1:80")
|
|
43
|
+
// set the username for OpenDAL
|
|
44
|
+
.username("xxxxxxxxxx")
|
|
45
|
+
// set the password name for OpenDAL
|
|
46
|
+
.password("opendal")
|
|
47
|
+
// set the repo_name for OpenDAL
|
|
48
|
+
.repo_name("xxxxxxxxxxxxx");
|
|
49
|
+
|
|
50
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
51
|
+
|
|
52
|
+
Ok(())
|
|
53
|
+
}
|
|
54
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
## Capabilities
|
|
2
|
+
|
|
3
|
+
This service can be used to:
|
|
4
|
+
|
|
5
|
+
- [x] stat
|
|
6
|
+
- [x] read
|
|
7
|
+
- [x] write
|
|
8
|
+
- [x] append
|
|
9
|
+
- [x] create_dir
|
|
10
|
+
- [x] delete
|
|
11
|
+
- [x] copy
|
|
12
|
+
- [x] rename
|
|
13
|
+
- [x] list
|
|
14
|
+
- [ ] ~~presign~~
|
|
15
|
+
- [ ] blocking
|
|
16
|
+
|
|
17
|
+
## Configuration
|
|
18
|
+
|
|
19
|
+
- `endpoint`: Set the endpoint for connection. The format is same as `openssh`, using either `[user@]hostname` or `ssh://[user@]hostname[:port]`. A username or port that is specified in the endpoint overrides the one set in the builder (but does not change the builder).
|
|
20
|
+
- `root`: Set the work directory for backend. It uses the default directory set by the remote `sftp-server` as default
|
|
21
|
+
- `user`: Set the login user
|
|
22
|
+
- `key`: Set the public key for login
|
|
23
|
+
- `known_hosts_strategy`: Set the strategy for known hosts, default to `Strict`
|
|
24
|
+
- `enable_copy`: Set whether the remote server has copy-file extension
|
|
25
|
+
|
|
26
|
+
For security reasons, it doesn't support password login, you can use public key or ssh-copy-id instead.
|
|
27
|
+
|
|
28
|
+
You can refer to [`SftpBuilder`]'s docs for more information
|
|
29
|
+
|
|
30
|
+
## Example
|
|
31
|
+
|
|
32
|
+
### Via Builder
|
|
33
|
+
|
|
34
|
+
```rust,no_run
|
|
35
|
+
use anyhow::Result;
|
|
36
|
+
use opendal::services::Sftp;
|
|
37
|
+
use opendal::Operator;
|
|
38
|
+
|
|
39
|
+
#[tokio::main]
|
|
40
|
+
async fn main() -> Result<()> {
|
|
41
|
+
let mut builder = Sftp::default()
|
|
42
|
+
.endpoint("127.0.0.1")
|
|
43
|
+
.user("test")
|
|
44
|
+
.key("test_key");
|
|
45
|
+
|
|
46
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
47
|
+
Ok(())
|
|
48
|
+
}
|
|
49
|
+
```
|
|
@@ -0,0 +1,39 @@
|
|
|
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
|
+
- [x] rename
|
|
12
|
+
- [ ] ~~list~~
|
|
13
|
+
- [ ] ~~presign~~
|
|
14
|
+
- [x] blocking
|
|
15
|
+
|
|
16
|
+
## Configuration
|
|
17
|
+
|
|
18
|
+
- `datadir`: Set the path to the sled data directory
|
|
19
|
+
|
|
20
|
+
You can refer to [`SledBuilder`]'s docs for more information
|
|
21
|
+
|
|
22
|
+
## Example
|
|
23
|
+
|
|
24
|
+
### Via Builder
|
|
25
|
+
|
|
26
|
+
```rust,no_run
|
|
27
|
+
use anyhow::Result;
|
|
28
|
+
use opendal::services::Sled;
|
|
29
|
+
use opendal::Operator;
|
|
30
|
+
|
|
31
|
+
#[tokio::main]
|
|
32
|
+
async fn main() -> Result<()> {
|
|
33
|
+
let mut builder = Sled::default()
|
|
34
|
+
.datadir("/tmp/opendal/sled");
|
|
35
|
+
|
|
36
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
37
|
+
Ok(())
|
|
38
|
+
}
|
|
39
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
- [ ] copy
|
|
11
|
+
- [ ] rename
|
|
12
|
+
- [x] list
|
|
13
|
+
- [ ] blocking
|
|
14
|
+
|
|
15
|
+
## Configuration
|
|
16
|
+
|
|
17
|
+
- `root`: Set the working directory of `OpenDAL`
|
|
18
|
+
- `connection_string`: Set the connection string of sqlite database
|
|
19
|
+
- `table`: Set the table of sqlite
|
|
20
|
+
- `key_field`: Set the key field of sqlite
|
|
21
|
+
- `value_field`: Set the value field of sqlite
|
|
22
|
+
|
|
23
|
+
## Example
|
|
24
|
+
|
|
25
|
+
### Via Builder
|
|
26
|
+
|
|
27
|
+
```rust,no_run
|
|
28
|
+
use anyhow::Result;
|
|
29
|
+
use opendal::services::Sqlite;
|
|
30
|
+
use opendal::Operator;
|
|
31
|
+
|
|
32
|
+
#[tokio::main]
|
|
33
|
+
async fn main() -> Result<()> {
|
|
34
|
+
let mut builder = Sqlite::default()
|
|
35
|
+
.root("/")
|
|
36
|
+
.connection_string("file//abc.db")
|
|
37
|
+
.table("your_table")
|
|
38
|
+
// key field type in the table should be compatible with Rust's &str like text
|
|
39
|
+
.key_field("key")
|
|
40
|
+
// value field type in the table should be compatible with Rust's Vec<u8> like bytea
|
|
41
|
+
.value_field("value");
|
|
42
|
+
|
|
43
|
+
let op = Operator::new(builder)?.finish();
|
|
44
|
+
Ok(())
|
|
45
|
+
}
|
|
46
|
+
```
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
## Capabilities
|
|
2
|
+
|
|
3
|
+
This service can be used to:
|
|
4
|
+
|
|
5
|
+
- [x] stat
|
|
6
|
+
- [x] read
|
|
7
|
+
- [x] write
|
|
8
|
+
- [ ] create_dir
|
|
9
|
+
- [x] delete
|
|
10
|
+
- [ ] copy
|
|
11
|
+
- [ ] rename
|
|
12
|
+
- [ ] ~~list~~
|
|
13
|
+
- [ ] ~~presign~~
|
|
14
|
+
- [ ] blocking
|
|
15
|
+
|
|
16
|
+
## Configuration
|
|
17
|
+
|
|
18
|
+
- `root`: Set the working directory of `OpenDAL`
|
|
19
|
+
- `connection_string`: Set the connection string of surrealdb server
|
|
20
|
+
- `username`: set the username of surrealdb
|
|
21
|
+
- `password`: set the password of surrealdb
|
|
22
|
+
- `namespace`: set the namespace of surrealdb
|
|
23
|
+
- `database`: set the database of surrealdb
|
|
24
|
+
- `table`: Set the table of surrealdb
|
|
25
|
+
- `key_field`: Set the key field of surrealdb
|
|
26
|
+
- `value_field`: Set the value field of surrealdb
|
|
27
|
+
-
|
|
28
|
+
|
|
29
|
+
## Example
|
|
30
|
+
|
|
31
|
+
### Via Builder
|
|
32
|
+
|
|
33
|
+
```rust
|
|
34
|
+
use anyhow::Result;
|
|
35
|
+
use opendal::services::Surrealdb;
|
|
36
|
+
use opendal::Operator;
|
|
37
|
+
|
|
38
|
+
#[tokio::main]
|
|
39
|
+
async fn main() -> Result<()> {
|
|
40
|
+
let mut builder = Surrealdb::default()
|
|
41
|
+
.root("/")
|
|
42
|
+
.connection_string("ws://127.0.0.1:8000")
|
|
43
|
+
.username("username")
|
|
44
|
+
.password("password")
|
|
45
|
+
.namespace("namespace")
|
|
46
|
+
.database("database")
|
|
47
|
+
.table("table")
|
|
48
|
+
.key_field("key")
|
|
49
|
+
.value_field("value");
|
|
50
|
+
|
|
51
|
+
let op = Operator::new(builder)?.finish();
|
|
52
|
+
Ok(())
|
|
53
|
+
}
|
|
54
|
+
```
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
## Compatible Services
|
|
2
|
+
|
|
3
|
+
### OpenStack Swift
|
|
4
|
+
|
|
5
|
+
[OpenStack Swift](https://docs.openstack.org/swift/latest/) is the default implementations of swift services.
|
|
6
|
+
|
|
7
|
+
To connect to OpenStack Swift, we need to set:
|
|
8
|
+
|
|
9
|
+
- `endpoint`: The endpoint of OpenStack Swift, for example: `http://127.0.0.1:8080/v1/AUTH_test`.
|
|
10
|
+
- `container`: The name of OpenStack Swift container.
|
|
11
|
+
- `token`: OpenStack Swift container personal access token.
|
|
12
|
+
|
|
13
|
+
```rust,ignore
|
|
14
|
+
builder.endpoint("http://127.0.0.1:8080/v1/AUTH_test");
|
|
15
|
+
builder.container("container");
|
|
16
|
+
builder.token("token");
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`endpoint` is the full URL that serves as the access point to all containers under an OpenStack Swift account. It represents the entry point for accessing the resources of the account. Alongside `endpoint`, `token` is used as a credential to verify the user's identity and authorize access to the relevant resources. Both `endpoint` and `token` can be obtained through OpenStack Swift authentication service.
|
|
20
|
+
|
|
21
|
+
`endpoint` consists of server address and port, API version, authenticated account ID. For instance, it might appear as follows:
|
|
22
|
+
|
|
23
|
+
- `http://127.0.0.1:8080/v1/AUTH_test`.
|
|
24
|
+
- `http://192.168.66.88:8080/swift/v1`.
|
|
25
|
+
- `https://openstack-controller.example.com:8080/v1/account`.
|
|
26
|
+
|
|
27
|
+
Please note that the exact format of `endpoint` may vary depending on the deployment configuration and version of swift services. Users can refer to the specific services documentation for the correct `endpoint` format and authentication method.
|
|
28
|
+
|
|
29
|
+
For more information, refer:
|
|
30
|
+
|
|
31
|
+
- [OpenStack Swift API](https://docs.openstack.org/api-ref/object-store/).
|
|
32
|
+
- [OpenStack Swift Authentication](https://docs.openstack.org/swift/latest/api/object_api_v1_overview.html).
|
|
33
|
+
|
|
34
|
+
### Ceph Rados Gateway
|
|
35
|
+
|
|
36
|
+
[Ceph Rados Gateway](https://docs.ceph.com/en/quincy/radosgw/) supports a RESTful API that is compatible with the basic data access model of OpenStack Swift API.
|
|
37
|
+
|
|
38
|
+
To connect to Ceph Rados Gateway, we need to set:
|
|
39
|
+
|
|
40
|
+
- `endpoint`: The endpoint of swift services, for example: `http://127.0.0.1:8080/swift/v1`.
|
|
41
|
+
- `container`: The name of swift container.
|
|
42
|
+
- `token`: swift container personal access token.
|
|
43
|
+
|
|
44
|
+
```rust,ignore
|
|
45
|
+
builder.endpoint("http://127.0.0.1:8080/swift/v1");
|
|
46
|
+
builder.container("container");
|
|
47
|
+
builder.token("token");
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
For more information, refer:
|
|
51
|
+
|
|
52
|
+
- [Ceph Rados Gateway Swift API](https://docs.ceph.com/en/latest/radosgw/swift/#api).
|
|
53
|
+
- [Ceph Rados Gateway Swift Authentication](https://docs.ceph.com/en/latest/radosgw/swift/auth/).
|
|
@@ -0,0 +1,52 @@
|
|
|
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
|
+
- [x] list
|
|
13
|
+
- [ ] ~~presign~~
|
|
14
|
+
- [ ] blocking
|
|
15
|
+
|
|
16
|
+
## Configurations
|
|
17
|
+
|
|
18
|
+
- `endpoint`: Set the endpoint for backend.
|
|
19
|
+
- `container`: Swift container.
|
|
20
|
+
- `token`: Swift personal access token.
|
|
21
|
+
|
|
22
|
+
Refer to [`SwiftBuilder`]'s public API docs for more information.
|
|
23
|
+
|
|
24
|
+
## Examples
|
|
25
|
+
|
|
26
|
+
### Via Builder
|
|
27
|
+
|
|
28
|
+
```rust,no_run
|
|
29
|
+
use std::sync::Arc;
|
|
30
|
+
|
|
31
|
+
use anyhow::Result;
|
|
32
|
+
use opendal::services::Swift;
|
|
33
|
+
use opendal::Operator;
|
|
34
|
+
|
|
35
|
+
#[tokio::main]
|
|
36
|
+
async fn main() -> Result<()> {
|
|
37
|
+
// Create Swift backend builder
|
|
38
|
+
let mut builder = Swift::default()
|
|
39
|
+
// Set the root for swift, all operations will happen under this root
|
|
40
|
+
.root("/path/to/dir")
|
|
41
|
+
// set the endpoint of Swift backend
|
|
42
|
+
.endpoint("https://openstack-controller.example.com:8080/v1/account")
|
|
43
|
+
// set the container name of Swift workspace
|
|
44
|
+
.container("container")
|
|
45
|
+
// set the auth token for builder
|
|
46
|
+
.token("token");
|
|
47
|
+
|
|
48
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
49
|
+
|
|
50
|
+
Ok(())
|
|
51
|
+
}
|
|
52
|
+
```
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
- [x] rename
|
|
12
|
+
- [ ] ~~list~~
|
|
13
|
+
- [ ] ~~presign~~
|
|
14
|
+
- [ ] ~~blocking~~
|
|
15
|
+
|
|
16
|
+
## Configuration
|
|
17
|
+
|
|
18
|
+
- `endpoints`: Set the endpoints to the tikv cluster
|
|
19
|
+
- `insecure`: Set the insecure flag to the tikv cluster
|
|
20
|
+
- `ca_path`: Set the ca path to the tikv connection
|
|
21
|
+
- `cert_path`: Set the cert path to the tikv connection
|
|
22
|
+
- `key_path`: Set the key path to the tikv connection
|
|
23
|
+
|
|
24
|
+
You can refer to [`TikvBuilder`]'s docs for more information
|
|
25
|
+
|
|
26
|
+
## Example
|
|
27
|
+
|
|
28
|
+
### Via Builder
|
|
29
|
+
|
|
30
|
+
```rust,no_run
|
|
31
|
+
use anyhow::Result;
|
|
32
|
+
use opendal::services::Tikv;
|
|
33
|
+
use opendal::Operator;
|
|
34
|
+
|
|
35
|
+
#[tokio::main]
|
|
36
|
+
async fn main() -> Result<()> {
|
|
37
|
+
let mut builder = Tikv::default()
|
|
38
|
+
.endpoints(vec!["127.0.0.1:2379".to_string()]);
|
|
39
|
+
|
|
40
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
41
|
+
Ok(())
|
|
42
|
+
}
|
|
43
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
- [x] rename
|
|
12
|
+
- [x] list
|
|
13
|
+
- [ ] presign
|
|
14
|
+
- [ ] blocking
|
|
15
|
+
|
|
16
|
+
## Configuration
|
|
17
|
+
|
|
18
|
+
- `root`: Set the work directory for backend
|
|
19
|
+
- `bucket`: Upyun bucket name
|
|
20
|
+
- `operator` Upyun operator
|
|
21
|
+
- `password` Upyun password
|
|
22
|
+
|
|
23
|
+
You can refer to [`UpyunBuilder`]'s docs for more information
|
|
24
|
+
|
|
25
|
+
## Example
|
|
26
|
+
|
|
27
|
+
### Via Builder
|
|
28
|
+
|
|
29
|
+
```rust,no_run
|
|
30
|
+
use anyhow::Result;
|
|
31
|
+
use opendal::services::Upyun;
|
|
32
|
+
use opendal::Operator;
|
|
33
|
+
|
|
34
|
+
#[tokio::main]
|
|
35
|
+
async fn main() -> Result<()> {
|
|
36
|
+
// create backend builder
|
|
37
|
+
let mut builder = Upyun::default()
|
|
38
|
+
// set the storage bucket for OpenDAL
|
|
39
|
+
.root("/")
|
|
40
|
+
// set the bucket for OpenDAL
|
|
41
|
+
.bucket("test")
|
|
42
|
+
// set the operator for OpenDAL
|
|
43
|
+
.operator("xxxxxxxxxx")
|
|
44
|
+
// set the password name for OpenDAL
|
|
45
|
+
.password("opendal");
|
|
46
|
+
|
|
47
|
+
let op: Operator = Operator::new(builder)?.finish();
|
|
48
|
+
|
|
49
|
+
Ok(())
|
|
50
|
+
}
|
|
51
|
+
```
|