summaryrefslogtreecommitdiff
path: root/server/vendor/php-opencloud/common/src/Common/Resource/HasWaiterTrait.php
diff options
context:
space:
mode:
authorEoleDev <root@serverpc.home>2016-03-09 15:37:42 +0100
committerEoleDev <root@serverpc.home>2016-03-09 15:37:42 +0100
commit1d3ed3af6d57316640c143002ddf80d61e6c098a (patch)
tree97ac49bc7ff0f16150aefee821da3557dc0d0644 /server/vendor/php-opencloud/common/src/Common/Resource/HasWaiterTrait.php
parentd69adc4f9d1f6019927de235ef84885c68e6e508 (diff)
parent08ea5ef31abcc4e23a39a780cacb64fa27f19194 (diff)
Merge branch 'Evan' into develop
Diffstat (limited to 'server/vendor/php-opencloud/common/src/Common/Resource/HasWaiterTrait.php')
-rw-r--r--server/vendor/php-opencloud/common/src/Common/Resource/HasWaiterTrait.php124
1 files changed, 124 insertions, 0 deletions
diff --git a/server/vendor/php-opencloud/common/src/Common/Resource/HasWaiterTrait.php b/server/vendor/php-opencloud/common/src/Common/Resource/HasWaiterTrait.php
new file mode 100644
index 0000000..519be7e
--- /dev/null
+++ b/server/vendor/php-opencloud/common/src/Common/Resource/HasWaiterTrait.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace OpenCloud\Common\Resource;
+
+use OpenCloud\Common\Error\BadResponseError;
+
+/**
+ * Contains reusable functionality for resources that have long operations which require waiting in
+ * order to reach a particular state.
+ *
+ * @codeCoverageIgnore
+ *
+ * @package OpenCloud\Common\Resource
+ */
+trait HasWaiterTrait
+{
+ /**
+ * Provides a blocking operation until the resource has reached a particular state. The method
+ * will enter a loop, requesting feedback from the remote API until it sends back an appropriate
+ * status.
+ *
+ * @param string $status The state to be reached
+ * @param int $timeout The maximum timeout. If the total time taken by the waiter has reached
+ * or exceed this timeout, the blocking operation will immediately cease.
+ * @param int $sleepPeriod The amount of time to pause between each HTTP request.
+ */
+ public function waitUntil($status, $timeout = 60, $sleepPeriod = 1)
+ {
+ $startTime = time();
+
+ while (true) {
+ $this->retrieve();
+
+ if ($this->status == $status || $this->shouldHalt($timeout, $startTime)) {
+ break;
+ }
+
+ sleep($sleepPeriod);
+ }
+ }
+
+ /**
+ * Provides a blocking operation until the resource has reached a particular state. The method
+ * will enter a loop, executing the callback until TRUE is returned. This provides great
+ * flexibility.
+ *
+ * @param callable $fn An anonymous function that will be executed on every iteration. You can
+ * encapsulate your own logic to determine whether the resource has
+ * successfully transitioned. When TRUE is returned by the callback,
+ * the loop will end.
+ * @param int|bool $timeout The maximum timeout in seconds. If the total time taken by the waiter has reached
+ * or exceed this timeout, the blocking operation will immediately cease. If FALSE
+ * is provided, the timeout will never be considered.
+ * @param int $sleepPeriod The amount of time to pause between each HTTP request.
+ */
+ public function waitWithCallback(callable $fn, $timeout = 60, $sleepPeriod = 1)
+ {
+ $startTime = time();
+
+ while (true) {
+ $this->retrieve();
+
+ $response = call_user_func_array($fn, [$this]);
+
+ if ($response === true || $this->shouldHalt($timeout, $startTime)) {
+ break;
+ }
+
+ sleep($sleepPeriod);
+ }
+ }
+
+ /**
+ * Internal method used to identify whether a timeout has been exceeded.
+ *
+ * @param bool|int $timeout
+ * @param int $startTime
+ *
+ * @return bool
+ */
+ private function shouldHalt($timeout, $startTime)
+ {
+ if ($timeout === false) {
+ return false;
+ }
+
+ return time() - $startTime >= $timeout;
+ }
+
+ /**
+ * Convenience method providing a blocking operation until the resource transitions to an
+ * ``ACTIVE`` status.
+ *
+ * @param int|bool $timeout The maximum timeout in seconds. If the total time taken by the waiter has reached
+ * or exceed this timeout, the blocking operation will immediately cease. If FALSE
+ * is provided, the timeout will never be considered.
+ */
+ public function waitUntilActive($timeout = false)
+ {
+ $this->waitUntil('ACTIVE', $timeout);
+ }
+
+ public function waitUntilDeleted($timeout = 60, $sleepPeriod = 1)
+ {
+ $startTime = time();
+
+ while (true) {
+ try {
+ $this->retrieve();
+ } catch (BadResponseError $e) {
+ if ($e->getResponse()->getStatusCode() === 404) {
+ break;
+ }
+ throw $e;
+ }
+
+ if ($this->shouldHalt($timeout, $startTime)) {
+ break;
+ }
+
+ sleep($sleepPeriod);
+ }
+ }
+}