diff --git a/gcloud-java-logging/src/main/java/com/google/cloud/logging/Logging.java b/gcloud-java-logging/src/main/java/com/google/cloud/logging/Logging.java index 36419676f146..b65e58af43a3 100644 --- a/gcloud-java-logging/src/main/java/com/google/cloud/logging/Logging.java +++ b/gcloud-java-logging/src/main/java/com/google/cloud/logging/Logging.java @@ -137,6 +137,20 @@ public static ListOption pageToken(String pageToken) { */ Future deleteSinkAsync(String sink); + /** + * Deletes a log and all its log entries. The log will reappear if new entries are written to it. + * + * @return {@code true} if the log was deleted, {@code false} if it was not found + */ + boolean deleteLog(String log); + + /** + * Sends a request for deleting a log and all its log entries. This method returns a + * {@code Future} object to consume the result. {@link Future#get()} returns {@code true} if the + * log was deleted, {@code false} if it was not found. + */ + Future deleteLogAsync(String log); + /** * Lists the monitored resource descriptors used by Google Cloud Logging. This method returns a * {@link Page} object that can be used to consume paginated results. Use {@link ListOption} to diff --git a/gcloud-java-logging/src/main/java/com/google/cloud/logging/LoggingImpl.java b/gcloud-java-logging/src/main/java/com/google/cloud/logging/LoggingImpl.java index f1afd64a176d..b44f634126b1 100644 --- a/gcloud-java-logging/src/main/java/com/google/cloud/logging/LoggingImpl.java +++ b/gcloud-java-logging/src/main/java/com/google/cloud/logging/LoggingImpl.java @@ -29,6 +29,7 @@ import com.google.cloud.PageImpl; import com.google.cloud.logging.spi.LoggingRpc; import com.google.cloud.logging.spi.v2.ConfigServiceV2Api; +import com.google.cloud.logging.spi.v2.LoggingServiceV2Api; import com.google.cloud.logging.spi.v2.MetricsServiceV2Api; import com.google.common.base.Function; import com.google.common.base.Throwables; @@ -39,6 +40,7 @@ import com.google.logging.v2.CreateLogMetricRequest; import com.google.logging.v2.CreateSinkRequest; import com.google.logging.v2.DeleteLogMetricRequest; +import com.google.logging.v2.DeleteLogRequest; import com.google.logging.v2.DeleteSinkRequest; import com.google.logging.v2.GetLogMetricRequest; import com.google.logging.v2.GetSinkRequest; @@ -249,6 +251,17 @@ public Future deleteSinkAsync(String sink) { return lazyTransform(rpc.delete(request), EMPTY_TO_BOOLEAN_FUNCTION); } + public boolean deleteLog(String log) { + return get(deleteLogAsync(log)); + } + + public Future deleteLogAsync(String log) { + DeleteLogRequest request = DeleteLogRequest.newBuilder() + .setLogName(LoggingServiceV2Api.formatLogName(options().projectId(), log)) + .build(); + return lazyTransform(rpc.delete(request), EMPTY_TO_BOOLEAN_FUNCTION); + } + private static ListMonitoredResourceDescriptorsRequest listMonitoredResourceDescriptorsRequest( Map options) { ListMonitoredResourceDescriptorsRequest.Builder builder = diff --git a/gcloud-java-logging/src/test/java/com/google/cloud/logging/LoggingImplTest.java b/gcloud-java-logging/src/test/java/com/google/cloud/logging/LoggingImplTest.java index 6d768e61bd67..b6aed1042e6b 100644 --- a/gcloud-java-logging/src/test/java/com/google/cloud/logging/LoggingImplTest.java +++ b/gcloud-java-logging/src/test/java/com/google/cloud/logging/LoggingImplTest.java @@ -39,6 +39,7 @@ import com.google.logging.v2.CreateLogMetricRequest; import com.google.logging.v2.CreateSinkRequest; import com.google.logging.v2.DeleteLogMetricRequest; +import com.google.logging.v2.DeleteLogRequest; import com.google.logging.v2.DeleteSinkRequest; import com.google.logging.v2.GetLogMetricRequest; import com.google.logging.v2.GetSinkRequest; @@ -84,6 +85,8 @@ public class LoggingImplTest { com.google.api.MonitoredResourceDescriptor.getDefaultInstance(); private static final MonitoredResourceDescriptor DESCRIPTOR = MonitoredResourceDescriptor.fromPb(DESCRIPTOR_PB); + private static final String LOG_NAME = "log"; + private static final String LOG_NAME_PB = "projects/" + PROJECT + "/logs/" + LOG_NAME; private static final Function SINK_TO_PB_FUNCTION = new Function() { @Override @@ -1080,4 +1083,42 @@ public void testListResourceDescriptorAsyncWithOptions() assertArrayEquals(descriptorList.toArray(), Iterables.toArray(page.values(), MonitoredResourceDescriptor.class)); } + + @Test + public void testDeleteLog() { + DeleteLogRequest request = DeleteLogRequest.newBuilder().setLogName(LOG_NAME_PB).build(); + Future response = Futures.immediateFuture(Empty.getDefaultInstance()); + EasyMock.expect(loggingRpcMock.delete(request)).andReturn(response); + EasyMock.replay(rpcFactoryMock, loggingRpcMock); + logging = options.service(); + assertTrue(logging.deleteLog(LOG_NAME)); + } + + @Test + public void testDeleteLog_Null() { + DeleteLogRequest request = DeleteLogRequest.newBuilder().setLogName(LOG_NAME_PB).build(); + EasyMock.expect(loggingRpcMock.delete(request)).andReturn(Futures.immediateFuture(null)); + EasyMock.replay(rpcFactoryMock, loggingRpcMock); + logging = options.service(); + assertFalse(logging.deleteLog(LOG_NAME)); + } + + @Test + public void testDeleteLogAync() throws ExecutionException, InterruptedException { + DeleteLogRequest request = DeleteLogRequest.newBuilder().setLogName(LOG_NAME_PB).build(); + Future response = Futures.immediateFuture(Empty.getDefaultInstance()); + EasyMock.expect(loggingRpcMock.delete(request)).andReturn(response); + EasyMock.replay(rpcFactoryMock, loggingRpcMock); + logging = options.service(); + assertTrue(logging.deleteLogAsync(LOG_NAME).get()); + } + + @Test + public void testDeleteLogAsync_Null() throws ExecutionException, InterruptedException { + DeleteLogRequest request = DeleteLogRequest.newBuilder().setLogName(LOG_NAME_PB).build(); + EasyMock.expect(loggingRpcMock.delete(request)).andReturn(Futures.immediateFuture(null)); + EasyMock.replay(rpcFactoryMock, loggingRpcMock); + logging = options.service(); + assertFalse(logging.deleteLogAsync(LOG_NAME).get()); + } }