S3 region=
S3: Support a region= configuration useful for some non-Amazon S3 implementations. This feature needs git-annex to be built with aws-0.24. datacenter= sets both the AWS hostname and region in one setting, which is easy when using AWS, but not useful for other hosts. So kept datacenter as-is, but added this additional config. Sponsored-By: Brett Eisenberg on Patreon
This commit is contained in:
parent
5aacc8eb59
commit
04ec726d3b
5 changed files with 53 additions and 7 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
git-annex (10.20230127) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* S3: Support a region= configuration useful for some non-Amazon S3
|
||||||
|
implementations. This feature needs git-annex to be built with aws-0.24.
|
||||||
|
|
||||||
|
-- Joey Hess <id@joeyh.name> Mon, 06 Feb 2023 13:39:18 -0400
|
||||||
|
|
||||||
git-annex (10.20230126) upstream; urgency=medium
|
git-annex (10.20230126) upstream; urgency=medium
|
||||||
|
|
||||||
* Change --metadata comparisons < > <= and >= to fall back to
|
* Change --metadata comparisons < > <= and >= to fall back to
|
||||||
|
|
27
Remote/S3.hs
27
Remote/S3.hs
|
@ -1,6 +1,6 @@
|
||||||
{- S3 remotes
|
{- S3 remotes
|
||||||
-
|
-
|
||||||
- Copyright 2011-2022 Joey Hess <id@joeyh.name>
|
- Copyright 2011-2023 Joey Hess <id@joeyh.name>
|
||||||
-
|
-
|
||||||
- Licensed under the GNU AGPL version 3 or higher.
|
- Licensed under the GNU AGPL version 3 or higher.
|
||||||
-}
|
-}
|
||||||
|
@ -83,6 +83,8 @@ remote = specialRemoteType $ RemoteType
|
||||||
(FieldDesc "S3 server hostname (default is Amazon S3)")
|
(FieldDesc "S3 server hostname (default is Amazon S3)")
|
||||||
, optionalStringParser datacenterField
|
, optionalStringParser datacenterField
|
||||||
(FieldDesc "S3 datacenter to use (US, EU, us-west-1, ..)")
|
(FieldDesc "S3 datacenter to use (US, EU, us-west-1, ..)")
|
||||||
|
, optionalStringParser regionField
|
||||||
|
(FieldDesc "S3 region to use")
|
||||||
, optionalStringParser partsizeField
|
, optionalStringParser partsizeField
|
||||||
(FieldDesc "part size for multipart upload (eg 1GiB)")
|
(FieldDesc "part size for multipart upload (eg 1GiB)")
|
||||||
, optionalStringParser storageclassField
|
, optionalStringParser storageclassField
|
||||||
|
@ -129,6 +131,9 @@ hostField = Accepted "host"
|
||||||
datacenterField :: RemoteConfigField
|
datacenterField :: RemoteConfigField
|
||||||
datacenterField = Accepted "datacenter"
|
datacenterField = Accepted "datacenter"
|
||||||
|
|
||||||
|
regionField :: RemoteConfigField
|
||||||
|
regionField = Accepted "region"
|
||||||
|
|
||||||
partsizeField :: RemoteConfigField
|
partsizeField :: RemoteConfigField
|
||||||
partsizeField = Accepted "partsize"
|
partsizeField = Accepted "partsize"
|
||||||
|
|
||||||
|
@ -914,6 +919,7 @@ s3Configuration c = cfg
|
||||||
}
|
}
|
||||||
where
|
where
|
||||||
h = fromJust $ getRemoteConfigValue hostField c
|
h = fromJust $ getRemoteConfigValue hostField c
|
||||||
|
r = encodeBS <$> getRemoteConfigValue regionField c
|
||||||
datacenter = fromJust $ getRemoteConfigValue datacenterField c
|
datacenter = fromJust $ getRemoteConfigValue datacenterField c
|
||||||
-- When the default S3 host is configured, connect directly to
|
-- When the default S3 host is configured, connect directly to
|
||||||
-- the S3 endpoint for the configured datacenter.
|
-- the S3 endpoint for the configured datacenter.
|
||||||
|
@ -948,8 +954,14 @@ s3Configuration c = cfg
|
||||||
| otherwise -> AWS.HTTP
|
| otherwise -> AWS.HTTP
|
||||||
cfg = case getRemoteConfigValue signatureField c of
|
cfg = case getRemoteConfigValue signatureField c of
|
||||||
Just (SignatureVersion 4) ->
|
Just (SignatureVersion 4) ->
|
||||||
S3.s3v4 proto endpoint False S3.SignWithEffort
|
(S3.s3v4 proto endpoint False S3.SignWithEffort)
|
||||||
_ -> S3.s3 proto endpoint False
|
#if MIN_VERSION_aws(0,24,0)
|
||||||
|
{ S3.s3Region = r }
|
||||||
|
#endif
|
||||||
|
_ -> (S3.s3 proto endpoint False)
|
||||||
|
#if MIN_VERSION_aws(0,24,0)
|
||||||
|
{ S3.s3Region = r }
|
||||||
|
#endif
|
||||||
|
|
||||||
data S3Info = S3Info
|
data S3Info = S3Info
|
||||||
{ bucket :: S3.Bucket
|
{ bucket :: S3.Bucket
|
||||||
|
@ -964,6 +976,7 @@ data S3Info = S3Info
|
||||||
, public :: Bool
|
, public :: Bool
|
||||||
, publicurl :: Maybe URLString
|
, publicurl :: Maybe URLString
|
||||||
, host :: Maybe String
|
, host :: Maybe String
|
||||||
|
, region :: Maybe String
|
||||||
}
|
}
|
||||||
|
|
||||||
extractS3Info :: ParsedRemoteConfig -> Annex S3Info
|
extractS3Info :: ParsedRemoteConfig -> Annex S3Info
|
||||||
|
@ -987,6 +1000,7 @@ extractS3Info c = do
|
||||||
getRemoteConfigValue publicField c
|
getRemoteConfigValue publicField c
|
||||||
, publicurl = getRemoteConfigValue publicurlField c
|
, publicurl = getRemoteConfigValue publicurlField c
|
||||||
, host = getRemoteConfigValue hostField c
|
, host = getRemoteConfigValue hostField c
|
||||||
|
, region = getRemoteConfigValue regionField c
|
||||||
}
|
}
|
||||||
|
|
||||||
putObject :: S3Info -> T.Text -> RequestBody -> S3.PutObject
|
putObject :: S3Info -> T.Text -> RequestBody -> S3.PutObject
|
||||||
|
@ -1126,7 +1140,12 @@ debugMapper level t = forward "Remote.S3" (T.unpack t)
|
||||||
s3Info :: ParsedRemoteConfig -> S3Info -> [(String, String)]
|
s3Info :: ParsedRemoteConfig -> S3Info -> [(String, String)]
|
||||||
s3Info c info = catMaybes
|
s3Info c info = catMaybes
|
||||||
[ Just ("bucket", fromMaybe "unknown" (getBucketName c))
|
[ Just ("bucket", fromMaybe "unknown" (getBucketName c))
|
||||||
, Just ("endpoint", w82s (BS.unpack (S3.s3Endpoint s3c)))
|
, Just ("endpoint", decodeBS (S3.s3Endpoint s3c))
|
||||||
|
#if MIN_VERSION_aws(0,24,0)
|
||||||
|
, case S3.s3Region s3c of
|
||||||
|
Nothing -> Nothing
|
||||||
|
Just r -> Just ("region", decodeBS r)
|
||||||
|
#endif
|
||||||
, Just ("port", show (S3.s3Port s3c))
|
, Just ("port", show (S3.s3Port s3c))
|
||||||
, Just ("protocol", map toLower (show (S3.s3Protocol s3c)))
|
, Just ("protocol", map toLower (show (S3.s3Protocol s3c)))
|
||||||
, Just ("storage class", showstorageclass (getStorageClass c))
|
, Just ("storage class", showstorageclass (getStorageClass c))
|
||||||
|
|
|
@ -28,3 +28,6 @@ Fedora Silverblue 37 / git-annex-10.20221212-1.fc37.x86_64
|
||||||
Yes, many years ago - now trying to get it up and running with my self-hosted S3 endpoint.
|
Yes, many years ago - now trying to get it up and running with my self-hosted S3 endpoint.
|
||||||
|
|
||||||
[1]: https://garagehq.deuxfleurs.fr/
|
[1]: https://garagehq.deuxfleurs.fr/
|
||||||
|
|
||||||
|
> [[fixed|done]] although it needs git-annex to be built against
|
||||||
|
> a not yet released version of aws. --[[Joey]]
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
[[!comment format=mdwn
|
||||||
|
username="joey"
|
||||||
|
subject="""comment 9"""
|
||||||
|
date="2023-02-06T17:33:25Z"
|
||||||
|
content="""
|
||||||
|
Implemented this in aws: https://github.com/aristidb/aws/pull/284
|
||||||
|
Which should be released as version 0.24.
|
||||||
|
|
||||||
|
git-annex will support region= when built with that version of aws.
|
||||||
|
"""]]
|
|
@ -34,9 +34,12 @@ the S3 remote.
|
||||||
Think carefully about who can access your repository before using
|
Think carefully about who can access your repository before using
|
||||||
embedcreds without gpg encryption.
|
embedcreds without gpg encryption.
|
||||||
|
|
||||||
* `datacenter` - Defaults to "US". Other values include "EU" (which is EU/Ireland),
|
* `datacenter` - Specifies which Amazon datacenter
|
||||||
"us-west-1", "us-west-2", "ap-southeast-1", "ap-southeast-2", and
|
to use for the bucket. Defaults to "US". Other values include "EU"
|
||||||
"sa-east-1".
|
(which is EU/Ireland), "us-west-1", "us-west-2", "ap-southeast-1",
|
||||||
|
"ap-southeast-2", and "sa-east-1". See Amazon's documentation for a
|
||||||
|
complete list. Configuring this is equivilant to configuring both
|
||||||
|
`host` and `region`.
|
||||||
|
|
||||||
* `storageclass` - Default is "STANDARD".
|
* `storageclass` - Default is "STANDARD".
|
||||||
Consult S3 provider documentation for pricing details and available
|
Consult S3 provider documentation for pricing details and available
|
||||||
|
@ -63,6 +66,10 @@ the S3 remote.
|
||||||
* `host` - Specify in order to use a different, S3 compatable
|
* `host` - Specify in order to use a different, S3 compatable
|
||||||
service.
|
service.
|
||||||
|
|
||||||
|
* `region` - Specify the region to use. Only makes sense to use when
|
||||||
|
you also set `host`.
|
||||||
|
(Requires a git-annex built with aws-0.24.)
|
||||||
|
|
||||||
* `protocol` - Either "http" (the default) or "https". Setting
|
* `protocol` - Either "http" (the default) or "https". Setting
|
||||||
protocol=https implies port=443.
|
protocol=https implies port=443.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue