Files
osmedeus/server/api/v1/execute/views.py
T
2019-09-08 22:14:11 +07:00

91 lines
3.1 KiB
Python

from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated, IsAdminUser
from rest_framework import serializers
from api.models import Commands, Activities, Workspaces, Logs
# import utils
from core import utils
from core import common
from core import execute
def parse_data(data):
item = {
'cmd': data.get('cmd'),
'output_path': data.get('output_path'),
'std_path': data.get('std_path'),
'module': data.get('module'),
'status': data.get('status'),
'cmd_type': data.get('cmd_type'),
'workspace': data.get('workspace'),
'resources': data.get('resources'),
'chunk': data.get('chunk'),
'delay': data.get('delay'),
}
return item
class ExecuteSerializer(serializers.Serializer):
cmd = serializers.CharField(default='')
output_path = serializers.CharField(allow_blank=True, default='')
std_path = serializers.CharField(allow_blank=True, default='')
# alias = serializers.CharField(default=None)
workspace = serializers.CharField(required=True)
module = serializers.CharField(default='default')
cmd_type = serializers.CharField(default='single')
forced = serializers.BooleanField(default=False)
nolog = serializers.BooleanField(default=False)
resources = serializers.CharField(allow_blank=True, default=False)
chunk = serializers.IntegerField(default=1)
delay = serializers.IntegerField(default=1)
class ExecuteView(APIView):
serializer_class = ExecuteSerializer
permission_classes = (IsAuthenticated, IsAdminUser)
def post(self, request, *args, **kwargs):
serializer = ExecuteSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
data = serializer.data
forced = data.get('forced')
cmd = data.get('cmd')
output_path = data.get('output_path')
cmd_type = data.get('cmd_type')
# don't care about the status
nolog = data.get('nolog')
# forced check if output path exist
if not forced:
if utils.not_empty_file(output_path):
return common.message(500, "Commands is already done")
# set idle status
if nolog:
data['status'] = 'Done'
else:
data['status'] = 'Running'
item = parse_data(data)
instance = Activities.objects.create(**item)
Logs.objects.create(**item)
command_record = instance.as_json()
# really run the command
if cmd_type == 'single':
utils.print_info("Execute: {0} ".format(cmd))
execute.run_single(command_record)
elif cmd_type == 'list':
utils.print_info("Execute chunk: {0} ".format(cmd))
commands = execute.get_chunk_commands(command_record)
execute.run_chunk(commands, command_record.get(
'chunk'), command_record.get('delay'))
# update status after done
if instance.status != 'Done':
instance.status = 'Done'
instance.save()
return common.message(200, "Commands is done")