|
147 | 147 | else: |
148 | 148 | machine.fail(f"nix path-info {pkg}") |
149 | 149 |
|
150 | | - def setup_s3(populate_bucket=[], public=False, versioned=False): |
| 150 | + def setup_s3(populate_bucket=[], public=False, versioned=False, profiles=None): |
151 | 151 | """ |
152 | 152 | Decorator that creates/destroys a unique bucket for each test. |
153 | 153 | Optionally pre-populates bucket with specified packages. |
|
157 | 157 | populate_bucket: List of packages to upload before test runs |
158 | 158 | public: If True, make the bucket publicly accessible |
159 | 159 | versioned: If True, enable versioning on the bucket before populating |
| 160 | + profiles: Dict of AWS profiles to create, e.g.: |
| 161 | + {"valid": {"access_key": "...", "secret_key": "..."}, |
| 162 | + "invalid": {"access_key": "WRONG", "secret_key": "WRONG"}} |
| 163 | + Profiles are created on the client machine at /root/.aws/credentials |
160 | 164 | """ |
161 | 165 | def decorator(test_func): |
162 | 166 | def wrapper(): |
|
167 | 171 | server.succeed(f"mc anonymous set download minio/{bucket}") |
168 | 172 | if versioned: |
169 | 173 | server.succeed(f"mc version enable minio/{bucket}") |
| 174 | + if profiles: |
| 175 | + # Build credentials file content |
| 176 | + creds_content = "" |
| 177 | + for name, creds in profiles.items(): |
| 178 | + creds_content += f"[{name}]\n" |
| 179 | + creds_content += f"aws_access_key_id = {creds['access_key']}\n" |
| 180 | + creds_content += f"aws_secret_access_key = {creds['secret_key']}\n\n" |
| 181 | + client.succeed("mkdir -p /root/.aws") |
| 182 | + client.succeed(f"cat > /root/.aws/credentials << 'AWSCREDS'\n{creds_content}AWSCREDS") |
170 | 183 | if populate_bucket: |
171 | 184 | store_url = make_s3_url(bucket) |
172 | 185 | for pkg in populate_bucket: |
173 | 186 | server.succeed(f"{ENV_WITH_CREDS} nix copy --to '{store_url}' {pkg}") |
174 | 187 | test_func(bucket) |
175 | 188 | finally: |
176 | 189 | server.succeed(f"mc rb --force minio/{bucket}") |
| 190 | + # Clean up AWS profiles if created |
| 191 | + if profiles: |
| 192 | + client.succeed("rm -rf /root/.aws") |
177 | 193 | # Clean up client store - only delete if path exists |
178 | 194 | for pkg in PKGS.values(): |
179 | 195 | client.succeed(f"[ ! -e {pkg} ] || nix store delete --ignore-liveness {pkg}") |
|
0 commit comments