Better error checking and logging in test tear down/clean up methods

This commit is contained in:
Andrew Donald Kennedy 2012-04-11 12:12:01 +01:00
parent 98a89aa68d
commit b786178a90
15 changed files with 172 additions and 108 deletions

View File

@ -18,6 +18,8 @@
*/ */
package org.jclouds.vcloud.director.v1_5.predicates; package org.jclouds.vcloud.director.v1_5.predicates;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Set; import java.util.Set;
@ -34,7 +36,7 @@ import com.google.common.base.Predicate;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
/** /**
* Test a {@link Task} to see if it has succeeded. * Test a {@link Task} status is in a particular set of {@link Task.Status statuses}.
* *
* @author grkvlt@apache.org * @author grkvlt@apache.org
*/ */
@ -61,6 +63,7 @@ public class TaskStatusEquals implements Predicate<Task> {
/** @see Predicate#apply(Object) */ /** @see Predicate#apply(Object) */
@Override @Override
public boolean apply(Task task) { public boolean apply(Task task) {
checkNotNull(task, "task");
logger.trace("looking for status on task %s", task); logger.trace("looking for status on task %s", task);
// TODO shouldn't we see if it's already done before getting it from API server? // TODO shouldn't we see if it's already done before getting it from API server?

View File

@ -18,6 +18,10 @@
*/ */
package org.jclouds.vcloud.director.v1_5.predicates; package org.jclouds.vcloud.director.v1_5.predicates;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.EnumSet;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
@ -30,7 +34,7 @@ import org.jclouds.vcloud.director.v1_5.features.TaskClient;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
/** /**
* Test a {@link Task} to see if it has succeeded. * Test a {@link Task} to see if it has {@link Task.Status#SUCCESS succeeded}.
* *
* @author grkvlt@apache.org * @author grkvlt@apache.org
*/ */
@ -50,21 +54,19 @@ public class TaskSuccess implements Predicate<Task> {
/** @see Predicate#apply(Object) */ /** @see Predicate#apply(Object) */
@Override @Override
public boolean apply(Task task) { public boolean apply(Task task) {
logger.trace("looking for status on task %s", task); checkNotNull(task, "task");
logger.trace("looking for status on task %s", task.getOperationName());
// TODO shouldn't we see if it's already done before getting it from API server? // TODO shouldn't we see if it's already done before getting it from API server?
task = taskClient.getTask(task.getHref()); task = taskClient.getTask(task.getHref());
// perhaps task isn't available, yet // perhaps task isn't available, yet
if (task == null) return false; if (task == null) return false;
logger.trace("%s: looking for status %s: currently: %s", task, Task.Status.SUCCESS, task.getStatus());
if (task.getStatus().equals(Task.Status.ERROR)) logger.trace("%s: looking for status %s: currently: %s", task.getOperationName(), Task.Status.SUCCESS, task.getStatus());
if (EnumSet.of(Task.Status.ERROR, Task.Status.CANCELED, Task.Status.ABORTED).contains(task.getStatus())) {
throw new VCloudDirectorException(task); throw new VCloudDirectorException(task);
if (task.getStatus().equals(Task.Status.CANCELED)) } else return task.getStatus().equals(Task.Status.SUCCESS);
throw new VCloudDirectorException(task);
if (task.getStatus().equals(Task.Status.ABORTED))
throw new VCloudDirectorException(task);
return task.getStatus().equals(Task.Status.SUCCESS);
} }
@Override @Override

View File

@ -582,6 +582,8 @@ public class Checks {
} }
public static void checkVmPendingQuestion(VmPendingQuestion question) { public static void checkVmPendingQuestion(VmPendingQuestion question) {
assertNotNull(question, String.format(NOT_NULL_OBJ_FMT, "VmPendingQuestion"));
// Check required fields // Check required fields
assertNotNull(question.getQuestion(), String.format(OBJ_FIELD_REQ, "VmPendingQuestion", "Question")); assertNotNull(question.getQuestion(), String.format(OBJ_FIELD_REQ, "VmPendingQuestion", "Question"));
assertNotNull(question.getQuestionId(), String.format(OBJ_FIELD_REQ, "VmPendingQuestion", "QuestionId")); assertNotNull(question.getQuestionId(), String.format(OBJ_FIELD_REQ, "VmPendingQuestion", "QuestionId"));

View File

@ -25,7 +25,6 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.O
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkCatalogItem; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkCatalogItem;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkError;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadata; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadata;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValue; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValue;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkTask; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkTask;
@ -35,9 +34,7 @@ import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull; import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.vcloud.director.v1_5.domain.AdminCatalog; import org.jclouds.vcloud.director.v1_5.domain.AdminCatalog;
import org.jclouds.vcloud.director.v1_5.domain.CatalogItem; import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
@ -112,22 +109,29 @@ public class CatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest {
@AfterClass(alwaysRun = true) @AfterClass(alwaysRun = true)
public void tearDown() { public void tearDown() {
if (catalogItem != null) if (catalogItem != null) {
catalogClient.deleteCatalogItem(catalogItem.getHref());
if (media != null)
context.getApi().getMediaClient().deleteMedia(media.getHref());
if (adminCatalog != null) {
adminContext.getApi().getCatalogClient().deleteCatalog(adminCatalog.getHref());
try { try {
catalogClient.getCatalog(catalogRef.getHref()); catalogClient.deleteCatalogItem(catalogItem.getHref());
fail("The Catalog should have been deleted"); } catch (Exception e) {
} catch (VCloudDirectorException vcde) { logger.warn(e, "Error when deleting catalog item '%s'", catalogItem.getName());
checkError(vcde.getError());
assertEquals(vcde.getError().getMajorErrorCode(), Integer.valueOf(403), "The majorErrorCode should be 403 since the item has been deleted");
} }
} }
if (media != null) {
try {
Task delete = context.getApi().getMediaClient().deleteMedia(media.getHref());
taskDoneEventually(delete);
} catch (Exception e) {
logger.warn(e, "Error when deleting media '%s'", media.getName());
}
}
if (adminContext != null && adminCatalog != null) {
try {
adminContext.getApi().getCatalogClient().deleteCatalog(adminCatalog.getHref());
} catch (Exception e) {
logger.warn(e, "Error when deleting catalog '%s'", adminCatalog.getName());
}
}
// TODO wait for tasks
} }
@Test(description = "GET /catalog/{id}") @Test(description = "GET /catalog/{id}")

View File

@ -42,18 +42,15 @@ import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull; import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.Collections; import java.util.Collections;
import java.util.Set; import java.util.Set;
import org.jclouds.io.Payloads; import org.jclouds.io.Payloads;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.vcloud.director.v1_5.domain.Checks; import org.jclouds.vcloud.director.v1_5.domain.Checks;
import org.jclouds.vcloud.director.v1_5.domain.CloneMediaParams; import org.jclouds.vcloud.director.v1_5.domain.CloneMediaParams;
import org.jclouds.vcloud.director.v1_5.domain.Error;
import org.jclouds.vcloud.director.v1_5.domain.File; import org.jclouds.vcloud.director.v1_5.domain.File;
import org.jclouds.vcloud.director.v1_5.domain.Link; import org.jclouds.vcloud.director.v1_5.domain.Link;
import org.jclouds.vcloud.director.v1_5.domain.Media; import org.jclouds.vcloud.director.v1_5.domain.Media;
@ -108,10 +105,20 @@ public class MediaClientLiveTest extends BaseVCloudDirectorClientLiveTest {
@AfterClass(alwaysRun = true) @AfterClass(alwaysRun = true)
protected void tidyUp() { protected void tidyUp() {
if (media != null) { if (media != null) {
assertTaskSucceeds(mediaClient.deleteMedia(media.getHref())); try {
Task delete = mediaClient.deleteMedia(media.getHref());
taskDoneEventually(delete);
} catch (Exception e) {
logger.warn(e, "Error when deleting media '%s': %s", media.getName());
}
} }
if (oldMedia != null) { if (oldMedia != null) {
assertTaskSucceeds(mediaClient.deleteMedia(oldMedia.getHref())); try {
Task delete = mediaClient.deleteMedia(oldMedia.getHref());
taskDoneEventually(delete);
} catch (Exception e) {
logger.warn(e, "Error when deleting media '%s': %s", oldMedia.getName());
}
} }
} }

View File

@ -36,6 +36,7 @@ import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue; import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
import org.jclouds.vcloud.director.v1_5.domain.Network; import org.jclouds.vcloud.director.v1_5.domain.Network;
import org.jclouds.vcloud.director.v1_5.domain.OrgNetwork; import org.jclouds.vcloud.director.v1_5.domain.OrgNetwork;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTest; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTest;
import org.testng.annotations.AfterClass; import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeClass;
@ -67,10 +68,14 @@ public class NetworkClientLiveTest extends BaseVCloudDirectorClientLiveTest {
} }
@AfterClass(alwaysRun = true) @AfterClass(alwaysRun = true)
public void cleanUp() throws Exception { public void cleanUp() {
if (metadataSet) { if (metadataSet) {
adminContext.getApi().getNetworkClient().getMetadataClient() try {
.deleteMetadataEntry(toAdminUri(networkURI), "key"); Task delete = adminContext.getApi().getNetworkClient().getMetadataClient().deleteMetadataEntry(toAdminUri(networkURI), "key");
taskDoneEventually(delete);
} catch (Exception e) {
logger.warn(e, "Error when deleting metadata");
}
} }
} }

View File

@ -40,6 +40,7 @@ import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
import org.jclouds.vcloud.director.v1_5.domain.Org; import org.jclouds.vcloud.director.v1_5.domain.Org;
import org.jclouds.vcloud.director.v1_5.domain.OrgList; import org.jclouds.vcloud.director.v1_5.domain.OrgList;
import org.jclouds.vcloud.director.v1_5.domain.Reference; import org.jclouds.vcloud.director.v1_5.domain.Reference;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTest; import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTest;
import org.testng.annotations.AfterClass; import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeClass;
@ -73,11 +74,17 @@ public class OrgClientLiveTest extends BaseVCloudDirectorClientLiveTest {
@AfterClass(alwaysRun = true) @AfterClass(alwaysRun = true)
public void cleanUp() throws Exception { public void cleanUp() throws Exception {
if (adminMembersSet) { if (adminMembersSet) {
adminContext.getApi().getOrgClient().getMetadataClient() try {
.deleteMetadataEntry(toAdminUri(orgURI), "KEY"); Task delete = adminContext.getApi().getOrgClient().getMetadataClient().deleteMetadataEntry(toAdminUri(orgURI), "KEY");
taskDoneEventually(delete);
adminContext.getApi().getCatalogClient() } catch (Exception e) {
.deleteCatalog(catalogRef); logger.warn(e, "Error when deleting metadata entry");
}
try {
adminContext.getApi().getCatalogClient().deleteCatalog(catalogRef);
} catch (Exception e) {
logger.warn(e, "Error when deleting catalog'%s': %s", catalogRef);
}
} }
} }

View File

@ -76,9 +76,7 @@ public class QueryClientLiveTest extends BaseVCloudDirectorClientLiveTest {
@AfterClass(alwaysRun = true) @AfterClass(alwaysRun = true)
public void cleanUp() throws Exception { public void cleanUp() throws Exception {
if (vApp != null) { if (vApp != null) cleanUpVApp(vApp);
cleanUpVApp(vApp);
}
} }
@Override @Override

View File

@ -134,16 +134,16 @@ public class VAppClientLiveTest extends AbstractVAppClientLiveTest {
private MetadataValue metadataValue; private MetadataValue metadataValue;
private String key; private String key;
private URI mediaURI;
private URI testUserURI; private URI testUserURI;
private boolean mediaCreated = false;
private boolean testUserCreated = false;
@Override @BeforeClass(alwaysRun = true, dependsOnMethods = { "setupRequiredClients" })
@BeforeClass(alwaysRun = true) protected void setupRequiredEntities() {
protected void setupRequiredClients() {
super.setupRequiredClients();
Set<Link> links = vdcClient.getVdc(vdcURI).getLinks(); Set<Link> links = vdcClient.getVdc(vdcURI).getLinks();
Predicate<Link> addMediaLink = and(relEquals("add"), typeEquals(VCloudDirectorMediaType.MEDIA));
if (mediaURI == null) {
Predicate<Link> addMediaLink = and(relEquals(Link.Rel.ADD), typeEquals(VCloudDirectorMediaType.MEDIA));
if (contains(links, addMediaLink)) { if (contains(links, addMediaLink)) {
Link addMedia = find(links, addMediaLink); Link addMedia = find(links, addMediaLink);
@ -172,8 +172,8 @@ public class VAppClientLiveTest extends AbstractVAppClientLiveTest {
} }
mediaURI = media.getHref(); mediaURI = media.getHref();
} else { mediaCreated = true;
mediaURI = super.mediaURI; }
} }
if (adminContext != null) { if (adminContext != null) {
@ -187,8 +187,20 @@ public class VAppClientLiveTest extends AbstractVAppClientLiveTest {
@Override @Override
@AfterClass(alwaysRun = true) @AfterClass(alwaysRun = true)
public void cleanUp() { public void cleanUp() {
if (adminContext != null && mediaURI != null) { if (adminContext != null && mediaCreated && mediaURI != null) {
assertTaskDoneEventually(context.getApi().getMediaClient().deleteMedia(mediaURI)); try {
Task delete = context.getApi().getMediaClient().deleteMedia(mediaURI);
taskDoneEventually(delete);
} catch (Exception e) {
logger.warn("Error when deleting media: %s", e.getMessage());
}
}
if (adminContext != null && testUserCreated && testUserURI != null) {
try {
adminContext.getApi().getUserClient().deleteUser(testUserURI);
} catch (Exception e) {
logger.warn("Error when deleting user: %s", e.getMessage());
}
} }
} }

View File

@ -93,7 +93,12 @@ public class VAppTemplateClientLiveTest extends AbstractVAppClientLiveTest {
@AfterClass(alwaysRun = true) @AfterClass(alwaysRun = true)
protected void tidyUp() { protected void tidyUp() {
if (key != null) { if (key != null) {
assertTaskSucceeds(vAppTemplateClient.getMetadataClient().deleteMetadataEntry(vAppTemplateURI, key)); try {
Task delete = vAppTemplateClient.getMetadataClient().deleteMetadataEntry(vAppTemplateURI, key);
taskDoneEventually(delete);
} catch (Exception e) {
logger.warn(e, "Error when deleting metadata entry '%s'", key);
}
} }
} }

View File

@ -118,8 +118,12 @@ public class VdcClientLiveTest extends BaseVCloudDirectorClientLiveTest {
} }
if (metadataSet) { if (metadataSet) {
adminContext.getApi().getVdcClient().getMetadataClient() try {
.deleteMetadataEntry(toAdminUri(vdcURI), "key"); Task delete = adminContext.getApi().getVdcClient().getMetadataClient().deleteMetadataEntry(toAdminUri(vdcURI), "key");
taskDoneEventually(delete);
} catch (Exception e) {
logger.warn(e, "Error deleting metadata entry");
}
} }
} }

View File

@ -83,13 +83,10 @@ public class AdminCatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest
@AfterClass(alwaysRun = true) @AfterClass(alwaysRun = true)
protected void tidyUp() { protected void tidyUp() {
if (catalog != null) { if (catalog != null) {
try {
catalogClient.deleteCatalog(catalog.getHref()); catalogClient.deleteCatalog(catalog.getHref());
try { //TODO: predicate to retry for a short while? } catch (Exception e) {
catalogClient.getCatalog(catalog.getHref()); logger.warn(e, "Error deleting admin catalog '%s'", catalog.getName());
fail("The Catalog should have been deleted");
} catch (VCloudDirectorException vcde) {
checkError(vcde.getError());
assertEquals(vcde.getError().getMajorErrorCode(), Integer.valueOf(403), "The majorErrorCode should be 403 since the item has been deleted");
} }
} }
} }

View File

@ -75,7 +75,7 @@ public class AdminVdcClientLiveTest extends BaseVCloudDirectorClientLiveTest {
if (metadataKey != null) { if (metadataKey != null) {
try { try {
Task task = metadataClient.deleteMetadataEntry(adminVdcUri, metadataKey); Task task = metadataClient.deleteMetadataEntry(adminVdcUri, metadataKey);
assertTaskSucceeds(task); taskDoneEventually(task);
} catch (VCloudDirectorException e) { } catch (VCloudDirectorException e) {
logger.warn(e, "Error deleting metadata-value (perhaps it doesn't exist?); continuing..."); logger.warn(e, "Error deleting metadata-value (perhaps it doesn't exist?); continuing...");
} }

View File

@ -30,7 +30,6 @@ import static org.testng.AssertJUnit.assertFalse;
import java.net.URI; import java.net.URI;
import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.AuthorizationException;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
import org.jclouds.vcloud.director.v1_5.domain.OrgPasswordPolicySettings; import org.jclouds.vcloud.director.v1_5.domain.OrgPasswordPolicySettings;
import org.jclouds.vcloud.director.v1_5.domain.Reference; import org.jclouds.vcloud.director.v1_5.domain.Reference;
import org.jclouds.vcloud.director.v1_5.domain.Role.DefaultRoles; import org.jclouds.vcloud.director.v1_5.domain.Role.DefaultRoles;
@ -77,8 +76,8 @@ public class UserClientLiveTest extends BaseVCloudDirectorClientLiveTest {
if (user != null) { if (user != null) {
try { try {
userClient.deleteUser(user.getHref()); userClient.deleteUser(user.getHref());
} catch (VCloudDirectorException e) { } catch (Exception e) {
// ignore; user probably already deleted logger.warn(e, "Error deleting user '%s'", user.getName());
} }
} }
} }
@ -181,7 +180,9 @@ public class UserClientLiveTest extends BaseVCloudDirectorClientLiveTest {
try { try {
sessionClient.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), orgRef.getName(), "wrongpassword!"); sessionClient.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), orgRef.getName(), "wrongpassword!");
fail("Managed to login using the wrong password!"); fail("Managed to login using the wrong password!");
} catch(AuthorizationException ex) { } catch (AuthorizationException e) {
} catch (Exception e) {
fail("Expected AuthorizationException", e);
} }
} }
@ -191,7 +192,9 @@ public class UserClientLiveTest extends BaseVCloudDirectorClientLiveTest {
try { try {
sessionClient.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), orgRef.getName(), "newPassword"); sessionClient.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), orgRef.getName(), "newPassword");
fail("Managed to login to locked account!"); fail("Managed to login to locked account!");
} catch(AuthorizationException ex) { } catch (AuthorizationException e) {
} catch (Exception e) {
fail("Expected AuthorizationException", e);
} }
userClient.unlockUser(user.getHref()); userClient.unlockUser(user.getHref());

View File

@ -303,21 +303,31 @@ public abstract class BaseVCloudDirectorClientLiveTest extends BaseVersionedServ
assertTrue(retryTaskSuccessLong.apply(task), String.format(TASK_COMPLETE_TIMELY, task)); assertTrue(retryTaskSuccessLong.apply(task), String.format(TASK_COMPLETE_TIMELY, task));
} }
protected void assertTaskStatusEventually(Task task, Task.Status running, ImmutableSet<Task.Status> immutableSet) { protected boolean taskStatusEventually(Task task, Task.Status running, ImmutableSet<Task.Status> immutableSet) {
TaskClient taskClient = context.getApi().getTaskClient(); TaskClient taskClient = context.getApi().getTaskClient();
TaskStatusEquals predicate = new TaskStatusEquals(taskClient, running, immutableSet); TaskStatusEquals predicate = new TaskStatusEquals(taskClient, running, immutableSet);
RetryablePredicate<Task> retryablePredicate = new RetryablePredicate<Task>(predicate, TASK_TIMEOUT_SECONDS * 1000L); RetryablePredicate<Task> retryablePredicate = new RetryablePredicate<Task>(predicate, TASK_TIMEOUT_SECONDS * 1000L);
assertTrue(retryablePredicate.apply(task), "Task must enter status "+running); return retryablePredicate.apply(task);
} }
protected void assertTaskDoneEventually(Task task) { protected void assertTaskStatusEventually(Task task, Task.Status running, ImmutableSet<Task.Status> immutableSet) {
assertTrue(taskStatusEventually(task, running, immutableSet),
String.format("Task '%s' must reach status %s", task.getOperationName(), running));
}
protected boolean taskDoneEventually(Task task) {
TaskClient taskClient = context.getApi().getTaskClient(); TaskClient taskClient = context.getApi().getTaskClient();
TaskStatusEquals predicate = new TaskStatusEquals( TaskStatusEquals predicate = new TaskStatusEquals(
taskClient, taskClient,
ImmutableSet.of(Task.Status.ABORTED, Task.Status.CANCELED, Task.Status.ERROR, Task.Status.SUCCESS), ImmutableSet.of(Task.Status.ABORTED, Task.Status.CANCELED, Task.Status.ERROR, Task.Status.SUCCESS),
Collections.<Task.Status>emptySet()); Collections.<Task.Status>emptySet());
RetryablePredicate<Task> retryablePredicate = new RetryablePredicate<Task>(predicate, LONG_TASK_TIMEOUT_SECONDS * 1000L); RetryablePredicate<Task> retryablePredicate = new RetryablePredicate<Task>(predicate, LONG_TASK_TIMEOUT_SECONDS * 1000L);
assertTrue(retryablePredicate.apply(task), "Task must be done"); return retryablePredicate.apply(task);
}
protected void assertTaskDoneEventually(Task task) {
assertTrue(taskDoneEventually(task),
String.format("Task '%s' must complete", task.getOperationName()));
} }
/** /**
@ -407,9 +417,12 @@ public abstract class BaseVCloudDirectorClientLiveTest extends BaseVersionedServ
protected void cleanUpVAppTemplate(VAppTemplate vAppTemplate) { protected void cleanUpVAppTemplate(VAppTemplate vAppTemplate) {
VAppTemplateClient vappTemplateClient = context.getApi().getVAppTemplateClient(); VAppTemplateClient vappTemplateClient = context.getApi().getVAppTemplateClient();
try {
Task task = vappTemplateClient.deleteVappTemplate(vAppTemplate.getHref()); Task task = vappTemplateClient.deleteVappTemplate(vAppTemplate.getHref());
assertTaskSucceeds(task); taskDoneEventually(task);
} catch (Exception e) {
logger.warn(e, "Error deleting template '%s'", vAppTemplate.getName());
}
} }
protected void cleanUpVApp(VApp vApp) { protected void cleanUpVApp(VApp vApp) {
@ -434,7 +447,9 @@ public abstract class BaseVCloudDirectorClientLiveTest extends BaseVersionedServ
// Otherwise, get error on delete "entity is busy completing an operation. // Otherwise, get error on delete "entity is busy completing an operation.
if (vApp.getTasks() != null) { if (vApp.getTasks() != null) {
for (Task task : vApp.getTasks()) { for (Task task : vApp.getTasks()) {
assertTaskDoneEventually(task); if (!taskDoneEventually(task)) {
logger.warn("Task '%s' did not complete", task.getOperationName());
}
} }
} }
@ -442,7 +457,7 @@ public abstract class BaseVCloudDirectorClientLiveTest extends BaseVersionedServ
if (vApp.getStatus().equals(Status.POWERED_ON.getValue())) { if (vApp.getStatus().equals(Status.POWERED_ON.getValue())) {
try { try {
Task shutdownTask = vAppClient.shutdown(vAppURI); Task shutdownTask = vAppClient.shutdown(vAppURI);
retryTaskSuccess.apply(shutdownTask); taskDoneEventually(shutdownTask);
} catch (Exception e) { } catch (Exception e) {
// keep going; cleanup as much as possible // keep going; cleanup as much as possible
logger.warn(e, "Continuing cleanup after error shutting down VApp %s", vApp.getName()); logger.warn(e, "Continuing cleanup after error shutting down VApp %s", vApp.getName());
@ -454,7 +469,7 @@ public abstract class BaseVCloudDirectorClientLiveTest extends BaseVersionedServ
try { try {
UndeployVAppParams params = UndeployVAppParams.builder().build(); UndeployVAppParams params = UndeployVAppParams.builder().build();
Task undeployTask = vAppClient.undeploy(vAppURI, params); Task undeployTask = vAppClient.undeploy(vAppURI, params);
retryTaskSuccess.apply(undeployTask); taskDoneEventually(undeployTask);
} catch (Exception e) { } catch (Exception e) {
// keep going; cleanup as much as possible // keep going; cleanup as much as possible
logger.warn(e, "Continuing cleanup after error undeploying VApp %s", vApp.getName()); logger.warn(e, "Continuing cleanup after error undeploying VApp %s", vApp.getName());
@ -463,7 +478,7 @@ public abstract class BaseVCloudDirectorClientLiveTest extends BaseVersionedServ
try { try {
Task task = vAppClient.deleteVApp(vAppURI); Task task = vAppClient.deleteVApp(vAppURI);
assertTaskSucceeds(task); taskDoneEventually(task);
vAppNames.remove(vApp.getName()); vAppNames.remove(vApp.getName());
logger.info("Deleted VApp %s", vApp.getName()); logger.info("Deleted VApp %s", vApp.getName());
} catch (Exception e) { } catch (Exception e) {