Skip to content

Commit 841d4a7

Browse files
authored
[OBS] Fix incorrect signature calculation (#79)
[OBS] Fix incorrect signature calculation Partly revert #70: headers have to be stored lower case. Fix #78 Reviewed-by: Anton Sidelnikov <None> Reviewed-by: None <None> Reviewed-by: Rodion Gyrbu <[email protected]>
1 parent 63ac0f1 commit 841d4a7

File tree

5 files changed

+249
-126
lines changed

5 files changed

+249
-126
lines changed

.golangci.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
issues:
2+
exclude-rules:
3+
# Exclude some staticcheck messages
4+
- linters:
5+
- staticcheck
6+
text: "SA1008:"

acceptance/clients/clients.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99

1010
golangsdk "github.com/opentelekomcloud/gophertelekomcloud"
1111
"github.com/opentelekomcloud/gophertelekomcloud/openstack"
12+
"github.com/opentelekomcloud/gophertelekomcloud/openstack/identity/v3/credentials"
13+
"github.com/opentelekomcloud/gophertelekomcloud/openstack/obs"
1214
)
1315

1416
const envPrefix = "OS_"
@@ -221,6 +223,26 @@ func NewObjectStorageV1Client() (*golangsdk.ServiceClient, error) {
221223
})
222224
}
223225

226+
func NewOBSClient() (*obs.ObsClient, error) {
227+
cc, err := CloudAndClient()
228+
if err != nil {
229+
return nil, err
230+
}
231+
232+
if err := setupTemporaryAKSK(cc); err != nil {
233+
return nil, fmt.Errorf("failed to construct OBS client without AK/SK: %s", err)
234+
}
235+
236+
client, err := openstack.NewOBSService(cc.ProviderClient, golangsdk.EndpointOpts{
237+
Region: cc.RegionName,
238+
})
239+
if err != nil {
240+
return nil, err
241+
}
242+
opts := cc.AKSKAuthOptions
243+
return obs.New(opts.AccessKey, opts.SecretKey, client.Endpoint, obs.WithSecurityToken(opts.SecurityToken))
244+
}
245+
224246
// NewSharedFileSystemV2Client returns a *ServiceClient for making calls
225247
// to the OpenStack Shared File System v2 API. An error will be returned
226248
// if authentication or client creation was not possible.
@@ -357,3 +379,26 @@ func CloudAndClient() (*cc, error) {
357379
}
358380
return &cc{cloud, client}, nil
359381
}
382+
383+
func setupTemporaryAKSK(config *cc) error {
384+
if config.AKSKAuthOptions.AccessKey != "" {
385+
return nil
386+
}
387+
388+
client, err := NewIdentityV3Client()
389+
if err != nil {
390+
return fmt.Errorf("error creating identity v3 domain client: %s", err)
391+
}
392+
credential, err := credentials.CreateTemporary(client, credentials.CreateTemporaryOpts{
393+
Methods: []string{"token"},
394+
Token: client.Token(),
395+
}).Extract()
396+
if err != nil {
397+
return fmt.Errorf("error creating temporary AK/SK: %s", err)
398+
}
399+
400+
config.AKSKAuthOptions.AccessKey = credential.AccessKey
401+
config.AKSKAuthOptions.SecretKey = credential.SecretKey
402+
config.AKSKAuthOptions.SecurityToken = credential.SecurityToken
403+
return nil
404+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package v1
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
"github.com/opentelekomcloud/gophertelekomcloud/acceptance/clients"
8+
"github.com/opentelekomcloud/gophertelekomcloud/acceptance/tools"
9+
"github.com/opentelekomcloud/gophertelekomcloud/openstack/obs"
10+
th "github.com/opentelekomcloud/gophertelekomcloud/testhelper"
11+
)
12+
13+
func TestObsBucketLifecycle(t *testing.T) {
14+
client, err := clients.NewOBSClient()
15+
th.AssertNoErr(t, err)
16+
17+
bucketName := strings.ToLower(tools.RandomString("obs-sdk-test", 5))
18+
19+
createOpts := &obs.CreateBucketInput{
20+
Bucket: bucketName,
21+
}
22+
23+
_, err = client.CreateBucket(createOpts)
24+
th.AssertNoErr(t, err)
25+
26+
_, err = client.DeleteBucket(bucketName)
27+
th.AssertNoErr(t, err)
28+
}
29+
30+
func TestObsObjectLifecycle(t *testing.T) {
31+
client, err := clients.NewOBSClient()
32+
th.AssertNoErr(t, err)
33+
34+
bucketName := strings.ToLower(tools.RandomString("obs-sdk-test", 5))
35+
36+
createOpts := &obs.CreateBucketInput{
37+
Bucket: bucketName,
38+
}
39+
40+
_, err = client.CreateBucket(createOpts)
41+
th.AssertNoErr(t, err)
42+
43+
defer func() {
44+
_, err = client.DeleteBucket(bucketName)
45+
th.AssertNoErr(t, err)
46+
}()
47+
48+
objectName := tools.RandomString("test-obs-", 5)
49+
50+
objectOpts := &obs.PutObjectInput{
51+
PutObjectBasicInput: obs.PutObjectBasicInput{
52+
ObjectOperationInput: obs.ObjectOperationInput{
53+
Bucket: bucketName,
54+
Key: objectName,
55+
},
56+
},
57+
}
58+
_, err = client.PutObject(objectOpts)
59+
th.AssertNoErr(t, err)
60+
61+
_, err = client.DeleteObject(&obs.DeleteObjectInput{
62+
Bucket: bucketName,
63+
Key: objectName,
64+
})
65+
}

auth_aksk_options.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ type AKSKAuthOptions struct {
2727
BssDomain string
2828
BssDomainID string
2929

30-
AccessKey string // Access Key
31-
SecretKey string // Secret key
30+
AccessKey string // Access Key
31+
SecretKey string // Secret key
32+
SecurityToken string // Security token (part of temporary AK/SK)
3233

3334
// AgencyName is the name of agency
3435
AgencyName string

0 commit comments

Comments
 (0)