Skip to content

Commit 630ea6e

Browse files
authored
Merge pull request #3052 from adobe/maintenance-for-5.1.0
Maintenance for 5.1.0
2 parents 18a3f1c + 906deb4 commit 630ea6e

13 files changed

Lines changed: 116 additions & 15 deletions

File tree

.claude/commands/document.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@.agents/skills/document/SKILL.md

.claude/commands/implement.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@.agents/skills/implement/SKILL.md

.claude/commands/lint.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@.agents/skills/lint/SKILL.md

.claude/commands/refactor.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@.agents/skills/refactor/SKILL.md

.claude/commands/review.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@.agents/skills/review/SKILL.md

.claude/commands/test.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@.agents/skills/test/SKILL.md

.github/CONTRIBUTING.md

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,7 @@ make format # Format Kotlin code
3131

3232
## Adding a New S3 Operation
3333

34-
1. Add DTO(s) in `server/dto/` — XML names must match the [AWS S3 API spec](https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html) exactly
35-
2. Add store method(s) in `server/store/` — acquire the per-object or per-bucket lock
36-
3. Add service method(s) in `server/service/` — business logic only, throw `S3Exception` constants
37-
4. Add controller method(s) in `server/controller/` — HTTP mapping only, no logic, no exception catching
38-
5. Add integration test(s) in `integration-tests/` — use real AWS SDK v2 against Docker container
39-
6. Run `make integration-tests` to verify XML serialization
40-
7. Update `CHANGELOG.md` and `AGENTS.md` configuration tables if new properties are added
34+
See the full implementation checklist in **[server/AGENTS.md § Implementation Flow](../server/AGENTS.md)** — it is the authoritative step-by-step guide (DTO → Store → Service → Controller → IT → docs).
4135

4236
## Code Review Focus
4337

@@ -110,7 +104,7 @@ Before flagging a blocker, verify:
110104
- [ ] `make test` passes (unit tests)
111105
- [ ] The change you're making is within the scope requested
112106

113-
If an integration test fails and you cannot determine why without running the full Docker stack, say so explicitly — do not claim success based on compilation alone.
107+
If `make integration-tests` fails, first verify Docker is available: run `docker info`. If that command fails, Docker is not running — escalate to the human rather than debugging the test failure. Do not claim success based on compilation alone.
114108

115109
### What not to do without approval
116110

AGENTS.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,49 @@ Filesystem layout:
7676
<root>/<bucket>/multiparts/<upload-id>/<part>.part
7777
```
7878

79+
**`bucketMetadata.json`** fields (`BucketMetadata`):
80+
81+
| Field | Type | Notes |
82+
|---|---|---|
83+
| `name` | `String` | Bucket name |
84+
| `creationDate` | `String` | ISO-8601 timestamp |
85+
| `bucketRegion` | `String` | AWS region string |
86+
| `objects` | `Map<String, UUID>` | key → object UUID mapping |
87+
| `versioningConfiguration` | `VersioningConfiguration?` | null until versioning is configured |
88+
| `objectLockConfiguration` | `ObjectLockConfiguration?` | null until object lock is enabled |
89+
| `bucketLifecycleConfiguration` | `BucketLifecycleConfiguration?` | null until lifecycle rules are set |
90+
| `objectOwnership` | `ObjectOwnership?` | null until ownership is set |
91+
| `bucketInfo` | `BucketInfo?` | bucket type/data-redundancy info |
92+
| `locationInfo` | `LocationInfo?` | bucket location info |
93+
| `path` | `Path` | filesystem path to the bucket folder (not serialized for cross-host use) |
94+
95+
**`objectMetadata.json`** fields (`S3ObjectMetadata`):
96+
97+
| Field | Type | Notes |
98+
|---|---|---|
99+
| `id` | `UUID` | object identity (matches the folder name) |
100+
| `key` | `String` | S3 object key |
101+
| `size` | `String` | content length as string |
102+
| `contentType` | `String?` | MIME type |
103+
| `etag` | `String?` | ETag value |
104+
| `modificationDate` | `String` | formatted date string |
105+
| `lastModified` | `Long` | epoch millis |
106+
| `dataPath` | `Path` | path to the `binaryData` file |
107+
| `userMetadata` | `Map<String, String>?` | `x-amz-meta-*` headers |
108+
| `storeHeaders` | `Map<String, String>?` | headers persisted verbatim (e.g. `Content-Encoding`) |
109+
| `encryptionHeaders` | `Map<String, String>?` | SSE headers |
110+
| `tags` | `List<Tag>?` | object tags |
111+
| `checksumAlgorithm` | `ChecksumAlgorithm?` | CRC32 / SHA-256 / etc. |
112+
| `checksum` | `String?` | computed checksum value |
113+
| `checksumType` | `ChecksumType?` | FULL\_OBJECT or COMPOSITE |
114+
| `storageClass` | `StorageClass?` | STANDARD, GLACIER, etc. |
115+
| `owner` | `Owner` | object owner |
116+
| `legalHold` | `LegalHold?` | WORM legal hold status |
117+
| `retention` | `Retention?` | WORM retention mode + until-date |
118+
| `policy` | `AccessControlPolicy?` | ACL policy |
119+
| `versionId` | `String?` | non-null when versioning is enabled |
120+
| `deleteMarker` | `Boolean` | true for versioned delete markers |
121+
79122
## Configuration
80123

81124
Environment variables:
@@ -111,6 +154,8 @@ See **[docs/TESTING.md](docs/TESTING.md)** for the full testing strategy, base c
111154

112155
## Build
113156

157+
Always use `make` targets. Never invoke `./mvnw` directly.
158+
114159
```bash
115160
make install # Full build
116161
make skip-docker # Skip Docker

