Skip to content

Commit edf72e3

Browse files
committed
Added container && proc operation
1 parent 73872c1 commit edf72e3

File tree

6 files changed

+91
-2
lines changed

6 files changed

+91
-2
lines changed

apis/models.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def podgroup_status_history(self, procname, instance):
125125
for history in status_histories:
126126
image, node = history['from'].split(' ')
127127
history['image'] = image.split('/')[1]
128-
history['node'] = node[5:] # len('node:')
128+
history['node'] = node[5:] # len('node:')
129129
del history['from']
130130
status_histories.reverse()
131131
return {
@@ -134,7 +134,8 @@ def podgroup_status_history(self, procname, instance):
134134
'StatusHistory': status_histories
135135
}
136136
else:
137-
logger.warning("fail getting PodGroup status history: %s" % r.content)
137+
logger.warning(
138+
"fail getting PodGroup status history: %s" % r.content)
138139
return None
139140
return None
140141

@@ -546,6 +547,11 @@ def podgroup_remove(self, podgroup_name):
546547
(podgroup_name, self.appname))
547548
return self.default_deploy.remove_podgroup(podgroup_name)
548549

550+
def podgroup_operate(self, podgroup_name, optype, instance):
551+
logger.info("operate podgroup %s of app %s " %
552+
(podgroup_name, self.appname))
553+
return self.default_deploy.operate_podgroup(podgroup_name)
554+
549555
def dependency_register(self, service_app, service_appname, dependency_pod_name):
550556
# service may not been deployed yet, so may need force generate the
551557
# calico profile of service_profile

apis/views.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,57 @@ def delete_app_proc(cls, appname, procname, options=None):
11291129
appname, procname, e),
11301130
reverse('api_proc', kwargs={'appname': appname, 'procname': procname}))
11311131

1132+
@classmethod
1133+
def operate_proc(cls, appname, procname, instance, operation, options=None):
1134+
try:
1135+
app = App.get_or_none(appname)
1136+
if not app.is_reachable():
1137+
return (404, None,
1138+
'app with appname %s has not been deployd\n' % appname,
1139+
reverse('api_apps'))
1140+
proc, pg_status = app.proc_and_pg_status(procname)
1141+
if proc is None:
1142+
return (404, None,
1143+
'no such proc %s in app %s' % (procname, appname),
1144+
reverse('api_procs', kwargs={'appname': appname}))
1145+
if pg_status:
1146+
if instance != 0 {
1147+
pods = pg_status['Status']['Pods']
1148+
if instance <= len(pods):
1149+
container_name = pods[instance - 1]['Containers'][0]['Runtime']['Name']
1150+
else:
1151+
return (404, None, 'no such proc %s instance %d, in app %s' % (procname, instance, appname),
1152+
reverse('api_procs', kwargs={'appname': appname}))
1153+
}
1154+
if container_name:
1155+
add_oplog(AuthApi.operater, operation.upper(), appname, "",
1156+
"%s container %s" % (operation, container_name))
1157+
else:
1158+
add_oplog(AuthApi.operater, operation.upper(), appname, "",
1159+
"%s proc %s" % (operation, procname))
1160+
1161+
podgroup_name = "%s.%s.%s" % (
1162+
appname, proc.type.name, proc.name)
1163+
result = app.podgroup_operate(podgroup_name)
1164+
if result.status_code < 400:
1165+
return (202, ProcApi.render_proc_data(appname, proc),
1166+
render_op_result_to_msg(result),
1167+
reverse('api_procs', kwargs={'appname': appname}))
1168+
else:
1169+
return (500, ProcApi.render_proc_data(appname, proc),
1170+
render_op_result_to_msg(result),
1171+
reverse('api_proc', kwargs={'appname': appname, 'procname': procname}))
1172+
else:
1173+
return (400, ProcApi.render_proc_data(appname, proc),
1174+
'proc %s exists but not deployed\nplease deploy it first\n' % (
1175+
procname),
1176+
reverse('api_proc', kwargs={'appname': appname, 'procname': procname}))
1177+
except Exception, e:
1178+
client.captureException()
1179+
return (500, None,
1180+
'fatal error when delete app %s proc %s:\n%s\nplease contact with admin of lain\n' % (
1181+
appname, procname, e),
1182+
reverse('api_proc', kwargs={'appname': appname, 'procname': procname}))
11321183

