From d986550f266ee15210823b217a5e0c01e5147aaf Mon Sep 17 00:00:00 2001 From: shoulinwei Date: Fri, 22 Oct 2021 21:07:35 +0800 Subject: [PATCH] level1 and sls --- .../unicode_data/11.0.0/charmap.json.gz | Bin 0 -> 20358 bytes csst_dfs_api_cluster/facility/__init__.py | 1 + csst_dfs_api_cluster/facility/level1prc.py | 103 +++++++++++ csst_dfs_api_cluster/ifs/level1.py | 19 +- csst_dfs_api_cluster/msc/level1.py | 13 +- csst_dfs_api_cluster/sls/__init__.py | 2 + csst_dfs_api_cluster/sls/level1.py | 172 ++++++++++++++++++ csst_dfs_api_cluster/sls/level2spectra.py | 171 +++++++++++++++++ tests/test_msc_level1.py | 54 +++--- 9 files changed, 484 insertions(+), 51 deletions(-) create mode 100644 .hypothesis/unicode_data/11.0.0/charmap.json.gz create mode 100644 csst_dfs_api_cluster/facility/level1prc.py create mode 100644 csst_dfs_api_cluster/sls/__init__.py create mode 100644 csst_dfs_api_cluster/sls/level1.py create mode 100644 csst_dfs_api_cluster/sls/level2spectra.py diff --git a/.hypothesis/unicode_data/11.0.0/charmap.json.gz b/.hypothesis/unicode_data/11.0.0/charmap.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..bf6877bbcc6737421c21ad79740b7dce16aa3947 GIT binary patch literal 20358 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 M0gY=Wee2u+0FP=m-2eap literal 0 HcmV?d00001 diff --git a/csst_dfs_api_cluster/facility/__init__.py b/csst_dfs_api_cluster/facility/__init__.py index 4a31a70..30e9e4f 100644 --- a/csst_dfs_api_cluster/facility/__init__.py +++ b/csst_dfs_api_cluster/facility/__init__.py @@ -2,4 +2,5 @@ from .calmerge import CalMergeApi from .detector import DetectorApi from .level0 import Level0DataApi from .level0prc import Level0PrcApi +from .level1prc import Level1PrcApi from .observation import ObservationApi \ No newline at end of file diff --git a/csst_dfs_api_cluster/facility/level1prc.py b/csst_dfs_api_cluster/facility/level1prc.py new file mode 100644 index 0000000..621c55e --- /dev/null +++ b/csst_dfs_api_cluster/facility/level1prc.py @@ -0,0 +1,103 @@ +import grpc + +from csst_dfs_commons.models import Result +from csst_dfs_commons.models.common import from_proto_model_list +from csst_dfs_commons.models.facility import Level1PrcRecord + +from csst_dfs_proto.facility.level1prc import level1prc_pb2, level1prc_pb2_grpc + +from ..common.service import ServiceProxy +from ..common.utils import * + +class Level1PrcApi(object): + def __init__(self): + self.stub = level1prc_pb2_grpc.Level1PrcSrvStub(ServiceProxy().channel()) + + def find(self, **kwargs): + ''' retrieve level1 procedure records from database + + parameter kwargs: + level1_id: [str] + pipeline_id: [str] + prc_module: [str] + prc_status : [int] + + return: csst_dfs_common.models.Result + ''' + try: + resp, _ = self.stub.Find.with_call(level1prc_pb2.FindLevel1PrcReq( + level1_id = get_parameter(kwargs, "level1_id"), + pipeline_id = get_parameter(kwargs, "pipeline_id"), + prc_module = get_parameter(kwargs, "prc_module"), + prc_status = get_parameter(kwargs, "prc_status"), + other_conditions = {"test":"cnlab.test"} + ),metadata = get_auth_headers()) + + if resp.success: + return Result.ok_data(data = from_proto_model_list(Level1PrcRecord, resp.records)).append("totalCount", resp.totalCount) + else: + return Result.error(message = str(resp.error.detail)) + + except grpc.RpcError as e: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + def update_proc_status(self, **kwargs): + ''' update the status of reduction + + parameter kwargs: + id : [int], + status : [int] + + return csst_dfs_common.models.Result + ''' + id = get_parameter(kwargs, "id") + status = get_parameter(kwargs, "status") + + try: + resp,_ = self.stub.UpdateProcStatus.with_call( + level1prc_pb2.UpdateProcStatusReq(id=id, status=status), + 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: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + def write(self, **kwargs): + ''' insert a level1 procedure record into database + + parameter kwargs: + level1_id : [int] + pipeline_id : [str] + prc_module : [str] + params_file_path : [str] + prc_status : [int] + prc_time : [str] + result_file_path : [str] + return csst_dfs_common.models.Result + ''' + + rec = level1prc_pb2.Level1PrcRecord( + id = 0, + level1_id = get_parameter(kwargs, "level1_id"), + pipeline_id = get_parameter(kwargs, "pipeline_id"), + prc_module = get_parameter(kwargs, "prc_module"), + params_file_path = get_parameter(kwargs, "params_file_path"), + prc_status = get_parameter(kwargs, "prc_status", -1), + prc_time = get_parameter(kwargs, "prc_time"), + result_file_path = get_parameter(kwargs, "result_file_path") + ) + req = level1prc_pb2.WriteLevel1PrcReq(record = rec) + try: + resp,_ = self.stub.Write.with_call(req,metadata = get_auth_headers()) + if resp.success: + return Result.ok_data(data = Level1PrcRecord().from_proto_model(resp.record)) + else: + return Result.error(message = str(resp.error.detail)) + except grpc.RpcError as e: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + + diff --git a/csst_dfs_api_cluster/ifs/level1.py b/csst_dfs_api_cluster/ifs/level1.py index 09d67f5..8c4380c 100644 --- a/csst_dfs_api_cluster/ifs/level1.py +++ b/csst_dfs_api_cluster/ifs/level1.py @@ -24,7 +24,6 @@ class Level1DataApi(object): parameter kwargs: level0_id: [str] data_type: [str] - obs_type: [str] create_time : (start, end), qc1_status : [int], prc_status : [int], @@ -69,7 +68,7 @@ class Level1DataApi(object): ),metadata = get_auth_headers()) if resp.record is None or resp.record.id == 0: - return Result.error(message=f"id:{id} not found") + return Result.error(message=f"id:{fits_id} not found") return Result.ok_data(data=Level1Record().from_proto_model(resp.record)) @@ -128,17 +127,12 @@ class Level1DataApi(object): data_type : [str] cor_sci_id : [int] prc_params : [str] - flat_id : [int] - dark_id : [int] - bias_id : [int] - lamp_id : [int] - arc_id : [int] - sky_id : [int] filename : [str] file_path : [str] prc_status : [int] prc_time : [str] pipeline_id : [str] + refs: [dict] return csst_dfs_common.models.Result ''' @@ -149,17 +143,12 @@ class Level1DataApi(object): data_type = get_parameter(kwargs, "data_type"), cor_sci_id = get_parameter(kwargs, "cor_sci_id"), prc_params = get_parameter(kwargs, "prc_params"), - flat_id = get_parameter(kwargs, "flat_id"), - dark_id = get_parameter(kwargs, "dark_id"), - bias_id = get_parameter(kwargs, "bias_id"), - lamp_id = get_parameter(kwargs, "lamp_id"), - arc_id = get_parameter(kwargs, "arc_id"), - sky_id = get_parameter(kwargs, "sky_id"), 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") + pipeline_id = get_parameter(kwargs, "pipeline_id"), + refs = get_parameter(kwargs, "refs", {}) ) def stream(rec): with open(rec.file_path, 'rb') as f: diff --git a/csst_dfs_api_cluster/msc/level1.py b/csst_dfs_api_cluster/msc/level1.py index 6ec3823..45ea553 100644 --- a/csst_dfs_api_cluster/msc/level1.py +++ b/csst_dfs_api_cluster/msc/level1.py @@ -24,7 +24,6 @@ class Level1DataApi(object): parameter kwargs: level0_id: [str] data_type: [str] - obs_type: [str] create_time : (start, end), qc1_status : [int], prc_status : [int], @@ -69,7 +68,7 @@ class Level1DataApi(object): ),metadata = get_auth_headers()) if resp.record is None or resp.record.id == 0: - return Result.error(message=f"id:{id} not found") + return Result.error(message=f"id:{fits_id} not found") return Result.ok_data(data = Level1Record().from_proto_model(resp.record)) @@ -128,14 +127,12 @@ class Level1DataApi(object): data_type : [str] cor_sci_id : [int] prc_params : [str] - flat_id : [int] - dark_id : [int] - bias_id : [int] filename : [str] file_path : [str] prc_status : [int] prc_time : [str] pipeline_id : [str] + refs: [dict] return csst_dfs_common.models.Result ''' @@ -146,14 +143,12 @@ class Level1DataApi(object): data_type = get_parameter(kwargs, "data_type"), cor_sci_id = get_parameter(kwargs, "cor_sci_id"), prc_params = get_parameter(kwargs, "prc_params"), - flat_id = get_parameter(kwargs, "flat_id"), - dark_id = get_parameter(kwargs, "dark_id"), - bias_id = get_parameter(kwargs, "bias_id"), 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") + pipeline_id = get_parameter(kwargs, "pipeline_id"), + refs = get_parameter(kwargs, "refs", {}) ) def stream(rec): with open(rec.file_path, 'rb') as f: diff --git a/csst_dfs_api_cluster/sls/__init__.py b/csst_dfs_api_cluster/sls/__init__.py new file mode 100644 index 0000000..819de80 --- /dev/null +++ b/csst_dfs_api_cluster/sls/__init__.py @@ -0,0 +1,2 @@ +from .level1 import Level1DataApi +from .level2spectra import Level2SpectraApi \ No newline at end of file diff --git a/csst_dfs_api_cluster/sls/level1.py b/csst_dfs_api_cluster/sls/level1.py new file mode 100644 index 0000000..0c4e1d1 --- /dev/null +++ b/csst_dfs_api_cluster/sls/level1.py @@ -0,0 +1,172 @@ +import os +import grpc +import datetime + +from csst_dfs_commons.models import Result +from csst_dfs_commons.models.common import from_proto_model_list +from csst_dfs_commons.models.sls import Level1Record +from csst_dfs_commons.models.constants import UPLOAD_CHUNK_SIZE +from csst_dfs_proto.sls.level1 import level1_pb2, level1_pb2_grpc + +from ..common.service import ServiceProxy +from ..common.utils import * + +class Level1DataApi(object): + """ + Level1 Data Operation Class + """ + def __init__(self): + self.stub = level1_pb2_grpc.Level1SrvStub(ServiceProxy().channel()) + + def find(self, **kwargs): + ''' retrieve level1 records from database + + parameter kwargs: + level0_id: [str] + data_type: [str] + create_time : (start, end), + qc1_status : [int], + prc_status : [int], + filename: [str] + limit: limits returns the number of records,default 0:no-limit + + return: csst_dfs_common.models.Result + ''' + try: + 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"), + prc_status = get_parameter(kwargs, "prc_status"), + filename = get_parameter(kwargs, "filename"), + limit = get_parameter(kwargs, "limit", 0), + other_conditions = {"test":"cnlab.test"} + ),metadata = get_auth_headers()) + + if resp.success: + return Result.ok_data(data=from_proto_model_list(Level1Record, resp.records)).append("totalCount", resp.totalCount) + else: + return Result.error(message = str(resp.error.detail)) + + except grpc.RpcError as e: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + def get(self, **kwargs): + ''' fetch a record from database + + parameter kwargs: + id : [int] + + return csst_dfs_common.models.Result + ''' + try: + fits_id = get_parameter(kwargs, "id") + resp, _ = self.stub.Get.with_call(level1_pb2.GetLevel1Req( + id = fits_id + ),metadata = get_auth_headers()) + + if resp.record is None or resp.record.id == 0: + return Result.error(message=f"id:{fits_id} not found") + + return Result.ok_data(data = Level1Record().from_proto_model(resp.record)) + + except grpc.RpcError as e: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + def update_proc_status(self, **kwargs): + ''' update the status of reduction + + parameter kwargs: + id : [int], + status : [int] + + return csst_dfs_common.models.Result + ''' + fits_id = get_parameter(kwargs, "id") + status = get_parameter(kwargs, "status") + try: + resp,_ = self.stub.UpdateProcStatus.with_call( + level1_pb2.UpdateProcStatusReq(id=fits_id, status=status), + 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: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + def update_qc1_status(self, **kwargs): + ''' update the status of QC0 + + parameter kwargs: + id : [int], + status : [int] + ''' + fits_id = get_parameter(kwargs, "id") + status = get_parameter(kwargs, "status") + try: + resp,_ = self.stub.UpdateQc1Status.with_call( + level1_pb2.UpdateQc1StatusReq(id=fits_id, status=status), + 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: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + def write(self, **kwargs): + ''' insert a level1 record into database + + parameter kwargs: + level0_id : [str] + data_type : [str] + prc_params : [str] + filename : [str] + file_path : [str] + prc_status : [int] + prc_time : [str] + pipeline_id : [str] + refs: [dict] + + 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"), + 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", {}) + ) + def stream(rec): + with open(rec.file_path, 'rb') as f: + while True: + data = f.read(UPLOAD_CHUNK_SIZE) + if not data: + break + yield level1_pb2.WriteLevel1Req(record = rec, data = data) + try: + 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()) + if resp.success: + return Result.ok_data(data=Level1Record().from_proto_model(resp.record)) + else: + return Result.error(message = str(resp.error.detail)) + except grpc.RpcError as e: + return Result.error(message="%s:%s" % (e.code().value, e.details)) diff --git a/csst_dfs_api_cluster/sls/level2spectra.py b/csst_dfs_api_cluster/sls/level2spectra.py new file mode 100644 index 0000000..0de6bbe --- /dev/null +++ b/csst_dfs_api_cluster/sls/level2spectra.py @@ -0,0 +1,171 @@ +import os +import grpc +import datetime + +from csst_dfs_commons.models import Result +from csst_dfs_commons.models.common import from_proto_model_list +from csst_dfs_commons.models.sls import Level2Spectra +from csst_dfs_commons.models.constants import UPLOAD_CHUNK_SIZE +from csst_dfs_proto.sls.level2spectra import level2spectra_pb2, level2spectra_pb2_grpc + +from ..common.service import ServiceProxy +from ..common.utils import * + +class Level2SpectraApi(object): + """ + Level2spectra Data Operation Class + """ + def __init__(self): + self.stub = level2spectra_pb2_grpc.Level2spectraSrvStub(ServiceProxy().channel()) + + def find(self, **kwargs): + ''' retrieve level2spectra records from database + + :param kwargs: Parameter dictionary, key items support: + level1_id: [int] + spectra_id: [str] + create_time : (start, end), + qc1_status : [int], + prc_status : [int], + filename: [str] + limit: limits returns the number of records,default 0:no-limit + + :returns: csst_dfs_common.models.Result + ''' + try: + resp, _ = self.stub.Find.with_call(level2spectra_pb2.FindLevel2spectraReq( + level1_id = get_parameter(kwargs, "level1_id",0), + spectra_id = get_parameter(kwargs, "spectra_id"), + 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"), + prc_status = get_parameter(kwargs, "prc_status"), + filename = get_parameter(kwargs, "filename"), + limit = get_parameter(kwargs, "limit", 0), + other_conditions = {"test":"cnlab.test"} + ),metadata = get_auth_headers()) + + if resp.success: + return Result.ok_data(data=from_proto_model_list(Level2Spectra, resp.records)).append("totalCount", resp.totalCount) + else: + return Result.error(message = str(resp.error.detail)) + + except grpc.RpcError as e: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + def get(self, **kwargs): + ''' fetch a record from database + + parameter kwargs: + id : [int] + + return csst_dfs_common.models.Result + ''' + try: + fits_id = get_parameter(kwargs, "id") + resp, _ = self.stub.Get.with_call(level2spectra_pb2.GetLevel2spectraReq( + id = fits_id + ),metadata = get_auth_headers()) + + if resp.record is None or resp.record.id == 0: + return Result.error(message=f"id:{fits_id} not found") + + return Result.ok_data(data = Level2Spectra().from_proto_model(resp.record)) + + except grpc.RpcError as e: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + def update_proc_status(self, **kwargs): + ''' update the status of reduction + + parameter kwargs: + id : [int], + status : [int] + + return csst_dfs_common.models.Result + ''' + fits_id = get_parameter(kwargs, "id") + status = get_parameter(kwargs, "status") + try: + resp,_ = self.stub.UpdateProcStatus.with_call( + level2spectra_pb2.UpdateProcStatusReq(id=fits_id, status=status), + 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: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + def update_qc1_status(self, **kwargs): + ''' update the status of QC0 + + parameter kwargs: + id : [int], + status : [int] + ''' + fits_id = get_parameter(kwargs, "id") + status = get_parameter(kwargs, "status") + try: + resp,_ = self.stub.UpdateQc1Status.with_call( + level2spectra_pb2.UpdateQc1StatusReq(id=fits_id, status=status), + 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: + return Result.error(message="%s:%s" % (e.code().value, e.details)) + + def write(self, **kwargs): + ''' insert a level2spectra record into database + + parameter kwargs: + level1_id: [int] + spectra_id : [str] + region : [str] + filename : [str] + file_path : [str] + prc_status : [int] + prc_time : [str] + pipeline_id : [str] + refs: [dict] + + return csst_dfs_common.models.Result + ''' + + rec = level2spectra_pb2.Level2spectraRecord( + id = 0, + level1_id = get_parameter(kwargs, "level1_id", 0), + spectra_id = get_parameter(kwargs, "spectra_id"), + region = get_parameter(kwargs, "region"), + 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") + ) + def stream(rec): + with open(rec.file_path, 'rb') as f: + while True: + data = f.read(UPLOAD_CHUNK_SIZE) + if not data: + break + yield level2spectra_pb2.WriteLevel2spectraReq(record = rec, data = data) + try: + 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()) + if resp.success: + return Result.ok_data(data=Level2Spectra().from_proto_model(resp.record)) + else: + return Result.error(message = str(resp.error.detail)) + except grpc.RpcError as e: + return Result.error(message="%s:%s" % (e.code().value, e.details)) diff --git a/tests/test_msc_level1.py b/tests/test_msc_level1.py index b039520..d126c9c 100644 --- a/tests/test_msc_level1.py +++ b/tests/test_msc_level1.py @@ -15,30 +15,30 @@ class MSCLevel1DataTestCase(unittest.TestCase): create_time = ("2021-06-01 11:12:13","2021-06-08 11:12:13")) print('find:', recs) - def test_get(self): - rec = self.api.get(id = 2) - print('get:', rec) - - def test_update_proc_status(self): - rec = self.api.update_proc_status(id = 2, status = 4) - print('update_proc_status:', rec) - - def test_update_qc1_status(self): - rec = self.api.update_qc1_status(id = 2, status = 7) - print('update_qc1_status:', rec) - - def test_write(self): - rec = self.api.write( - level0_id='1', - data_type = "sci", - cor_sci_id = 1, - prc_params = "/opt/dddasd.params", - flat_id = 1, - dark_id = 2, - bias_id = 3, - prc_status = 3, - prc_time = '2021-06-04 11:12:13', - filename = "MSC_MS_210525121500_100000001_09_raw", - file_path = "/opt/temp/csst/MSC_MS_210525121500_100000001_09_raw.fits", - pipeline_id = "P1") - print('write:', rec) \ No newline at end of file + # def test_get(self): + # rec = self.api.get(id = 2) + # print('get:', rec) + + # def test_update_proc_status(self): + # rec = self.api.update_proc_status(id = 2, status = 4) + # print('update_proc_status:', rec) + + # def test_update_qc1_status(self): + # rec = self.api.update_qc1_status(id = 2, status = 7) + # print('update_qc1_status:', rec) + + # def test_write(self): + # rec = self.api.write( + # level0_id='1', + # data_type = "sci", + # cor_sci_id = 1, + # prc_params = "/opt/dddasd.params", + # flat_id = 1, + # dark_id = 2, + # bias_id = 3, + # prc_status = 3, + # prc_time = '2021-06-04 11:12:13', + # filename = "MSC_MS_210525121500_100000001_09_raw", + # file_path = "/opt/temp/csst/MSC_MS_210525121500_100000001_09_raw.fits", + # pipeline_id = "P1") + # print('write:', rec) \ No newline at end of file -- GitLab