Fix vnflcm new tosca util pep8 error
[vfc/gvnfm/vnflcm.git] / lcm / lcm / pub / utils / jobutil.py
1 # Copyright 2017 ZTE Corporation.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 import datetime
16 import logging
17 import uuid
18 import traceback
19
20 from lcm.pub.database.models import JobStatusModel, JobModel
21 from lcm.pub.utils import idutil
22
23 logger = logging.getLogger(__name__)
24
25
26 def enum(**enums):
27     return type('Enum', (), enums)
28
29
30 JOB_STATUS = enum(PROCESSING=0, FINISH=1)
31 JOB_MODEL_STATUS = enum(STARTED='started', PROCESSING='processing', FINISHED='finished', ERROR='error',
32                         TIMEOUT='timeout')
33 JOB_TYPE = enum(CREATE_VNF="create vnf", TERMINATE_VNF="terminate vnf", GRANT_VNF="grant vnf")
34
35
36 class JobUtil(object):
37     def __init__(self):
38         pass
39
40     @staticmethod
41     def __gen_job_id(job_name):
42         return "%s-%s" % (job_name if job_name else "UnknownJob", uuid.uuid1())
43
44     @staticmethod
45     def query_job_status(job_id, index_id=-1):
46         # logger.info("Query job status, jobid =[%s], responseid [%d]" % (job_id, index_id))
47         jobs = []
48         if index_id < 0:
49             row = JobStatusModel.objects.filter(jobid=job_id).order_by("-indexid").first()
50             if row:
51                 jobs.append(row)
52         else:
53             [jobs.append(job) for job in JobStatusModel.objects.filter(jobid=job_id).order_by("-indexid")
54              if job.indexid > index_id]
55
56         # logger.info("Query job status, rows=%s" % str(jobs))
57         return jobs
58
59     @staticmethod
60     def is_job_exists(job_id):
61         jobs = JobModel.objects.filter(jobid=job_id)
62         return len(jobs) > 0
63
64     @staticmethod
65     def create_job(inst_type, jobaction, inst_id, user='', job_id=None, res_name=''):
66         if job_id is None:
67             job_id = JobUtil.__gen_job_id(
68                 '%s-%s-%s' % (str(inst_type).replace(' ', '_'), str(jobaction).replace(' ', '_'), str(inst_id)))
69         job = JobModel()
70         job.jobid = job_id
71         job.jobtype = inst_type
72         job.jobaction = jobaction
73         job.resid = str(inst_id)
74         job.status = JOB_STATUS.PROCESSING
75         job.user = user
76         job.starttime = datetime.datetime.now().strftime('%Y-%m-%d %X')
77         job.progress = 0
78         job.resname = res_name
79         logger.debug("create a new job, jobid=%s, jobtype=%s, jobaction=%s, resid=%s, status=%d" %
80                      (job.jobid, job.jobtype, job.jobaction, job.resid, job.status))
81         job.save()
82         return job_id
83
84     @staticmethod
85     def clear_job(job_id):
86         [job.delete() for job in JobModel.objects.filter(jobid=job_id)]
87         logger.debug("Clear job, job_id=%s" % job_id)
88
89     @staticmethod
90     def add_job_status(job_id, progress, status_decs, error_code=""):
91         jobs = JobModel.objects.filter(jobid=job_id)
92         if not jobs:
93             logger.error("Job[%s] is not exists, please create job first." % job_id)
94             raise Exception("Job[%s] is not exists." % job_id)
95         try:
96             int_progress = int(progress)
97             job_status = JobStatusModel()
98             job_status.indexid = int(idutil.get_auto_id(job_id))
99             job_status.jobid = job_id
100             job_status.status = "processing"
101             job_status.progress = int_progress
102
103             if job_status.progress == 0:
104                 job_status.status = "started"
105             elif job_status.progress == 100:
106                 job_status.status = "finished"
107             elif job_status.progress == 101:
108                 job_status.status = "partly_finished"
109             elif job_status.progress > 101:
110                 job_status.status = "error"
111
112             job_status.descp = status_decs
113             job_status.errcode = error_code
114             job_status.addtime = datetime.datetime.now().strftime('%Y-%m-%d %X')
115             job_status.save()
116             logger.debug("Add a new job status, jobid=%s, indexid=%d,"
117                          " status=%s, description=%s, progress=%d, errcode=%s, addtime=%r" %
118                          (job_status.jobid, job_status.indexid, job_status.status, job_status.descp,
119                           job_status.progress, job_status.errcode, job_status.addtime))
120
121             job = jobs[0]
122             job.progress = int_progress
123             if job_status.progress >= 100:
124                 job.status = JOB_STATUS.FINISH
125                 job.endtime = datetime.datetime.now().strftime('%Y-%m-%d %X')
126             job.save()
127             logger.debug("update job, jobid=%s, progress=%d" % (job_status.jobid, int_progress))
128         except:
129             logger.error(traceback.format_exc())
130
131     @staticmethod
132     def clear_job_status(job_id):
133         [job.delete() for job in JobStatusModel.objects.filter(jobid=job_id)]
134         logger.debug("Clear job status, job_id=%s" % job_id)
135
136     @staticmethod
137     def get_unfinished_jobs(url_prefix, inst_id, inst_type):
138         jobs = JobModel.objects.filter(resid=inst_id, jobtype=inst_type, status=JOB_STATUS.PROCESSING)
139         progresses = reduce(lambda content, job: content + [url_prefix + "/" + job.jobid], jobs, [])
140         return progresses