code logic for version checkpoints instead of env vars for more optionality (#135)

This commit is contained in:
Lucy C
2023-05-16 16:55:35 -06:00
committed by GitHub
parent 1a1169f371
commit 683b9d1712
8 changed files with 35 additions and 32 deletions

View File

@@ -36,8 +36,7 @@ tor-port: "_env:TOR_PORT:447"
static-bin-dir: "_env:STATIC_BIN:/usr/local/bin/" static-bin-dir: "_env:STATIC_BIN:/usr/local/bin/"
error-log-root: "_env:ERROR_LOG_ROOT:/var/log/registry/" error-log-root: "_env:ERROR_LOG_ROOT:/var/log/registry/"
marketplace-name: "_env:MARKETPLACE_NAME:CHANGE ME" marketplace-name: "_env:MARKETPLACE_NAME:CHANGE ME"
max-eos-version: "_env:MAX_VERSION:0.3.4.0" community-version: "_env:COMMUNITY_VERSION:0.3.3.0"
min-eos-version: "_env:MIN_VERSION:0.3.4.0"
run-migration: "_env:RUN_MIGRATION:false" run-migration: "_env:RUN_MIGRATION:false"
whitelist: "_env:WHITELIST:" whitelist: "_env:WHITELIST:"

View File

@@ -11,7 +11,7 @@ import Database.Persist.Sql (
SqlBackend, SqlBackend,
) )
import Lib.Types.Core ( import Lib.Types.Core (
PkgId, OsArch (X86_64, AARCH64), PkgId, OsArch (X86_64, AARCH64_NONFREE),
) )
import Lib.Types.Emver (Version) import Lib.Types.Emver (Version)
import Model ( import Model (
@@ -330,7 +330,7 @@ upsertPackageVersionPlatform :: (MonadUnliftIO m) => PackageManifest -> ReaderT
upsertPackageVersionPlatform PackageManifest{..} = do upsertPackageVersionPlatform PackageManifest{..} = do
now <- liftIO getCurrentTime now <- liftIO getCurrentTime
let pkgId = PkgRecordKey packageManifestId let pkgId = PkgRecordKey packageManifestId
let arches = [X86_64, AARCH64] let arches = [X86_64 .. AARCH64_NONFREE]
let records = createVersionPlatformRecord now pkgId packageManifestVersion <$> arches let records = createVersionPlatformRecord now pkgId packageManifestVersion <$> arches
repsertMany records repsertMany records
where where

View File

@@ -17,18 +17,18 @@ import Database.Esqueleto.Experimental (
(^.), (^.),
(==.) (==.)
) )
import Foundation (Handler, RegistryCtx (appSettings)) import Foundation (Handler)
import Handler.Package.V0.ReleaseNotes (ReleaseNotes (..)) import Handler.Package.V0.ReleaseNotes (ReleaseNotes (..))
import Handler.Util (queryParamAs, getArchQuery) import Handler.Util (queryParamAs, getArchQuery)
import Lib.Types.Emver (Version (unVersion), Version(Version), parseVersion) import Lib.Types.Emver (Version (unVersion), Version(Version), parseVersion)
import Model (EntityField (..), OsVersion (..)) import Model (EntityField (..), OsVersion (..))
import Orphans.Emver () import Orphans.Emver ()
import Startlude (Down (..), Eq, Generic, Maybe (..), Ord ((<)), Show, Text, filter, fst, head, pure, sortOn, ($), (&&&), (.), (<$>), (<&>), (<=)) import Startlude (Down (..), Eq, Generic, Maybe (..), Ord ((<)), Text, filter, fst, head, pure, sortOn, ($), (&&&), (.), (<$>), (<&>), (<=))
import Yesod (ToContent (toContent), ToTypedContent (..), YesodPersist (runDB), getsYesod) import Yesod (ToContent (toContent), ToTypedContent (..), YesodPersist (runDB))
import Yesod.Core.Types (JSONResponse (..)) import Yesod.Core.Types (JSONResponse (..))
import Settings (AppSettings(maxOsVersion))
import Lib.Types.Core (OsArch(RASPBERRYPI)) import Lib.Types.Core (OsArch(RASPBERRYPI))
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import GHC.Show
data EosRes = EosRes data EosRes = EosRes
@@ -49,15 +49,15 @@ instance ToTypedContent EosRes where
getEosVersionR :: Handler (JSONResponse (Maybe EosRes)) getEosVersionR :: Handler (JSONResponse (Maybe EosRes))
getEosVersionR = do getEosVersionR = do
currentEosVersion <- fromMaybe Version { unVersion = (0,3,0,0) } <$> queryParamAs "eos-version" parseVersion currentEosVersion <- fromMaybe Version { unVersion = (0,3,0,0) } <$> queryParamAs "eos-version" parseVersion
-- defaults to raspberrypi for those on OS versions where we did not send this param yet
arch <- fromMaybe RASPBERRYPI <$> getArchQuery arch <- fromMaybe RASPBERRYPI <$> getArchQuery
maxVersion <- getsYesod $ maxOsVersion . appSettings
allEosVersions <- runDB $ allEosVersions <- runDB $
select $ do select $ do
vers <- from $ table @OsVersion vers <- from $ table @OsVersion
where_ (vers ^. OsVersionArch ==. val (Just arch)) where_ (vers ^. OsVersionArch ==. val (Just arch))
orderBy [desc (vers ^. OsVersionNumber)] orderBy [desc (vers ^. OsVersionNumber)]
pure vers pure vers
let osV = determineMaxEosVersionAvailable maxVersion currentEosVersion $ entityVal <$> allEosVersions let osV = determineMaxOsVersionAvailable currentEosVersion $ entityVal <$> allEosVersions
let mLatest = head osV let mLatest = head osV
let mappedVersions = let mappedVersions =
ReleaseNotes $ ReleaseNotes $
@@ -74,8 +74,10 @@ getEosVersionR = do
, eosResReleaseNotes = mappedVersions , eosResReleaseNotes = mappedVersions
} }
determineMaxEosVersionAvailable :: Version -> Version -> [OsVersion] -> [OsVersion] determineMaxOsVersionAvailable :: Version -> [OsVersion] -> [OsVersion]
determineMaxEosVersionAvailable maxEosVersion currentEosVersion versions = do determineMaxOsVersionAvailable currentEosVersion versions = do
if (currentEosVersion < maxEosVersion) if (currentEosVersion < Version (0,3,2,1))
then sortOn (Down . osVersionNumber) $ filter (\v -> osVersionNumber v <= maxEosVersion) $ versions then sortOn (Down . osVersionNumber) $ filter (\v -> osVersionNumber v <= Version(0,3,2,1)) $ versions
else versions else if (currentEosVersion < Version(0,3,4,0))
then sortOn (Down . osVersionNumber) $ filter (\v -> osVersionNumber v <= Version(0,3,4,0)) $ versions
else versions

