Some checks failed
go: build dev binaries / cleanup (push) Successful in 4s
Codespell / Check for spelling errors (push) Failing after 3s
docker: build dev containers / build-rust-binaries (amd64, x86_64-unknown-linux-musl) (push) Failing after 3s
docker: build dev containers / build-dev-containers (push) Has been skipped
docker: build dev containers / build-rust-binaries (arm64, true, aarch64-unknown-linux-musl) (push) Failing after 3s
End to End / FUSE Mount (push) Failing after 2s
EC Integration Tests / EC Integration Tests (push) Failing after 30s
FUSE DLM Integration Tests / FUSE DLM Integration Tests (push) Failing after 3s
FUSE Volume Server Failover Tests / FUSE Volume Server Failover (push) Failing after 3s
FUSE Integration Tests / FUSE Integration Testing (push) Failing after 2s
FUSE P2P Peer Chunk Sharing Integration Tests / FUSE P2P Peer Chunk Sharing (push) Failing after 3s
go: build binary / Go Vet (push) Failing after 2s
go: build binary / Go Vet 32-bit (push) Failing after 3s
go: build binary / Build (push) Failing after 4s
go: build binary / Build cross-platform (freebsd/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (darwin/arm64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/arm64) (push) Failing after 3s
go: build binary / Test (push) Failing after 2s
go: build binary / Test 32-bit (push) Failing after 3s
helm: lint and test charts / lint-test (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (11) (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (17) (push) Failing after 3s
go: build dev binaries / build_dev_linux_windows (amd64, linux) (push) Failing after 2s
go: build dev binaries / build_dev_linux_windows (amd64, windows) (push) Failing after 3s
go: build dev binaries / build_dev_darwin (amd64, darwin) (push) Has been skipped
go: build dev binaries / build_dev_darwin (arm64, darwin) (push) Has been skipped
Java Client Unit Tests / Java Unit Tests (11) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (17) (push) Failing after 2s
Java Client Unit Tests / Java Unit Tests (21) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (8) (push) Failing after 3s
Kafka Quick Test (Load Test with Schema Registry) / Kafka Client Load Test (Quick) (push) Failing after 3s
Kafka Gateway Tests / Kafka Unit Tests (unit-tests-1) (push) Failing after 11s
Kafka Gateway Tests / Kafka Integration Tests (Critical) (integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka End-to-End Tests (with SMQ) (e2e-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Consumer Group Tests (Highly Isolated) (consumer-group-1) (push) Failing after 2s
Kafka Gateway Tests / Kafka Client Compatibility (with SMQ) (client-compat-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka SMQ Integration Tests (Full Stack) (smq-integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Protocol Tests (Isolated) (protocol-1) (push) Failing after 3s
KMS Tests / KMS Provider Integration Tests (push) Failing after 2s
KMS Tests / S3 KMS End-to-End Tests (push) Failing after 3s
Master Cold Start Tests / Master Cold Start Tests (push) Failing after 4s
Metadata Subscribe Integration Tests / Metadata Subscribe Integration Tests (push) Failing after 3s
Multi-Master Tests / Multi-Master Failover Tests (push) Failing after 3s
Performance / CPU and Heap Profile (push) Failing after 2s
Performance / S3 Read/Write Benchmark (rust volume) (push) Failing after 3s
pjdfstest POSIX Compliance / pjdfstest (push) Failing after 2s
Plugin Worker Integration Tests / Plugin Worker: erasure_coding (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: vacuum (push) Failing after 3s
Rust Volume Server Tests / Rust Integration Tests (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 1) (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 1) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 3) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Distributed Tests (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Performance Tests (push) Failing after 3s
Performance / Throughput Benchmark (go volume) (push) Failing after 3s
Performance / Throughput Benchmark (rust volume) (push) Failing after 2s
Performance / S3 Read/Write Benchmark (go volume) (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: volume_balance (push) Failing after 3s
PostgreSQL Gateway Tests / PostgreSQL Basic Tests (push) Failing after 3s
Rust Volume Server Tests / Rust Unit Tests (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 3) (push) Failing after 3s
Rust Plugin Worker Tests / Rust Plugin Worker Build and Unit Tests (push) Failing after 3s
rust: build dev volume server binaries / cleanup (push) Successful in 3s
S3 ETag and ACL Tests / S3 ETag + ACL Integration Tests (push) Failing after 3s
S3 IAM Integration Tests / IAM Unit Tests (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (advanced) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (basic) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (group) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (policy-enforcement) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (sts) (push) Failing after 4s
S3 Keycloak Integration Tests / S3 Keycloak Integration Tests (push) Failing after 3s
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.11) (push) Failing after 3s
S3 PyArrow Parquet Tests / Go Unit Tests (Implicit Directory) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.12) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-amd64, x86_64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-arm64, aarch64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-linux (linux-amd64, x86_64-unknown-linux-gnu) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.9) (push) Has been cancelled
S3 Proxy Signature Tests / S3 Proxy Signature Verification Tests (push) Has been cancelled
S3 SDK V2 Route Disambiguation Tests / S3 SDK V2 Routing Tests (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (quick) (push) Has been cancelled
S3 SSE Tests / S3 SSE Compatibility Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Metadata Persistence Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Copy Operations Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Multipart Upload Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Performance Test (push) Has been cancelled
S3 SSE Tests / S3 Volume Encryption Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (comprehensive) (push) Has been cancelled
Spark Integration Tests / Spark Integration Tests (push) Failing after 2s
Telemetry Integration Tests / telemetry-integration-test (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 1) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 1) (push) Failing after 3s
Ceph S3 tests / Basic S3 tests (KV store) (push) Has been cancelled
Ceph S3 tests / S3 Versioning & Object Lock tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Unit Tests (push) Failing after 3s
Ceph S3 tests / S3 CORS tests (push) Has been cancelled
Ceph S3 tests / SeaweedFS Custom S3 Copy tests (push) Has been cancelled
Ceph S3 tests / Basic S3 tests (SQL store) (push) Has been cancelled
test s3 over https using aws-cli / awscli-tests (push) Has been cancelled
TLS Rotation Integration Tests / TLS Rotation Integration Tests (push) Has been cancelled
Vacuum Integration Tests / Vacuum Integration Tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Variables Integration Tests (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (advanced-policy) (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (basic-policy) (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (contextual-policy) (push) Failing after 4s
S3 Policy Integration Tests / Trusted Proxy Detection Tests (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Shell Integration Tests (push) Failing after 3s
Samba on FUSE Integration / samba-integration (push) Failing after 2s
SFTP Integration Tests / SFTP Integration Testing (push) Failing after 3s
terraform: validate and test modules / fmt, validate, plan-level tests (push) Failing after 3s
terraform: validate and test modules / local cluster smoke test (real weed) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 3) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 2) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 2) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 3) (push) Failing after 5s
mount: windows conformance / WinFsp conformance (push) Has been cancelled
mount: windows / Mount on Windows (push) Has been cancelled
275 lines
8.0 KiB
Python
Executable File
275 lines
8.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# /// script
|
|
# requires-python = ">=3.12"
|
|
# dependencies = [
|
|
# "boto3",
|
|
# ]
|
|
# ///
|
|
|
|
import argparse
|
|
import json
|
|
import random
|
|
import string
|
|
import subprocess
|
|
from enum import Enum
|
|
from pathlib import Path
|
|
|
|
import boto3
|
|
|
|
REGION_NAME = "us-east-1"
|
|
|
|
|
|
class Actions(str, Enum):
|
|
Get = "Get"
|
|
Put = "Put"
|
|
List = "List"
|
|
|
|
|
|
def get_user_dir(bucket_name, user, with_bucket=True):
|
|
if with_bucket:
|
|
return f"{bucket_name}/user-id-{user}"
|
|
|
|
return f"user-id-{user}"
|
|
|
|
|
|
def create_power_user():
|
|
power_user_key = "power_user_key"
|
|
power_user_secret = "power_user_secret"
|
|
command = f"s3.configure -apply -user poweruser -access_key {power_user_key} -secret_key {power_user_secret} -actions Admin"
|
|
print("Creating Power User...")
|
|
subprocess.run(
|
|
["docker", "exec", "-i", "seaweedfs-master-1", "weed", "shell"],
|
|
input=command,
|
|
text=True,
|
|
stdout=subprocess.PIPE,
|
|
)
|
|
print(
|
|
f"Power User created with key: {power_user_key} and secret: {power_user_secret}"
|
|
)
|
|
return power_user_key, power_user_secret
|
|
|
|
|
|
def create_bucket(s3_client, bucket_name):
|
|
print(f"Creating Bucket {bucket_name}...")
|
|
s3_client.create_bucket(Bucket=bucket_name)
|
|
print(f"Bucket {bucket_name} created.")
|
|
|
|
|
|
def upload_file(s3_client, bucket_name, user, file_path, custom_remote_path=None):
|
|
user_dir = get_user_dir(bucket_name, user, with_bucket=False)
|
|
if custom_remote_path:
|
|
remote_path = custom_remote_path
|
|
else:
|
|
remote_path = f"{user_dir}/{str(Path(file_path).name)}"
|
|
|
|
print(f"Uploading {file_path} for {user}... on {user_dir}")
|
|
|
|
s3_client.upload_file(file_path, bucket_name, remote_path)
|
|
print(f"File {file_path} uploaded for {user}.")
|
|
|
|
|
|
def create_user(iam_client, user):
|
|
print(f"Creating user {user}...")
|
|
response = iam_client.create_access_key(UserName=user)
|
|
print(
|
|
f"User {user} created with access key: {response['AccessKey']['AccessKeyId']}"
|
|
)
|
|
return response
|
|
|
|
|
|
def list_files(s3_client, bucket_name, path=None):
|
|
if path is None:
|
|
path = ""
|
|
print(f"Listing files of s3://{bucket_name}/{path}...")
|
|
try:
|
|
response = s3_client.list_objects_v2(Bucket=bucket_name, Prefix=path)
|
|
if "Contents" in response:
|
|
for obj in response["Contents"]:
|
|
print(f"\t - {obj['Key']}")
|
|
else:
|
|
print("No files found.")
|
|
except Exception as e:
|
|
print(f"Error listing files: {e}")
|
|
|
|
|
|
def create_policy_for_user(
|
|
iam_client, user, bucket_name, actions=[Actions.Get, Actions.List]
|
|
):
|
|
print(f"Creating policy for {user} on {bucket_name}...")
|
|
policy_document = {
|
|
"Version": "2012-10-17",
|
|
"Statement": [
|
|
{
|
|
"Effect": "Allow",
|
|
"Action": [f"s3:{action.value}*" for action in actions],
|
|
"Resource": [
|
|
f"arn:aws:s3:::{get_user_dir(bucket_name, user)}/*",
|
|
],
|
|
}
|
|
],
|
|
}
|
|
policy_name = f"{user}-{bucket_name}-full-access"
|
|
|
|
policy_json = json.dumps(policy_document)
|
|
filepath = f"/tmp/{policy_name}.json"
|
|
with open(filepath, "w") as f:
|
|
f.write(json.dumps(policy_document, indent=2))
|
|
|
|
iam_client.put_user_policy(
|
|
PolicyName=policy_name, PolicyDocument=policy_json, UserName=user
|
|
)
|
|
print(f"Policy for {user} on {bucket_name} created.")
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="SeaweedFS S3 Test Script")
|
|
parser.add_argument(
|
|
"--s3-url", default="http://127.0.0.1:8333", help="S3 endpoint URL"
|
|
)
|
|
parser.add_argument(
|
|
"--iam-url", default="http://127.0.0.1:8111", help="IAM endpoint URL"
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
bucket_name = (
|
|
f"test-bucket-{''.join(random.choices(string.digits + 'abcdef', k=8))}"
|
|
)
|
|
sentinel_file = "/tmp/SENTINEL"
|
|
with open(sentinel_file, "w") as f:
|
|
f.write("Hello World")
|
|
print(f"SENTINEL file created at {sentinel_file}")
|
|
|
|
power_user_key, power_user_secret = create_power_user()
|
|
|
|
admin_s3_client = get_s3_client(args, power_user_key, power_user_secret)
|
|
iam_client = get_iam_client(args, power_user_key, power_user_secret)
|
|
|
|
create_bucket(admin_s3_client, bucket_name)
|
|
upload_file(admin_s3_client, bucket_name, "Alice", sentinel_file)
|
|
upload_file(admin_s3_client, bucket_name, "Bob", sentinel_file)
|
|
list_files(admin_s3_client, bucket_name)
|
|
|
|
alice_user_info = create_user(iam_client, "Alice")
|
|
bob_user_info = create_user(iam_client, "Bob")
|
|
|
|
alice_key = alice_user_info["AccessKey"]["AccessKeyId"]
|
|
alice_secret = alice_user_info["AccessKey"]["SecretAccessKey"]
|
|
bob_key = bob_user_info["AccessKey"]["AccessKeyId"]
|
|
bob_secret = bob_user_info["AccessKey"]["SecretAccessKey"]
|
|
|
|
# Make sure Admin can read any files
|
|
list_files(admin_s3_client, bucket_name)
|
|
list_files(
|
|
admin_s3_client,
|
|
bucket_name,
|
|
get_user_dir(bucket_name, "Alice", with_bucket=False),
|
|
)
|
|
list_files(
|
|
admin_s3_client,
|
|
bucket_name,
|
|
get_user_dir(bucket_name, "Bob", with_bucket=False),
|
|
)
|
|
|
|
# Create read policy for Alice and Bob
|
|
create_policy_for_user(iam_client, "Alice", bucket_name)
|
|
create_policy_for_user(iam_client, "Bob", bucket_name)
|
|
|
|
alice_s3_client = get_s3_client(args, alice_key, alice_secret)
|
|
|
|
# Make sure Alice can read her files
|
|
list_files(
|
|
alice_s3_client,
|
|
bucket_name,
|
|
get_user_dir(bucket_name, "Alice", with_bucket=False) + "/",
|
|
)
|
|
|
|
# Make sure Bob can read his files
|
|
bob_s3_client = get_s3_client(args, bob_key, bob_secret)
|
|
list_files(
|
|
bob_s3_client,
|
|
bucket_name,
|
|
get_user_dir(bucket_name, "Bob", with_bucket=False) + "/",
|
|
)
|
|
|
|
# Update policy to include write
|
|
create_policy_for_user(iam_client, "Alice", bucket_name, actions=[Actions.Put, Actions.Get, Actions.List]) # fmt: off
|
|
create_policy_for_user(iam_client, "Bob", bucket_name, actions=[Actions.Put, Actions.Get, Actions.List]) # fmt: off
|
|
|
|
print("############################# Make sure Alice can write her files")
|
|
upload_file(
|
|
alice_s3_client,
|
|
bucket_name,
|
|
"Alice",
|
|
sentinel_file,
|
|
custom_remote_path=f"{get_user_dir(bucket_name, 'Alice', with_bucket=False)}/SENTINEL_by_Alice",
|
|
)
|
|
|
|
|
|
print("############################# Make sure Bob can write his files")
|
|
upload_file(
|
|
bob_s3_client,
|
|
bucket_name,
|
|
"Bob",
|
|
sentinel_file,
|
|
custom_remote_path=f"{get_user_dir(bucket_name, 'Bob', with_bucket=False)}/SENTINEL_by_Bob",
|
|
)
|
|
|
|
|
|
print("############################# Make sure Alice can read her new files")
|
|
list_files(
|
|
alice_s3_client,
|
|
bucket_name,
|
|
get_user_dir(bucket_name, "Alice", with_bucket=False) + "/",
|
|
)
|
|
|
|
|
|
print("############################# Make sure Bob can read his new files")
|
|
list_files(
|
|
bob_s3_client,
|
|
bucket_name,
|
|
get_user_dir(bucket_name, "Bob", with_bucket=False) + "/",
|
|
)
|
|
|
|
|
|
print("############################# Make sure Bob cannot read Alice's files")
|
|
list_files(
|
|
bob_s3_client,
|
|
bucket_name,
|
|
get_user_dir(bucket_name, "Alice", with_bucket=False) + "/",
|
|
)
|
|
|
|
print("############################# Make sure Alice cannot read Bob's files")
|
|
|
|
list_files(
|
|
alice_s3_client,
|
|
bucket_name,
|
|
get_user_dir(bucket_name, "Bob", with_bucket=False) + "/",
|
|
)
|
|
|
|
|
|
|
|
def get_iam_client(args, access_key, secret_key):
|
|
iam_client = boto3.client(
|
|
"iam",
|
|
endpoint_url=args.iam_url,
|
|
region_name=REGION_NAME,
|
|
aws_access_key_id=access_key,
|
|
aws_secret_access_key=secret_key,
|
|
)
|
|
return iam_client
|
|
|
|
|
|
def get_s3_client(args, access_key, secret_key):
|
|
s3_client = boto3.client(
|
|
"s3",
|
|
endpoint_url=args.s3_url,
|
|
region_name=REGION_NAME,
|
|
aws_access_key_id=access_key,
|
|
aws_secret_access_key=secret_key,
|
|
)
|
|
return s3_client
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|