@@ -31,6 +31,7 @@ import System.Process.Typed
3131
3232import Common.API
3333import DMS.Args
34+import DMS.AWS
3435import Orphans ()
3536import TLS (createTLSOpts)
3637import Types
@@ -159,6 +160,7 @@ createH dep = do
159160 "INSERT INTO deployments (name, tag, envs) VALUES (?, ?, ?)"
160161 -- FIXME: make EnvPairs a newtype and give it ToField instance
161162 (n, t, formatEnvPairs e)
163+ failIfImageNotFound $ tag dep
162164 res :: Either SqlError Int64 <- liftIO . try $ createDep pgPool dep
163165 case res of
164166 Right _ -> pure ()
@@ -338,6 +340,7 @@ updateH dName DeploymentUpdate { newTag = dTag, newEnvs = nEnvs } = do
338340 , "--tag", coerce $ dTag
339341 ] ++ concat [["--env", concatPair e] | e <- envPairs]
340342 cmd = coerce $ updateCommand st
343+ failIfImageNotFound dTag
341344 liftIO $ do
342345 void $ updateDeploymentNameAndTag pgPool dName dTag
343346 log $ "call " <> unwords (cmd : args)
@@ -457,6 +460,7 @@ restoreH dName = do
457460 st <- ask
458461 let pgPool = pool st
459462 dep <- selectDeployment pgPool dName ArchivedOnlyDeployments
463+ failIfImageNotFound $ tag dep
460464 ec <- createDeployment dep st
461465 void $ liftIO $ do
462466 let
@@ -501,6 +505,14 @@ createDeploymentLog pgPool (Deployment dName dTag dEnvs) act ec arch = do
501505 void $ withResource pgPool $ \conn ->
502506 execute conn q (act, dTag, formatEnvPairs dEnvs, exitCode', arch', dName)
503507
508+failIfImageNotFound :: DeploymentTag -> AppM ()
509+failIfImageNotFound dTag = do
510+ foundTag <- liftIO . findImageTag $ dTag
511+ case foundTag of
512+ Just _ -> pure ()
513+ Nothing ->
514+ throwError err400 { errBody = validationError [] ["tag not found"] }
515+
504516appError :: Text -> BSL.ByteString
505517appError = encode . AppError
506518