@@ -41,6 +41,7 @@ import System.Process.Typed
4141
4242import Common.Utils
4343import Common.Validation (isNameValid)
44+import Database.PostgreSQL.Simple.Transaction
4445import Octopod.API
4546import Octopod.PowerAPI
4647import Octopod.Server.Args
@@ -385,8 +386,7 @@ updateDeploymentInfo dName st = do
385386 case ec of
386387 ExitSuccess -> do
387388 dMeta <- parseDeploymentMetadata (lines . unStdout $ out)
388− forM_ dMeta $ \meta ->
389− upsertDeploymentMetadata (pool st) dName meta
389+ upsertDeploymentMetadata (pool st) dName dMeta
390390 ExitFailure _ ->
391391 log $
392392 "could not get deployment info, exit code: " <> (pack . show $ ec)
@@ -1045,7 +1045,8 @@ selectDeploymentMetadata conn dName = do
10451045 let
10461046 q =
10471047 "SELECT key, value FROM deployment_metadata \
1048− \WHERE deployment_id = (SELECT id FROM deployments WHERE name = ?)"
1048+ \WHERE deployment_id = (SELECT id FROM deployments WHERE name = ?) \
1049+ \ORDER BY id ASC"
10491050 rows <- query conn q (Only dName)
10501051 for rows $ \(k, v) -> pure $ DeploymentMetadata k v
10511052
@@ -1065,21 +1066,23 @@ deleteDeploymentMetadata pgPool dName = do
10651066upsertDeploymentMetadata
10661067 :: PgPool
10671068 -> DeploymentName
1068− -> DeploymentMetadata
1069+ -> [DeploymentMetadata]
10691070 -> IO ()
1070−upsertDeploymentMetadata pgPool dName dMetadata = do
1071+upsertDeploymentMetadata pgPool dName dMetadatas = do
10711072 let
1072− q =
1073− "INSERT INTO deployment_metadata \
1074− \(deployment_id, key, value, created_at, updated_at) \
1075− \(SELECT id, ?, ?, now(), now() FROM deployments WHERE name = ?) \
1076− \ON CONFLICT (deployment_id, key) \
1077− \DO \
1078− \UPDATE SET key = ?, value = ?, updated_at = now()"
1079− key = deploymentMetadataKey dMetadata
1080− value = deploymentMetadataValue dMetadata
1081− void $ withResource pgPool $ \conn ->
1082− execute conn q (key, value, dName, key, value)
1073+ withResource pgPool $ \conn -> withTransactionSerializable conn $ do
1074+ void $ execute
1075+ conn
1076+ "DELETE FROM deployment_metadata \
1077+ \WHERE deployment_id = (SELECT id FROM deployments WHERE name = ?)"
1078+ (Only dName)
1079+ forM_ dMetadatas $ \dMeta ->
1080+ execute
1081+ conn
1082+ "INSERT INTO deployment_metadata \
1083+ \(deployment_id, key, value, created_at, updated_at) \
1084+ \(SELECT id, ?, ?, now(), now() FROM deployments WHERE name = ?)"
1085+ (deploymentMetadataKey dMeta, deploymentMetadataValue dMeta, dName)
10831086
10841087-- | Checks the existence of a deployment tag.
10851088-- Returns 404 'Tag not found' response if the deployment tag doesn't exist.