Releases: optiflowic/kumolo
Releases · optiflowic/kumolo
Release list
v0.2.3
What's Changed
Added
S3
PutObjectLockConfigurationwithDefaultRetentionnow enforces the configured mode (GOVERNANCE / COMPLIANCE) and period (days or years) on every new object uploaded viaPutObject,CopyObject, andCompleteMultipartUpload- BucketLifecycle now evaluates
NoncurrentVersionExpirationandNoncurrentVersionTransitionrules - BucketLifecycle now accepts the
x-amz-transition-default-minimum-object-sizerequest header (required by Terraform AWS Provider v6) - BucketReplication now replicates delete markers when
DeleteMarkerReplicationis enabled in the replication configuration - BucketReplication now supports tag-based filter rules (
Filter.TagandFilter.And.Tags) in addition to key prefix matching - Presigned POST (
POST Object): browser-based direct-to-S3 uploads via HTML multipart form; supports${filename}substitution in the object key andsuccess_action_status/success_action_redirectresponse control
Server
- Request logs now include method, path, status code, and latency in a structured, color-coded format; color is disabled automatically when stderr is not a terminal or
NO_COLORis set
Fixed
S3
PutBucketVersioningnow returnsInvalidBucketStatewhen attempting to suspend versioning on an Object Lock-enabled bucket
Server
- Fixed Windows build failure caused by
syscall.Stderr(uintptr) being incompatible withterm.IsTerminalaftergolang.org/x/termv0.44.0 unified the signature toint; replaced withint(os.Stderr.Fd())
Full Changelog: v0.2.2...v0.2.3
v0.2.2
What's Changed
Added
DynamoDB
TagResourceandUntagResourcenow accept index ARNs (e.g.table/Name/index/IndexName) in addition to table ARNs
S3
ListObjectsandListObjectsV2now supportencoding-type=url; key names, prefixes, delimiters, and markers are percent-encoded in the responseCopyObjectnow supportsx-amz-tagging-directive(COPYorREPLACE);COPY(default) preserves source tags,REPLACEapplies tags fromx-amz-taggingCopyObjectnow evaluatesx-amz-copy-source-if-match,x-amz-copy-source-if-none-match,x-amz-copy-source-if-modified-since, andx-amz-copy-source-if-unmodified-sinceCompleteMultipartUploadnow appliesx-amz-taggingfrom theCreateMultipartUploadrequest to the final object
Fixed
DynamoDB
TagResourceandUntagResourcenow enforce the 50-tag limit and key/value length constraints (key: 1–128, value: 0–256), returningValidationExceptionfor violations
KMS
CreateKeynow rejectsECC_SECG_P256K1asKeySpecwithUnsupportedOperationExceptionimmediately; previously the key was created butGetPublicKeyfailed later
STS
AssumeRoleandGetSessionTokennow validateDurationSeconds(AssumeRole: 900–43200, GetSessionToken: 900–129600), returningValidationErrorfor out-of-range values
Full Changelog: v0.2.1...v0.2.2
v0.2.1
What's Changed
Fixed
S3
CopyObjectand all multipart upload operations now enforce ACL permission checks for anonymous requests; previously anonymous callers could bypass ACL restrictions on these paths
STS
AssumeRolenow validatesRoleArn(length 20–2048) andRoleSessionName(length 2–64, pattern[\w+=,.@-]*), returningValidationErrorfor out-of-range or malformed inputs
KMS
CreateKeynow persists theTagsparameter; previously tags were accepted but silently discarded, causing Terraform'sdefault_tagsmechanism to loop indefinitely on plan/apply
DynamoDB
CreateTablenow persists theTagsparameter; previously tags were accepted but silently discarded
Full Changelog: https://github.com/optiflowic/kumolo/blob/main/CHANGELOG.md
v0.2.0
What's New
KMS (new service)
- Core key management:
CreateKey,DescribeKey,ListKeys,GetKeyPolicy,PutKeyPolicy - Data plane:
GenerateDataKey,GenerateDataKeyWithoutPlaintext,GenerateDataKeyPair,GenerateDataKeyPairWithoutPlaintext,Encrypt,Decrypt - Key aliases:
CreateAlias,DeleteAlias,UpdateAlias,ListAliases - Key lifecycle:
EnableKey,DisableKey,ScheduleKeyDeletion,CancelKeyDeletion - Key rotation:
EnableKeyRotation,DisableKeyRotation,GetKeyRotationStatus,RotateKeyOnDemand,ListKeyRotations - Grant management:
CreateGrant,ListGrants,RetireGrant,RevokeGrant,ListRetirableGrants - Tagging:
TagResource,UntagResource,ListResourceTags
S3
SelectObjectContent— CSV and JSON input/output with SQL expression evaluation- SSE-C: server-side encryption with customer-provided keys (
x-amz-server-side-encryption-customer-*headers validated and stored onPutObject,GetObject,HeadObject,UploadPart,CopyObject) - SSE header validation:
x-amz-server-side-encryptionnow rejects invalid values;AES256,aws:kms, andaws:kms:dsseaccepted - SSE-KMS integration: KMS
GenerateDataKeycalled on object writes when a KMS key is specified;x-amz-server-side-encryption-aws-kms-key-idresolved and echoed in responses BucketKeyEnabledrequest/response header and object metadata- Default encryption applied to
PutObject,CopyObject, andCreateMultipartUploadwhen a bucket default encryption rule is configured - BucketLogging: access log records now delivered to the configured target bucket and prefix
- BucketReplication: objects now replicated to the configured destination bucket on
PutObject,CopyObject, and multipart upload completion
DynamoDB
- PartiQL:
ExecuteStatement,BatchExecuteStatement,ExecuteTransaction ReturnValuesOnConditionCheckFailureon PartiQL write statements- DynamoDB Streams:
ListStreams,DescribeStream,GetShardIterator,GetRecords
Go testing library
pkg/kumolo: in-process Go testing library — start kumolo in ahttptest.Serverwith a single call, no Docker required
Bug Fixes
S3
- ACL operations (
GetBucketAcl,PutBucketAcl,GetObjectAcl,PutObjectAcl) stored grants but never enforced them — previously stored grants are now enforced onGetObject/PutObject - Lifecycle rule
Expiration.Date(absolute expiry date) andExpiredObjectDeleteMarkerwere never evaluated by the background enforcement loop
DynamoDB
ReturnConsumedCapacity:ConsumedCapacity(orConsumedCapacities) was accepted as a parameter but omitted from all responses; it is now included
Full Changelog
v0.1.1
Fixed
DynamoDB
CreateTablereturnedResourceInUseExceptionwhen a previous failed attempt left an orphan directory — table existence is now determined by the presence of the.table.jsonmetadata file, not the directoryCreateTablecan now reuse an orphan directory left by a failed prior attempt instead of failing with a directory-exists errorListTablesincluded orphan directories (no.table.json) in its output, causingDescribeTableto returnResourceNotFoundExceptionfor the same nameListTablessilently swallowed non-ErrNotExistI/O errors fromstat; these are now propagated to the callerTransactWriteItemsdid not roll back writes already applied to disk when a later write in Phase 2 failed, violating atomicity; each item's pre-write state is now snapshotted and restored in reverse order on failure
Full Changelog: https://github.com/optiflowic/kumolo/blob/main/CHANGELOG.md
v0.1.0
Changelog
- aab083f: Add server configuration (port, data directory, log level) (#28) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 7649073: S3: Implement core HTTP router with AWS SigV4 request handling (#29) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 033610e: S3: Implement filesystem-based storage backend (#30) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 13a2a6f: [Bug]: DynamoDB ReturnConsumedCapacity parameter accepted but ConsumedCapacity omitted from all responses (#213) (#229) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- a8ef424: [Bug]: DynamoDB TTL expiry and Select parameter support (#186) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 70fc292: [Bug]: DynamoDB UpdateItem SET clause does not support if_not_exists() and list_append() (#197) (#208) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- eb24b5b: [Bug]: FilterExpression does not validate ExpressionAttributeValues references before item evaluation (#206) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 53aac94: [Bug]: S3 CopyObject does not apply bucket default ObjectLock retention to destination objects (#191) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 35880a0: [Bug]: S3 Lifecycle Expiration.Date and ExpiredObjectDeleteMarker not evaluated (#212) (#226) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 510a018: [Bug]: S3 PutObjectLockConfiguration default retention is not applied to new objects (#189) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 2c8880c: [Bug]: S3 RestoreObject does not restrict object access before restore completes (#192) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 5685de1: [Bug]: S3 multipart upload does not enforce 5 MB minimum part size (#187) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- df71a5f: [Bug]: S3 storage class not surfaced in GetObject, HeadObject, ListObjects, and GetObjectAttributes responses (#195) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 64d56d4: [Feature]: DynamoDB IN operator support in filter expressions (#204) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 6acd2f4: [Feature]: DynamoDB nested attribute path support in FilterExpression, ConditionExpression, and UpdateExpression (#209) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 04a9740: [Feature]: DynamoDB: Add GSI and LSI support (#151) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 555f4e0: [Feature]: DynamoDB: Implement DescribeContinuousBackups, UpdateContinuousBackups, and Kinesis streaming destination APIs (#166) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 3adbfba: [Feature]: DynamoDB: Implement DescribeLimits, DescribeEndpoints, UpdateTimeToLive, DescribeTimeToLive, TagResource, UntagResource, ListTagsOfResource, UpdateTable (#135) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 4b5d19e: [Feature]: DynamoDB: Implement TransactWriteItems and TransactGetItems (#152) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 33163db: [Feature]: DynamoDB: Improve Query with Limit, ScanIndexForward, ExclusiveStartKey pagination (#149) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 5d44a8a: [Feature]: DynamoDB: Scan pagination, parallel scan, and AWS spec compliance (#150) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- c369ef5: [Feature]: DynamoDB: Support ADD and DELETE clauses in UpdateExpression (#146) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 9b562e8: [Feature]: DynamoDB: Support FilterExpression for Scan and Query (#133) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 5e25809: [Feature]: DynamoDB: Support ProjectionExpression for GetItem, Query, Scan, BatchGetItem (#148) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 002f291: [Feature]: DynamoDB: Support ReturnValues ALL_OLD for PutItem and DeleteItem (#137) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- daa9616: [Feature]: DynamoDB: Support ReturnValues UPDATED_NEW, UPDATED_OLD, ALL_OLD for UpdateItem (#134) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- c248160: [Feature]: DynamoDB: Validate ReturnValues enum for UpdateItem (#138) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 26a7d9c: [Feature]: Implement DynamoDB BatchGetItem and BatchWriteItem (#57) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- a5d2360: [Feature]: Implement DynamoDB UpdateItem and Query (#56) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- d61828a: [Feature]: Implement GetBucketLocation endpoint (#38) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 88edf45: [Feature]: Implement S3 CopyObject endpoint (#22) (#39) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- dd22db4: [Feature]: Implement S3 bucket operations and HTTP logging (#34) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 42ce43a: [Feature]: Implement S3 multipart upload operations (#41) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 4ea7fb9: [Feature]: Implement S3 presigned URL support (#42) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 374abc5: [Feature]: Introduce Nix flake for reproducible dev environment and CI (#168) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 835b202: [Feature]: Make storage ephemeral by default (#44) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 21ee9b0: [Feature]: Migrate log → log/slog for structured logging (#33) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 95347ac: [Feature]: S3 bucket config, ACL, and RestoreObject stubs (#118) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 537c606: [Feature]: S3 pagination for ListMultipartUploads, ListObjectVersions, and ListParts (#210) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 77d45fe: [Feature]: S3: Enforce lifecycle rules via background goroutine (#145) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- a3a9a86: [Feature]: S3: Implement CORS OPTIONS preflight response enforcement (#120) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 0cb12d9: [Feature]: S3: Implement DeleteObjects (batch delete) (#58) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 431adbb: [Feature]: S3: Implement GetObjectAttributes (#144) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- f2a7367: [Feature]: S3: Implement ListMultipartUploads and ListParts (#61) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 01f8393: [Feature]: S3: Implement ListObjectVersions and versioned object operations (#112) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- bf48016: [Feature]: S3: Implement ListObjects V1 (#59) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 3ce519d: [Feature]: S3: Implement ListObjectsV2 pagination, delimiter, and fetch-owner (#117) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 88170f6: [Feature]: S3: Implement Object Lock (bucket config, object retention, legal hold, delete enforcement) (#125) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- c9376f1: [Feature]: S3: Implement bucket CORS configuration (PutBucketCors, GetBucketCors, DeleteBucketCors) (#74) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 0f4ebfc: [Feature]: S3: Implement bucket policy (PutBucketPolicy, GetBucketPolicy, DeleteBucketPolicy) (#75) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 33cc4a9: [Feature]: S3: Implement bucket tagging (GetBucketTagging, PutBucketTagging, DeleteBucketTagging) (#72) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 0ac6b31: [Feature]: S3: Implement bucket versioning (PutBucketVersioning, GetBucketVersioning) (#73) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 9ab34d7: [Feature]: S3: Implement object tagging (GetObjectTagging, PutObjectTagging, DeleteObjectTagging) (#70) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 773f9cd: [Feature]: S3: Stream-validate Content-MD5 instead of buffering full body (#142) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 5edacdc: [Feature]: S3: Support Range header and conditional GET (If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since) (#111) (Hisanari Kikuchi hisanari.kikuchi.dev@gmail.com)
- 7c0b92c: [Feature]: S3: Support SSE header pass-through for PutObject, CopyObject, CreateMult...