View File

@@ -20,7 +20,7 @@ import Startlude (Bool (True), Down (Down), Either (..), Generic, Maybe (..), No
import Yesod (ToContent (..), ToTypedContent (..), YesodPersist (runDB), YesodRequest (reqGetParams), getRequest, sendResponseStatus) import Yesod (ToContent (..), ToTypedContent (..), YesodPersist (runDB), YesodRequest (reqGetParams), getRequest, sendResponseStatus)
import Handler.Util (getArchQuery, filterDeprecatedVersions) import Handler.Util (getArchQuery, filterDeprecatedVersions)
import Yesod.Core (getsYesod) import Yesod.Core (getsYesod)
import Settings (AppSettings(minOsVersion)) import Settings (AppSettings(communityVersion))
newtype VersionLatestRes = VersionLatestRes (HashMap PkgId (Maybe Version)) newtype VersionLatestRes = VersionLatestRes (HashMap PkgId (Maybe Version))
@@ -40,7 +40,7 @@ getVersionLatestR = do
Nothing -> const True Nothing -> const True
Just v -> flip satisfies v Just v -> flip satisfies v
osArch <- getArchQuery osArch <- getArchQuery
minOsVersion <- getsYesod $ minOsVersion . appSettings communityServiceDeprecationVersion <- getsYesod $ communityVersion . appSettings
do do
case lookup "ids" getParameters of case lookup "ids" getParameters of
Nothing -> sendResponseStatus status400 (InvalidParamsE "get:ids" "<MISSING>") Nothing -> sendResponseStatus status400 (InvalidParamsE "get:ids" "<MISSING>")
@@ -57,8 +57,8 @@ getVersionLatestR = do
.| collateVersions .| collateVersions
-- filter out versions of apps that are incompatible with the OS predicate -- filter out versions of apps that are incompatible with the OS predicate
.| mapC (second (filter (osPredicate' . versionRecordOsVersion))) .| mapC (second (filter (osPredicate' . versionRecordOsVersion)))
-- filter out deprecated service versions after a min os version -- filter out deprecated service versions after community registry release
.| mapC (second (filterDeprecatedVersions minOsVersion osPredicate')) .| mapC (second (filterDeprecatedVersions communityServiceDeprecationVersion osPredicate'))
-- prune empty version sets -- prune empty version sets
.| concatMapC (\(pkgId, vs) -> (pkgId,) <$> nonEmpty vs) .| concatMapC (\(pkgId, vs) -> (pkgId,) <$> nonEmpty vs)
-- grab the latest matching version if it exists -- grab the latest matching version if it exists

View File

@@ -34,7 +34,7 @@ import Lib.Types.Core (PkgId)
import Lib.Types.Emver (Version, VersionRange (..), parseRange, satisfies, (<||)) import Lib.Types.Emver (Version, VersionRange (..), parseRange, satisfies, (<||))
import Model (Category (..), Key (..), PkgDependency (..), VersionRecord (..), PkgRecord (pkgRecordHidden)) import Model (Category (..), Key (..), PkgDependency (..), VersionRecord (..), PkgRecord (pkgRecordHidden))
import Protolude.Unsafe (unsafeFromJust) import Protolude.Unsafe (unsafeFromJust)
import Settings (AppSettings (minOsVersion)) import Settings (AppSettings (communityVersion))
import Startlude ( import Startlude (
Applicative ((*>)), Applicative ((*>)),
Bifunctor (..), Bifunctor (..),
@@ -119,7 +119,7 @@ getPackageIndexR = do
Nothing -> const True Nothing -> const True
Just v -> flip satisfies v Just v -> flip satisfies v
osArch <- getArchQuery osArch <- getArchQuery
minOsVersion <- getsYesod $ minOsVersion . appSettings communityVersion <- getsYesod $ communityVersion . appSettings
do do
pkgIds <- getPkgIdsQuery pkgIds <- getPkgIdsQuery
category <- getCategoryQuery category <- getCategoryQuery
@@ -140,8 +140,8 @@ getPackageIndexR = do
.| collateVersions .| collateVersions
-- filter out versions of apps that are incompatible with the OS predicate -- filter out versions of apps that are incompatible with the OS predicate
.| mapC (second (filter (osPredicate . versionRecordOsVersion))) .| mapC (second (filter (osPredicate . versionRecordOsVersion)))
-- filter out deprecated service versions after a min os version -- filter out deprecated service versions after community registry release
.| mapC (second (filterDeprecatedVersions minOsVersion osPredicate)) .| mapC (second (filterDeprecatedVersions communityVersion osPredicate))
-- prune empty version sets -- prune empty version sets
.| concatMapC (\(pkgId, vs) -> (pkgId,) <$> nonEmpty vs) .| concatMapC (\(pkgId, vs) -> (pkgId,) <$> nonEmpty vs)
-- grab the latest matching version if it exists -- grab the latest matching version if it exists

View File

@@ -178,7 +178,7 @@ getArchQuery :: Handler (Maybe OsArch)
getArchQuery = parseQueryParam "arch" ((flip $ note . mappend "Invalid 'arch': ") =<< readMaybe) getArchQuery = parseQueryParam "arch" ((flip $ note . mappend "Invalid 'arch': ") =<< readMaybe)
filterDeprecatedVersions :: Version -> (Version -> Bool) -> [VersionRecord] -> [VersionRecord] filterDeprecatedVersions :: Version -> (Version -> Bool) -> [VersionRecord] -> [VersionRecord]
filterDeprecatedVersions minOsVersion osPredicate vrs = do filterDeprecatedVersions communityVersion osPredicate vrs = do
if (osPredicate minOsVersion) if (osPredicate communityVersion)
then filter (\v -> not $ isJust $ versionRecordDeprecatedAt v) $ vrs then filter (\v -> not $ isJust $ versionRecordDeprecatedAt v) $ vrs
else vrs else vrs

View File

@@ -27,7 +27,7 @@ import Startlude (
show, show,
symbolVal, symbolVal,
($), ($),
(.), (.), Enum,
) )
import Data.Aeson ( import Data.Aeson (
@@ -89,17 +89,21 @@ instance PathPiece PkgId where
fromPathPiece = fmap PkgId . fromPathPiece fromPathPiece = fmap PkgId . fromPathPiece
toPathPiece = unPkgId toPathPiece = unPkgId
data OsArch = X86_64 | AARCH64 | RASPBERRYPI data OsArch = X86_64 | AARCH64 | RASPBERRYPI | X86_64_NONFREE | AARCH64_NONFREE
deriving (Eq, Ord) deriving (Eq, Ord, Enum)
instance Show OsArch where instance Show OsArch where
show X86_64 = "x86_64" show X86_64 = "x86_64"
show AARCH64 = "aarch64" show AARCH64 = "aarch64"
show RASPBERRYPI = "raspberrypi" show RASPBERRYPI = "raspberrypi"
show X86_64_NONFREE = "x86_64-nonfree"
show AARCH64_NONFREE = "aarch64-nonfree"
instance Read OsArch where instance Read OsArch where
readsPrec _ "x86_64" = [(X86_64, "")] readsPrec _ "x86_64" = [(X86_64, "")]
readsPrec _ "aarch64" = [(AARCH64, "")] readsPrec _ "aarch64" = [(AARCH64, "")]
readsPrec _ "raspberrypi" = [(RASPBERRYPI, "")] readsPrec _ "raspberrypi" = [(RASPBERRYPI, "")]
readsPrec _ "rasberrypi" = [(RASPBERRYPI, "")] readsPrec _ "rasberrypi" = [(RASPBERRYPI, "")]
readsPrec _ "x86_64-nonfree" = [(X86_64_NONFREE, "")]
readsPrec _ "aarch64-nonfree" = [(AARCH64_NONFREE, "")]
readsPrec _ _ = [] readsPrec _ _ = []
instance PersistField OsArch where instance PersistField OsArch where
toPersistValue = PersistText . show toPersistValue = PersistText . show

View File

@@ -80,8 +80,7 @@ data AppSettings = AppSettings
-- ^ Should all log messages be displayed? -- ^ Should all log messages be displayed?
, errorLogRoot :: !FilePath , errorLogRoot :: !FilePath
, marketplaceName :: !Text , marketplaceName :: !Text
, maxOsVersion :: !Version , communityVersion :: !Version
, minOsVersion :: !Version
, registryHostname :: !Text , registryHostname :: !Text
, registryVersion :: !Version , registryVersion :: !Version
, resourcesDir :: !FilePath , resourcesDir :: !FilePath
@@ -117,8 +116,7 @@ instance FromJSON AppSettings where
appShouldLogAll <- o .:? "should-log-all" .!= False appShouldLogAll <- o .:? "should-log-all" .!= False
errorLogRoot <- o .: "error-log-root" errorLogRoot <- o .: "error-log-root"
marketplaceName <- o .: "marketplace-name" marketplaceName <- o .: "marketplace-name"
maxOsVersion <- o .: "max-eos-version" communityVersion <- o .: "community-version"
minOsVersion <- o .: "min-eos-version"
registryHostname <- o .: "registry-hostname" registryHostname <- o .: "registry-hostname"
resourcesDir <- o .: "resources-path" resourcesDir <- o .: "resources-path"
needsMigration <- o .: "run-migration" needsMigration <- o .: "run-migration"