@@ -33,20 +33,19 @@ import Types
3333
3434
3535type PgPool = Pool Connection
36−type AppM = ReaderT AppState Handler
36+type AppM = ReaderT AppState Handler
3737
3838data AppState = AppState
39− { pool :: PgPool
40− , logger :: TimedFastLogger
41− , project_name :: ProjectName
42− , base_domain :: Domain
43− , namespace :: Namespace
44− , creation_command :: Command
45− , update_command :: Command
39+ { pool :: PgPool
40+ , logger :: TimedFastLogger
41+ , project_name :: ProjectName
42+ , base_domain :: Domain
43+ , namespace :: Namespace
44+ , creation_command :: Command
45+ , update_command :: Command
4646 , update_envs_command :: Command
47− , deletion_command :: Command
48− , checking_command :: Command
49− }
47+ , deletion_command :: Command
48+ , checking_command :: Command }
5049
5150data DeploymentException
5251 = DeploymentFailed Int
@@ -61,30 +60,32 @@ runDMS = do
6160 (logger', _) <- newTimedFastLogger timeCache (LogStdout defaultBufSize)
6261 logInfo logger' "started"
6362 opts <- parseArgs
64− let a ?! e = a >>= maybe (die e) pure
65− proj_name <- coerce . pack <$> lookupEnv "PROJECT_NAME" ?! "PROJECT_NAME is not set"
66− domain <- coerce . pack <$> lookupEnv "BASE_DOMAIN" ?! "BASE_DOMAIN is not set"
67− ns <- coerce . pack <$> lookupEnv "NAMESPACE" ?! "NAMESPACE is not set"
68− creation_cmd <- coerce . pack <$> lookupEnv "CREATION_COMMAND" ?! "CREATION_COMMAND is not set"
69− update_cmd <- coerce . pack <$> lookupEnv "UPDATE_COMMAND" ?! "UPDATE_COMMAND is not set"
70− update_envs_cmd <- coerce . pack <$> lookupEnv "UPDATE_ENVS_COMMAND" ?! "UPDATE_ENVS_COMMAND is not set"
71− deletion_cmd <- coerce . pack <$> lookupEnv "DELETION_COMMAND" ?! "DELETION_COMMAND is not set"
72− checking_cmd <- coerce . pack <$> lookupEnv "CHECKING_COMMAND" ?! "CHECKING_COMMAND is not set"
63+ let
64+ a ?! e = a >>= maybe (die e) pure
65+ getEnvOrDie eName = lookupEnv eName ?! (eName <> " is not set")
66+ proj_name <- coerce . pack <$> getEnvOrDie "PROJECT_NAME"
67+ domain <- coerce . pack <$> getEnvOrDie "BASE_DOMAIN"
68+ ns <- coerce . pack <$> getEnvOrDie "NAMESPACE"
69+ creation_cmd <- coerce . pack <$> getEnvOrDie "CREATION_COMMAND"
70+ update_cmd <- coerce . pack <$> getEnvOrDie "UPDATE_COMMAND"
71+ update_envs_cmd <- coerce . pack <$> getEnvOrDie "UPDATE_ENVS_COMMAND"
72+ deletion_cmd <- coerce . pack <$> getEnvOrDie "DELETION_COMMAND"
73+ checking_cmd <- coerce . pack <$> getEnvOrDie "CHECKING_COMMAND"
7374 pgPool <- initConnectionPool (unDBConnectionString $ dmsDB opts) (unDBPoolSize $ dmsDBPoolSize opts)
74− let app' = app $ AppState pgPool
75− logger'
76− proj_name
77− domain
78− ns
79− creation_cmd
80− update_cmd
81− update_envs_cmd
82− deletion_cmd
83− checking_cmd
84− serverPort = dmsPort opts
75+ let app' = app $ AppState pgPool
76+ logger'
77+ proj_name
78+ domain
79+ ns
80+ creation_cmd
81+ update_cmd
82+ update_envs_cmd
83+ deletion_cmd
84+ checking_cmd
85+ serverPort = dmsPort opts
8586 uiServerPort = unServerPort $ dmsUIPort opts
86− tlsOpts = createTLSOpts (dmsTLSCertPath opts) (dmsTLSKeyPath opts) (dmsTLSStorePath opts) serverPort
87− warpOpts = setPort (unServerPort serverPort) defaultSettings
87+ tlsOpts = createTLSOpts (dmsTLSCertPath opts) (dmsTLSKeyPath opts) (dmsTLSStorePath opts) serverPort
88+ warpOpts = setPort (unServerPort serverPort) defaultSettings
8889 in (run uiServerPort app') `race_` (runTLS tlsOpts warpOpts app')
8990
9091initConnectionPool :: ByteString -> Int -> IO PgPool
@@ -105,39 +106,40 @@ server = (listH :<|> createH :<|> getH :<|> editH
105106
106107listH :: AppM [DeploymentFullInfo]
107108listH = do
108− AppState{pool = p, logger = l, base_domain = d} <- ask
109+ AppState {pool = p, logger = l, base_domain = d} <- ask
109110
110111 retrieved <- liftIO $ withResource p $ \conn -> query_ conn q
111− ds <- liftIO $ for retrieved $ \(n, t, e, ct, ut) -> do
112+ deployments <- liftIO $ for retrieved $ \(n, t, e, ct, ut) -> do
112113 es <- parseEnvs (lines e)
113114 pure $ DeploymentFullInfo (Deployment n t es) ct ut (depUrls d n)
114115
115− liftIO . logInfo l $ "get deployments: " <> (pack . show $ ds)
116− return ds
116+ liftIO . logInfo l $ "get deployments: " <> (pack . show $ deployments)
117+ return deployments
117118 where
118− q = "SELECT name, tag, envs, extract(epoch from created_at)::int, extract(epoch from updated_at)::int \
119− \FROM deployments ORDER BY name"
120− depUrls d n = [ ("app", appUrl d n)
121− , ("kibana", "kibana." <> appUrl d n)
122− , ("tasker", "tasker." <> appUrl d n)
123− ]
124− appUrl d n = coerce n <> "." <> coerce d
119+ q =
120+ "SELECT name, tag, envs, extract(epoch from created_at)::int, extract(epoch from updated_at)::int \
121+ \FROM deployments ORDER BY name"
122+ depUrls domain dName = [ ("app", appUrl domain dName)
123+ , ("kibana", "kibana." <> appUrl domain dName)
124+ , ("tasker", "tasker." <> appUrl domain dName)
125+ ]
126+ appUrl domain dName = coerce dName <> "." <> coerce domain
125127
126128createH :: Deployment -> AppM NoContent
127129createH dep = do
128130 st <- ask
129131 let
130132 log :: Text -> IO ()
131− log = logInfo (logger st)
132− pgPool = pool st
133− args = [ "--project-name", coerce $ project_name st
134− , "--base-domain", coerce $ base_domain st
135− , "--namespace", coerce $ namespace st
136− , "--name", coerce $ name dep
137− , "--tag", coerce $ tag dep
138− ]
139− ++ concat [["--env", concatPair e] | e <- envs dep]
140− cmd = coerce $ creation_command st
133+ log = logInfo (logger st)
134+ pgPool = pool st
135+ args =
136+ [ "--project-name", coerce $ project_name st
137+ , "--base-domain", coerce $ base_domain st
138+ , "--namespace", coerce $ namespace st
139+ , "--name", coerce $ name dep
140+ , "--tag", coerce $ tag dep
141+ ] ++ concat [["--env", concatPair e] | e <- envs dep]
142+ cmd = coerce $ creation_command st
141143 createDeployment :: PgPool -> Deployment -> IO Int64
142144 createDeployment p Deployment { name = n, tag = t, envs = e } =
143145 withResource p $ \conn -> execute
@@ -208,9 +210,8 @@ editH n e = do
208210 , "--namespace", coerce $ namespace st
209211 , "--name", coerce n
210212 , "--tag", coerce t
211− ]
212− ++ concat [["--env", concatPair p] | p <- e]
213− cmd = coerce $ update_command st
213+ ] ++ concat [["--env", concatPair p] | p <- e]
214+ cmd = coerce $ update_command st
214215 liftIO $ do
215216 void $ updateEditDeployment pgPool
216217 log $ "call " <> unwords (cmd : args)
@@ -222,13 +223,13 @@ editH n e = do
222223 createDeploymentLog pgPool dep "edit" ec
223224 handleExitCode ec
224225 return ()
225− _ -> liftIO . logWarning (logger st) $ "tag not found, name: " <> coerce n
226+ _ -> liftIO . logWarning (logger st) $ "tag not found, name: " <> coerce n
226227 return NoContent
227228 where
228− getTag :: PgPool -> IO [DeploymentTag]
229− getTag p = fmap (fmap fromOnly) $ withResource p $ \conn ->
229+ getTag :: PgPool -> IO [DeploymentTag]
230+ getTag p = fmap (fmap fromOnly) $ withResource p $ \conn ->
230231 query conn "SELECT tag FROM deployments WHERE name = ?" (Only n)
231− updateEditDeployment :: PgPool -> IO Int64
232+ updateEditDeployment :: PgPool -> IO Int64
232233 updateEditDeployment p = withResource p $ \conn -> execute
233234 conn
234235 "UPDATE deployments SET envs = ?, updated_at = now() WHERE name = ?"
@@ -241,11 +242,11 @@ destroyH dName = do
241242 let
242243 log = logInfo (logger st)
243244 pgPool = pool st
244− args = [ "--project-name", coerce $ project_name st
245− , "--namespace", coerce $ namespace st
246− , "--name", coerce dName
247− ]
248− cmd = coerce $ deletion_command st
245+ args = [ "--project-name", coerce $ project_name st
246+ , "--namespace", coerce $ namespace st
247+ , "--name", coerce dName
248+ ]
249+ cmd = coerce $ deletion_command st
249250 liftIO $ do
250251 log $ "call " <> unwords (cmd : args)
251252 ec <- withProcessWait (proc (unpack cmd) (unpack <$> args)) waitProcess
@@ -276,15 +277,14 @@ updateH dName dTag = do
276277 storedEnv : _ -> do
277278 envPairs <- liftIO $ parseEnvs $ lines storedEnv
278279 let
279− log = logInfo (logger st)
280+ log = logInfo (logger st)
280281 args = [ "--project-name", coerce $ project_name st
281282 , "--base-domain", coerce $ base_domain st
282283 , "--namespace", coerce $ namespace st
283284 , "--name", coerce $ dName
284285 , "--tag", coerce $ dTag
285− ]
286− ++ concat [["--env", concatPair e] | e <- envPairs]
287− cmd = coerce $ update_envs_command st
286+ ] ++ concat [["--env", concatPair e] | e <- envPairs]
287+ cmd = coerce $ update_envs_command st
288288 liftIO $ do
289289 void $ updateDeploymentNameAndTag pgPool dName dTag
290290 log $ "call " <> unwords (cmd : args)
@@ -317,8 +317,7 @@ updateDeploymentNameAndTag p dName dTag = withResource p $ \conn -> execute
317317infoH :: DeploymentName -> AppM [DeploymentInfo]
318318infoH dName = do
319319 st <- ask
320− let
321− pgPool = pool st
320+ let pgPool = pool st
322321 liftIO $ do
323322 dep <- selectDeployment pgPool dName
324323 depLogs <- selectDeploymentLogs pgPool dName
@@ -329,17 +328,18 @@ infoH dName = do
329328pingH :: AppM NoContent
330329pingH = do
331330 pgPool <- pool <$> ask
332− _ :: [Only Int] <-
333− liftIO $ withResource pgPool $ \conn -> query_ conn "SELECT 1"
331+ _ :: [Only Int] <- liftIO $ withResource pgPool $ \conn -> query_ conn "SELECT 1"
334332 pure NoContent
335333
336334statusH :: DeploymentName -> AppM DeploymentStatus
337335statusH dName = do
338336 cmd <- checking_command <$> ask
339− ec <- liftIO $ withProcessWait (proc (unpack $ coerce cmd) [unpack . coerce $ dName]) waitProcess
340− pure $ DeploymentStatus $ case ec of
341− ExitSuccess -> Ok
342− _ -> Error
337+ let args = [unpack . coerce $ dName]
338+ ec <- liftIO $ withProcessWait (proc (unpack $ coerce cmd) args) waitProcess
339+ pure . DeploymentStatus $
340+ case ec of
341+ ExitSuccess -> Ok
342+ _ -> Error
343343
344344waitProcess :: (Show o, Show e) => Process i o e -> IO ExitCode
345345waitProcess p = do
@@ -348,7 +348,7 @@ waitProcess p = do
348348 waitExitCode p
349349
350350handleExitCode :: ExitCode -> IO ()
351−handleExitCode ExitSuccess = return ()
351+handleExitCode ExitSuccess = return ()
352352handleExitCode (ExitFailure c) = throwIO $ DeploymentFailed c
353353
354354createDeploymentLog :: PgPool -> Deployment -> Action -> ExitCode -> IO ()