From 14924563bc249a42d685da4f3f87194146324b27 Mon Sep 17 00:00:00 2001 From: Julia Molin Date: Thu, 26 Sep 2024 01:44:26 -0700 Subject: [PATCH] Added --latest to glean restore Summary: Add ```--latest``` flag to ``` glean restore ``` Reviewed By: simonmar Differential Revision: D63266005 fbshipit-source-id: 0e3683628430f4e6e9ab2a96bd12d3d0c785c7de --- glean/tools/gleancli/GleanCLI/Restore.hs | 39 ++++++++++++++++++++---- glean/website/docs/cli.md | 2 +- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/glean/tools/gleancli/GleanCLI/Restore.hs b/glean/tools/gleancli/GleanCLI/Restore.hs index 5986e42a7..c098cf7bc 100644 --- a/glean/tools/gleancli/GleanCLI/Restore.hs +++ b/glean/tools/gleancli/GleanCLI/Restore.hs @@ -50,6 +50,12 @@ data WhatToRestore = RestoreLocator Text | RestoreDb Repo | RestoreDbOnDay Text Day + | RestoreDbLatest Text + +data RestoreDbSpec + = InstanceOpt Text + | DateOpt Day + | LatestOpt data RestoreCommand = Restore @@ -77,10 +83,12 @@ instance Plugin RestoreCommand where (RestoreLocator <$> locator) <|> (RestoreDb <$> dbSlash) <|> do repoName <- dbNameOpt - spec <- Left <$> dbInstanceOpt <|> Right <$> dayOpt + spec <- InstanceOpt <$> dbInstanceOpt <|> DateOpt <$> dayOpt + <|> latestOpt return $ case spec of - Left hash -> RestoreDb (Repo repoName hash) - Right day -> RestoreDbOnDay repoName day + InstanceOpt hash -> RestoreDb (Repo repoName hash) + DateOpt day -> RestoreDbOnDay repoName day + LatestOpt -> RestoreDbLatest repoName parseDay = return . parseTimeOrError False defaultTimeLocale (iso8601DateFormat Nothing) @@ -90,6 +98,10 @@ instance Plugin RestoreCommand where <> metavar "YYYY-MM-DD" <> help "find a DB for this date (UTC)") + latestOpt = flag' LatestOpt + (long "latest" + <> help "find latest instance") + runCommand _ _ backend Restore{..} = do targets <- locatorsToRestore restore targets @@ -115,9 +127,6 @@ instance Plugin RestoreCommand where RestoreDbOnDay repoName day -> do databases <- listWithBackups let - dbTime Database{..} = - fromMaybe database_created_since_epoch - database_repo_hash_time matchingDay = listToMaybe [ database_repo | db@Database{..} <- sortOn dbTime databases @@ -134,6 +143,20 @@ instance Plugin RestoreCommand where Nothing -> die 1 $ unwords ["Cannot find backup locator for", Text.unpack repoName, "on" , formatTime defaultTimeLocale (iso8601DateFormat Nothing) day ] + RestoreDbLatest repoName -> do + databases <- listWithBackups + let latestRepo = listToMaybe $ reverse + [ database_repo + | Database{..} <- sortOn dbTime databases + , repo_name database_repo == repoName + ] + case latestRepo of + Just repo -> do + let deps = if ignoreDependencies + then [] + else dependencies databases repo + withLocator databases $ repo : deps + Nothing -> die 1 $ "Cannot find repo for " <> Text.unpack repoName getDependenciesOneByOne sites db = do case database_dependencies db of @@ -153,6 +176,10 @@ instance Plugin RestoreCommand where dieHere repo = die 1 $ "Cannot find " <> show repo + dbTime Database{..} = + fromMaybe database_created_since_epoch + database_repo_hash_time + withLocator :: [Database] -> [Repo] -> IO [(Locator, Maybe Repo)] withLocator databases repos = forM repos $ \repo -> do locator <- repoLocator databases repo diff --git a/glean/website/docs/cli.md b/glean/website/docs/cli.md index a0921f097..3bfc404e9 100644 --- a/glean/website/docs/cli.md +++ b/glean/website/docs/cli.md @@ -176,7 +176,7 @@ DB location, see `:list-all` in glean shell. Alternatively the DB to restore can be specified by: -* `--db NAME/INSTANCE` or `--db-name NAME` and (`--db-instance INSTANCE` or `--date YYY-MM-DD`) +* `--db NAME/INSTANCE` or `--db-name NAME` and (`--db-instance INSTANCE` or `--date YYY-MM-DD` or `--latest`) ### `glean validate`