-
Notifications
You must be signed in to change notification settings - Fork 1.1k
adding functions to manage life cycle of resources in ITComputeTest #1768
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
Conversation
created during tests can be properly deleted even if tests fail or become timed out.
| @@ -0,0 +1,230 @@ | |||
| /* | |||
| * Copyright 2016 Google Inc. All Rights Reserved. | |||
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| import java.util.ArrayList; | ||
| import java.util.List; | ||
|
|
||
| public class ManagedResourceHelper { |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| @SuppressWarnings("unchecked") | ||
| Function<T, Void> localFunc = (Function<T, Void>) getDeleteMethod(res); | ||
|
|
||
| this.func = localFunc; |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| public void cleanUpResources() { | ||
| for (ManagedResource<?> r : resources) { | ||
| r.delete(); | ||
| //TODO (neowu): add logging if a resource has not been deleted in test fixture |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
|
Thanks for fixing this! Just a few comments. |
| } catch (Exception e) { | ||
|
|
||
| } finally { | ||
| return null; |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| try { | ||
| Operation operation = address.delete(); | ||
| operation.waitFor(); | ||
| } catch (Exception e) { |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| } | ||
|
|
||
| private <T> Function<?, Void> getDeleteMethod(T res) { | ||
| if (res instanceof Address) { |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| } | ||
| } | ||
|
|
||
| public <T> ManagedResourceHelper addManagedResource(T res) { |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| import java.util.ArrayList; | ||
| import java.util.List; | ||
|
|
||
| public class ManagedResourceHelper { |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
* implement `add` function with compile-time type checking * add `remove` method to remove a resource from managed resources * use Id's as handles to resources
| compute.deleteAddress(addressId); | ||
| return null; | ||
| } | ||
| }; |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| public ManagedResourceCleaner remove(AddressId addressId) { | ||
| resources.remove(addressId); | ||
| return this; | ||
| } |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| compute.deleteSnapshot(firstSnapshotId); | ||
| managedResourceCleaner.remove(firstSnapshotId); | ||
| compute.deleteSnapshot(secondSnapshotId); | ||
| managedResourceCleaner.remove(secondSnapshotId); |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
|
Changes Unknown when pulling c047cd0 on neozwu:fix-compute-resource into ** on GoogleCloudPlatform:master**. |
|
Changes Unknown when pulling f04997e on neozwu:fix-compute-resource into ** on GoogleCloudPlatform:master**. |
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.
Let @garrettjonesgoogle approve as well
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.
Ok this should be the last set of things to take care of.
| } | ||
|
|
||
| private class ManagedResource<T> { | ||
| final T res; |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
|
|
||
| private class ManagedResource<T> { | ||
| final T res; | ||
| Function<T, Void> func; |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
|
|
||
| public void cleanUp() { | ||
| for (Map.Entry<Object, ManagedResource<?>> r : resources.entrySet()) { | ||
| System.out.println("Clean up compute engine resource: " + r.getKey().toString()); |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| A3E2 | resources.clear(); | |
| } | ||
|
|
||
| public ResourceCleaner add(AddressId addressId) { |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| return this; | ||
| } | ||
|
|
||
| public <T> ResourceCleaner remove(T resourceId) { |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
| } | ||
|
|
||
| @AfterClass | ||
| public static void teardown() { |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
|
Changes Unknown when pulling c05b45b on neozwu:fix-compute-resource into ** on GoogleCloudPlatform:master**. |
|
LGTM |
* updating 'PubSubExample' to latest api (#1808) * updating pubsub sample to latest api * Pubsub update (#1818) * Update GAPIC layer * Manual updates to support pubsub changes * Update spi classes (#1817) * Update README.md (#1825) [ci skip] * Add DURABLE_REDUCED_AVAILABILITY storage class (#1834) Otherwise we crash when servers return this value. * logging: make flush wait for writes (#1815) This PR still isn't completely correct, since it does not force any RPC to immediately be issued. However, flush should now correctly wait for RPCs representing prior calls to publish to complete and any failures to be reported to ErrorManager before returning. * use new PartitionKey implementation (#1841) bumping gax version to 0.8.0 for the new implementation. reflects googleapis/gapic-generator#1153 . * Release 0.11.0 * Updating version in README files. [ci skip] * Update version to 0.11.1-SNAPSHOT (#1843) * Added a missing @test annotation (#1842) * pubsub: make Subscriber use ApiService (#1824) Fixes #1761. * SPI: Adding @experimentalapi back to logging client classes (#1844) * Bumping NL, Translate to beta (#1848) * Release 0.11.1 * Updating version in README files. [ci skip] * Update version to 0.11.2-SNAPSHOT (#1852) * pubsub: remove obsolete doc references (#1823) This PR removes references to the deprecated code of the docs. The emulator section is rewritten. Fixes #1789. * adding functions to manage life cycle of resources in ITComputeTest (#1768) *adding functions to ITComputeTest, in order to make sure resources created during tests can be properly deleted even if tests fail or become timed out. * refactor and incorporate feedbacks * implement `add` function with compile-time type checking * add `remove` method to remove a resource from managed resources * use Id's as handles to resources * fix copyright header * rename class name * modify remove function, pass delete function to each add method * address comments * Add Speech v1. (#1858) * Make logging overrides the default channel provider (#1820) * Added more unit tests for SessionPool (#1862) * Rename Translate title to Translation [ci skip] (#1867) * Release 0.11.2 * Updating version in README files. [ci skip] * Update pom.xml version to 0.11.3-SNAPSHOT (#1870) * pubsub: acquire FlowController before releasing (#1831) * Revert "pubsub: acquire FlowController before releasing (#1831)" (#1872) This reverts commit 3717ac6. This change brings up another serious bug. If the number of messages we pull in one RPC is greater than the number size of the semaphore, we deadlock forever. Will redo this later. * pubsub: make deprecated methods package-private (#1861) add back mistakenly deleted test Fixes #1828. * pubsub: rename newBuilder to defaultBuilder (#1873) Fixes #1853. * GAE (Flex_Java/Flex_Custom/Flex_Compat/Std_Java8), GCE, GKE testing app for gcj (#1859) Appengine tests for #1752 * Replace a constant of type Set with ImmutableSet (#1876) * Language v1beta2 Release (#1878) * Language v1beta2 Release * Language v1 update * Regenerating SPI: use setEndpoint (#1879) Reflects googleapis/gapic-generator#1172. Updates #1835. * remove last use of setPort/setServiceAddress (#1880) Fixes #1835. * new code snippet for push subscription + cleanup of deprecated snippets (#1875) * cleaning up PubSubExample adding snippet for creating a subscription with a push endpoint * updating start, end tags for snippets, adding async pull snippet tag * Release 0.12.0 * Updating version in README files. [ci skip] * Update version to 0.12.1-SNAPSHOT (#1886) * Update version of google-auth-java to 0.6.1 (#1888) * Update version of google-auth-java to 0.6.1 Latest version of google-auth-java contains a fix for auth token refresh failures. * Remove harcoded auth dependencies * Don't use `UrlFetchTransport` in App Engine Flex environment (#1893) * Don't use `UrlFetchTransport` in App Engine Flex environment #1492 * Add annotations to specify GCP launch stage (#1889) The Google Cloud Platform launch stage (https://cloud.google.com/terms/launch-stages) is a signifier of the level of access and support that can be expected of a particular feature. These annotations will be used to clearly demarcate features as being in a state other than General Availability to help set user expectations accordingly. * Add Identity Access Management (IAM) to the Storage API (#1812) Adds support for bucket-level IAM (currently in limited alpha). More information about IAM in Google Cloud Storage can be found at https://cloud.google.com/storage/docs/access-control/iam
…1286) This should fix release script reporting back to the release PRs Source-Link: googleapis/synthtool@4c15ec0 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-java:latest@sha256:e62f3ea524b11c1cd6ff7f80362736d86c0056631346b5b106a421686fce2726 Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
In ITComputeTest, we use "JUnit timeout rule" to specify test case timeout. Timeout rule (unlike timeout parameter in @test annotation) applies to the entire test fixture (that includes all @before methods + @test method + all @after methods). Therefore, when a test times out in the middle of execution, teardown method (@after method) won't be executed. This will result in resource leak, and accumulation of unused resources (instances, disks, snapshots, etc.) in google cloud compute engine. One approach is to use timeout parameter rather than timeout rule and properly clean up resources in @after method. However timeout parameter will force tests (@test method) to run in a different thread, thus may cause potential thread-safety issue. In this PR, a different approach is used, which registers all resources that are created by test cases in a static data structure, and try to delete all these resources after all tests are executed (i.e. in the @afterclass method). The implementation tries to be as generic as possible, but without introducing any change of existing resource objects.