@@ -1,138 +1,207 @@
1−{-|
2−Module : Octopod.Server.ControlScriptUtils
3−Description : Control script utils.
4−
5−This module contains control script utils.
6−-}
1+-- |
2+--Module : Octopod.Server.ControlScriptUtils
3+--Description : Control script utils.
4+--
5+--This module contains control script utils.
6+module Octopod.Server.ControlScriptUtils
7+ ( infoCommandArgs,
8+ notificationCommandArgs,
9+ runCommand,
10+ runCommandWithoutPipes,
11+ runCommandArgs,
12+ runCommandArgs',
13+ checkCommandArgs,
14+ archiveCheckArgs,
15+ tagCheckCommandArgs,
716
17+ -- * Helpers
18+ applicationOverrideToArg,
19+ applicationOverridesToArgs,
20+ deploymentOverrideToArg,
21+ deploymentOverridesToArgs,
22+ )
23+where
824
9−module Octopod.Server.ControlScriptUtils
10− ( infoCommandArgs
11− , notificationCommandArgs
12− , runCommand
13− , runCommandWithoutPipes
14− , runCommandArgs
15− , runCommandArgs'
16− , checkCommandArgs
17− , archiveCheckArgs
18− ) where
19−
20−
21−import Control.Monad.Base
22−import Control.Monad.Reader
25+import Control.Monad.Base
26+import Control.Monad.Reader
2327import qualified Data.ByteString.Lazy as TL
24−import Data.Coerce
25−import Data.Generics.Product.Typed
28+import Data.Coerce
29+import Data.Generics.Product.Typed
30+import Data.Text (Text)
2631import qualified Data.Text as T
2732import qualified Data.Text.Encoding as T
28−import Octopod.Server.Logger
29−import System.Exit
30−import System.Log.FastLogger
31−import System.Process.Typed
32−import Types
33−
33+import Octopod.Server.Logger
34+import System.Exit
35+import System.Log.FastLogger
36+import System.Process.Typed
37+import Types
3438
3539-- | Creates command arguments for the 'info' deployment control script.
36−infoCommandArgs
37− :: ProjectName
38− -> Domain
39− -> Namespace
40− -> DeploymentName
41− -> ControlScriptArgs
42−infoCommandArgs pName domain ns dName =
43− ControlScriptArgs
44− [ "--project-name", T.unpack . coerce $ pName
45− , "--base-domain", T.unpack . coerce $ domain
46− , "--namespace", T.unpack . coerce $ ns
47− , "--name", T.unpack . coerce $ dName ]
48−
49−notificationCommandArgs
50− ::
51− ( MonadReader r m
52− , HasType Namespace r
53− , HasType ProjectName r
54− , HasType Domain r
55− )
56− => DeploymentName
57− -> DeploymentTag
58− -> DeploymentStatus
59− -- ^ Previous status
60− -> DeploymentStatus
61− -- ^ New status
62− -> m ControlScriptArgs
40+infoCommandArgs ::
41+ ( MonadReader r m
42+ , HasType Namespace r
43+ , HasType ProjectName r
44+ , HasType Domain r
45+ ) =>
46+ Deployment ->
47+ m ControlScriptArgs
48+infoCommandArgs dep = do
49+ (Namespace namespace) <- asks getTyped
50+ (ProjectName projectName) <- asks getTyped
51+ (Domain domain) <- asks getTyped
52+ return $
53+ ControlScriptArgs
54+ [ "--project-name"
55+ , T.unpack . coerce $ projectName
56+ , "--base-domain"
57+ , T.unpack . coerce $ domain
58+ , "--namespace"
59+ , T.unpack . coerce $ namespace
60+ , "--name"
61+ , T.unpack . coerce $ name dep
62+ , "--tag"
63+ , T.unpack . coerce $ tag dep
64+ ]
65+ <> getApplicationOverrideArgs dep
66+ <> getDeploymentOverrideArgs dep
67+
68+notificationCommandArgs ::
69+ ( MonadReader r m
70+ , HasType Namespace r
71+ , HasType ProjectName r
72+ , HasType Domain r
73+ ) =>
74+ DeploymentName ->
75+ DeploymentTag ->
76+ -- | Previous status
77+ DeploymentStatus ->
78+ -- | New status
79+ DeploymentStatus ->
80+ m ControlScriptArgs
6381notificationCommandArgs dName dTag old new = do
6482 (Namespace namespace) <- asks getTyped
6583 (ProjectName projectName) <- asks getTyped
6684 (Domain domain) <- asks getTyped
67− return $ ControlScriptArgs
68− [ "--project-name", T.unpack projectName
69− , "--base-domain", T.unpack domain
70− , "--namespace", T.unpack namespace
71− , "--name", T.unpack . coerce $ dName
72− , "--tag", T.unpack . coerce $ dTag
73− , "--old-status", T.unpack $ deploymentStatusText old
74− , "--new-status", T.unpack $ deploymentStatusText new
75− ]
76−
77−checkCommandArgs
78− ::
79− ( MonadReader r m
80− , HasType Namespace r
81− , HasType ProjectName r
82− , HasType Domain r
83− )
84− => DeploymentName
85− -> DeploymentTag
86− -> m ControlScriptArgs
87−checkCommandArgs dName dTag = do
85+ return $
86+ ControlScriptArgs
87+ [ "--project-name"
88+ , T.unpack projectName
89+ , "--base-domain"
90+ , T.unpack domain
91+ , "--namespace"
92+ , T.unpack namespace
93+ , "--name"
94+ , T.unpack . coerce $ dName
95+ , "--tag"
96+ , T.unpack . coerce $ dTag
97+ , "--old-status"
98+ , T.unpack $ deploymentStatusText old
99+ , "--new-status"
100+ , T.unpack $ deploymentStatusText new
101+ ]
102+
103+checkCommandArgs ::
104+ ( MonadReader r m
105+ , HasType Namespace r
106+ , HasType ProjectName r
107+ , HasType Domain r
108+ ) =>
109+ Deployment ->
110+ m ControlScriptArgs
111+checkCommandArgs dep = do
112+ (Namespace namespace) <- asks getTyped
88113 (ProjectName projectName) <- asks getTyped
89114 (Domain domain) <- asks getTyped
115+ return $
116+ ControlScriptArgs
117+ [ "--project-name"
118+ , T.unpack . coerce $ projectName
119+ , "--base-domain"
120+ , T.unpack . coerce $ domain
121+ , "--namespace"
122+ , T.unpack . coerce $ namespace
123+ , "--name"
124+ , T.unpack . coerce $ name dep
125+ , "--tag"
126+ , T.unpack . coerce $ tag dep
127+ ]
128+ <> getApplicationOverrideArgs dep
129+ <> getDeploymentOverrideArgs dep
130+
131+tagCheckCommandArgs ::
132+ ( MonadReader r m
133+ , HasType Namespace r
134+ , HasType ProjectName r
135+ , HasType Domain r
136+ ) =>
137+ Deployment ->
138+ m ControlScriptArgs
139+tagCheckCommandArgs dep = do
90140 (Namespace namespace) <- asks getTyped
91− return $ ControlScriptArgs
92− [ "--namespace", T.unpack namespace
93− , "--name", T.unpack . coerce $ dName
94− , "--tag", T.unpack . unDeploymentTag $ dTag
95− , "--project-name", T.unpack projectName
96− , "--base-domain", T.unpack domain
97− ]
98−
99−archiveCheckArgs
100− ::
101− ( MonadReader r m
102− , HasType Namespace r
103− , HasType ProjectName r
104− , HasType Domain r
105− )
106− => DeploymentName
107− -> m ControlScriptArgs
141+ (ProjectName projectName) <- asks getTyped
142+ (Domain domain) <- asks getTyped
143+ return $
144+ ControlScriptArgs
145+ [ "--project-name"
146+ , T.unpack . coerce $ projectName
147+ , "--base-domain"
148+ , T.unpack . coerce $ domain
149+ , "--namespace"
150+ , T.unpack . coerce $ namespace
151+ , "--name"
152+ , T.unpack . coerce $ name dep
153+ , "--tag"
154+ , T.unpack . coerce $ tag dep
155+ ]
156+ <> getApplicationOverrideArgs dep
157+ <> getDeploymentOverrideArgs dep
158+
159+archiveCheckArgs ::
160+ ( MonadReader r m
161+ , HasType Namespace r
162+ , HasType ProjectName r
163+ , HasType Domain r
164+ ) =>
165+ DeploymentName ->
166+ m ControlScriptArgs
108167archiveCheckArgs dName = do
109168 (ProjectName projectName) <- asks getTyped
110169 (Domain domain) <- asks getTyped
111170 (Namespace namespace) <- asks getTyped
112− return $ ControlScriptArgs
113− [ "--project-name", T.unpack projectName
114− , "--base-domain", T.unpack domain
115− , "--namespace", T.unpack namespace
116− , "--name", T.unpack . coerce $ dName
117− ]
118−
119−runCommandArgs
120− :: (MonadReader r m, MonadBase IO m, HasType TimedFastLogger r)
121− => (r -> Command) -> ControlScriptArgs -> m (ExitCode, Stdout, Stderr)
171+ return $
172+ ControlScriptArgs
173+ [ "--project-name"
174+ , T.unpack projectName
175+ , "--base-domain"
176+ , T.unpack domain
177+ , "--namespace"
178+ , T.unpack namespace
179+ , "--name"
180+ , T.unpack . coerce $ dName
181+ ]
182+
183+runCommandArgs ::
184+ (MonadReader r m, MonadBase IO m, HasType TimedFastLogger r) =>
185+ (r -> Command) ->
186+ ControlScriptArgs ->
187+ m (ExitCode, Stdout, Stderr)
122188runCommandArgs f args = do
123189 cmd <- asks f
124190 runCommandArgs' cmd args
125191
126−runCommandArgs'
127− :: (MonadBase IO m, HasType TimedFastLogger r, MonadReader r m)
128− => Command -> ControlScriptArgs -> m (ExitCode, Stdout, Stderr)
192+runCommandArgs' ::
193+ (MonadBase IO m, HasType TimedFastLogger r, MonadReader r m) =>
194+ Command ->
195+ ControlScriptArgs ->
196+ m (ExitCode, Stdout, Stderr)
129197runCommandArgs' (Command cmd) (ControlScriptArgs args) = do
130198 logger <- asks (getTyped @TimedFastLogger)
131199 let logText = T.unwords (cmd : fmap T.pack args)
132200 liftBase $ logInfo logger $ "calling: " <> logText
133201 res@(ec, _, _) <- runCommand (T.unpack cmd) args
134− liftBase $ logInfo logger
135− $ "calling `" <> logText <> "` exited with: " <> show' ec
202+ liftBase $
203+ logInfo logger $
204+ "calling `" <> logText <> "` exited with: " <> show' ec
136205 return res
137206
138207-- | Helper to run command with pipes.
@@ -149,3 +218,28 @@ runCommand cmd args = do
149218runCommandWithoutPipes :: FilePath -> [String] -> IO ExitCode
150219runCommandWithoutPipes cmd args =
151220 withProcessWait (proc cmd args) waitExitCode
221+
222+-- | Converts an application-level override list to command arguments.
223+applicationOverrideToArg :: ApplicationOverride -> [Text]
224+applicationOverrideToArg o = ["--app-env-override", overrideToArg . coerce $ o]
225+
226+-- | Helper to convert an application-level override to command arguments.
227+applicationOverridesToArgs :: ApplicationOverrides -> [Text]
228+applicationOverridesToArgs ovs = concat [applicationOverrideToArg o | o <- ovs]
229+
230+getApplicationOverrideArgs :: Deployment -> ControlScriptArgs
231+getApplicationOverrideArgs =
232+ ControlScriptArgs . map T.unpack . applicationOverridesToArgs . appOverrides
233+
234+-- | Converts a deployment-level override list to command arguments.
235+deploymentOverrideToArg :: DeploymentOverride -> [Text]
236+deploymentOverrideToArg o =
237+ ["--deployment-override", overrideToArg . coerce $ o]
238+
239+-- | Helper to convert a deployment-level override to command arguments.
240+deploymentOverridesToArgs :: DeploymentOverrides -> [Text]
241+deploymentOverridesToArgs ovs = concat [deploymentOverrideToArg o | o <- ovs]
242+
243+getDeploymentOverrideArgs :: Deployment -> ControlScriptArgs
244+getDeploymentOverrideArgs =
245+ ControlScriptArgs . map T.unpack . deploymentOverridesToArgs . deploymentOverrides