level1.py 6.62 KB
Newer Older
Wei Shoulin's avatar
Wei Shoulin committed
1
import os
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
2
import grpc
Wei Shoulin's avatar
Wei Shoulin committed
3
import datetime
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
4
5

from csst_dfs_commons.models import Result
Wei Shoulin's avatar
Wei Shoulin committed
6
from csst_dfs_commons.models.common import from_proto_model_list
Wei Shoulin's avatar
Wei Shoulin committed
7
from csst_dfs_commons.models.cpic import Level1Record
Wei Shoulin's avatar
bugs    
Wei Shoulin committed
8
from csst_dfs_commons.models.constants import UPLOAD_CHUNK_SIZE
Wei Shoulin's avatar
Wei Shoulin committed
9
from csst_dfs_proto.cpic.level1 import level1_pb2, level1_pb2_grpc
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
10
11
12
13

from ..common.service import ServiceProxy
from ..common.utils import *

Wei Shoulin's avatar
Wei Shoulin committed
14
15
16
17
class Level1DataApi(object):
    """
    Level1 Data Operation Class
    """    
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
18
    def __init__(self):
Wei Shoulin's avatar
Wei Shoulin committed
19
        self.stub = level1_pb2_grpc.Level1SrvStub(ServiceProxy().channel())
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
20
21

    def find(self, **kwargs):
Wei Shoulin's avatar
Wei Shoulin committed
22
        ''' retrieve level1 records from database
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
23
24

        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
25
26
27
28
            level0_id: [str]
            data_type: [str]
            create_time : (start, end),
            qc1_status : [int],
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
29
            prc_status : [int],
Wei Shoulin's avatar
Wei Shoulin committed
30
            filename: [str]
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
31
32
33
34
35
            limit: limits returns the number of records,default 0:no-limit

        return: csst_dfs_common.models.Result
        '''
        try:
Wei Shoulin's avatar
Wei Shoulin committed
36
37
38
39
40
41
            resp, _ =  self.stub.Find.with_call(level1_pb2.FindLevel1Req(
                level0_id = get_parameter(kwargs, "level0_id"),
                data_type = get_parameter(kwargs, "data_type"),
                create_time_start = get_parameter(kwargs, "create_time", [None, None])[0],
                create_time_end = get_parameter(kwargs, "create_time", [None, None])[1],
                qc1_status = get_parameter(kwargs, "qc1_status"),
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
42
                prc_status = get_parameter(kwargs, "prc_status"),
Wei Shoulin's avatar
Wei Shoulin committed
43
                filename = get_parameter(kwargs, "filename"),
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
44
45
46
47
48
                limit = get_parameter(kwargs, "limit", 0),
                other_conditions = {"test":"cnlab.test"}
            ),metadata = get_auth_headers())

            if resp.success:
Wei Shoulin's avatar
Wei Shoulin committed
49
                return Result.ok_data(data=from_proto_model_list(Level1Record, resp.records)).append("totalCount", resp.totalCount)
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
50
            else:
Wei Shoulin's avatar
c3    
Wei Shoulin committed
51
                return Result.error(message = str(resp.error.detail))
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
52
53

        except grpc.RpcError as e:
Wei Shoulin's avatar
Wei Shoulin committed
54
            return Result.error(message="%s:%s" % (e.code().value, e.details()))
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
55
56
57
58
59

    def get(self, **kwargs):
        '''  fetch a record from database

        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
60
            id : [int] 
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
61
62
63
64

        return csst_dfs_common.models.Result
        '''
        try:
Wei Shoulin's avatar
Wei Shoulin committed
65
66
67
68
            resp, _ =  self.stub.Get.with_call(level1_pb2.GetLevel1Req(
                id = get_parameter(kwargs, "id"),
                level0_id = get_parameter(kwargs, "level0_id"),
                data_type = get_parameter(kwargs, "data_type") 
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
69
70
            ),metadata = get_auth_headers())

Wei Shoulin's avatar
Wei Shoulin committed
71
            if resp.record is None or resp.record.id == 0:
Wei Shoulin's avatar
Wei Shoulin committed
72
                return Result.error(message=f"data not found")  
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
73

Wei Shoulin's avatar
Wei Shoulin committed
74
            return Result.ok_data(data = Level1Record().from_proto_model(resp.record))
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
75
76
           
        except grpc.RpcError as e:
Wei Shoulin's avatar
Wei Shoulin committed
77
            return Result.error(message="%s:%s" % (e.code().value, e.details()))   
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
78
79
80
81
82

    def update_proc_status(self, **kwargs):
        ''' update the status of reduction

        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
83
            id : [int],
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
84
85
86
87
            status : [int]

        return csst_dfs_common.models.Result
        '''
