5
5
from mongoengine import QuerySet
6
6
from spaceone .core .service import *
7
7
from spaceone .cost_analysis .error import *
8
- from spaceone .cost_analysis .model .data_source .request import (
9
- DataSourceUpdatePermissionsRequest ,
10
- )
11
- from spaceone .cost_analysis .model .data_source .response import DataSourceResponse
8
+ from spaceone .cost_analysis .model .data_source .request import *
9
+ from spaceone .cost_analysis .model .data_source .response import *
12
10
from spaceone .cost_analysis .service .job_service import JobService
13
11
from spaceone .cost_analysis .manager .repository_manager import RepositoryManager
14
12
from spaceone .cost_analysis .manager .secret_manager import SecretManager
@@ -48,8 +46,10 @@ def __init__(self, *args, **kwargs):
48
46
permission = "cost-analysis:DataSource.write" ,
49
47
role_types = ["DOMAIN_ADMIN" , "WORKSPACE_OWNER" ],
50
48
)
51
- @check_required (["name" , "data_source_type" , "domain_id" ])
52
- def register (self , params ):
49
+ @convert_model
50
+ def register (
51
+ self , params : DataSourceRegisterRequest
52
+ ) -> Union [DataSourceResponse , dict ]:
53
53
"""Register data source
54
54
55
55
Args:
@@ -70,6 +70,7 @@ def register(self, params):
70
70
Returns:
71
71
data_source_vo (object)
72
72
"""
73
+ params = params .dict (exclude_unset = True )
73
74
74
75
domain_id = params ["domain_id" ]
75
76
data_source_type = params ["data_source_type" ]
@@ -177,7 +178,7 @@ def register(self, params):
177
178
data_source_vo
178
179
)
179
180
180
- return data_source_vo
181
+ return DataSourceResponse ( ** data_source_vo . to_dict ())
181
182
182
183
@transaction (
183
184
permission = "cost-analysis:DataSource.write" ,
@@ -228,7 +229,7 @@ def update(self, params):
228
229
)
229
230
@convert_model
230
231
def update_permissions (
231
- self , params : DataSourceUpdatePermissionsRequest
232
+ self , params : DataSourceUpdatePermissionsRequest
232
233
) -> Union [DataSourceResponse , dict ]:
233
234
"""Update data source permissions
234
235
@@ -567,35 +568,45 @@ def sync(self, params):
567
568
permission = "cost-analysis:DataSource.read" ,
568
569
role_types = ["DOMAIN_ADMIN" , "WORKSPACE_OWNER" , "WORKSPACE_MEMBER" ],
569
570
)
570
- @check_required (["data_source_id" , "domain_id" ])
571
- def get (self , params ):
571
+ @change_value_by_rule ("APPEND" , "workspace_id" , "*" )
572
+ @convert_model
573
+ def get (self , params : DataSourceGetRequest ) -> Union [DataSourceResponse , dict ]:
572
574
"""Get data source
573
575
574
576
Args:
575
577
params (dict): {
576
578
'data_source_id': 'str', # required
577
- 'workspace_id': 'str '
579
+ 'workspace_id': 'list '
578
580
'domain_id': 'str', # injected from auth
579
581
}
580
582
581
583
Returns:
582
584
data_source_vo (object)
583
585
"""
584
586
585
- data_source_id = params [ " data_source_id" ]
586
- domain_id = params [ " domain_id" ]
587
- workspace_id = params .get ( " workspace_id" )
587
+ data_source_id = params . data_source_id
588
+ domain_id = params . domain_id
589
+ workspace_id = params .workspace_id
588
590
589
- return self .data_source_mgr .get_data_source (
591
+ data_source_vo = self .data_source_mgr .get_data_source (
590
592
data_source_id , domain_id , workspace_id
591
593
)
592
594
595
+ # Check data fields permissions
596
+ if self .transaction .get_meta ("authorization.role_type" ) != "DOMAIN_ADMIN" :
597
+ data_source_vo = (
598
+ self ._filter_cost_data_keys_with_permissions_by_data_source_vo (
599
+ data_source_vo
600
+ )
601
+ )
602
+
603
+ return DataSourceResponse (** data_source_vo .to_dict ())
604
+
593
605
@transaction (
594
606
permission = "cost-analysis:DataSource.read" ,
595
607
role_types = ["DOMAIN_ADMIN" , "WORKSPACE_OWNER" , "WORKSPACE_MEMBER" ],
596
608
)
597
609
@change_value_by_rule ("APPEND" , "workspace_id" , "*" )
598
- @check_required (["domain_id" ])
599
610
@append_query_filter (
600
611
[
601
612
"data_source_id" ,
@@ -609,11 +620,15 @@ def get(self, params):
609
620
)
610
621
@change_tag_filter ("tags" )
611
622
@append_keyword_filter (["data_source_id" , "name" ])
612
- def list (self , params ):
623
+ @convert_model
624
+ def list (
625
+ self , params : DataSourceSearchQueryRequest
626
+ ) -> Union [DataSourcesResponse , dict ]:
613
627
"""List data sources
614
628
615
629
Args:
616
630
params (dict): {
631
+ 'query': 'dict (spaceone.api.core.v1.Query)'
617
632
'data_source_id': 'str',
618
633
'name': 'str',
619
634
'state': 'str',
@@ -622,16 +637,19 @@ def list(self, params):
622
637
'connected_workspace_id': str,
623
638
'workspace_id': 'list,
624
639
'domain_id': 'str',
625
- 'query': 'dict (spaceone.api.core.v1.Query)'
640
+
626
641
}
627
642
628
643
Returns:
629
644
data_source_vos (object)
630
645
total_count
631
646
"""
632
647
633
- query = params .get ("query" , {})
634
- connected_workspace_id = params .get ("connected_workspace_id" )
648
+ query = params .query or {}
649
+ connected_workspace_id = params .connected_workspace_id
650
+
651
+ if self .transaction .get_meta ("authorization.role_type" ) != "DOMAIN_ADMIN" :
652
+ self ._check_only_fields_for_permissions (query )
635
653
636
654
if connected_workspace_id :
637
655
(
@@ -643,7 +661,9 @@ def list(self, params):
643
661
else :
644
662
data_source_vos , total_count = self .data_source_mgr .list_data_sources (query )
645
663
646
- return data_source_vos , total_count
664
+ data_sources_info = self ._get_data_sources_info_by_role_type (data_source_vos )
665
+
666
+ return DataSourcesResponse (results = data_sources_info , total_count = total_count )
647
667
648
668
@transaction (
649
669
permission = "cost-analysis:DataSource.read" ,
@@ -741,21 +761,21 @@ def _get_secret_data(self, secret_id, domain_id):
741
761
return secret_data
742
762
743
763
@staticmethod
744
- def _validate_plugin_info (plugin_info , secret_type ) :
764
+ def _validate_plugin_info (plugin_info : dict , secret_type : str ) -> None :
745
765
if "plugin_id" not in plugin_info :
746
766
raise ERROR_REQUIRED_PARAMETER (key = "plugin_info.plugin_id" )
747
767
748
768
if (
749
- plugin_info .get ("upgrade_mode" , "AUTO" ) == "MANUAL"
750
- and "version" not in plugin_info
769
+ plugin_info .get ("upgrade_mode" , "AUTO" ) == "MANUAL"
770
+ and "version" not in plugin_info
751
771
):
752
772
raise ERROR_REQUIRED_PARAMETER (key = "plugin_info.version" )
753
773
754
774
if secret_type == "MANUAL" and plugin_info .get ("secret_data" ) is None :
755
775
raise ERROR_REQUIRED_PARAMETER (key = "plugin_info.secret_data" )
756
776
757
777
def create_data_source_account_with_data_source_vo (
758
- self , accounts_info : dict , data_source_vo : DataSource
778
+ self , accounts_info : dict , data_source_vo : DataSource
759
779
) -> None :
760
780
data_source_id = data_source_vo .data_source_id
761
781
workspace_id = data_source_vo .workspace_id
@@ -813,7 +833,7 @@ def create_data_source_account_with_data_source_vo(
813
833
)
814
834
815
835
def _get_data_source_account_vo_map (
816
- self , data_source_id : str , domain_id : str
836
+ self , data_source_id : str , domain_id : str
817
837
) -> dict :
818
838
data_source_account_vo_map = {}
819
839
data_source_account_vos = (
@@ -828,7 +848,7 @@ def _get_data_source_account_vo_map(
828
848
return data_source_account_vo_map
829
849
830
850
def _change_filter_connected_workspace_data_source (
831
- self , query : dict , connected_workspace_id : str
851
+ self , query : dict , connected_workspace_id : str
832
852
) -> Tuple [Union [QuerySet , list ], int ]:
833
853
connected_data_source_ids = []
834
854
domain_id = self ._get_domain_id_from_filter (query )
@@ -873,6 +893,22 @@ def _change_filter_connected_workspace_data_source(
873
893
874
894
return self .data_source_mgr .list_data_sources (query )
875
895
896
+ def _get_data_sources_info_by_role_type (self , data_source_vos : list ) -> list :
897
+ data_sources_info = []
898
+ if self .transaction .get_meta ("authorization.role_type" ) != "DOMAIN_ADMIN" :
899
+ for data_source_vo in data_source_vos :
900
+ data_source_vo = (
901
+ self ._filter_cost_data_keys_with_permissions_by_data_source_vo (
902
+ data_source_vo
903
+ )
904
+ )
905
+ data_sources_info .append (data_source_vo .to_dict ())
906
+ else :
907
+ for data_source_vo in data_source_vos :
908
+ data_sources_info .append (data_source_vo .to_dict ())
909
+
910
+ return data_sources_info
911
+
876
912
@staticmethod
877
913
def _get_domain_id_from_filter (query : dict ) -> str :
878
914
for condition in query .get ("filter" , []):
@@ -903,3 +939,29 @@ def _get_copied_remove_only_filter_query(query: dict) -> dict:
903
939
copied_query .pop ("minimal" , None )
904
940
_LOGGER .debug (f"[_get_copied_remove_only_filter_query] query: { copied_query } " )
905
941
return copied_query
942
+
943
+ @staticmethod
944
+ def _filter_cost_data_keys_with_permissions_by_data_source_vo (
945
+ data_source_vo : DataSource ,
946
+ ) -> DataSource :
947
+ if data_source_vo .permissions :
948
+ deny = data_source_vo .permissions .get ("deny" , [])
949
+ cost_data_keys = data_source_vo .cost_data_keys or []
950
+ for deny_key in deny :
951
+ if deny_key .startswith ("data." ):
952
+ split_denied_key = deny_key .split ("." )[1 ]
953
+ if split_denied_key in cost_data_keys :
954
+ cost_data_keys .remove (split_denied_key )
955
+ data_source_vo .cost_data_keys = cost_data_keys
956
+ return data_source_vo
957
+
958
+ @staticmethod
959
+ def _check_only_fields_for_permissions (query : dict ) -> None :
960
+ only_fields = query .get ("only" )
961
+ for only_field in only_fields :
962
+ if only_field == "cost_data_keys" :
963
+ if "permissions" not in only_fields :
964
+ raise ERROR_INVALID_PARAMETER (
965
+ key = "permissions" ,
966
+ reason = "when you want to get 'cost_data_keys', you must include 'permissions' field in 'only' field." ,
967
+ )
0 commit comments