fix ossbackend only returned 100 workspaces

This commit is contained in:
zjd 2020-07-21 11:18:00 +08:00
parent f8e3456867
commit 25de713214
2 changed files with 61 additions and 12 deletions

View File

@ -57,28 +57,39 @@ func (b *Backend) Workspaces() ([]string, error) {
} }
var options []oss.Option var options []oss.Option
options = append(options, oss.Prefix(b.statePrefix+"/")) options = append(options, oss.Prefix(b.statePrefix+"/"), oss.MaxKeys(1000))
resp, err := bucket.ListObjects(options...) resp, err := bucket.ListObjects(options...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
result := []string{backend.DefaultStateName} result := []string{backend.DefaultStateName}
prefix := b.statePrefix prefix := b.statePrefix
lastObj := ""
for {
for _, obj := range resp.Objects { for _, obj := range resp.Objects {
// we have 3 parts, the state prefix, the workspace name, and the state file: <prefix>/<worksapce-name>/<key> // we have 3 parts, the state prefix, the workspace name, and the state file: <prefix>/<worksapce-name>/<key>
if path.Join(b.statePrefix, b.stateKey) == obj.Key { if path.Join(b.statePrefix, b.stateKey) == obj.Key {
// filter the default workspace // filter the default workspace
continue continue
} }
lastObj = obj.Key
parts := strings.Split(strings.TrimPrefix(obj.Key, prefix+"/"), "/") parts := strings.Split(strings.TrimPrefix(obj.Key, prefix+"/"), "/")
if len(parts) > 0 && parts[0] != "" { if len(parts) > 0 && parts[0] != "" {
result = append(result, parts[0]) result = append(result, parts[0])
} }
} }
if resp.IsTruncated {
if len(options) == 3 {
options[2] = oss.Marker(lastObj)
} else {
options = append(options, oss.Marker(lastObj))
}
resp, err = bucket.ListObjects(options...)
} else {
break
}
}
sort.Strings(result[1:]) sort.Strings(result[1:])
return result, nil return result, nil
} }

View File

@ -67,6 +67,44 @@ func TestBackendConfig(t *testing.T) {
} }
} }
func TestBackendConfigWorkSpace(t *testing.T) {
testACC(t)
config := map[string]interface{}{
"region": "cn-beijing",
"bucket": "terraform-backend-oss-test",
"prefix": "mystate",
"key": "first.tfstate",
"tablestore_endpoint": "https://terraformstate.cn-beijing.ots.aliyuncs.com",
"tablestore_table": "TableStore",
}
b := backend.TestBackendConfig(t, New(), backend.TestWrapConfig(config)).(*Backend)
createOSSBucket(t, b.ossClient, "terraform-backend-oss-test")
defer deleteOSSBucket(t, b.ossClient, "terraform-backend-oss-test")
if _, err := b.Workspaces(); err != nil {
t.Fatal(err.Error())
}
if !strings.HasPrefix(b.ossClient.Config.Endpoint, "https://oss-cn-beijing") {
t.Fatalf("Incorrect region was provided")
}
if b.bucketName != "terraform-backend-oss-test" {
t.Fatalf("Incorrect bucketName was provided")
}
if b.statePrefix != "mystate" {
t.Fatalf("Incorrect state file path was provided")
}
if b.stateKey != "first.tfstate" {
t.Fatalf("Incorrect keyName was provided")
}
if b.ossClient.Config.AccessKeyID == "" {
t.Fatalf("No Access Key Id was provided")
}
if b.ossClient.Config.AccessKeySecret == "" {
t.Fatalf("No Secret Access Key was provided")
}
}
func TestBackendConfigProfile(t *testing.T) { func TestBackendConfigProfile(t *testing.T) {
testACC(t) testACC(t)
config := map[string]interface{}{ config := map[string]interface{}{