Skip to content

Commit f5ccf3d

Browse files
committed
Fix changes brought in by #1544 + others
1 parent b383d11 commit f5ccf3d

File tree

4 files changed

+123
-21
lines changed

4 files changed

+123
-21
lines changed

cli/cmd/gcp_cluster.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,9 @@ func upGCP(gcpPath string) {
8383
}
8484

8585
GCP := &gcp.Client{}
86-
if exists, err := GCP.BucketExists(gcpConfig.Bucket); err != nil {
86+
err = GCP.CreateBucket(gcpConfig.Bucket, gcpConfig.Project, true)
87+
if err != nil {
8788
exit.Error(err)
88-
} else if !exists {
89-
err = GCP.CreateBucket(gcpConfig.Bucket, gcpConfig.Project)
90-
if err != nil {
91-
exit.Error(err)
92-
}
9389
}
9490

9591
fmt.Print("○ spinning up a cluster .")

pkg/lib/gcp/errors.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
Copyright 2020 Cortex Labs, Inc.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package gcp
18+
19+
import (
20+
"github.com/cortexlabs/cortex/pkg/lib/errors"
21+
"github.com/cortexlabs/cortex/pkg/lib/pointer"
22+
"google.golang.org/api/googleapi"
23+
)
24+
25+
const (
26+
YouAlreadyOwnThisBucketErrorMessage = "You already own this bucket. Please select another name."
27+
InvalidBucketNameErrorMessage = "Sorry, that name is not available. Please try a different one."
28+
)
29+
30+
func IsGCPError(err error) bool {
31+
_, ok := errors.CauseOrSelf(err).(*googleapi.Error)
32+
return ok
33+
}
34+
35+
func IsErrCode(err error, errorCode int, errorMessage *string) bool {
36+
gcpError, ok := errors.CauseOrSelf(err).(*googleapi.Error)
37+
if !ok {
38+
return false
39+
}
40+
if gcpError.Code == errorCode {
41+
if errorMessage != nil && gcpError.Message == *errorMessage {
42+
return true
43+
}
44+
if errorMessage != nil && gcpError.Message != *errorMessage {
45+
return false
46+
}
47+
return true
48+
}
49+
return false
50+
}
51+
52+
func DoesBucketAlreadyExistError(err error) bool {
53+
return IsErrCode(err, 409, pointer.String(YouAlreadyOwnThisBucketErrorMessage))
54+
}
55+
56+
func IsInvalidBucketNameError(err error) bool {
57+
return IsErrCode(err, 409, pointer.String(InvalidBucketNameErrorMessage))
58+
}

pkg/lib/gcp/gcs.go

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,35 +21,38 @@ import (
2121
"context"
2222
"encoding/json"
2323
"path/filepath"
24+
"strings"
2425

2526
"cloud.google.com/go/storage"
27+
"github.com/cortexlabs/cortex/pkg/lib/debug"
2628
"github.com/cortexlabs/cortex/pkg/lib/errors"
29+
"github.com/cortexlabs/cortex/pkg/lib/sets/strset"
2730
s "github.com/cortexlabs/cortex/pkg/lib/strings"
31+
"google.golang.org/api/googleapi"
2832
"google.golang.org/api/iterator"
2933
)
3034

3135
func GCSPath(bucket string, key string) string {
3236
return "gs://" + filepath.Join(bucket, key)
3337
}
3438

35-
func (c *Client) BucketExists(bucket string) (bool, error) {
36-
gcsClient, err := c.GCS()
37-
if err != nil {
38-
return false, err
39-
}
40-
_, err = gcsClient.Bucket(bucket).Attrs(context.Background())
41-
// TODO fix this
42-
return err == nil, nil
43-
}
44-
45-
func (c *Client) CreateBucket(bucket, projectID string) error {
39+
func (c *Client) CreateBucket(bucket, projectID string, ignoreErrorIfBucketExists bool) error {
4640
gcsClient, err := c.GCS()
4741
if err != nil {
4842
return err
4943
}
5044
err = gcsClient.Bucket(bucket).Create(context.Background(), projectID, nil)
5145
if err != nil {
52-
return err
46+
if e, ok := err.(*googleapi.Error); ok {
47+
debug.Ppg(e)
48+
}
49+
if DoesBucketAlreadyExistError(err) {
50+
if !ignoreErrorIfBucketExists {
51+
return err
52+
}
53+
} else {
54+
return err
55+
}
5356
}
5457
return nil
5558
}
@@ -162,3 +165,38 @@ func (c *Client) ReadBytesFromGCS(bucket string, key string) ([]byte, error) {
162165
}
163166
return buf.Bytes(), nil
164167
}
168+
169+
func (c *Client) ListGCSDirOneLevel(bucket string, gcsDir string, maxResults *int64) ([]string, error) {
170+
gcsClient, err := c.GCS()
171+
if err != nil {
172+
return nil, err
173+
}
174+
175+
gcsDir = s.EnsureSuffix(gcsDir, "/")
176+
177+
objectIterator := gcsClient.Bucket(bucket).Objects(context.Background(), &storage.Query{
178+
Prefix: gcsDir,
179+
})
180+
181+
allNames := strset.New()
182+
183+
for {
184+
attrs, err := objectIterator.Next()
185+
if err == iterator.Done {
186+
break
187+
}
188+
if err != nil {
189+
return nil, err
190+
}
191+
192+
relativePath := strings.TrimPrefix(attrs.Name, gcsDir)
193+
oneLevelPath := strings.Split(relativePath, "/")[0]
194+
allNames.Add(oneLevelPath)
195+
196+
if maxResults != nil && int64(len(allNames)) >= *maxResults {
197+
break
198+
}
199+
}
200+
201+
return allNames.SliceSorted(), nil
202+
}

pkg/operator/resources/resources.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -407,10 +407,20 @@ func GetAPIByID(apiName string, apiID string) ([]schema.APIResponse, error) {
407407

408408
func getPastAPIDeploys(apiName string) ([]schema.APIVersion, error) {
409409
var apiVersions []schema.APIVersion
410+
var apiIDs []string
411+
var err error
410412

411-
apiIDs, err := config.AWS.ListS3DirOneLevel(config.Cluster.Bucket, spec.KeysPrefix(apiName, config.Cluster.ClusterName), pointer.Int64(10))
412-
if err != nil {
413-
return nil, err
413+
if config.Provider == types.AWSProviderType {
414+
apiIDs, err = config.AWS.ListS3DirOneLevel(config.Cluster.Bucket, spec.KeysPrefix(apiName, config.Cluster.ClusterName), pointer.Int64(10))
415+
if err != nil {
416+
return nil, err
417+
}
418+
}
419+
if config.Provider == types.GCPProviderType {
420+
apiIDs, err = config.GCP.ListGCSDirOneLevel(config.GCPCluster.Bucket, spec.KeysPrefix(apiName, config.GCPCluster.ClusterName), pointer.Int64(10))
421+
if err != nil {
422+
return nil, err
423+
}
414424
}
415425

416426
for _, apiID := range apiIDs {

0 commit comments

Comments
 (0)