Skip to content

Commit 5830806

Browse files
authored
Added retry capability for get APIs (#24)
* Added retry capability to some APIs (e.g. `get`)
1 parent 370c75a commit 5830806

File tree

4 files changed

+61
-17
lines changed

4 files changed

+61
-17
lines changed

Project.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3"
1212
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
1313
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
1414
Swagger = "2d69052b-6a58-5cd9-a030-a48559c324ac"
15+
Retry = "20febd7b-183b-5ae2-ac4a-720e7ce64774"
1516

1617
[compat]
1718
HTTP = "0.8"

src/Kuber.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module Kuber
33
using JSON
44
using Swagger
55
using HTTP
6+
using Retry, HTTP.IOExtras
67

78
include("api/Kubernetes.jl")
89
using .Kubernetes

src/helpers.jl

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ show(io::IO, ctx::KuberContext) = print("Kubernetes namespace ", ctx.namespace,
6161
get_server(ctx::KuberContext) = ctx.client.root
6262
get_ns(ctx::KuberContext) = ctx.namespace
6363

64-
function set_server(ctx::KuberContext, uri::String=DEFAULT_URI, reset_api_versions::Bool=false; kwargs...)
64+
function set_server(ctx::KuberContext, uri::String=DEFAULT_URI, reset_api_versions::Bool=false; max_tries=1, kwargs...)
6565
rtfn = (default,data)->kuber_type(ctx, default, data)
6666
ctx.client = Swagger.Client(uri; get_return_type=rtfn, kwargs...)
6767
ctx.client.headers["Connection"] = "close"
68-
reset_api_versions && set_api_versions!(ctx)
68+
reset_api_versions && set_api_versions!(ctx; max_tries=max_tries)
6969
ctx.client
7070
end
7171

@@ -113,9 +113,16 @@ function override_pref(name, server_pref, override)
113113
server_pref
114114
end
115115

116-
function fetch_misc_apis_versions(ctx::KuberContext; override=nothing, verbose::Bool=false)
116+
function fetch_misc_apis_versions(ctx::KuberContext; override=nothing, verbose::Bool=false, max_tries=1)
117117
apis = ctx.apis
118-
vers = getAPIVersions(ApisApi(ctx.client))
118+
vers = @repeat max_tries try
119+
getAPIVersions(ApisApi(ctx.client))
120+
catch e
121+
@retry if isa(e, IOError)
122+
@debug("Retrying getAPIVersions")
123+
sleep(2)
124+
end
125+
end
119126
api_groups = vers.groups
120127
for apigrp in api_groups
121128
name = apigrp.name
@@ -150,9 +157,16 @@ function fetch_misc_apis_versions(ctx::KuberContext; override=nothing, verbose::
150157
apis
151158
end
152159

153-
function fetch_core_version(ctx::KuberContext; override=nothing, verbose::Bool=false)
160+
function fetch_core_version(ctx::KuberContext; override=nothing, verbose::Bool=false, max_tries=1)
154161
apis = ctx.apis
155-
api_vers = getCoreAPIVersions(CoreApi(ctx.client))
162+
api_vers = @repeat max_tries try
163+
getCoreAPIVersions(CoreApi(ctx.client))
164+
catch e
165+
@retry if isa(e, IOError)
166+
@debug("Retrying getCoreAPIVersions")
167+
sleep(2)
168+
end
169+
end
156170
name = "Core"
157171
pref_vers = override_pref(name, api_vers.versions[1], override)
158172
verbose && @info("Core versions", supported=join(api_vers.versions, ", "), preferred=pref_vers)
@@ -194,7 +208,7 @@ function build_model_api_map(ctx::KuberContext)
194208
modelapi
195209
end
196210

197-
function set_api_versions!(ctx::KuberContext; override=nothing, verbose::Bool=false)
211+
function set_api_versions!(ctx::KuberContext; override=nothing, verbose::Bool=false, max_tries=1)
198212
empty!(ctx.apis)
199213
empty!(ctx.modelapi)
200214

@@ -203,8 +217,8 @@ function set_api_versions!(ctx::KuberContext; override=nothing, verbose::Bool=fa
203217
build_model_api_map(ctx)
204218

205219
# fetch apis and map the types
206-
fetch_core_version(ctx; override=override, verbose=verbose)
207-
fetch_misc_apis_versions(ctx; override=override, verbose=verbose)
220+
fetch_core_version(ctx; override=override, verbose=verbose, max_tries=max_tries)
221+
fetch_misc_apis_versions(ctx; override=override, verbose=verbose, max_tries=max_tries)
208222
build_model_api_map(ctx)
209223

210224
# add custom models

src/simpleapi.jl

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,34 +58,62 @@ function list(ctx::KuberContext, O::Symbol, apiversion::Union{String,Nothing}=no
5858
end
5959
end
6060

61-
function get(ctx::KuberContext, O::Symbol, name::String, apiversion::Union{String,Nothing}=nothing; kwargs...)
62-
isempty(ctx.apis) && set_api_versions!(ctx)
61+
function get(ctx::KuberContext, O::Symbol, name::String, apiversion::Union{String,Nothing}=nothing; max_tries::Integer=1, kwargs...)
62+
isempty(ctx.apis) && set_api_versions!(ctx; max_tries=max_tries)
6363

6464
apictx = _get_apictx(ctx, O, apiversion)
6565
try
6666
apicall = eval(Symbol("read$O"))
67-
return apicall(apictx, name; kwargs...)
67+
@repeat max_tries try
68+
return apicall(apictx, name; kwargs...)
69+
catch e
70+
@retry if isa(e, IOError)
71+
@debug("Retrying ", "read$O")
72+
sleep(2)
73+
end
74+
end
6875
catch ex
6976
isa(ex, UndefVarError) || rethrow()
7077
apicall = eval(Symbol("readNamespaced$O"))
71-
return apicall(apictx, name, ctx.namespace; kwargs...)
78+
@repeat max_tries try
79+
return apicall(apictx, name, ctx.namespace; kwargs...)
80+
catch e
81+
@retry if isa(e, IOError)
82+
@debug("Retrying ", "readNamespaced$O")
83+
sleep(2)
84+
end
85+
end
7286
end
7387
end
7488

75-
function get(ctx::KuberContext, O::Symbol, apiversion::Union{String,Nothing}=nothing; label_selector=nothing, namespace::Union{String,Nothing}=ctx.namespace)
76-
isempty(ctx.apis) && set_api_versions!(ctx)
89+
function get(ctx::KuberContext, O::Symbol, apiversion::Union{String,Nothing}=nothing; label_selector=nothing, namespace::Union{String,Nothing}=ctx.namespace, max_tries::Integer=1)
90+
isempty(ctx.apis) && set_api_versions!(ctx; max_tries=max_tries)
7791

7892
apictx = _get_apictx(ctx, O, apiversion)
7993
try
8094
apiname = "list$O"
8195
(namespace === nothing) && (apiname *= "ForAllNamespaces")
8296
apicall = eval(Symbol(apiname))
83-
return apicall(apictx; labelSelector=label_selector)
97+
@repeat max_tries try
98+
return apicall(apictx; labelSelector=label_selector)
99+
catch e
100+
@retry if isa(e, IOError)
101+
@debug("Retrying ", apiname)
102+
sleep(2)
103+
end
104+
end
84105
catch ex
85106
isa(ex, UndefVarError) || rethrow()
86107
(namespace === nothing) && rethrow()
87108
apicall = eval(Symbol("listNamespaced$O"))
88-
return apicall(apictx, namespace; labelSelector=label_selector)
109+
@repeat max_tries try
110+
return apicall(apictx, namespace; labelSelector=label_selector)
111+
catch e
112+
@retry if isa(e, IOError)
113+
@debug("Retrying ", "listNamespaced$O")
114+
sleep(2)
115+
end
116+
end
89117
end
90118
end
91119

0 commit comments

Comments
 (0)