summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-05-31 13:51:21 +0200
committerMartin Polden <mpolden@mpolden.no>2019-05-31 13:51:21 +0200
commit70c1f28c6c16f41191fa736157973b32b7397f64 (patch)
treea6b7999b31de9a6f47a5c3f681753ae1f5c043a6 /controller-server
parentcb165b874d9d7bdc31c0081d7ec26bb6cd963bac (diff)
Audit log PUT requests
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/auditlog/AuditLog.java1
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/auditlog/AuditLoggerTest.java46
3 files changed, 38 insertions, 11 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/auditlog/AuditLog.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/auditlog/AuditLog.java
index c467a4a0acd..aefe8ae7b48 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/auditlog/AuditLog.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/auditlog/AuditLog.java
@@ -109,6 +109,7 @@ public class AuditLog {
public enum Method {
POST,
PATCH,
+ PUT,
DELETE
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java
index 5bcb155efcb..7fee9a7f9b4 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/AuditLogSerializer.java
@@ -60,6 +60,7 @@ public class AuditLogSerializer {
switch (method) {
case POST: return "POST";
case PATCH: return "PATCH";
+ case PUT: return "PUT";
case DELETE: return "DELETE";
default: throw new IllegalArgumentException("No serialization defined for method " + method);
}
@@ -69,6 +70,7 @@ public class AuditLogSerializer {
switch (field.asString()) {
case "POST": return AuditLog.Entry.Method.POST;
case "PATCH": return AuditLog.Entry.Method.PATCH;
+ case "PUT": return AuditLog.Entry.Method.PUT;
case "DELETE": return AuditLog.Entry.Method.DELETE;
default: throw new IllegalArgumentException("Unknown serialized value '" + field.asString() + "'");
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/auditlog/AuditLoggerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/auditlog/AuditLoggerTest.java
index 6470ce3663f..67979571f73 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/auditlog/AuditLoggerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/auditlog/AuditLoggerTest.java
@@ -24,11 +24,10 @@ import static org.junit.Assert.assertTrue;
public class AuditLoggerTest {
private final ControllerTester tester = new ControllerTester();
+ private final Supplier<AuditLog> log = () -> tester.controller().auditLogger().readLog();
@Test
public void test_logging() {
- Supplier<AuditLog> log = () -> tester.controller().auditLogger().readLog();
-
{ // GET request is ignored
HttpRequest request = testRequest(Method.GET, URI.create("http://localhost:8080/os/v1/"), "");
tester.controller().auditLogger().log(request);
@@ -40,11 +39,8 @@ public class AuditLoggerTest {
String data = "{\"cloud\":\"cloud9\",\"version\":\"42.0\"}";
HttpRequest request = testRequest(Method.PATCH, url, data);
tester.controller().auditLogger().log(request);
-
- assertEquals(instant(), log.get().entries().get(0).at());
+ assertEntry(Entry.Method.PATCH, 1, "/os/v1/?foo=bar");
assertEquals("user", log.get().entries().get(0).principal());
- assertEquals(Entry.Method.PATCH, log.get().entries().get(0).method());
- assertEquals("/os/v1/?foo=bar", log.get().entries().get(0).resource());
assertEquals(data, log.get().entries().get(0).data().get());
}
@@ -53,9 +49,31 @@ public class AuditLoggerTest {
HttpRequest request = testRequest(Method.PATCH, URI.create("http://localhost:8080/os/v1/"),
"{\"cloud\":\"cloud9\",\"version\":\"43.0\"}");
tester.controller().auditLogger().log(request);
- assertEquals(2, log.get().entries().size());
- assertEquals(instant(), log.get().entries().get(0).at());
- assertEquals("/os/v1/", log.get().entries().get(0).resource());
+ assertEntry(Entry.Method.PATCH, 2, "/os/v1/");
+ }
+
+ { // PUT is logged
+ tester.clock().advance(Duration.ofDays(1));
+ HttpRequest request = testRequest(Method.PUT, URI.create("http://localhost:8080/zone/v2/prod/us-north-1/nodes/v2/state/dirty/node1/"),
+ "");
+ tester.controller().auditLogger().log(request);
+ assertEntry(Entry.Method.PUT, 3, "/zone/v2/prod/us-north-1/nodes/v2/state/dirty/node1/");
+ }
+
+ { // DELETE is logged
+ tester.clock().advance(Duration.ofDays(1));
+ HttpRequest request = testRequest(Method.DELETE, URI.create("http://localhost:8080/zone/v2/prod/us-north-1/nodes/v2/node/node1"),
+ "");
+ tester.controller().auditLogger().log(request);
+ assertEntry(Entry.Method.DELETE, 4, "/zone/v2/prod/us-north-1/nodes/v2/node/node1");
+ }
+
+ { // POST is logged
+ tester.clock().advance(Duration.ofDays(1));
+ HttpRequest request = testRequest(Method.POST, URI.create("http://localhost:8080/controller/v1/jobs/upgrader/confidence/6.42"),
+ "6.42");
+ tester.controller().auditLogger().log(request);
+ assertEntry(Entry.Method.POST, 5, "/controller/v1/jobs/upgrader/confidence/6.42");
}
{ // 14 days pass and another PATCH request is logged. Older entries are removed due to expiry
@@ -63,8 +81,7 @@ public class AuditLoggerTest {
HttpRequest request = testRequest(Method.PATCH, URI.create("http://localhost:8080/os/v1/"),
"{\"cloud\":\"cloud9\",\"version\":\"44.0\"}");
tester.controller().auditLogger().log(request);
- assertEquals(1, log.get().entries().size());
- assertEquals(instant(), log.get().entries().get(0).at());
+ assertEntry(Entry.Method.PATCH, 1, "/os/v1/");
}
}
@@ -72,6 +89,13 @@ public class AuditLoggerTest {
return tester.clock().instant().truncatedTo(MILLIS);
}
+ private void assertEntry(Entry.Method method, int logSize, String resource) {
+ assertEquals(logSize, log.get().entries().size());
+ assertEquals(instant(), log.get().entries().get(0).at());
+ assertEquals(method, log.get().entries().get(0).method());
+ assertEquals(resource, log.get().entries().get(0).resource());
+ }
+
private static HttpRequest testRequest(Method method, URI url, String data) {
HttpRequest request = HttpRequest.createTestRequest(
url.toString(),