JCLOUDS-105. Short-term fix for keypairs being ignored if VM says it's password-enabled.
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 e839d30..96b3a8a 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 @@
       VirtualMachine vm = blockUntilJobCompletesAndReturnResult.<VirtualMachine>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 bab5459..a0badad 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 @@
    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<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> 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<VirtualMachine> 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 @@
       template.getOptions().as(CloudStackTemplateOptions.class).keyPair("mykeypair").setupStaticNat(false);
 
       CloudStackComputeServiceAdapter adapter = forKeyPair.getInstance(CloudStackComputeServiceAdapter.class);
+      CloudStackContext context = forKeyPair.getInstance(CloudStackContext.class);
 
       NodeAndInitialCredentials<VirtualMachine> 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 @@
       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<VirtualMachine> 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