@@ -21,38 +21,46 @@ import (
2121 "path/filepath"
2222 "strings"
2323
24- "github.com/cortexlabs/cortex/pkg/lib/files"
25- "github.com/cortexlabs/cortex/pkg/lib/msgpack"
26-
2724 "github.com/aws/aws-sdk-go/aws"
25+ "github.com/aws/aws-sdk-go/aws/endpoints"
26+ "github.com/aws/aws-sdk-go/aws/session"
2827 "github.com/aws/aws-sdk-go/service/s3"
2928
3029 "github.com/cortexlabs/cortex/pkg/lib/errors"
30+ "github.com/cortexlabs/cortex/pkg/lib/files"
3131 "github.com/cortexlabs/cortex/pkg/lib/json"
32+ "github.com/cortexlabs/cortex/pkg/lib/msgpack"
3233 "github.com/cortexlabs/cortex/pkg/lib/parallel"
34+ "github.com/cortexlabs/cortex/pkg/lib/sets/strset"
3335 s "github.com/cortexlabs/cortex/pkg/lib/strings"
3436)
3537
36- func (c * Client ) S3Path (key string ) string {
37- return "s3://" + filepath .Join (c .Bucket , key )
38- }
38+ const DefaultS3Region string = endpoints .UsWest2RegionID
3939
40- func (c * Client ) IsS3File (key string ) (bool , error ) {
41- return c .IsS3FileExternal (c .Bucket , key )
42- }
40+ var S3Regions strset.Set
4341
44- func (c * Client ) IsS3Dir (dirPath string ) (bool , error ) {
45- prefix := s .EnsureSuffix (dirPath , "/" )
46- return c .IsS3Prefix (prefix )
42+ func init () {
43+ resolver := endpoints .DefaultResolver ()
44+ partitions := resolver .(endpoints.EnumPartitions ).Partitions ()
45+
46+ S3Regions = strset .New ()
47+
48+ for _ , p := range partitions {
49+ if p .ID () == endpoints .AwsPartitionID || p .ID () == endpoints .AwsCnPartitionID {
50+ for id := range p .Regions () {
51+ S3Regions .Add (id )
52+ }
53+ }
54+ }
4755}
4856
49- func (c * Client ) IsS3Prefix ( prefix string ) ( bool , error ) {
50- return c . IsS3PrefixExternal (c .Bucket , prefix )
57+ func (c * Client ) S3Path ( key string ) string {
58+ return "s3://" + filepath . Join (c .Bucket , key )
5159}
5260
53- func (c * Client ) IsS3FileExternal ( bucket string , key string ) (bool , error ) {
61+ func (c * Client ) IsS3File ( key string ) (bool , error ) {
5462 _ , err := c .s3Client .HeadObject (& s3.HeadObjectInput {
55- Bucket : aws .String (bucket ),
63+ Bucket : aws .String (c . Bucket ),
5664 Key : aws .String (key ),
5765 })
5866
@@ -66,9 +74,14 @@ func (c *Client) IsS3FileExternal(bucket string, key string) (bool, error) {
6674 return true , nil
6775}
6876
69- func (c * Client ) IsS3PrefixExternal (bucket string , prefix string ) (bool , error ) {
77+ func (c * Client ) IsS3Dir (dirPath string ) (bool , error ) {
78+ prefix := s .EnsureSuffix (dirPath , "/" )
79+ return c .IsS3Prefix (prefix )
80+ }
81+
82+ func (c * Client ) IsS3Prefix (prefix string ) (bool , error ) {
7083 out , err := c .s3Client .ListObjectsV2 (& s3.ListObjectsV2Input {
71- Bucket : aws .String (bucket ),
84+ Bucket : aws .String (c . Bucket ),
7285 Prefix : aws .String (prefix ),
7386 })
7487
@@ -80,14 +93,6 @@ func (c *Client) IsS3PrefixExternal(bucket string, prefix string) (bool, error)
8093 return hasPrefix , nil
8194}
8295
83- func (c * Client ) IsS3aPrefixExternal (s3aPath string ) (bool , error ) {
84- bucket , prefix , err := SplitS3aPath (s3aPath )
85- if err != nil {
86- return false , err
87- }
88- return c .IsS3PrefixExternal (bucket , prefix )
89- }
90-
9196func (c * Client ) UploadBytesToS3 (data []byte , key string ) error {
9297 _ , err := c .s3Client .PutObject (& s3.PutObjectInput {
9398 Body : bytes .NewReader (data ),
@@ -253,3 +258,29 @@ func SplitS3aPath(s3aPath string) (string, string, error) {
253258
254259 return bucket , key , nil
255260}
261+
262+ func IsS3PrefixExternal (bucket string , prefix string , region string ) (bool , error ) {
263+ sess := session .Must (session .NewSession (& aws.Config {
264+ Region : aws .String (region ),
265+ }))
266+
267+ out , err := s3 .New (sess ).ListObjectsV2 (& s3.ListObjectsV2Input {
268+ Bucket : aws .String (bucket ),
269+ Prefix : aws .String (prefix ),
270+ })
271+
272+ if err != nil {
273+ return false , errors .Wrap (err , prefix )
274+ }
275+
276+ hasPrefix := * out .KeyCount > 0
277+ return hasPrefix , nil
278+ }
279+
280+ func IsS3aPrefixExternal (s3aPath string , region string ) (bool , error ) {
281+ bucket , prefix , err := SplitS3aPath (s3aPath )
282+ if err != nil {
283+ return false , err
284+ }
285+ return IsS3PrefixExternal (bucket , prefix , region )
286+ }
0 commit comments