integration/base.go (213 lines of code) (raw):
package integration
import (
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ram"
"github.com/aliyun/alibaba-cloud-sdk-go/services/sts"
)
var role_doc = `{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"RAM": [
"acs:ram::%s:root"
]
}
}
],
"Version": "1"
}`
var (
username = "test-user-" + os.Getenv("CONCURRENT_ID")
rolename = "test-role-" + os.Getenv("CONCURRENT_ID")
rolearn = fmt.Sprintf("acs:ram::%s:role/%s", os.Getenv("USER_ID"), rolename)
)
var ecsEndpoint = "ecs." + os.Getenv("REGION_ID") + ".aliyuncs.com"
func newRamClient() (*ram.Client, error) {
return ram.NewClientWithAccessKey(os.Getenv("REGION_ID"), os.Getenv("ACCESS_KEY_ID"), os.Getenv("ACCESS_KEY_SECRET"))
}
func createRole(userid string) (err error) {
client, err := newRamClient()
if err != nil {
return
}
createRequest := ram.CreateCreateRoleRequest()
createRequest.Scheme = "HTTPS"
createRequest.RoleName = rolename
createRequest.AssumeRolePolicyDocument = fmt.Sprintf(role_doc, userid)
_, err = client.CreateRole(createRequest)
return
}
func ensureRole(userid string) (err error) {
client, err := newRamClient()
if err != nil {
return
}
request := ram.CreateGetRoleRequest()
request.RoleName = rolename
request.Scheme = "HTTPS"
_, err = client.GetRole(request)
if err != nil {
if se, ok := err.(*errors.ServerError); ok {
if se.ErrorCode() == "EntityNotExist.Role" {
// 如果角色不存在,则创建
err = createRole(userid)
return
}
}
return
}
return
}
func createUser() (response *ram.CreateUserResponse, err error) {
client, err := newRamClient()
if err != nil {
return
}
createRequest := ram.CreateCreateUserRequest()
createRequest.Scheme = "HTTPS"
createRequest.UserName = username
return client.CreateUser(createRequest)
}
func ensureUser() (err error) {
client, err := newRamClient()
if err != nil {
return
}
// 查询用户
getUserRequest := ram.CreateGetUserRequest()
getUserRequest.UserName = username
getUserRequest.Scheme = "HTTPS"
_, err = client.GetUser(getUserRequest)
if err != nil {
if se, ok := err.(*errors.ServerError); ok {
if se.ErrorCode() == "EntityNotExist.User" {
// 如果用户不存在,则创建
_, err = createUser()
return
}
}
return
}
return
}
func createAttachPolicyToUser() error {
listRequest := ram.CreateListPoliciesForUserRequest()
listRequest.UserName = username
listRequest.Scheme = "HTTPS"
client, err := newRamClient()
if err != nil {
return err
}
listResponse, err := client.ListPoliciesForUser(listRequest)
if err != nil {
return err
}
for _, policy := range listResponse.Policies.Policy {
if policy.PolicyName == "AliyunSTSAssumeRoleAccess" {
return nil
}
}
createRequest := ram.CreateAttachPolicyToUserRequest()
createRequest.Scheme = "HTTPS"
createRequest.PolicyName = "AliyunSTSAssumeRoleAccess"
createRequest.UserName = username
createRequest.PolicyType = "System"
_, err = client.AttachPolicyToUser(createRequest)
if err != nil {
return err
}
return nil
}
func createAttachPolicyToRole() error {
listRequest := ram.CreateListPoliciesForRoleRequest()
listRequest.RoleName = rolename
listRequest.Scheme = "HTTPS"
client, err := newRamClient()
if err != nil {
return err
}
listResponse, err := client.ListPoliciesForRole(listRequest)
if err != nil {
return err
}
for _, policy := range listResponse.Policies.Policy {
if policy.PolicyName == "AdministratorAccess" {
return nil
}
}
createRequest := ram.CreateAttachPolicyToRoleRequest()
createRequest.Scheme = "HTTPS"
createRequest.PolicyName = "AdministratorAccess"
createRequest.RoleName = rolename
createRequest.PolicyType = "System"
_, err = client.AttachPolicyToRole(createRequest)
if err != nil {
return err
}
return nil
}
func createAccessKey() (id string, secret string, err error) {
client, err := newRamClient()
if err != nil {
return
}
listrequest := ram.CreateListAccessKeysRequest()
listrequest.UserName = username
listrequest.Scheme = "HTTPS"
listresponse, err := client.ListAccessKeys(listrequest)
if err != nil {
return
}
if listresponse.AccessKeys.AccessKey != nil {
if len(listresponse.AccessKeys.AccessKey) >= 2 {
accesskey := listresponse.AccessKeys.AccessKey[0]
deleterequest := ram.CreateDeleteAccessKeyRequest()
deleterequest.UserAccessKeyId = accesskey.AccessKeyId
deleterequest.UserName = username
deleterequest.Scheme = "HTTPS"
_, err = client.DeleteAccessKey(deleterequest)
if err != nil {
return
}
}
}
request := ram.CreateCreateAccessKeyRequest()
request.Scheme = "HTTPS"
request.UserName = username
response, err := client.CreateAccessKey(request)
if err != nil {
return
}
id = response.AccessKey.AccessKeyId
secret = response.AccessKey.AccessKeySecret
return
}
func createAssumeRole() (response *sts.AssumeRoleResponse, err error) {
err = ensureUser()
if err != nil {
return
}
subaccesskeyid, subaccesskeysecret, err := createAccessKey()
if err != nil {
return
}
err = ensureRole(os.Getenv("USER_ID"))
if err != nil {
return
}
err = createAttachPolicyToUser()
if err != nil {
return
}
request := sts.CreateAssumeRoleRequest()
request.RoleArn = rolearn
request.RoleSessionName = "alice_test"
request.Scheme = "HTTPS"
client, err := sts.NewClientWithAccessKey(os.Getenv("REGION_ID"), subaccesskeyid, subaccesskeysecret)
if err != nil {
return
}
response, err = client.AssumeRole(request)
return
}