Skip to content

Commit 658ba12

Browse files
committed
chore(broker): add check install_hooks status
1 parent 60d66c8 commit 658ba12

3 files changed

Lines changed: 84 additions & 46 deletions

File tree

rootfs/helmbroker/broker.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def last_operation(self,
178178
OperationState(data["last_operation"]["state"]),
179179
data["last_operation"]["description"]
180180
)
181-
raise LastOperation(OperationState.IN_PROGRESS)
181+
return LastOperation(OperationState.IN_PROGRESS)
182182

183183
def last_binding_operation(self,
184184
instance_id: str,
@@ -192,4 +192,4 @@ def last_binding_operation(self,
192192
OperationState(data["last_operation"]["state"]),
193193
data["last_operation"]["description"]
194194
)
195-
return LastOperation(OperationState.SUCCEEDED)
195+
return LastOperation(OperationState.IN_PROGRESS)

rootfs/helmbroker/tasks.py

Lines changed: 79 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
from .celery import app
1010
from .utils import helm, format_params_to_helm_args, new_instance_lock, run_instance_hooks
1111

12-
from .database.metadata import save_instance_meta, save_binding_meta, load_instance_meta
12+
from .database.metadata import save_instance_meta, save_binding_meta, load_instance_meta, \
13+
load_binding_meta
1314
from .database.savepoint import save_addon_values, backup_instance
1415
from .database.query import get_plan_path, get_chart_path, get_cred_value, get_binding_file
1516

@@ -18,22 +19,30 @@
1819

1920
@app.task(serializer='pickle')
2021
def provision(instance_id: str, details: ProvisionDetails):
21-
with new_instance_lock(instance_id), run_instance_hooks(instance_id, "provision"):
22+
with (
23+
new_instance_lock(instance_id),
24+
run_instance_hooks(instance_id, "provision") as (status, output)
25+
):
2226
backup_instance(instance_id)
2327
# create instance.json
24-
save_instance_meta(instance_id, {
25-
"id": instance_id,
28+
data = {
29+
"id": instance_id, "last_operation": {},
2630
"details": {
2731
"service_id": details.service_id, "plan_id": details.plan_id,
2832
"context": details.context,
2933
"parameters": details.parameters if details.parameters else {},
3034
},
31-
"last_operation": {
32-
"state": OperationState.IN_PROGRESS.value, "operation": "provision",
33-
"description": ("provision %s in progress at %s" % (instance_id, time.time()))
34-
}
35-
})
36-
35+
}
36+
if status != 0:
37+
data["last_operation"]["state"] = OperationState.FAILED.value
38+
data["last_operation"]["description"] = f"provision {instance_id} error: {output}"
39+
save_instance_meta(instance_id, data)
40+
return
41+
data["last_operation"]["state"] = OperationState.IN_PROGRESS.value
42+
data["last_operation"]["operation"] = "provision"
43+
data["last_operation"]["description"] = (
44+
f"provision {instance_id} in progress at {time.time()}")
45+
save_instance_meta(instance_id, data)
3746
chart_path = get_chart_path(instance_id)
3847
bind_yaml = f'{chart_path}/templates/bind.yaml'
3948
if os.path.exists(bind_yaml):
@@ -56,19 +65,22 @@ def provision(instance_id: str, details: ProvisionDetails):
5665
args = format_params_to_helm_args(instance_id, details.parameters, args)
5766
logger.debug(f"helm install args:{args}")
5867
status, output = helm(instance_id, *args)
59-
data = load_instance_meta(instance_id)
6068
if status != 0:
6169
data["last_operation"]["state"] = OperationState.FAILED.value
62-
data["last_operation"]["description"] = "provision error:\n%s" % output
70+
data["last_operation"]["description"] = f"provision {instance_id} error: {output}"
6371
else:
6472
data["last_operation"]["state"] = OperationState.SUCCEEDED.value
65-
data["last_operation"]["description"] = "provision succeeded at %s" % time.time()
73+
data["last_operation"]["description"] = (
74+
f"provision {instance_id} succeeded at {time.time()}")
6675
save_instance_meta(instance_id, data)
6776

6877

6978
@app.task(serializer='pickle')
7079
def update(instance_id: str, details: UpdateDetails):
71-
with new_instance_lock(instance_id), run_instance_hooks(instance_id, "update"):
80+
with (
81+
new_instance_lock(instance_id),
82+
run_instance_hooks(instance_id, "update") as (status, output)
83+
):
7284
backup_instance(instance_id)
7385
data = load_instance_meta(instance_id)
7486
if details.service_id:
@@ -82,9 +94,14 @@ def update(instance_id: str, details: UpdateDetails):
8294
params.update(details.parameters)
8395
# remove the key which value is null
8496
data['details']['parameters'] = {k: v for k, v in params.items() if v != ""}
97+
if status != 0:
98+
data["last_operation"]["state"] = OperationState.FAILED.value
99+
data["last_operation"]["description"] = f"update {instance_id} failed: {output}"
100+
save_instance_meta(instance_id, data)
101+
return
85102
data['last_operation']["state"] = OperationState.IN_PROGRESS.value
86-
data['last_operation']["description"] = "update %s in progress at %s" % (
87-
instance_id, time.time())
103+
data['last_operation']["description"] = (
104+
f"update {instance_id} in progress at {time.time()}")
88105
save_instance_meta(instance_id, data)
89106
chart_path = get_chart_path(instance_id)
90107
values_file = os.path.join(get_plan_path(instance_id), "values.yaml")
@@ -105,11 +122,11 @@ def update(instance_id: str, details: UpdateDetails):
105122
status, output = helm(instance_id, *args)
106123
if status != 0:
107124
data["last_operation"]["state"] = OperationState.FAILED.value
108-
data["last_operation"]["description"] = "update %s failed: %s" % (instance_id, output)
125+
data["last_operation"]["description"] = f"update {time.time()} failed: {output}"
109126
else:
110127
data["last_operation"]["state"] = OperationState.SUCCEEDED.value
111128
data["last_operation"]["description"] = (
112-
"update %s succeeded at %s" % (instance_id, time.time()))
129+
f"update {instance_id} succeeded at {time.time()}")
113130
save_instance_meta(instance_id, data)
114131

