Skip to content

Commit 0b6cdb2

Browse files
committed
sql工单orc操作迁移至api
1 parent e7c9462 commit 0b6cdb2

File tree

6 files changed

+56
-65
lines changed

6 files changed

+56
-65
lines changed

sql/sql_workflow.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -137,24 +137,3 @@ def cancel(request):
137137
task_name=f"sqlreview-cancel-{workflow_id}",
138138
)
139139
return HttpResponseRedirect(reverse("sql:detail", args=(workflow_id,)))
140-
141-
142-
def osc_control(request):
143-
"""用于mysql控制osc执行"""
144-
workflow_id = request.POST.get("workflow_id")
145-
sqlsha1 = request.POST.get("sqlsha1")
146-
command = request.POST.get("command")
147-
workflow = SqlWorkflow.objects.get(id=workflow_id)
148-
execute_engine = get_engine(workflow.instance)
149-
try:
150-
execute_result = execute_engine.osc_control(command=command, sqlsha1=sqlsha1)
151-
rows = execute_result.to_dict()
152-
error = execute_result.error
153-
except Exception as e:
154-
rows = []
155-
error = str(e)
156-
result = {"total": len(rows), "rows": rows, "msg": error}
157-
return HttpResponse(
158-
json.dumps(result, cls=ExtendJSONEncoder, bigint_as_string=True),
159-
content_type="application/json",
160-
)

