diff --git a/pom.xml b/pom.xml index 590f586..67bd997 100644 --- a/pom.xml +++ b/pom.xml @@ -122,7 +122,7 @@ cloud.dnation.integration hetzner-cloud-client-java - 1.3.0 + 1.6.0 org.jenkins-ci.plugins diff --git a/src/main/java/cloud/dnation/jenkins/plugins/hetzner/ConfigurationValidator.java b/src/main/java/cloud/dnation/jenkins/plugins/hetzner/ConfigurationValidator.java index d81ea66..fa38ff3 100644 --- a/src/main/java/cloud/dnation/jenkins/plugins/hetzner/ConfigurationValidator.java +++ b/src/main/java/cloud/dnation/jenkins/plugins/hetzner/ConfigurationValidator.java @@ -106,8 +106,8 @@ static ValidationResult verifyImage(String image, String credentialsId) { "Expected exactly one result, got %s", result.getImages().size()); return new ValidationResult(true, "Found: " + result.getImages().get(0).getDescription()); - } else if (Helper.isPossiblyInteger(image)) { - final GetImageByIdResponse result = api.getImageById(Integer.parseInt(image)).execute().body(); + } else if (Helper.isPossiblyLong(image)) { + final GetImageByIdResponse result = api.getImageById(Long.parseLong(image)).execute().body(); return new ValidationResult(true, "Found: " + result.getImage().getDescription()); } else { @@ -128,7 +128,7 @@ static ValidationResult verifyNetwork(String network, String credentialsId) { return new ValidationResult(true, "Found: " + result.getNetworks().get(0).getName() + " " + result.getNetworks().get(0).getIpRange()); - } else if (Helper.isPossiblyInteger(network)) { + } else if (Helper.isPossiblyLong(network)) { final GetNetworkByIdResponse result = api.getNetworkById(Integer.parseInt(network)).execute().body(); return new ValidationResult(true, "Found: " + result.getNetwork().getName() + " " + result.getNetwork().getIpRange()); @@ -150,7 +150,7 @@ static ValidationResult verifyPlacementGroup(String placementGroup, String crede return new ValidationResult(true, "Found: " + result.getPlacementGroups().get(0).getName() + " " + result.getPlacementGroups().get(0).getId()); - } else if (Helper.isPossiblyInteger(placementGroup)) { + } else if (Helper.isPossiblyLong(placementGroup)) { final GetPlacementGroupByIdResponse result = api.getPlacementGroupById(Integer.parseInt(placementGroup)).execute().body(); return new ValidationResult(true, "Found: " + result.getPlacementGroup().getName() + " " + result.getPlacementGroup().getId()); diff --git a/src/main/java/cloud/dnation/jenkins/plugins/hetzner/Helper.java b/src/main/java/cloud/dnation/jenkins/plugins/hetzner/Helper.java index 338e83b..17462c4 100644 --- a/src/main/java/cloud/dnation/jenkins/plugins/hetzner/Helper.java +++ b/src/main/java/cloud/dnation/jenkins/plugins/hetzner/Helper.java @@ -20,7 +20,6 @@ import com.cloudbees.plugins.credentials.CredentialsProvider; import com.google.common.base.Preconditions; import com.google.common.base.Strings; -import com.google.common.primitives.Ints; import com.trilead.ssh2.crypto.PEMDecoder; import hudson.security.ACL; import jenkins.model.Jenkins; @@ -92,14 +91,18 @@ public static boolean isLabelExpression(String expression) { } /** - * Check if given string could be parsed as positive integer. + * Check if given string could be parsed as positive long. * * @param str string to check - * @return true if given string could be parsed as positive integer, false otherwise + * @return true if given string could be parsed as positive long, false otherwise */ - public static boolean isPossiblyInteger(String str) { - final Integer value = Ints.tryParse(str); - return value != null && value > 0; + public static boolean isPossiblyLong(String str) { + try { + final long value = Long.parseLong(str); + return value > 0; + } catch (NumberFormatException e) { + return false; + } } public static List getPayload(@Nonnull Response response, @Nonnull Function> mapper) { diff --git a/src/main/java/cloud/dnation/jenkins/plugins/hetzner/HetznerCloudResourceManager.java b/src/main/java/cloud/dnation/jenkins/plugins/hetzner/HetznerCloudResourceManager.java index 3d01dd3..529fed9 100644 --- a/src/main/java/cloud/dnation/jenkins/plugins/hetzner/HetznerCloudResourceManager.java +++ b/src/main/java/cloud/dnation/jenkins/plugins/hetzner/HetznerCloudResourceManager.java @@ -117,7 +117,7 @@ private HetznerApi proxy() { * @throws IllegalStateException if there was invalid response from API server * @throws IllegalArgumentException if label expression didn't yield single image */ - private int getImageIdForLabelExpression(String labelExpression) throws IOException { + private long getImageIdForLabelExpression(String labelExpression) throws IOException { return searchResourceByLabelExpression(labelExpression, proxy()::getImagesBySelector, GetImagesBySelectorResponse::getImages); } @@ -132,7 +132,7 @@ private int getImageIdForLabelExpression(String labelExpression) throws IOExcept * @throws IllegalStateException if there was invalid response from API server * @throws IllegalArgumentException if label expression didn't yield single network */ - private int getNetworkIdForLabelExpression(String labelExpression) throws IOException { + private long getNetworkIdForLabelExpression(String labelExpression) throws IOException { return searchResourceByLabelExpression(labelExpression, proxy()::getNetworkBySelector, GetNetworksBySelectorResponse::getNetworks); } @@ -147,12 +147,12 @@ private int getNetworkIdForLabelExpression(String labelExpression) throws IOExce * @throws IllegalStateException if there was invalid response from API server * @throws IllegalArgumentException if label expression didn't yield single placement group */ - private int getPlacementGroupForLabelExpression(String labelExpression) throws IOException { + private long getPlacementGroupForLabelExpression(String labelExpression) throws IOException { return searchResourceByLabelExpression(labelExpression, proxy()::getPlacementGroups, GetPlacementGroupsResponse::getPlacementGroups); } - private int searchResourceByLabelExpression( + private long searchResourceByLabelExpression( String labelExpression, Function> searchFunction, Function> getItemsFunction) throws IOException { @@ -172,7 +172,7 @@ private int s * @param server server instance to remove from cloud */ public void destroyServer(ServerDetail server) { - final int serverId = server.getId(); + final long serverId = server.getId(); final HetznerApi client = proxy(); try { assertValidResponse(client.powerOffServer(serverId).execute()); @@ -204,11 +204,10 @@ private SshKeyDetail getOrCreateSshKey(HetznerServerTemplate template) throws IO } final String publicKey = getSSHPublicKeyFromPrivate(privateKey.getPrivateKey(), Secret.toString(privateKey.getPassphrase())); - final Response createResponse = proxy().createSshKey(CreateSshKeyRequest.builder() + final Response createResponse = proxy().createSshKey(new CreateSshKeyRequest() .labels(createLabelsForSshKey(credentialsId)) .name(template.getConnector().getSshCredentialsId()) - .publicKey(publicKey) - .build()) + .publicKey(publicKey)) .execute(); return assertValidResponse(createResponse, CreateSshKeyResponse::getSshKey); } @@ -255,9 +254,9 @@ public HetznerServerInfo createServer(HetznerServerAgent agent) { final ConnectivityType ct = agent.getTemplate().getConnectivity().getType(); if (ct == ConnectivityType.BOTH || ct == ConnectivityType.PRIVATE) { if (!Strings.isNullOrEmpty(agent.getTemplate().getNetwork())) { - final int networkId; - if (Helper.isPossiblyInteger(agent.getTemplate().getNetwork())) { - networkId = Integer.parseInt(agent.getTemplate().getNetwork()); + final long networkId; + if (Helper.isPossiblyLong(agent.getTemplate().getNetwork())) { + networkId = Long.parseLong(agent.getTemplate().getNetwork()); } else { networkId = getNetworkIdForLabelExpression(agent.getTemplate().getNetwork()); } @@ -272,8 +271,8 @@ public HetznerServerInfo createServer(HetznerServerAgent agent) { } final String placementGroup = agent.getTemplate().getPlacementGroup(); if (!Strings.isNullOrEmpty(placementGroup)) { - if(Helper.isPossiblyInteger(placementGroup)) { - createServerRequest.setPlacementGroup(Integer.parseInt(placementGroup)); + if(Helper.isPossiblyLong(placementGroup)) { + createServerRequest.setPlacementGroup(Long.parseLong(placementGroup)); } else { createServerRequest.setPlacementGroup(getPlacementGroupForLabelExpression(placementGroup)); } diff --git a/src/main/java/cloud/dnation/jenkins/plugins/hetzner/primaryip/AbstractByLabelSelector.java b/src/main/java/cloud/dnation/jenkins/plugins/hetzner/primaryip/AbstractByLabelSelector.java index 13852b5..2f8924e 100644 --- a/src/main/java/cloud/dnation/jenkins/plugins/hetzner/primaryip/AbstractByLabelSelector.java +++ b/src/main/java/cloud/dnation/jenkins/plugins/hetzner/primaryip/AbstractByLabelSelector.java @@ -38,7 +38,7 @@ public AbstractByLabelSelector(boolean failIfError, String selector) { @Override public void applyInternal(HetznerApi api, CreateServerRequest server) throws IOException { - final PrimaryIpDetail pip = api.getAllPrimaryIps(selector).execute().body().getIps().stream() + final PrimaryIpDetail pip = api.getAllPrimaryIps(selector).execute().body().getPrimaryIps().stream() .filter(ip -> isIpUsable(ip, server)).findFirst().get(); final PublicNetRequest net = new PublicNetRequest(); net.setIpv4(pip.getId()); diff --git a/src/test/java/cloud/dnation/jenkins/plugins/hetzner/HelperTest.java b/src/test/java/cloud/dnation/jenkins/plugins/hetzner/HelperTest.java index d815af3..f85fda4 100644 --- a/src/test/java/cloud/dnation/jenkins/plugins/hetzner/HelperTest.java +++ b/src/test/java/cloud/dnation/jenkins/plugins/hetzner/HelperTest.java @@ -58,4 +58,11 @@ public void testCanShutdownServer() { assertFalse(Helper.canShutdownServer(str, time("2022-08-08T11:03:02"))); assertTrue(Helper.canShutdownServer(str, time("2022-08-08T11:59:02"))); } + + @Test + public void testIsPossiblyLong() { + assertTrue(Helper.isPossiblyLong("1")); + assertFalse(Helper.isPossiblyLong("0")); + assertFalse(Helper.isPossiblyLong("not-a-number")); + } } diff --git a/src/test/java/cloud/dnation/jenkins/plugins/hetzner/primaryip/PrimaryIpStrategyTest.java b/src/test/java/cloud/dnation/jenkins/plugins/hetzner/primaryip/PrimaryIpStrategyTest.java index cf83522..9e62a72 100644 --- a/src/test/java/cloud/dnation/jenkins/plugins/hetzner/primaryip/PrimaryIpStrategyTest.java +++ b/src/test/java/cloud/dnation/jenkins/plugins/hetzner/primaryip/PrimaryIpStrategyTest.java @@ -63,7 +63,7 @@ public void testIpIsUsable() { assertFalse(isIpUsable(ip, server)); //Already allocated - ip.setAssigneeId(0); + ip.setAssigneeId(0L); assertFalse(isIpUsable(ip, server)); } }