diff --git a/gradle.properties b/gradle.properties index ee02f42c..64b8c9bb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group = io.github.cdancy -version = 1.0.2 +version = 1.1.0 artifactoryURL = http://127.0.0.1:8080/artifactory artifactoryUser = admin diff --git a/src/main/java/com/cdancy/jenkins/rest/domain/system/SystemInfo.java b/src/main/java/com/cdancy/jenkins/rest/domain/system/SystemInfo.java index 1db3c7de..eefc3a1d 100644 --- a/src/main/java/com/cdancy/jenkins/rest/domain/system/SystemInfo.java +++ b/src/main/java/com/cdancy/jenkins/rest/domain/system/SystemInfo.java @@ -56,4 +56,5 @@ public static SystemInfo create(String hudsonVersion, String jenkinsVersion, Str hudsonVersion, jenkinsVersion, jenkinsSession, instanceIdentity, sshEndpoint, server); } + } diff --git a/src/main/java/com/cdancy/jenkins/rest/features/SystemApi.java b/src/main/java/com/cdancy/jenkins/rest/features/SystemApi.java index 81685d71..67aa4a4f 100644 --- a/src/main/java/com/cdancy/jenkins/rest/features/SystemApi.java +++ b/src/main/java/com/cdancy/jenkins/rest/features/SystemApi.java @@ -61,5 +61,13 @@ public interface SystemApi { @Consumes(MediaType.TEXT_HTML) @POST RequestStatus cancelQuietDown(); + + @Named("system:safe-exit") + @Path("safeExit") + @Fallback(JenkinsFallbacks.RequestStatusOnError.class) + @ResponseParser(RequestStatusParser.class) + @Consumes(MediaType.TEXT_HTML) + @POST + RequestStatus safeExit(); } diff --git a/src/main/java/com/cdancy/jenkins/rest/parsers/SystemInfoFromJenkinsHeaders.java b/src/main/java/com/cdancy/jenkins/rest/parsers/SystemInfoFromJenkinsHeaders.java index cb14ee04..3e00552d 100644 --- a/src/main/java/com/cdancy/jenkins/rest/parsers/SystemInfoFromJenkinsHeaders.java +++ b/src/main/java/com/cdancy/jenkins/rest/parsers/SystemInfoFromJenkinsHeaders.java @@ -30,6 +30,9 @@ */ @Singleton public class SystemInfoFromJenkinsHeaders implements Function { + + private static final String DEFAULT_EMPTY_HEADER_STRING = "information not available"; + @Override public SystemInfo apply(HttpResponse response) { @@ -41,10 +44,15 @@ public SystemInfo apply(HttpResponse response) { if (statusCode >= 200 && statusCode < 400) { return SystemInfo.create(response.getFirstHeaderOrNull("X-Hudson"), response.getFirstHeaderOrNull("X-Jenkins"), response.getFirstHeaderOrNull("X-Jenkins-Session"), - response.getFirstHeaderOrNull("X-Instance-Identity"), response.getFirstHeaderOrNull("X-SSH-Endpoint"), - response.getFirstHeaderOrNull("Server"), null); + response.getFirstHeaderOrNull("X-Instance-Identity"), getFirstHeaderOrDefault(response, "X-SSH-Endpoint"), + getFirstHeaderOrDefault(response, "Server"), null); } else { throw new RuntimeException(response.getStatusLine()); } } + + private String getFirstHeaderOrDefault(HttpResponse response, String header) { + String headerFromResponse = response.getFirstHeaderOrNull(header); + return (headerFromResponse != null) ? headerFromResponse : DEFAULT_EMPTY_HEADER_STRING; + } } diff --git a/src/test/java/com/cdancy/jenkins/rest/features/SystemApiMockTest.java b/src/test/java/com/cdancy/jenkins/rest/features/SystemApiMockTest.java index a9bb9037..d8992095 100644 --- a/src/test/java/com/cdancy/jenkins/rest/features/SystemApiMockTest.java +++ b/src/test/java/com/cdancy/jenkins/rest/features/SystemApiMockTest.java @@ -147,4 +147,21 @@ public void testCancelQuietDownOnAuthException() throws Exception { server.shutdown(); } } + + public void testSafeExit() throws Exception { + MockWebServer server = mockWebServer(); + + server.enqueue(new MockResponse().setResponseCode(200)); + JenkinsApi jenkinsApi = api(server.url("/").url()); + SystemApi api = jenkinsApi.systemApi(); + try { + RequestStatus success = api.safeExit(); + assertNotNull(success); + assertTrue(success.value()); + assertSentAccept(server, "POST", "/safeExit", MediaType.TEXT_HTML); + } finally { + jenkinsApi.close(); + server.shutdown(); + } + } }