115132

@@ -119,15 +136,17 @@ def bind(instance_id: str,
119136
details: BindDetails,
120137
async_allowed: bool,
121138
**kwargs):
122-
with new_instance_lock(instance_id), run_instance_hooks(instance_id, "bind"):
139+
with (
140+
new_instance_lock(instance_id),
141+
run_instance_hooks(instance_id, "bind") as (status, output)
142+
):
123143
backup_instance(instance_id)
124-
data = {
125-
"binding_id": binding_id, "credentials": {},
126-
"last_operation": {
127-
"state": OperationState.IN_PROGRESS.value,
128-
"description": "binding %s in progress at %s" % (binding_id, time.time())
129-
}
130-
}
144+
data = {"binding_id": binding_id, "credentials": {}, "last_operation": {}}
145+
if status != 0:
146+
data["last_operation"]["state"] = OperationState.FAILED.value
147+
data["last_operation"]["description"] = f"binding {instance_id} failed: {output}"
148+
save_binding_meta(instance_id, data)
149+
return
131150
save_binding_meta(instance_id, data)
132151
chart_path = get_chart_path(instance_id)
133152
values_file = os.path.join(get_plan_path(instance_id), "values.yaml")
@@ -145,9 +164,7 @@ def bind(instance_id: str,
145164
status, templates = helm(instance_id, *args) # output: templates.yaml
146165
if status != 0:
147166
data["last_operation"]["state"] = OperationState.FAILED.value
148-
data["last_operation"]["description"] = "binding %s failed: %s" % (
149-
instance_id, templates)
150-
167+
data["last_operation"]["description"] = f"binding {instance_id} failed: {templates}"
151168
credential_template = yaml.load(templates.split('bind.yaml')[1], Loader=yaml.Loader)
152169
success_flag = True
153170
errors = []
@@ -164,15 +181,13 @@ def bind(instance_id: str,
164181
else:
165182
data['credentials'][_['name']] = val
166183
if success_flag:
167-
data['last_operation'] = {
168-
'state': OperationState.SUCCEEDED.value,
169-
'description': "binding %s succeeded at %s" % (instance_id, time.time())
170-
}
184+
data['last_operation']['state'] = OperationState.SUCCEEDED.value
185+
data['last_operation']['description'] = (
186+
f"binding {instance_id} succeeded at {time.time()}")
171187
else:
172-
data['last_operation'] = {
173-
'state': OperationState.FAILED.value,
174-
'description': "binding %s failed: %s" % (instance_id, ','.join(errors))
175-
}
188+
data['last_operation']['state'] = OperationState.FAILED.value
189+
data['last_operation']['description'] = (
190+
f"binding {instance_id} failed: {','.join(errors)}")
176191
bind_yaml = f'{chart_path}/templates/bind.yaml'
177192
if os.path.exists(bind_yaml):
178193
os.remove(bind_yaml)
@@ -181,22 +196,43 @@ def bind(instance_id: str,
181196

182197
@app.task(serializer='pickle')
183198
def unbind(instance_id):
184-
with new_instance_lock(instance_id), run_instance_hooks(instance_id, "deprovision"):
199+
with (
200+
new_instance_lock(instance_id),
201+
run_instance_hooks(instance_id, "deprovision") as (status, output)
202+
):
185203
backup_instance(instance_id)
204+
data = load_binding_meta(instance_id)
205+
if status != 0:
206+
data['last_operation']['state'] = OperationState.FAILED.value
207+
data['last_operation']['description'] = f"unbind {instance_id} failed: {output}"
208+
save_binding_meta(instance_id, data)
209+
return
186210
binding_file = get_binding_file(instance_id)
187211
if os.path.exists(binding_file):
188212
os.remove(binding_file)
213+
data['last_operation']['state'] = OperationState.SUCCEEDED.value
214+
data['last_operation']['description'] = f"unbind {instance_id} succeeded at {time.time()}"
215+
save_binding_meta(instance_id, data)
189216

190217

191218
@app.task(serializer='pickle')
192219
def deprovision(instance_id: str):
193-
with new_instance_lock(instance_id), run_instance_hooks(instance_id, "deprovision"):
220+
with (
221+
new_instance_lock(instance_id),
222+
run_instance_hooks(instance_id, "deprovision") as (status, output)
223+
):
194224
backup_instance(instance_id)
195225
data = load_instance_meta(instance_id)
226+
if status != 0:
227+
data["last_operation"]["operation"] = "deprovision"
228+
data["last_operation"]["state"] = OperationState.FAILED.value
229+
data["last_operation"]["description"] = f"deprovision {instance_id} failed: {output}"
230+
save_instance_meta(instance_id, data)
231+
return
196232
data["last_operation"]["operation"] = "deprovision"
197233
data["last_operation"]["state"] = OperationState.IN_PROGRESS.value
198234
data["last_operation"]["description"] = (
199-
"deprovision %s in progress at %s" % (instance_id, time.time()))
235+
f"deprovision {instance_id} in progress at {time.time()}")
200236
save_instance_meta(instance_id, data)
201237
args = [
202238
"uninstall", data["details"]["context"]["instance_name"],
@@ -206,8 +242,9 @@ def deprovision(instance_id: str):
206242
status, output = helm(instance_id, *args)
207243
if status != 0:
208244
data["last_operation"]["state"] = OperationState.FAILED.value
209-
data["last_operation"]["description"] = "deprovision error:\n%s" % output
245+
data["last_operation"]["description"] = f"deprovision {instance_id} failed: {output}"
210246
else:
211247
data["last_operation"]["state"] = OperationState.SUCCEEDED.value
212-
data["last_operation"]["description"] = "deprovision succeeded at %s" % time.time()
248+
data["last_operation"]["description"] = (
249+
f"deprovision {instance_id} succeeded at {time.time()}")
213250
save_instance_meta(instance_id, data)

rootfs/helmbroker/utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,9 @@ def run_instance_hooks(instance_id, stage):
6262
status, output = subprocess.getstatusoutput(pre_script_file)
6363
result.append({"script": pre_script_file, "status": status, "output": output})
6464
else:
65-
logger.debug(f"skip running {pre_script_file}")
66-
yield
65+
status, output = 0, f"skip running {pre_script_file}"
66+
logger.debug(output)
67+
yield status, output
6768
finally:
6869
if os.path.exists(pre_script_file):
6970
status, output = subprocess.getstatusoutput(post_script_file)

0 commit comments

Comments
 (0)