sql/templates/detail.html

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -764,8 +764,9 @@ <h4 class="modal-title text-danger">修改可执行时间</h4>
764764
$('#osc_percent_list').bootstrapTable('destroy').bootstrapTable({
765765
escape: true,
766766
method: 'post',
767-
contentType: "application/x-www-form-urlencoded",
768-
url: "/inception/osc_control/",
767+
contentType: "application/json",
768+
url: "/api/v2/workflow/sql/" + workflow_id + "/mysql_osc_control/",
769+
dataType: "json",
769770
striped: true, //是否显示行间隔色
770771
cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)
771772
pagination: false, //是否显示分页(*)
@@ -808,11 +809,11 @@ <h4 class="modal-title text-danger">修改可执行时间</h4>
808809
//请求服务数据时所传参数
809810
queryParams:
810811
function (params) {
811-
return {
812+
return JSON.stringify({
812813
sqlsha1: $(obj).attr("sqlsha1"),
813814
workflow_id: "{{ workflow_detail.id }}",
814815
command: "get"
815-
}
816+
})
816817
},
817818
columns: [{
818819
title: '',
@@ -887,11 +888,11 @@ <h4 class="modal-title text-danger">修改可执行时间</h4>
887888
//发送请求
888889
$.ajax({
889890
type: "post",
890-
url: "/inception/osc_control/",
891+
contentType: "application/json",
892+
url: "/api/v2/workflow/sql/" + workflow_id + "/mysql_osc_control/",
891893
dataType: "json",
892894
data: {
893895
sqlsha1: sqlsha1,
894-
workflow_id: "{{ workflow_detail.id }}",
895896
command: command
896897
},
897898
complete: function () {

sql/tests.py

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -898,38 +898,6 @@ def testWorkflowCancelView(
898898
self.wf2.refresh_from_db()
899899
self.assertEqual("workflow_abort", self.wf2.status)
900900

901-
@patch("sql.sql_workflow.get_engine")
902-
def test_osc_control(self, _get_engine):
903-
"""测试MySQL工单osc控制"""
904-
c = Client()
905-
c.force_login(self.superuser1)
906-
request_data = {
907-
"workflow_id": self.wf1.id,
908-
"sqlsha1": "sqlsha1",
909-
"command": "get",
910-
}
911-
_get_engine.return_value.osc_control.return_value = ResultSet()
912-
r = c.post("/inception/osc_control/", data=request_data, follow=False)
913-
self.assertDictEqual(
914-
json.loads(r.content), {"total": 0, "rows": [], "msg": None}
915-
)
916-
917-
@patch("sql.sql_workflow.get_engine")
918-
def test_osc_control_exception(self, _get_engine):
919-
"""测试MySQL工单OSC控制异常"""
920-
c = Client()
921-
c.force_login(self.superuser1)
922-
request_data = {
923-
"workflow_id": self.wf1.id,
924-
"sqlsha1": "sqlsha1",
925-
"command": "get",
926-
}
927-
_get_engine.return_value.osc_control.side_effect = RuntimeError("RuntimeError")
928-
r = c.post("/inception/osc_control/", data=request_data, follow=False)
929-
self.assertDictEqual(
930-
json.loads(r.content), {"total": 0, "rows": [], "msg": "RuntimeError"}
931-
)
932-
933901

934902
class TestOptimize(TestCase):
935903
"""

sql/urls.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@
7676
path("audit_sqlworkflow/", views.audit_sqlworkflow),
7777
path("authenticate/", auth.authenticate_entry),
7878
path("del_sqlcronjob/", tasks.del_schedule),
79-
path("inception/osc_control/", sql_workflow.osc_control),
8079
path("sql_analyze/generate/", sql_analyze.generate),
8180
path("sql_analyze/analyze/", sql_analyze.analyze),
8281
path("workflow/list/", workflow.lists),

sql_api/api_views/sql_workflow.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import django_filters
1111
from django.contrib.auth.decorators import permission_required
1212
from django.utils.decorators import method_decorator
13-
from drf_spectacular.types import OpenApiTypes
1413
from drf_spectacular.utils import extend_schema, extend_schema_view
1514
from rest_framework import serializers, viewsets, filters
1615
from rest_framework.decorators import action
@@ -30,6 +29,7 @@
3029
SqlWorkflowDetailSerializer,
3130
SqlWorkflowExecuteSerializer,
3231
SqlWorkflowTimingTaskSerializer,
32+
SqlWorkflowMySQLOscControlSerializer,
3333
)
3434

3535

@@ -169,7 +169,7 @@ def alter_run_date(self, request, *args, **kwargs):
169169
@extend_schema(
170170
summary="立即执行工单",
171171
request=SqlWorkflowExecuteSerializer,
172-
responses={200: OpenApiTypes.NUMBER},
172+
responses={200: SqlWorkflowSerializer},
173173
description="通过工单ID执行工单",
174174
)
175175
@action(methods=["post"], detail=True)
@@ -179,12 +179,12 @@ def execute(self, request, *args, **kwargs):
179179
mode = request.data.get("mode")
180180
serializer = self.get_serializer()
181181
serializer.execute(obj, mode=mode, username=request.user.username)
182-
return Response(obj.id)
182+
return Response(serializer.data)
183183

184184
@extend_schema(
185185
summary="设置定时执行工单",
186186
request=SqlWorkflowTimingTaskSerializer,
187-
responses={200: OpenApiTypes.DATETIME},
187+
responses={200: SqlWorkflowSerializer},
188188
description="通过工单ID执行工单",
189189
)
190190
@action(methods=["post"], detail=True)
@@ -196,4 +196,24 @@ def timing_task(self, request, *args, **kwargs):
196196
run_date = request.data.get("run_date")
197197
serializer = self.get_serializer()
198198
serializer.timing_task(obj, run_date=run_date, username=request.user.username)
199-
return Response(run_date)
199+
return Response(serializer.data)
200+
201+
@extend_schema(
202+
summary="用于MySQL的大表DDL控制",
203+
request=SqlWorkflowMySQLOscControlSerializer,
204+
responses={200: SqlWorkflowSerializer},
205+
description="控制pt-osc、gh-ost任务,用于执行进度获取,暂停、恢复、终止执行等",
206+
)
207+
@action(methods=["post"], detail=True)
208+
def mysql_osc_control(self, request, *args, **kwargs):
209+
obj = self.get_object()
210+
SqlWorkflowMySQLOscControlSerializer(data=request.data).is_valid(
211+
raise_exception=True
212+
)
213+
sqlsha1 = request.data.get("sqlsha1")
214+
command = request.data.get("command")
215+
serializer = self.get_serializer()
216+
serializer.mysql_osc_control(
217+
obj, sqlsha1=sqlsha1, command=command, username=request.user.username
218+
)
219+
return Response(serializer.data)

sql_api/serializers/sql_workflow.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,19 @@ def timing_task(obj, run_date, username):
251251
operator_display=user.display,
252252
)
253253

254+
@staticmethod
255+
def mysql_osc_control(obj, sqlsha1, command):
256+
"""用于MySQL的大表DDL控制"""
257+
execute_engine = get_engine(instance=obj.instance)
258+
try:
259+
execute_result = execute_engine.osc_control(command=command, sqlsha1=sqlsha1)
260+
rows = execute_result.to_dict()
261+
error = execute_result.error
262+
except Exception as e:
263+
rows = []
264+
error = str(e)
265+
return {"total": len(rows), "rows": rows, "msg": error}
266+
254267
class Meta:
255268
model = SqlWorkflow
256269
fields = "__all__"
@@ -274,3 +287,14 @@ class SqlWorkflowTimingTaskSerializer(serializers.Serializer):
274287
run_date = serializers.DateTimeField(
275288
label="定时执行时间",
276289
)
290+
291+
292+
class SqlWorkflowMySQLOscControlSerializer(serializers.Serializer):
293+
"""用于MySQL的大表DDL控制"""
294+
295+
sqlsha1 = serializers.CharField(
296+
label="SQL审核返回的sqlsha1信息",
297+
)
298+
command = serializers.ChoiceField(
299+
choices=["get", "pause", "resume", "kill"], label="命令:get-获取详情,pause-暂停,resume-恢复,kill-终止"
300+
)

0 commit comments

Comments
 (0)