Wei Shoulin's avatar
Wei Shoulin committed
88
        fits_id = get_parameter(kwargs, "id")
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
89
90
91
        status = get_parameter(kwargs, "status")
        try:
            resp,_ = self.stub.UpdateProcStatus.with_call(
Wei Shoulin's avatar
Wei Shoulin committed
92
                level1_pb2.UpdateProcStatusReq(id=fits_id, status=status),
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
93
94
95
96
97
98
99
                metadata = get_auth_headers()
            )
            if resp.success:
                return Result.ok_data()
            else:
                return Result.error(message = str(resp.error.detail))
        except grpc.RpcError as e:
Wei Shoulin's avatar
Wei Shoulin committed
100
            return Result.error(message="%s:%s" % (e.code().value, e.details()))
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
101

Wei Shoulin's avatar
Wei Shoulin committed
102
    def update_qc1_status(self, **kwargs):
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
103
104
105
        ''' update the status of QC0
        
        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
106
            id : [int],
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
107
108
            status : [int]
        '''        
Wei Shoulin's avatar
Wei Shoulin committed
109
        fits_id = get_parameter(kwargs, "id")
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
110
111
        status = get_parameter(kwargs, "status")
        try:
Wei Shoulin's avatar
Wei Shoulin committed
112
113
            resp,_ = self.stub.UpdateQc1Status.with_call(
                level1_pb2.UpdateQc1StatusReq(id=fits_id, status=status),
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
114
115
116
117
118
119
120
                metadata = get_auth_headers()
            )
            if resp.success:
                return Result.ok_data()
            else:
                return Result.error(message = str(resp.error.detail))
        except grpc.RpcError as e:
Wei Shoulin's avatar
Wei Shoulin committed
121
            return Result.error(message="%s:%s" % (e.code().value, e.details()))
Wei Shoulin's avatar
leve0  
Wei Shoulin committed
122

Wei Shoulin's avatar
c3    
Wei Shoulin committed
123
    def write(self, **kwargs):
Wei Shoulin's avatar
Wei Shoulin committed
124
        ''' insert a level1 record into database
Wei Shoulin's avatar
c3    
Wei Shoulin committed
125
126
 
        parameter kwargs:
Wei Shoulin's avatar
Wei Shoulin committed
127
128
129
130
131
132
133
134
135
136
            level0_id : [str]
            data_type : [str]
            cor_sci_id : [int]
            prc_params : [str]
            filename : [str]
            file_path : [str]            
            prc_status : [int]
            prc_time : [str]
            pipeline_id : [str]
            refs: [dict]
Wei Shoulin's avatar
bugs    
Wei Shoulin committed
137

Wei Shoulin's avatar
Wei Shoulin committed
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
        return csst_dfs_common.models.Result
        '''   

        rec = level1_pb2.Level1Record(
            id = 0,
            level0_id = get_parameter(kwargs, "level0_id"),
            data_type = get_parameter(kwargs, "data_type"),
            cor_sci_id = get_parameter(kwargs, "cor_sci_id"),
            prc_params = get_parameter(kwargs, "prc_params"),
            filename = get_parameter(kwargs, "filename", ""),
            file_path = get_parameter(kwargs, "file_path", ""),
            prc_status = get_parameter(kwargs, "prc_status", -1),
            prc_time = get_parameter(kwargs, "prc_time", format_datetime(datetime.now())),
            pipeline_id = get_parameter(kwargs, "pipeline_id"),
            refs = get_parameter(kwargs, "refs", {})
        )
Wei Shoulin's avatar
bugs    
Wei Shoulin committed
154
155
156
157
158
159
        def stream(rec):
            with open(rec.file_path, 'rb') as f:
                while True:
                    data = f.read(UPLOAD_CHUNK_SIZE)
                    if not data:
                        break
Wei Shoulin's avatar
Wei Shoulin committed
160
                    yield level1_pb2.WriteLevel1Req(record = rec, data = data)
Wei Shoulin's avatar
c3    
Wei Shoulin committed
161
        try:
Wei Shoulin's avatar
bugs    
Wei Shoulin committed
162
163
164
165
166
167
168
169
            if not rec.file_path:
                return Result.error(message="file_path is blank")
            if not os.path.exists(rec.file_path):
                return Result.error(message="the file [%s] not existed" % (rec.file_path, ))
            if not rec.filename:
                rec.filename = os.path.basename(rec.file_path)

            resp,_ = self.stub.Write.with_call(stream(rec),metadata = get_auth_headers())
Wei Shoulin's avatar
c3    
Wei Shoulin committed
170
            if resp.success:
Wei Shoulin's avatar
Wei Shoulin committed
171
                return Result.ok_data(data=Level1Record().from_proto_model(resp.record))
Wei Shoulin's avatar
c3    
Wei Shoulin committed
172
173
174
            else:
                return Result.error(message = str(resp.error.detail))
        except grpc.RpcError as e:
Wei Shoulin's avatar
Wei Shoulin committed
175
            return Result.error(message="%s:%s" % (e.code().value, e.details()))