1
- from dataclasses import dataclass
1
+ from dataclasses import dataclass , field
2
2
from typing import List , Dict , Optional
3
3
from .utils .phase_io import Phase as PhaseIO
4
4
from .utils .secret_referencing import resolve_all_secrets
5
5
6
+ @dataclass
7
+ class GetSecretOptions :
8
+ env_name : str
9
+ app_name : str
10
+ key_to_find : Optional [str ] = None
11
+ tag : Optional [str ] = None
12
+ secret_path : str = "/"
13
+
14
+ @dataclass
15
+ class GetAllSecretsOptions :
16
+ env_name : str
17
+ app_name : str
18
+ tag : Optional [str ] = None
19
+ secret_path : str = "/"
20
+
21
+ @dataclass
22
+ class CreateSecretsOptions :
23
+ env_name : str
24
+ app_name : str
25
+ key_value_pairs : List [Dict [str , str ]]
26
+ secret_path : str = "/"
27
+
28
+ @dataclass
29
+ class SecretUpdateOptions :
30
+ env_name : str
31
+ app_name : str
32
+ key : str
33
+ value : Optional [str ] = None
34
+ secret_path : str = "/"
35
+ destination_path : Optional [str ] = None
36
+ override : bool = False
37
+ toggle_override : bool = False
38
+
39
+ @dataclass
40
+ class DeleteSecretOptions :
41
+ env_name : str
42
+ app_name : str
43
+ key_to_delete : str
44
+ secret_path : str = "/"
45
+
6
46
@dataclass
7
47
class PhaseSecret :
8
48
key : str
9
49
value : str
10
- comment : str
11
- path : str
12
- tags : List [str ]
13
- overridden : bool
50
+ comment : str = ""
51
+ path : str = "/"
52
+ tags : List [str ] = field ( default_factory = list )
53
+ overridden : bool = False
14
54
15
55
class Phase :
16
56
def __init__ (self , init = True , pss = None , host = None ):
17
57
self ._phase_io = PhaseIO (init = init , pss = pss , host = host )
18
58
19
- def create (self , env_name : str , app_name : str , secrets : List [PhaseSecret ], path : str = '/' ) -> str :
20
- key_value_pairs = [(secret .key , secret .value ) for secret in secrets ]
21
- response = self ._phase_io .create (key_value_pairs , env_name , app_name , path )
22
- return "Success" if response .status_code == 200 else f"Error: { response .status_code } "
59
+ def get_secret (self , options : GetSecretOptions ) -> Optional [PhaseSecret ]:
60
+ secrets = self ._phase_io .get (
61
+ env_name = options .env_name ,
62
+ keys = [options .key_to_find ] if options .key_to_find else None ,
63
+ app_name = options .app_name ,
64
+ tag = options .tag ,
65
+ path = options .secret_path
66
+ )
67
+ if secrets :
68
+ secret = secrets [0 ]
69
+ return PhaseSecret (
70
+ key = secret ['key' ],
71
+ value = secret ['value' ],
72
+ comment = secret .get ('comment' , '' ),
73
+ path = secret .get ('path' , '/' ),
74
+ tags = secret .get ('tags' , []),
75
+ overridden = secret .get ('overridden' , False )
76
+ )
77
+ return None
23
78
24
- def get (self , env_name : str , keys : List [str ] = None , app_name : str = None , tag : str = None , path : str = '' ) -> List [PhaseSecret ]:
25
- secrets = self ._phase_io .get (env_name , keys , app_name , tag , path )
26
- phase_secrets = [
79
+ def get_all_secrets (self , options : GetAllSecretsOptions ) -> List [PhaseSecret ]:
80
+ secrets = self ._phase_io .get (
81
+ env_name = options .env_name ,
82
+ app_name = options .app_name ,
83
+ tag = options .tag ,
84
+ path = options .secret_path
85
+ )
86
+ return [
27
87
PhaseSecret (
28
88
key = secret ['key' ],
29
89
value = secret ['value' ],
@@ -34,22 +94,40 @@ def get(self, env_name: str, keys: List[str] = None, app_name: str = None, tag:
34
94
)
35
95
for secret in secrets
36
96
]
37
- return self ._resolve_references (phase_secrets , env_name , app_name )
38
97
39
- def update (self , env_name : str , secret : PhaseSecret , app_name : str = None ) -> str :
40
- response = self ._phase_io .update (
41
- env_name ,
42
- secret .key ,
43
- secret .value ,
44
- app_name ,
45
- source_path = secret .path
98
+ def create_secrets (self , options : CreateSecretsOptions ) -> str :
99
+ # Convert the list of dictionaries to a list of tuples
100
+ key_value_tuples = [(list (item .keys ())[0 ], list (item .values ())[0 ]) for item in options .key_value_pairs ]
101
+
102
+ response = self ._phase_io .create (
103
+ key_value_pairs = key_value_tuples ,
104
+ env_name = options .env_name ,
105
+ app_name = options .app_name ,
106
+ path = options .secret_path
107
+ )
108
+ return "Success" if response .status_code == 200 else f"Error: { response .status_code } "
109
+
110
+ def update_secret (self , options : SecretUpdateOptions ) -> str :
111
+ return self ._phase_io .update (
112
+ env_name = options .env_name ,
113
+ key = options .key ,
114
+ value = options .value ,
115
+ app_name = options .app_name ,
116
+ source_path = options .secret_path ,
117
+ destination_path = options .destination_path ,
118
+ override = options .override ,
119
+ toggle_override = options .toggle_override
46
120
)
47
- return response
48
121
49
- def delete (self , env_name : str , keys : List [str ], app_name : str = None , path : str = None ) -> List [str ]:
50
- return self ._phase_io .delete (env_name , keys , app_name , path )
122
+ def delete_secret (self , options : DeleteSecretOptions ) -> List [str ]:
123
+ return self ._phase_io .delete (
124
+ env_name = options .env_name ,
125
+ keys_to_delete = [options .key_to_delete ],
126
+ app_name = options .app_name ,
127
+ path = options .secret_path
128
+ )
51
129
52
- def _resolve_references (self , secrets : List [PhaseSecret ], env_name : str , app_name : str ) -> List [PhaseSecret ]:
130
+ def resolve_references (self , secrets : List [PhaseSecret ], env_name : str , app_name : str ) -> List [PhaseSecret ]:
53
131
all_secrets = [
54
132
{
55
133
'environment' : env_name ,
0 commit comments