@@ -5,7 +5,7 @@ module User.Requester.Cli
5
5
, RequesterCommand (.. )
6
6
) where
7
7
8
- import Control.Monad (void )
8
+ import Control.Monad (forM , forM_ , void )
9
9
import Control.Monad.Catch (MonadMask )
10
10
import Control.Monad.IO.Class (MonadIO (.. ))
11
11
import Control.Monad.Trans.Class (lift )
@@ -16,13 +16,22 @@ import Core.Context
16
16
, askSubmit
17
17
, askValidation
18
18
)
19
- import Core.Types.Basic (Duration , TokenId )
19
+ import Core.Types.Basic
20
+ ( Directory (.. )
21
+ , Duration
22
+ , FileName (.. )
23
+ , Repository (.. )
24
+ , TokenId
25
+ )
20
26
import Core.Types.Change (Change (.. ), Key (.. ), deleteKey , insertKey )
21
27
import Core.Types.Operation (Operation (.. ))
22
28
import Core.Types.Tx (TxHash , WithTxHash (.. ))
23
29
import Core.Types.Wallet (Wallet )
30
+ import Data.Bifunctor (Bifunctor (.. ))
24
31
import Data.ByteString.Lazy qualified as BL
25
32
import Data.Functor (($>) )
33
+ import Data.Text.IO qualified as T
34
+ import Lib.JSON.Canonical.Extra (object , (.=) )
26
35
import Lib.SSH.Private
27
36
( KeyAPI (.. )
28
37
, SSHClient (.. )
@@ -53,7 +62,10 @@ import Oracle.Validate.Requests.TestRun.Create
53
62
import Oracle.Validate.Types
54
63
( AValidationResult
55
64
, liftMaybe
65
+ , mapFailure
56
66
, runValidate
67
+ , sequenceValidate
68
+ , throwLeft
57
69
)
58
70
import Submitting (Submission (.. ))
59
71
import Text.JSON.Canonical (ToJSON (.. ), renderCanonicalJSON )
@@ -64,6 +76,22 @@ import User.Types
64
76
, TestRun (.. )
65
77
, TestRunState (.. )
66
78
)
79
+ import Validation (Validation (.. ))
80
+ import Validation.DownloadFile (DownloadedFileFailure )
81
+
82
+ newtype GenerateAssetsFailure
83
+ = GenerateAssetsFailure [(FileName , DownloadedFileFailure )]
84
+
85
+ instance Monad m => ToJSON m GenerateAssetsFailure where
86
+ toJSON (GenerateAssetsFailure failures) =
87
+ object
88
+ [
89
+ ( " generateAssetsFailure"
90
+ , mapM
91
+ (\ (FileName fn, err) -> object [" file" .= fn, " error" .= err])
92
+ failures
93
+ )
94
+ ]
67
95
68
96
data RequesterCommand a where
69
97
RegisterUser
@@ -97,6 +125,13 @@ data RequesterCommand a where
97
125
CreateTestRunFailure
98
126
(WithTxHash (TestRunState PendingT ))
99
127
)
128
+ GenerateAssets
129
+ :: Directory
130
+ -> RequesterCommand
131
+ ( AValidationResult
132
+ GenerateAssetsFailure
133
+ ()
134
+ )
100
135
101
136
deriving instance Show (RequesterCommand a )
102
137
deriving instance Eq (RequesterCommand a )
@@ -122,6 +157,29 @@ requesterCmd command = do
122
157
sshClient
123
158
testRun
124
159
duration
160
+ GenerateAssets directory -> generateAssets directory
161
+
162
+ generateAssets
163
+ :: MonadIO m
164
+ => Directory
165
+ -> WithContext m (AValidationResult GenerateAssetsFailure () )
166
+ generateAssets (Directory targetDirectory) = do
167
+ Validation {githubGetFile} <- askValidation Nothing
168
+ lift $ runValidate $ do
169
+ downloads <- forM [" docker-compose.yaml" , " README.md" , " testnet.yaml" ] $ \ filename -> do
170
+ fmap (bimap (FileName filename,) (filename,))
171
+ $ lift
172
+ $ githubGetFile
173
+ (Repository " cardano-foundation" " antithesis" )
174
+ Nothing
175
+ (FileName $ " compose/testnets/cardano_node_master/" <> filename)
176
+ contents <-
177
+ mapFailure GenerateAssetsFailure
178
+ $ sequenceValidate
179
+ $ fmap (throwLeft id ) downloads
180
+ forM_ contents $ \ (filename, content) -> do
181
+ let filePath = targetDirectory <> " /" <> filename
182
+ liftIO $ T. writeFile filePath content
125
183
126
184
createCommand
127
185
:: (MonadIO m , MonadMask m )
0 commit comments