CHANGELOG.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,19 @@ Version 5.x is JDK17 LTS bytecode compatible, with Docker and JUnit / direct Jav
154154
* TBD
155155
* Version updates (deliverable dependencies)
156156
* Bump alpine from 3.23.3 to 3.23.4 in /docker
157+
* Bump spring-boot.version from 4.0.5 to 4.0.6
158+
* Bump software.amazon.awssdk:bom from 2.42.29 to 2.43.0
159+
* Bump aws.sdk.kotlin:s3-jvm from 1.6.52 to 1.6.65
160+
* Bump org.jetbrains.kotlin:kotlin-bom from 2.3.10 to 2.3.21
161+
* Bump org.jetbrains.kotlinx:kotlinx-coroutines-bom from 1.10.2 to 1.11.0
162+
* Bump org.testcontainers:testcontainers-bom from 2.0.2 to 2.0.5
157163
* Version updates (build dependencies)
158-
* Bump com.github.gantsign.maven:ktlint-maven-plugin from 3.7.0 to 3.7.1.
164+
* Bump com.github.gantsign.maven:ktlint-maven-plugin from 3.7.0 to 3.7.1
165+
* Bump com.puppycrawl.tools:checkstyle from 13.4.0 to 13.4.2
159166
* Bump actions/upload-artifact from 7.0.0 to 7.0.1
160-
* Bump github/codeql-action from 4.35.1 to 4.35.2
161-
* Bump step-security/harden-runner from 2.16.1 to 2.18.0
167+
* Bump actions/dependency-review-action from 4.9.0 to 5.0.0
168+
* Bump github/codeql-action from 4.35.1 to 4.35.4
169+
* Bump step-security/harden-runner from 2.16.1 to 2.19.1
162170

163171
## 5.0.0
164172

INVARIANTS.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,18 @@ No performance SLAs are defined for S3Mock. It is a local testing tool, not a th
6565
✅ Never use JUnit 4 — it was removed in 5.x — *Enforced by: human review*
6666

6767
✅ Never mock AWS SDK clients in integration tests (`*IT.kt`) — use actual SDK v2 clients against a live S3Mock Docker container — *Enforced by: human review*
68+
69+
✅ Every code change must include unit tests (`*Test.kt` in `server/`) covering the new or modified logic — *Enforced by: human review*
70+
71+
✅ Every behavior observable via the S3 HTTP API must be covered by an integration test (`*IT.kt` in `integration-tests/`) — *Enforced by: human review*
72+
73+
---
74+
75+
## Definition of Done
76+
77+
A task is not complete until all of the following are true:
78+
79+
- Unit tests cover the new or modified logic (`*Test.kt` in the module the change was made)
80+
- Integration tests cover the observable HTTP/S3 behavior (`*IT.kt` in `integration-tests/`)
81+
- `CHANGELOG.md` has an entry under the current version for any user-facing bug fix or feature
82+
- `make format` passes (ktlint + Checkstyle)

0 commit comments

Comments
 (0)