Skip to content

Commit

Permalink
Support slashes in states' names (#1) (#2)
Browse files Browse the repository at this point in the history
  • Loading branch information
gi0baro authored Dec 18, 2022
1 parent 0ac1811 commit bcc8d40
Showing 1 changed file with 26 additions and 25 deletions.
51 changes: 26 additions & 25 deletions tfstater/api/terraform.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ async def open(self):
terraform.pipeline = [BasicAuthPipe(), CType()]


@terraform.route("/<str:name>", methods="get", output="bytes")
@terraform.route("/<any:name>", methods="get", output="bytes")
async def get_state_by_name(name: str):
rv = b"{}"
row = State.get(name=name)
Expand All @@ -35,29 +35,7 @@ async def get_state_by_name(name: str):
return rv


@terraform.route("/<str:name>", methods="post", output="bytes")
async def update_state_by_name(name: str):
try:
with State.lock(name, request.user, request.query_params.ID) as state:
params = await request.body_params
try:
with db.atomic():
revision = state.versions.create(
version=params.serial,
publisher=request.user
)
except Exception:
raise StateLockedException
await put_object(
revision.id.object_store_path,
_json_dump(params)
)
except StateLockedException:
response.status = 409
return b"{}"


@terraform.route("/<str:name>/lock", methods="post")
@terraform.route("/<any:name>/lock", methods="post")
@service.json
async def lock_state(name: str):
params = await request.body_params
Expand All @@ -75,10 +53,33 @@ async def lock_state(name: str):
}


@terraform.route("/<str:name>/lock", methods="delete", output="bytes")
@terraform.route("/<any:name>/lock", methods="delete", output="bytes")
async def unlock_state(name: str):
# NOTE: if ID is missing from params is a force unlock
params = await request.body_params
if not State.unlock({"name": name}, params.ID):
response.status = 409
return b"{}"


# NOTE: this route should be the last defined to avoid catching also `lock_state`
@terraform.route("/<any:name>", methods="post", output="bytes")
async def update_state_by_name(name: str):
try:
with State.lock(name, request.user, request.query_params.ID) as state:
params = await request.body_params
try:
with db.atomic():
revision = state.versions.create(
version=params.serial,
publisher=request.user
)
except Exception:
raise StateLockedException
await put_object(
revision.id.object_store_path,
_json_dump(params)
)
except StateLockedException:
response.status = 409
return b"{}"

0 comments on commit bcc8d40

Please sign in to comment.