-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Create helper for parsing an error code from error response #938
Merged
Merged
Changes from all commits
Commits
Show all changes
7 commits
Select commit
Hold shift + click to select a range
0438673
Improve error message for registries that do not support v2-2
briandealwis b0018d0
Add tests
briandealwis 31c916e
Add helper to parse an error code from an error response
briandealwis 2a77983
fix param name
briandealwis d3e285a
Merge with HEAD
briandealwis 146c9a7
format
briandealwis eaa3c7b
review nits
briandealwis File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
70 changes: 70 additions & 0 deletions
70
jib-core/src/main/java/com/google/cloud/tools/jib/registry/ErrorResponseUtil.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
/* | ||
* Copyright 2018 Google Inc. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package com.google.cloud.tools.jib.registry; | ||
|
||
import com.google.api.client.http.HttpResponseException; | ||
import com.google.cloud.tools.jib.json.JsonTemplateMapper; | ||
import com.google.cloud.tools.jib.registry.json.ErrorEntryTemplate; | ||
import com.google.cloud.tools.jib.registry.json.ErrorResponseTemplate; | ||
import java.io.IOException; | ||
import java.util.List; | ||
|
||
/** Utility methods for parsing {@link ErrorResponseTemplate JSON-encoded error responses}. */ | ||
public class ErrorResponseUtil { | ||
|
||
/** | ||
* Extract an {@link ErrorCodes} response from the error object encoded in an {@link | ||
* HttpResponseException}. | ||
* | ||
* @param httpResponseException the response exception | ||
* @return the parsed {@link ErrorCodes} if found | ||
* @throws HttpResponseException rethrows the original exception if an error object could not be | ||
* parsed, if there were multiple error objects, or if the error code is unknown. | ||
*/ | ||
public static ErrorCodes getErrorCode(HttpResponseException httpResponseException) | ||
throws HttpResponseException { | ||
// Obtain the error response code. | ||
String errorContent = httpResponseException.getContent(); | ||
if (errorContent == null) { | ||
throw httpResponseException; | ||
} | ||
|
||
try { | ||
ErrorResponseTemplate errorResponse = | ||
JsonTemplateMapper.readJson(errorContent, ErrorResponseTemplate.class); | ||
List<ErrorEntryTemplate> errors = errorResponse.getErrors(); | ||
// There may be multiple error objects | ||
if (errors.size() == 1) { | ||
String errorCodeString = errors.get(0).getCode(); | ||
// May not get an error code back. | ||
if (errorCodeString != null) { | ||
// throws IllegalArgumentException if unknown error code | ||
return ErrorCodes.valueOf(errorCodeString); | ||
} | ||
} | ||
|
||
} catch (IOException | IllegalArgumentException ex) { | ||
// Parse exception: either isn't an error object or unknown error code | ||
} | ||
|
||
// rethrow the original exception | ||
throw httpResponseException; | ||
} | ||
|
||
// not intended to be instantiated | ||
private ErrorResponseUtil() {} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
93 changes: 93 additions & 0 deletions
93
jib-core/src/test/java/com/google/cloud/tools/jib/registry/ErrorResponseUtilTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
/* | ||
* Copyright 2018 Google Inc. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package com.google.cloud.tools.jib.registry; | ||
|
||
import com.google.api.client.http.HttpHeaders; | ||
import com.google.api.client.http.HttpResponseException; | ||
import org.apache.http.HttpStatus; | ||
import org.junit.Assert; | ||
import org.junit.Test; | ||
|
||
/** Test for {@link ErrorReponseUtil}. */ | ||
public class ErrorResponseUtilTest { | ||
|
||
@Test | ||
public void testGetErrorCode_knownErrorCode() throws HttpResponseException { | ||
HttpResponseException httpResponseException = | ||
new HttpResponseException.Builder( | ||
HttpStatus.SC_BAD_REQUEST, "Bad Request", new HttpHeaders()) | ||
.setContent( | ||
"{\"errors\":[{\"code\":\"MANIFEST_INVALID\",\"message\":\"manifest invalid\",\"detail\":{}}]}") | ||
.build(); | ||
|
||
Assert.assertSame( | ||
ErrorCodes.MANIFEST_INVALID, ErrorResponseUtil.getErrorCode(httpResponseException)); | ||
} | ||
|
||
/** An unknown {@link ErrorCodes} should cause original exception to be rethrown. */ | ||
@Test | ||
public void testGetErrorCode_unknownErrorCode() { | ||
HttpResponseException httpResponseException = | ||
new HttpResponseException.Builder( | ||
HttpStatus.SC_BAD_REQUEST, "Bad Request", new HttpHeaders()) | ||
.setContent( | ||
"{\"errors\":[{\"code\":\"INVALID_ERROR_CODE\",\"message\":\"invalid code\",\"detail\":{}}]}") | ||
.build(); | ||
try { | ||
ErrorResponseUtil.getErrorCode(httpResponseException); | ||
Assert.fail(); | ||
} catch (HttpResponseException ex) { | ||
Assert.assertSame(httpResponseException, ex); | ||
} | ||
} | ||
|
||
/** Multiple error objects should cause original exception to be rethrown. */ | ||
@Test | ||
public void testGetErrorCode_multipleErrors() { | ||
HttpResponseException httpResponseException = | ||
new HttpResponseException.Builder( | ||
HttpStatus.SC_BAD_REQUEST, "Bad Request", new HttpHeaders()) | ||
.setContent( | ||
"{\"errors\":[" | ||
+ "{\"code\":\"MANIFEST_INVALID\",\"message\":\"message 1\",\"detail\":{}}," | ||
+ "{\"code\":\"TAG_INVALID\",\"message\":\"message 2\",\"detail\":{}}" | ||
+ "]}") | ||
.build(); | ||
try { | ||
ErrorResponseUtil.getErrorCode(httpResponseException); | ||
Assert.fail(); | ||
} catch (HttpResponseException ex) { | ||
Assert.assertSame(httpResponseException, ex); | ||
} | ||
} | ||
|
||
/** An non-error object should cause original exception to be rethrown. */ | ||
@Test | ||
public void testGetErrorCode_invalidErrorObject() { | ||
HttpResponseException httpResponseException = | ||
new HttpResponseException.Builder( | ||
HttpStatus.SC_BAD_REQUEST, "Bad Request", new HttpHeaders()) | ||
.setContent("{\"type\":\"other\",\"message\":\"some other object\"}") | ||
.build(); | ||
try { | ||
ErrorResponseUtil.getErrorCode(httpResponseException); | ||
Assert.fail(); | ||
} catch (HttpResponseException ex) { | ||
Assert.assertSame(httpResponseException, ex); | ||
} | ||
} | ||
} |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the
JSON-encoded error responses
intended to be inside the{@link
?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah. Callers aren't necessarily aware of the class, but its javadocs have a nice description of the object layout.