diff --git a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/strategy/CloudStackComputeServiceAdapter.java b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/strategy/CloudStackComputeServiceAdapter.java index e839d30463..96b3a8ade0 100644 --- a/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/strategy/CloudStackComputeServiceAdapter.java +++ b/apis/cloudstack/src/main/java/org/jclouds/cloudstack/compute/strategy/CloudStackComputeServiceAdapter.java @@ -182,11 +182,11 @@ public class CloudStackComputeServiceAdapter implements VirtualMachine vm = blockUntilJobCompletesAndReturnResult.apply(job); logger.debug("--- virtualmachine: %s", vm); LoginCredentials credentials = null; - if (vm.isPasswordEnabled()) { + if (!vm.isPasswordEnabled() || templateOptions.getKeyPair() != null) { + credentials = LoginCredentials.fromCredentials(credentialStore.get("keypair#" + templateOptions.getKeyPair())); + } else { assert vm.getPassword() != null : vm; credentials = LoginCredentials.builder().password(vm.getPassword()).build(); - } else { - credentials = LoginCredentials.fromCredentials(credentialStore.get("keypair#" + templateOptions.getKeyPair())); } if (templateOptions.shouldSetupStaticNat()) { Capabilities capabilities = client.getConfigurationClient().listCapabilities(); diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/CloudStackComputeServiceAdapterExpectTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/CloudStackComputeServiceAdapterExpectTest.java index bab545927d..a0badad60b 100644 --- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/CloudStackComputeServiceAdapterExpectTest.java +++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/compute/CloudStackComputeServiceAdapterExpectTest.java @@ -62,7 +62,58 @@ public class CloudStackComputeServiceAdapterExpectTest extends BaseCloudStackCom HttpResponse queryAsyncJobResultResponse = HttpResponse.builder().statusCode(200) .payload(payloadFromResource("/queryasyncjobresultresponse-virtualmachine.json")) .build(); - + + HttpRequest listCapabilitiesNotListAll = HttpRequest.builder().method("GET") + .endpoint("http://localhost:8080/client/api") + .addQueryParam("response", "json") + .addQueryParam("command", "listCapabilities") + .addQueryParam("apiKey", "APIKEY") + .addQueryParam("signature", "l3PVoJnKK2G2gHk3HPHtpwWjlW4%3D") + .addHeader("Accept", "application/json") + .build(); + + public void testCreateNodeWithGroupEncodedIntoName() { + HttpRequest deployVM = HttpRequest.builder().method("GET") + .endpoint("http://localhost:8080/client/api") + .addQueryParam("response", "json") + .addQueryParam("command", "deployVirtualMachine") + .addQueryParam("zoneid", "1") + .addQueryParam("serviceofferingid", "1") + .addQueryParam("templateid", "4") + .addQueryParam("displayname", "test-e92") + .addQueryParam("name", "test-e92") + .addQueryParam("networkids", "204") + .addQueryParam("apiKey", "APIKEY") + .addQueryParam("signature", "wJ%2BiflOS3am5qcjQOd8Y/Pw8/Dc%3D") + .addHeader("Accept", "application/json") + .build(); + + Map requestResponseMap = ImmutableMap. builder() + .put(listTemplates, listTemplatesResponse) + .put(listOsTypes, listOsTypesResponse) + .put(listOsCategories, listOsCategoriesResponse) + .put(listZones, listZonesResponse) + .put(listServiceOfferings, listServiceOfferingsResponse) + .put(listAccounts, listAccountsResponse) + .put(listNetworks, listNetworksResponse) + .put(getZone, getZoneResponse) + .put(deployVM, deployVMResponse) + .put(queryAsyncJobResult, queryAsyncJobResultResponse) + .build(); + + Injector forNode = requestsSendResponses(requestResponseMap); + + Template template = forNode.getInstance(TemplateBuilder.class).osFamily(OsFamily.CENTOS).build(); + template.getOptions().as(CloudStackTemplateOptions.class).setupStaticNat(false); + + CloudStackComputeServiceAdapter adapter = forNode.getInstance(CloudStackComputeServiceAdapter.class); + + NodeAndInitialCredentials server = adapter.createNodeWithGroupEncodedIntoName("test", "test-e92", + template); + assertNotNull(server); + assertEquals(server.getCredentials(), LoginCredentials.builder().password("dD7jwajkh").build()); + } + public void testCreateNodeWithGroupEncodedIntoNameWithKeyPair() { HttpRequest deployVM = HttpRequest.builder().method("GET") .endpoint("http://localhost:8080/client/api") @@ -99,11 +150,16 @@ public class CloudStackComputeServiceAdapterExpectTest extends BaseCloudStackCom template.getOptions().as(CloudStackTemplateOptions.class).keyPair("mykeypair").setupStaticNat(false); CloudStackComputeServiceAdapter adapter = forKeyPair.getInstance(CloudStackComputeServiceAdapter.class); + CloudStackContext context = forKeyPair.getInstance(CloudStackContext.class); NodeAndInitialCredentials server = adapter.createNodeWithGroupEncodedIntoName("test", "test-e92", template); assertNotNull(server); - assertEquals(server.getCredentials(), LoginCredentials.builder().password("dD7jwajkh").build()); + assertEquals(server.getCredentials(), + LoginCredentials.fromCredentials(context.utils().getCredentialStore().get("keypair#" + + template.getOptions(). + as(CloudStackTemplateOptions.class). + getKeyPair()))); } public void testCreateNodeWithGroupEncodedIntoNameWithKeyPairAssignedToAccountAndDomain() { @@ -144,11 +200,16 @@ public class CloudStackComputeServiceAdapterExpectTest extends BaseCloudStackCom template.getOptions().as(CloudStackTemplateOptions.class).keyPair("mykeypair").account("account").domainId("domainId").setupStaticNat(false); CloudStackComputeServiceAdapter adapter = forKeyPair.getInstance(CloudStackComputeServiceAdapter.class); + CloudStackContext context = forKeyPair.getInstance(CloudStackContext.class); NodeAndInitialCredentials server = adapter.createNodeWithGroupEncodedIntoName("test", "test-e92", template); assertNotNull(server); - assertEquals(server.getCredentials(), LoginCredentials.builder().password("dD7jwajkh").build()); + assertEquals(server.getCredentials(), + LoginCredentials.fromCredentials(context.utils().getCredentialStore().get("keypair#" + + template.getOptions(). + as(CloudStackTemplateOptions.class). + getKeyPair()))); } @Override