11331184
'''
11341185
这个类响应 console.views 关于 maintainer 的所有调用

console/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
'console.views.api_procs', name='api_procs'),
1818
url(r'^(?:api/)?v1/apps/(?P<appname>[^/]+)/procs/(?P<procname>[^/]+)/$',
1919
'console.views.api_proc', name='api_proc'),
20+
url(r'^(?:api/)?v1/apps/(?P<appname>[^/]+)/procs/(?P<procname>[^/]+)/(?P<operation>[^/]+)/$',
21+
'console.views.api_proc_op', name='api_proc_op'),
2022

2123
url(r'^(?:api/)?v1/apps/(?P<appname>[^/]+)/proc/(?P<procname>[^/]+)/instance/(?P<instance>[^/]+)/histories/$',
2224
'console.views.api_proc_history', name='api_proc_history'),

console/views.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,13 @@ def api_proc(request, appname, procname):
210210
_invalid_request_method('proc', request.method)
211211

212212

213+
def api_proc_op(request, appname, procname, operation):
214+
if request.method == 'POST':
215+
return api_proc_operate(request, appname, procname, operation)
216+
else:
217+
_invalid_request_method('proc', request.method)
218+
219+
213220
def api_proc_history(request, appname, procname, instance):
214221
if request.method == 'GET':
215222
return api_proc_history_get(request, appname, procname, instance)
@@ -251,6 +258,17 @@ def api_proc_get(request, appname, procname):
251258
return render_json_response(status_code, 'proc', view_object, msg, url)
252259

253260

261+
@permission_required('maintain')
262+
@deployd_required
263+
def api_proc_operate(request, appname, procname, operation):
264+
try:
265+
options = json.loads(request.body)
266+
instance = int(options.get('instance', 0))
267+
status_code, view_object, msg, url = ProcApi.operate_proc(appname, procname, operation, instance)
268+
return render_json_response(status_code, 'proc', view_object, msg, url)
269+
except Exception:
270+
return render_json_response(400, 'proc', None, 'invalid request: instance should be integer', reverse('api_docs'))
271+
254272
def api_repos(request):
255273
if request.method == 'POST':
256274
return api_repos_post(request)

deploys/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ def get_podhistory(self, podgroup_name, instance):
3434
def remove_podgroup(self, podgroup_name):
3535
return deploys.utils.remove_podgroup(podgroup_name, self.apiserver)
3636

37+
def operate_podgroup(self, podgroup_name, instance, operation):
38+
return deploys.utils.operate_podgroup(podgroup_name, instance, operation, self.apiserver)
39+
3740
def patch_podgroup_instance(self, podgroup_name, num_instances):
3841
return deploys.utils.patch_podgroup_instance(podgroup_name, num_instances, self.apiserver)
3942

deploys/utils.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,25 @@ def get_podgroup(podgroup_name, apiserver):
2323
apiserver, podgroup_name)
2424
return send_request("GET", url, None, None)
2525

26+
2627
def get_podhistory(podgroup_name, instance, apiserver):
2728
url = "%s/api/cntstatushistory?name=%s&instance=%d" % (
2829
apiserver, podgroup_name, instance)
2930
return send_request("GET", url, None, None)
3031

32+
3133
def remove_podgroup(podgroup_name, apiserver):
3234
url = "%s/api/podgroups?name=%s" % (apiserver, podgroup_name)
3335
return send_request("DELETE", url, None, None)
3436

3537

38+
def operate_podgroup(podgroup_name, instance, operation, apiserver):
39+
url = "%s/api/podgroups?name=%s&instance=%s&cmd=operation&optype=%s" % (
40+
apiserver, podgroup_name, instance, operation
41+
)
42+
return send_request("POST", url, None, None)
43+
44+
3645
def patch_podgroup_instance(podgroup_name, num_instances, apiserver):
3746
url = "%s/api/podgroups?name=%s&num_instances=%s&cmd=replica" % (
3847
apiserver, podgroup_name, num_instances

0 commit comments

Comments
 (0)