implement CommandStep
and record each SimCommand in simHistory, except for CommandStep where instead the actions that are generated are recorded.
This commit is contained in:
parent
64466d8687
commit
217bc214b3
1 changed files with 55 additions and 49 deletions
104
Annex/Sim.hs
104
Annex/Sim.hs
|
@ -158,22 +158,37 @@ applySimCommand
|
||||||
:: SimCommand
|
:: SimCommand
|
||||||
-> SimState
|
-> SimState
|
||||||
-> Either String (Either (Annex SimState) SimState)
|
-> Either String (Either (Annex SimState) SimState)
|
||||||
applySimCommand (CommandInit reponame) st =
|
applySimCommand (CommandStep n) st
|
||||||
|
| n > 0 = case randomRepo st of
|
||||||
|
(Just (_repo, u), st') ->
|
||||||
|
let (act, st'') = randomAction st'
|
||||||
|
st''' = applySimAction u act st''
|
||||||
|
in applySimCommand (CommandStep (pred n)) st'''
|
||||||
|
(Nothing, st') -> Right $ Right st'
|
||||||
|
| otherwise = Right $ Right st
|
||||||
|
applySimCommand c st =
|
||||||
|
applySimCommand' c $ st { simHistory = c : simHistory st }
|
||||||
|
|
||||||
|
applySimCommand'
|
||||||
|
:: SimCommand
|
||||||
|
-> SimState
|
||||||
|
-> Either String (Either (Annex SimState) SimState)
|
||||||
|
applySimCommand' (CommandInit reponame) st =
|
||||||
checkNonexistantRepo reponame st $
|
checkNonexistantRepo reponame st $
|
||||||
let (u, st') = genSimUUID st reponame
|
let (u, st') = genSimUUID st reponame
|
||||||
in Right $ Right $ addRepo reponame (newSimRepoConfig u False) st'
|
in Right $ Right $ addRepo reponame (newSimRepoConfig u False) st'
|
||||||
applySimCommand (CommandInitRemote reponame) st =
|
applySimCommand' (CommandInitRemote reponame) st =
|
||||||
checkNonexistantRepo reponame st $
|
checkNonexistantRepo reponame st $
|
||||||
let (u, st') = genSimUUID st reponame
|
let (u, st') = genSimUUID st reponame
|
||||||
in Right $ Right $ addRepo reponame (newSimRepoConfig u True) st'
|
in Right $ Right $ addRepo reponame (newSimRepoConfig u True) st'
|
||||||
applySimCommand (CommandUse reponame s) st =
|
applySimCommand' (CommandUse reponame s) st =
|
||||||
case getExistingRepoByName (simGetExistingRepoByName st) s of
|
case getExistingRepoByName (simGetExistingRepoByName st) s of
|
||||||
Right existingrepo -> checkNonexistantRepo reponame st $
|
Right existingrepo -> checkNonexistantRepo reponame st $
|
||||||
Right $ Right $ addRepo reponame existingrepo st
|
Right $ Right $ addRepo reponame existingrepo st
|
||||||
Left msg -> Left $ "Unable to use a repository \""
|
Left msg -> Left $ "Unable to use a repository \""
|
||||||
++ fromRepoName reponame
|
++ fromRepoName reponame
|
||||||
++ "\" in the simulation because " ++ msg
|
++ "\" in the simulation because " ++ msg
|
||||||
applySimCommand (CommandConnect repo remote) st =
|
applySimCommand' (CommandConnect repo remote) st =
|
||||||
checkKnownRepo repo st $ const $ Right $ Right $ st
|
checkKnownRepo repo st $ const $ Right $ Right $ st
|
||||||
{ simConnections =
|
{ simConnections =
|
||||||
let s = case M.lookup repo (simConnections st) of
|
let s = case M.lookup repo (simConnections st) of
|
||||||
|
@ -181,7 +196,7 @@ applySimCommand (CommandConnect repo remote) st =
|
||||||
Nothing -> S.singleton remote
|
Nothing -> S.singleton remote
|
||||||
in M.insert repo s (simConnections st)
|
in M.insert repo s (simConnections st)
|
||||||
}
|
}
|
||||||
applySimCommand (CommandDisconnect repo remote) st =
|
applySimCommand' (CommandDisconnect repo remote) st =
|
||||||
checkKnownRepo repo st $ const $ Right $ Right $ st
|
checkKnownRepo repo st $ const $ Right $ Right $ st
|
||||||
{ simConnections =
|
{ simConnections =
|
||||||
let sc = case M.lookup repo (simConnections st) of
|
let sc = case M.lookup repo (simConnections st) of
|
||||||
|
@ -189,11 +204,11 @@ applySimCommand (CommandDisconnect repo remote) st =
|
||||||
Nothing -> S.empty
|
Nothing -> S.empty
|
||||||
in M.insert repo sc (simConnections st)
|
in M.insert repo sc (simConnections st)
|
||||||
}
|
}
|
||||||
applySimCommand (CommandAddTree repo expr) st =
|
applySimCommand' (CommandAddTree repo expr) st =
|
||||||
checkKnownRepo repo st $ const $
|
checkKnownRepo repo st $ const $
|
||||||
checkValidPreferredContentExpression expr $ Left $
|
checkValidPreferredContentExpression expr $ Left $
|
||||||
error "TODO" -- XXX
|
error "TODO" -- XXX
|
||||||
applySimCommand (CommandAdd file sz repo) st = checkKnownRepo repo st $ \u ->
|
applySimCommand' (CommandAdd file sz repo) st = checkKnownRepo repo st $ \u ->
|
||||||
let (k, st') = genSimKey sz st
|
let (k, st') = genSimKey sz st
|
||||||
in Right $ Right $ st'
|
in Right $ Right $ st'
|
||||||
{ simFiles = M.insert (toRawFilePath file) k (simFiles st')
|
{ simFiles = M.insert (toRawFilePath file) k (simFiles st')
|
||||||
|
@ -203,36 +218,14 @@ applySimCommand (CommandAdd file sz repo) st = checkKnownRepo repo st $ \u ->
|
||||||
(simRepoState st')
|
(simRepoState st')
|
||||||
Nothing -> error "no simRepoState in applySimCommand CommandAdd"
|
Nothing -> error "no simRepoState in applySimCommand CommandAdd"
|
||||||
}
|
}
|
||||||
applySimCommand (CommandStep n) st
|
applySimCommand' (CommandStep _) _ = error "applySimCommand' CommandStep"
|
||||||
| n > 0 = undefined -- XXX TODO
|
applySimCommand' (CommandAction repo act) st =
|
||||||
{-
|
checkKnownRepo repo st $ \u ->
|
||||||
let (repo, st') = randomRepo st
|
Right $ Right $ applySimAction u act st
|
||||||
(act, st'') = randomAction st'
|
applySimCommand' (CommandSeed rngseed) st = Right $ Right $ st
|
||||||
st''' = applySimCommand (CommandAction repo act) st''
|
|
||||||
st'''' = st''' { simHistory = act : simHistory st''' }
|
|
||||||
in applySimCommand (CommandStep (pred n)) st''''
|
|
||||||
-}
|
|
||||||
| otherwise = Right $ Right st
|
|
||||||
applySimCommand (CommandAction repo (ActionPull remote)) st =
|
|
||||||
checkKnownRepo repo st $ \u -> undefined -- XXX TODO
|
|
||||||
applySimCommand (CommandAction repo (ActionPush remote)) st =
|
|
||||||
checkKnownRepo repo st $ \u -> undefined -- XXX TODO
|
|
||||||
applySimCommand (CommandAction repo (ActionGetWanted remote)) st =
|
|
||||||
checkKnownRepo repo st $ \u -> undefined -- XXX TODO
|
|
||||||
applySimCommand (CommandAction repo (ActionDropUnwanted Nothing)) st =
|
|
||||||
checkKnownRepo repo st $ \u -> undefined -- XXX TODO
|
|
||||||
applySimCommand (CommandAction repo (ActionDropUnwanted (Just remote))) st =
|
|
||||||
checkKnownRepo repo st $ \u -> undefined -- XXX TODO
|
|
||||||
applySimCommand (CommandAction repo (ActionSendWanted remote)) st =
|
|
||||||
checkKnownRepo repo st $ \u -> undefined -- XXX TODO
|
|
||||||
applySimCommand (CommandAction repo (ActionGitPush remote)) st =
|
|
||||||
checkKnownRepo repo st $ \u -> undefined -- XXX TODO
|
|
||||||
applySimCommand (CommandAction repo (ActionGitPull remote)) st =
|
|
||||||
checkKnownRepo repo st $ \u -> undefined -- XXX TODO
|
|
||||||
applySimCommand (CommandSeed rngseed) st = Right $ Right $ st
|
|
||||||
{ simRng = mkStdGen rngseed
|
{ simRng = mkStdGen rngseed
|
||||||
}
|
}
|
||||||
applySimCommand (CommandPresent repo file) st = checkKnownRepo repo st $ \u ->
|
applySimCommand' (CommandPresent repo file) st = checkKnownRepo repo st $ \u ->
|
||||||
case (M.lookup (toRawFilePath file) (simFiles st), M.lookup repo (simRepoState st)) of
|
case (M.lookup (toRawFilePath file) (simFiles st), M.lookup repo (simRepoState st)) of
|
||||||
(Just k, Just rst) -> case M.lookup k (simLocations rst) of
|
(Just k, Just rst) -> case M.lookup k (simLocations rst) of
|
||||||
Just locs | S.member u locs -> Right $ Right st
|
Just locs | S.member u locs -> Right $ Right st
|
||||||
|
@ -244,7 +237,7 @@ applySimCommand (CommandPresent repo file) st = checkKnownRepo repo st $ \u ->
|
||||||
where
|
where
|
||||||
missing = Left $ "Expected " ++ file ++ " to be present in "
|
missing = Left $ "Expected " ++ file ++ " to be present in "
|
||||||
++ fromRepoName repo ++ ", but it is not."
|
++ fromRepoName repo ++ ", but it is not."
|
||||||
applySimCommand (CommandNotPresent repo file) st = checkKnownRepo repo st $ \u ->
|
applySimCommand' (CommandNotPresent repo file) st = checkKnownRepo repo st $ \u ->
|
||||||
case (M.lookup (toRawFilePath file) (simFiles st), M.lookup repo (simRepoState st)) of
|
case (M.lookup (toRawFilePath file) (simFiles st), M.lookup repo (simRepoState st)) of
|
||||||
(Just k, Just rst) -> case M.lookup k (simLocations rst) of
|
(Just k, Just rst) -> case M.lookup k (simLocations rst) of
|
||||||
Just locs | S.notMember u locs -> Right $ Right st
|
Just locs | S.notMember u locs -> Right $ Right st
|
||||||
|
@ -256,49 +249,60 @@ applySimCommand (CommandNotPresent repo file) st = checkKnownRepo repo st $ \u -
|
||||||
where
|
where
|
||||||
present = Left $ "Expected " ++ file ++ " not to be present in "
|
present = Left $ "Expected " ++ file ++ " not to be present in "
|
||||||
++ fromRepoName repo ++ ", but it is present."
|
++ fromRepoName repo ++ ", but it is present."
|
||||||
applySimCommand (CommandNumCopies n) st = Right $ Right $ st
|
applySimCommand' (CommandNumCopies n) st = Right $ Right $ st
|
||||||
{ simNumCopies = configuredNumCopies n
|
{ simNumCopies = configuredNumCopies n
|
||||||
}
|
}
|
||||||
applySimCommand (CommandMinCopies n) st = Right $ Right $ st
|
applySimCommand' (CommandMinCopies n) st = Right $ Right $ st
|
||||||
{ simMinCopies = configuredMinCopies n
|
{ simMinCopies = configuredMinCopies n
|
||||||
}
|
}
|
||||||
applySimCommand (CommandTrustLevel repo s) st = checkKnownRepo repo st $ \u ->
|
applySimCommand' (CommandTrustLevel repo s) st = checkKnownRepo repo st $ \u ->
|
||||||
case readTrustLevel s of
|
case readTrustLevel s of
|
||||||
Just trustlevel -> Right $ Right $ st
|
Just trustlevel -> Right $ Right $ st
|
||||||
{ simTrustLevels = M.insert u trustlevel
|
{ simTrustLevels = M.insert u trustlevel
|
||||||
(simTrustLevels st)
|
(simTrustLevels st)
|
||||||
}
|
}
|
||||||
Nothing -> Left $ "Unknown trust level \"" ++ s ++ "\"."
|
Nothing -> Left $ "Unknown trust level \"" ++ s ++ "\"."
|
||||||
applySimCommand (CommandGroup repo groupname) st = checkKnownRepo repo st $ \u ->
|
applySimCommand' (CommandGroup repo groupname) st = checkKnownRepo repo st $ \u ->
|
||||||
Right $ Right $ st
|
Right $ Right $ st
|
||||||
{ simGroups = M.insertWith S.union u
|
{ simGroups = M.insertWith S.union u
|
||||||
(S.singleton groupname)
|
(S.singleton groupname)
|
||||||
(simGroups st)
|
(simGroups st)
|
||||||
}
|
}
|
||||||
applySimCommand (CommandUngroup repo groupname) st = checkKnownRepo repo st $ \u ->
|
applySimCommand' (CommandUngroup repo groupname) st = checkKnownRepo repo st $ \u ->
|
||||||
Right $ Right $ st
|
Right $ Right $ st
|
||||||
{ simGroups = M.adjust (S.delete groupname) u (simGroups st)
|
{ simGroups = M.adjust (S.delete groupname) u (simGroups st)
|
||||||
}
|
}
|
||||||
applySimCommand (CommandWanted repo expr) st = checkKnownRepo repo st $ \u ->
|
applySimCommand' (CommandWanted repo expr) st = checkKnownRepo repo st $ \u ->
|
||||||
checkValidPreferredContentExpression expr $ Right $ st
|
checkValidPreferredContentExpression expr $ Right $ st
|
||||||
{ simWanted = M.insert u expr (simWanted st)
|
{ simWanted = M.insert u expr (simWanted st)
|
||||||
}
|
}
|
||||||
applySimCommand (CommandRequired repo expr) st = checkKnownRepo repo st $ \u ->
|
applySimCommand' (CommandRequired repo expr) st = checkKnownRepo repo st $ \u ->
|
||||||
checkValidPreferredContentExpression expr $ Right $ st
|
checkValidPreferredContentExpression expr $ Right $ st
|
||||||
{ simRequired = M.insert u expr (simRequired st)
|
{ simRequired = M.insert u expr (simRequired st)
|
||||||
}
|
}
|
||||||
applySimCommand (CommandGroupWanted groupname expr) st =
|
applySimCommand' (CommandGroupWanted groupname expr) st =
|
||||||
checkValidPreferredContentExpression expr $ Right $ st
|
checkValidPreferredContentExpression expr $ Right $ st
|
||||||
{ simGroupWanted = M.insert groupname expr (simGroupWanted st)
|
{ simGroupWanted = M.insert groupname expr (simGroupWanted st)
|
||||||
}
|
}
|
||||||
applySimCommand (CommandMaxSize repo sz) st = checkKnownRepo repo st $ \u ->
|
applySimCommand' (CommandMaxSize repo sz) st = checkKnownRepo repo st $ \u ->
|
||||||
Right $ Right $ st
|
Right $ Right $ st
|
||||||
{ simMaxSize = M.insert u sz (simMaxSize st)
|
{ simMaxSize = M.insert u sz (simMaxSize st)
|
||||||
}
|
}
|
||||||
applySimCommand (CommandRebalance b) st = Right $ Right $ st
|
applySimCommand' (CommandRebalance b) st = Right $ Right $ st
|
||||||
{ simRebalance = b
|
{ simRebalance = b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- XXX todo
|
||||||
|
applySimAction :: UUID -> SimAction -> SimState -> SimState
|
||||||
|
applySimAction u (ActionPull remote) st = undefined
|
||||||
|
applySimAction u (ActionPush remote) st = undefined
|
||||||
|
applySimAction u (ActionGetWanted remote) st = undefined
|
||||||
|
applySimAction u (ActionDropUnwanted Nothing) st = undefined
|
||||||
|
applySimAction u (ActionDropUnwanted (Just remote)) st = undefined
|
||||||
|
applySimAction u (ActionSendWanted remote) st = undefined
|
||||||
|
applySimAction u (ActionGitPush remote) st = undefined
|
||||||
|
applySimAction u (ActionGitPull remote) st = undefined
|
||||||
|
|
||||||
checkNonexistantRepo :: RepoName -> SimState -> Either String a -> Either String a
|
checkNonexistantRepo :: RepoName -> SimState -> Either String a -> Either String a
|
||||||
checkNonexistantRepo reponame st a = case M.lookup reponame (simRepos st) of
|
checkNonexistantRepo reponame st a = case M.lookup reponame (simRepos st) of
|
||||||
Nothing -> a
|
Nothing -> a
|
||||||
|
@ -322,12 +326,14 @@ simRandom st mk f =
|
||||||
let (v, rng) = mk (simRng st)
|
let (v, rng) = mk (simRng st)
|
||||||
in (f v, st { simRng = rng })
|
in (f v, st { simRng = rng })
|
||||||
|
|
||||||
randomRepo :: SimState -> (Maybe RepoName, SimState)
|
randomRepo :: SimState -> (Maybe (RepoName, UUID), SimState)
|
||||||
randomRepo st
|
randomRepo st
|
||||||
| null (simRepoList st) = (Nothing, st)
|
| null (simRepoList st) = (Nothing, st)
|
||||||
| otherwise = simRandom st
|
| otherwise = simRandom st
|
||||||
(randomR (0, length (simRepoList st) - 1))
|
(randomR (0, length (simRepoList st) - 1)) $ \n -> do
|
||||||
(\n -> Just $ simRepoList st !! n)
|
let r = simRepoList st !! n
|
||||||
|
u <- M.lookup r (simRepos st)
|
||||||
|
return (r, u)
|
||||||
|
|
||||||
randomAction :: SimState -> (SimAction, SimState)
|
randomAction :: SimState -> (SimAction, SimState)
|
||||||
randomAction = undefined -- XXX TODO
|
randomAction = undefined -- XXX TODO
|
||||||
|
|
Loading…
Reference in a new issue