diff --git a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/internal/InternalPostService.java b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/internal/InternalPostService.java index 8084d15..e5ee909 100644 --- a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/internal/InternalPostService.java +++ b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/internal/InternalPostService.java @@ -63,6 +63,7 @@ public SecretVersion postAcrossCluster(SecretKey key, String value) { UUID operationId = UUID.randomUUID(); long version = 1L; + log.info("Starting distributed post: operationId={}, key={}, version={}", operationId, key, version); List parts = createParts(key, value, version); SecretPart localPart = parts.get(0); List peerParts = parts.subList(1, parts.size()); @@ -72,7 +73,11 @@ public SecretVersion postAcrossCluster(SecretKey key, String value) { int peerAcks = broadcastPrepare(peerUrls, peerParts, operationId); int totalAcks = peerAcks + 1; int requiredAcks = computeRequiredAcks(); + log.info("Post prepare phase complete: operationId={}, totalAcks={}, requiredAcks={}", + operationId, totalAcks, requiredAcks); if (totalAcks < requiredAcks) { + log.warn("Quorum not reached for post: operationId={}, totalAcks={}, requiredAcks={}", + operationId, totalAcks, requiredAcks); pendingActionsBuffer.discard(operationId); throw new QuorumNotReachedException( "Post failed - received " + totalAcks + " ACKs, required " + requiredAcks); diff --git a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/internal/InternalPutService.java b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/internal/InternalPutService.java index 36a2b43..ae0019f 100644 --- a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/internal/InternalPutService.java +++ b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/internal/InternalPutService.java @@ -63,6 +63,7 @@ public SecretVersion putAcrossCluster(SecretKey key, String value) { UUID operationId = UUID.randomUUID(); long version = currentLocalPart.getVersion() + 1L; + log.info("Starting distributed put: operationId={}, key={}, version={}", operationId, key, version); List parts = createParts(key, value, version); SecretPart localPart = parts.get(0); List peerParts = parts.subList(1, parts.size()); @@ -72,7 +73,11 @@ public SecretVersion putAcrossCluster(SecretKey key, String value) { int peerAcks = broadcastPrepare(peerUrls, peerParts, operationId); int totalAcks = peerAcks + 1; int requiredAcks = computeRequiredAcks(); + log.info("Put prepare phase complete: operationId={}, totalAcks={}, requiredAcks={}", + operationId, totalAcks, requiredAcks); if (totalAcks < requiredAcks) { + log.warn("Quorum not reached for put: operationId={}, totalAcks={}, requiredAcks={}", + operationId, totalAcks, requiredAcks); pendingActionsBuffer.discard(operationId); throw new QuorumNotReachedException( "Put failed - received " + totalAcks + " ACKs, required " + requiredAcks); diff --git a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/DeleteSecretService.java b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/DeleteSecretService.java index 031967b..4be15ee 100644 --- a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/DeleteSecretService.java +++ b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/DeleteSecretService.java @@ -1,6 +1,8 @@ package edu.yu.capstone.DistributedSecretsVault.service.secret; import org.springframework.http.ResponseEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import edu.yu.capstone.DistributedSecretsVault.domain.model.SecretKey; @@ -9,6 +11,8 @@ @Service public class DeleteSecretService implements SecretCommand { + private static final Logger log = LoggerFactory.getLogger(DeleteSecretService.class); + private final InternalDeleteService internalDeleteService; public DeleteSecretService(InternalDeleteService internalDeleteService) { @@ -24,7 +28,9 @@ public ResponseEntity execute(DeleteSecretRequest input) { throw new IllegalArgumentException("User is required"); } SecretKey key = new SecretKey(input.getUser(), input.getDeleteName()); + log.info("Delete secret requested: user={}, secretName={}", key.getOwnerId(), key.getName()); internalDeleteService.deleteAcrossCluster(key); + log.info("Delete secret completed: user={}, secretName={}", key.getOwnerId(), key.getName()); return ResponseEntity.noContent().build(); } } diff --git a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/GetSecretService.java b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/GetSecretService.java index 9e4ff23..1002b57 100644 --- a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/GetSecretService.java +++ b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/GetSecretService.java @@ -1,6 +1,8 @@ package edu.yu.capstone.DistributedSecretsVault.service.secret; import org.springframework.http.ResponseEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import edu.yu.capstone.DistributedSecretsVault.domain.model.SecretKey; @@ -10,6 +12,8 @@ @Service public class GetSecretService { + private static final Logger log = LoggerFactory.getLogger(GetSecretService.class); + private final InternalGetService internalGetService; public GetSecretService(InternalGetService internalGetService) { @@ -18,13 +22,22 @@ public GetSecretService(InternalGetService internalGetService) { public ResponseEntity getVersion(String user, String secretName, Long version) { SecretKey key = validate(user, secretName); + log.info("Retrieve secret requested: user={}, secretName={}, version={}", + key.getOwnerId(), key.getName(), version == null ? "latest" : version); String secretValue = internalGetService.getAcrossCluster(key, version); + log.info("Retrieve secret completed: user={}, secretName={}, version={}", + key.getOwnerId(), key.getName(), version == null ? "latest" : version); return ResponseEntity.ok(secretValue); } public ResponseEntity> getAllVersions(String user, String secretName) { SecretKey key = validate(user, secretName); - return ResponseEntity.ok(internalGetService.getAllVersionsAcrossCluster(key)); + log.info("Retrieve all secret versions requested: user={}, secretName={}", + key.getOwnerId(), key.getName()); + Map versions = internalGetService.getAllVersionsAcrossCluster(key); + log.info("Retrieve all secret versions completed: user={}, secretName={}, versionCount={}", + key.getOwnerId(), key.getName(), versions.size()); + return ResponseEntity.ok(versions); } private SecretKey validate(String user, String secretName) { diff --git a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/PostSecretService.java b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/PostSecretService.java index 363827b..6b3f8f0 100644 --- a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/PostSecretService.java +++ b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/PostSecretService.java @@ -2,6 +2,8 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import edu.yu.capstone.DistributedSecretsVault.domain.model.SecretKey; @@ -11,6 +13,8 @@ @Service public class PostSecretService implements SecretCommand { + private static final Logger log = LoggerFactory.getLogger(PostSecretService.class); + private final InternalPostService internalPostService; public PostSecretService(InternalPostService internalPostService) { @@ -26,7 +30,10 @@ public ResponseEntity execute(PostSecretRequest input) { throw new IllegalArgumentException("User is required"); } SecretKey key = new SecretKey(input.getUser(), input.getSecretName()); + log.info("Create secret requested: user={}, secretName={}", key.getOwnerId(), key.getName()); SecretVersion version = internalPostService.postAcrossCluster(key, input.getSecretValue()); + log.info("Create secret completed: user={}, secretName={}, version={}", + key.getOwnerId(), key.getName(), version.getVersion()); return ResponseEntity.status(HttpStatus.CREATED) .body("Secret created (version: " + version.getVersion() + ")"); } diff --git a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/PutSecretService.java b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/PutSecretService.java index 761c502..f017b6a 100644 --- a/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/PutSecretService.java +++ b/src/main/java/edu/yu/capstone/DistributedSecretsVault/service/secret/PutSecretService.java @@ -1,6 +1,8 @@ package edu.yu.capstone.DistributedSecretsVault.service.secret; import org.springframework.http.ResponseEntity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import edu.yu.capstone.DistributedSecretsVault.dto.secret.PutSecretRequest; @@ -10,6 +12,8 @@ @Service public class PutSecretService implements SecretCommand { + private static final Logger log = LoggerFactory.getLogger(PutSecretService.class); + private final InternalPutService internalPutService; public PutSecretService(InternalPutService internalPutService) { @@ -25,7 +29,10 @@ public ResponseEntity execute(PutSecretRequest input) { throw new IllegalArgumentException("User is required"); } SecretKey key = new SecretKey(input.getUser(), input.getSecretCurrentName()); + log.info("Update secret requested: user={}, secretName={}", key.getOwnerId(), key.getName()); SecretVersion version = internalPutService.putAcrossCluster(key, input.getSecretUpdatedValue()); + log.info("Update secret completed: user={}, secretName={}, version={}", + key.getOwnerId(), key.getName(), version.getVersion()); return ResponseEntity.ok("Secret updated (version: " + version.getVersion() + ")"); } }