level2.py 3.67 KB
Newer Older
Wei Shoulin's avatar
Wei Shoulin committed
1
2
3
4
5
6
7
8
9
10
import io
import os
import grpc
import datetime
import pickle

from collections.abc import Iterable

from csst_dfs_commons.models import Result
from csst_dfs_commons.models.common import from_proto_model_list
Wei Shoulin's avatar
Wei Shoulin committed
11
from csst_dfs_commons.models.level2 import Level2Record, filter_table_name
Wei Shoulin's avatar
C9    
Wei Shoulin committed
12

Wei Shoulin's avatar
Wei Shoulin committed
13
from ..common.service import grpc_channel
Wei Shoulin's avatar
Wei Shoulin committed
14
from ..common.utils import *
Wei Shoulin's avatar
C9    
Wei Shoulin committed
15
from ..common.constants import *
Wei Shoulin's avatar
Wei Shoulin committed
16
17
18
19
20
21

class Level2DataApi(object):
    """
    Level2 Data Operation Class
    """    
    def __init__(self):
Wei Shoulin's avatar
Wei Shoulin committed
22
        self.stub = None
Wei Shoulin's avatar
Wei Shoulin committed
23

Wei Shoulin's avatar
Wei Shoulin committed
24
    @grpc_channel
Wei Shoulin's avatar
Wei Shoulin committed
25
    def find(self, **kwargs):
Wei Shoulin's avatar
C9    
Wei Shoulin committed
26
        return find_req("Level2Servicer.Find", kwargs)
Wei Shoulin's avatar
Wei Shoulin committed
27

Wei Shoulin's avatar
Wei Shoulin committed
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    def catalog_columns(self, **kwargs):
        ''' retrieve columns data type

        :param kwargs: Parameter dictionary, key items support:
            data_type: [str]
            columns: [list], list of str
        '''
        data_type = get_parameter(kwargs, "data_type", "")
        columns = get_parameter(kwargs, "columns", [])
        if type(columns) != list:
            columns = [columns]
        resp = self.catalog_query(sql=f"describe {filter_table_name(data_type)}")
        if resp.success:
            resp['data'] = [(rec[0], rec[1]) for rec in resp.data if rec[0].lower() in [col.lower() for col in columns] or len(columns) == 0]
            resp['columns'] = ['Field', 'Type']
            resp['totalCount'] = len(resp['data'])
        return resp

Wei Shoulin's avatar
Wei Shoulin committed
46
    @grpc_channel
Wei Shoulin's avatar
Wei Shoulin committed
47
    def catalog_query(self, **kwargs):
Wei Shoulin's avatar
C9    
Wei Shoulin committed
48
        return find_req("Level2Servicer.FindCatalog", kwargs)
Wei Shoulin's avatar
Wei Shoulin committed
49

Wei Shoulin's avatar
Wei Shoulin committed
50
    @grpc_channel
51
    def coord_cond_sql(self, **kwargs):
Wei Shoulin's avatar
C9    
Wei Shoulin committed
52
        return get_req("Level2Servicer.CoordCond", kwargs)
53
        
Wei Shoulin's avatar
Wei Shoulin committed
54
    @grpc_channel
Wei Shoulin's avatar
Wei Shoulin committed
55
    def find_existed_brick_ids(self, **kwargs):
Wei Shoulin's avatar
C9    
Wei Shoulin committed
56
        return find_req("Level2Servicer.FindExistedBricks", kwargs)
Wei Shoulin's avatar
Wei Shoulin committed
57

Wei Shoulin's avatar
Wei Shoulin committed
58
    @grpc_channel
Wei Shoulin's avatar
Wei Shoulin committed
59
    def get(self, **kwargs):
Wei Shoulin's avatar
C9    
Wei Shoulin committed
60
        return get_req("Level2Servicer.Get", kwargs)
Wei Shoulin's avatar
Wei Shoulin committed
61

Wei Shoulin's avatar
Wei Shoulin committed
62
    @grpc_channel
Wei Shoulin's avatar
Wei Shoulin committed
63
    def update_proc_status(self, **kwargs):
Wei Shoulin's avatar
C9    
Wei Shoulin committed
64
        return update_req("Level2Servicer.UpdateProcStatus", kwargs)
Wei Shoulin's avatar
Wei Shoulin committed
65
66
        
    @grpc_channel
Wei Shoulin's avatar
Wei Shoulin committed
67
    def update_qc2_status(self, **kwargs):
Wei Shoulin's avatar
C9    
Wei Shoulin committed
68
        return update_req("Level2Servicer.UpdateQc2Status", kwargs)
Wei Shoulin's avatar
Wei Shoulin committed
69
70
    
    @grpc_channel
Wei Shoulin's avatar
Wei Shoulin committed
71
72
    def write(self, **kwargs):
        try:
Wei Shoulin's avatar
C9    
Wei Shoulin committed
73
74
75
76
77
78
79
80
            conditions = {}
            conditions.update(kwargs)

            module_id = get_parameter(kwargs, "module_id", "")
            data_type = get_parameter(kwargs, "data_type", "")
            file_path = get_parameter(kwargs, "file_path", "")
            filename = get_parameter(kwargs, "filename", "")
            if not module_id:
Wei Shoulin's avatar
Wei Shoulin committed
81
                return Result.error(message="module_id is blank")
Wei Shoulin's avatar
C9    
Wei Shoulin committed
82
            if not data_type:
Wei Shoulin's avatar
Wei Shoulin committed
83
                return Result.error(message="data_type is blank")
Wei Shoulin's avatar
C9    
Wei Shoulin committed
84
            if not file_path:
Wei Shoulin's avatar
Wei Shoulin committed
85
                return Result.error(message="file_path is blank")
Wei Shoulin's avatar
C9    
Wei Shoulin committed
86
87
88
89
90
            if not os.path.exists(file_path):
                return Result.error(message="the file [%s] not existed" % (file_path, ))
            if not filename:
                filename = os.path.basename(file_path)
                conditions["filename"] = filename
Wei Shoulin's avatar
Wei Shoulin committed
91

Wei Shoulin's avatar
C9    
Wei Shoulin committed
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
            if not conditions.get("qc2_status", ''):
                conditions["qc2_status"] = "0"

            if not conditions.get("prc_status", ''):
                conditions["prc_status"] = "-1024"
            
            if not conditions.get("prc_time", ''):
                time_now = datetime.datetime.now()
                conditions["prc_time"] = time_now.strftime('%Y-%m-%d %H:%M:%S')

            with open(file_path, 'rb') as f:
                byte_stream = io.BytesIO(f.read())
                return write_stream_req("Level2Servicer.Write", byte_stream, conditions)
        except Exception as e:
            return Result.error(message="%s" % (e,))