diff options
author | Nathan Dench <ndenc2@gmail.com> | 2019-05-24 15:16:44 +1000 |
---|---|---|
committer | Nathan Dench <ndenc2@gmail.com> | 2019-05-24 15:16:44 +1000 |
commit | 107c1cdb09c575aa2f61d97f48d8587eb6bada4c (patch) | |
tree | ca7d008643efc555c388baeaf1d986e0b6b3e28c /vendor/github.com/googleapis/gax-go/v2/invoke.go | |
parent | 844b5a68d8af4791755b8f0ad293cc99f5959183 (diff) | |
download | terraform-provider-statuscake-107c1cdb09c575aa2f61d97f48d8587eb6bada4c.tar.gz terraform-provider-statuscake-107c1cdb09c575aa2f61d97f48d8587eb6bada4c.tar.zst terraform-provider-statuscake-107c1cdb09c575aa2f61d97f48d8587eb6bada4c.zip |
Upgrade to 0.12
Diffstat (limited to 'vendor/github.com/googleapis/gax-go/v2/invoke.go')
-rw-r--r-- | vendor/github.com/googleapis/gax-go/v2/invoke.go | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/vendor/github.com/googleapis/gax-go/v2/invoke.go b/vendor/github.com/googleapis/gax-go/v2/invoke.go new file mode 100644 index 0000000..fe31dd0 --- /dev/null +++ b/vendor/github.com/googleapis/gax-go/v2/invoke.go | |||
@@ -0,0 +1,99 @@ | |||
1 | // Copyright 2016, Google Inc. | ||
2 | // All rights reserved. | ||
3 | // | ||
4 | // Redistribution and use in source and binary forms, with or without | ||
5 | // modification, are permitted provided that the following conditions are | ||
6 | // met: | ||
7 | // | ||
8 | // * Redistributions of source code must retain the above copyright | ||
9 | // notice, this list of conditions and the following disclaimer. | ||
10 | // * Redistributions in binary form must reproduce the above | ||
11 | // copyright notice, this list of conditions and the following disclaimer | ||
12 | // in the documentation and/or other materials provided with the | ||
13 | // distribution. | ||
14 | // * Neither the name of Google Inc. nor the names of its | ||
15 | // contributors may be used to endorse or promote products derived from | ||
16 | // this software without specific prior written permission. | ||
17 | // | ||
18 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
19 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
20 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
21 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
22 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
23 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
24 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
25 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
26 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
27 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
28 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
29 | |||
30 | package gax | ||
31 | |||
32 | import ( | ||
33 | "context" | ||
34 | "strings" | ||
35 | "time" | ||
36 | ) | ||
37 | |||
38 | // APICall is a user defined call stub. | ||
39 | type APICall func(context.Context, CallSettings) error | ||
40 | |||
41 | // Invoke calls the given APICall, | ||
42 | // performing retries as specified by opts, if any. | ||
43 | func Invoke(ctx context.Context, call APICall, opts ...CallOption) error { | ||
44 | var settings CallSettings | ||
45 | for _, opt := range opts { | ||
46 | opt.Resolve(&settings) | ||
47 | } | ||
48 | return invoke(ctx, call, settings, Sleep) | ||
49 | } | ||
50 | |||
51 | // Sleep is similar to time.Sleep, but it can be interrupted by ctx.Done() closing. | ||
52 | // If interrupted, Sleep returns ctx.Err(). | ||
53 | func Sleep(ctx context.Context, d time.Duration) error { | ||
54 | t := time.NewTimer(d) | ||
55 | select { | ||
56 | case <-ctx.Done(): | ||
57 | t.Stop() | ||
58 | return ctx.Err() | ||
59 | case <-t.C: | ||
60 | return nil | ||
61 | } | ||
62 | } | ||
63 | |||
64 | type sleeper func(ctx context.Context, d time.Duration) error | ||
65 | |||
66 | // invoke implements Invoke, taking an additional sleeper argument for testing. | ||
67 | func invoke(ctx context.Context, call APICall, settings CallSettings, sp sleeper) error { | ||
68 | var retryer Retryer | ||
69 | for { | ||
70 | err := call(ctx, settings) | ||
71 | if err == nil { | ||
72 | return nil | ||
73 | } | ||
74 | if settings.Retry == nil { | ||
75 | return err | ||
76 | } | ||
77 | // Never retry permanent certificate errors. (e.x. if ca-certificates | ||
78 | // are not installed). We should only make very few, targeted | ||
79 | // exceptions: many (other) status=Unavailable should be retried, such | ||
80 | // as if there's a network hiccup, or the internet goes out for a | ||
81 | // minute. This is also why here we are doing string parsing instead of | ||
82 | // simply making Unavailable a non-retried code elsewhere. | ||
83 | if strings.Contains(err.Error(), "x509: certificate signed by unknown authority") { | ||
84 | return err | ||
85 | } | ||
86 | if retryer == nil { | ||
87 | if r := settings.Retry(); r != nil { | ||
88 | retryer = r | ||
89 | } else { | ||
90 | return err | ||
91 | } | ||
92 | } | ||
93 | if d, ok := retryer.Retry(err); !ok { | ||
94 | return err | ||
95 | } else if err = sp(ctx, d); err != nil { | ||
96 | return err | ||
97 | } | ||
98 | } | ||
99 | } | ||