6
6
from fastapi .responses import JSONResponse
7
7
8
8
9
- from .helpers .local_file_handler import save_file , read_file
9
+ from .helpers .local_file_handler import (save_file ,
10
+ read_file ,
11
+ read_lock_file ,
12
+ delete_lock_file ,
13
+ save_lock_file )
10
14
11
15
from .settings import settings
12
16
@@ -45,45 +49,41 @@ class TerraformState(BaseModel):
45
49
46
50
class Config :
47
51
extra = "allow"
48
- @app .api_route ("/tfstate/lock" , methods = ["LOCK" ])
49
- async def lock_state (lock : LockInfo ):
50
- global lock_info
52
+
53
+ @app .api_route ("/tfstate/{project_id}/lock" , methods = ["LOCK" ])
54
+ async def lock_state (project_id : int , lock : LockInfo ):
55
+ lock_info = read_lock_file (project_id )
51
56
if lock_info is None :
52
57
lock_info = lock
58
+ save_lock_file (project_id , lock_info .model_dump ())
53
59
return JSONResponse (content = lock .model_dump (), status_code = 200 )
54
60
else :
55
61
return JSONResponse (
56
62
content = {"error" : "State already locked" , "locked_by" : lock_info .dict ()},
57
63
status_code = 423
58
64
)
59
65
60
- @app .api_route ("/tfstate/lock" , methods = ["UNLOCK" ])
61
- async def unlock_state (lock : LockInfo ):
62
- global lock_info
66
+ @app .api_route ("/tfstate/{project_id}/ lock" , methods = ["UNLOCK" ])
67
+ async def unlock_state (project_id : int , lock : LockInfo ):
68
+ lock_info = read_lock_file ( project_id )
63
69
if lock_info is None :
64
70
raise HTTPException (status_code = 404 , detail = "State is not locked" )
65
- if lock_info . ID != lock .ID :
71
+ if lock_info [ "ID" ] != lock .ID :
66
72
raise HTTPException (status_code = 403 , detail = "Lock ID does not match" )
67
- lock_info = None
73
+ delete_lock_file ( project_id )
68
74
return Response (status_code = 200 )
69
75
70
- @app .get ("/tfstate/lock" )
71
- async def get_lock ():
76
+ @app .get ("/tfstate/{project_id}/lock" )
77
+ async def get_lock (project_id : int ):
78
+ lock_info = read_lock_file (project_id )
72
79
if lock_info is None :
73
80
return Response (status_code = 404 )
74
81
return JSONResponse (content = lock_info .model_dump (), status_code = 200 )
75
-
76
- @app .post ("/tfstate" )
77
- async def update_terraform_state (ID : str , state : TerraformState ):
78
- logging .info (f"Update state file { ID } " )
79
- save_file (state .model_dump ())
80
- logging .debug (state )
81
- return JSONResponse (content = state .model_dump ())
82
-
83
- @app .get ("/tfstate" )
84
- async def get_terraform_state ():
85
- logging .info ("Requesting State File" )
86
- state_returned = read_file ()
82
+
83
+ @app .get ("/tfstate/{project_id}" )
84
+ async def get_terraform_state_project (project_id :int ):
85
+ logging .info (f"Requesting State File for project { project_id } " )
86
+ state_returned = read_file (str (project_id ))
87
87
if state_returned is None :
88
88
dummy_state = TerraformState (
89
89
version = 4 ,
@@ -96,4 +96,11 @@ async def get_terraform_state():
96
96
return dummy_state
97
97
else :
98
98
returned_state = TerraformState (** state_returned )
99
- return JSONResponse (content = returned_state .model_dump ())
99
+ return JSONResponse (content = returned_state .model_dump ())
100
+
101
+ @app .post ("/tfstate/{project_id}" )
102
+ async def update_terraform_state_project (project_id : int , state : TerraformState ):
103
+ logging .info (f"Update state file for project { project_id } " )
104
+ save_file (state .model_dump (), str (project_id ))
105
+ logging .debug (state )
106
+ return JSONResponse (content = state .model_dump ())
0 commit comments