Files
cloudpods/pkg/multicloud/aliyun/ram.go
T
2020-03-22 19:36:43 +08:00

232 lines
5.1 KiB
Go

// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package aliyun
import (
"time"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
"yunion.io/x/onecloud/pkg/cloudprovider"
)
func (self *SAliyunClient) ramRequest(apiName string, params map[string]string) (jsonutils.JSONObject, error) {
cli, err := self.getDefaultClient()
if err != nil {
return nil, err
}
return jsonRequest(cli, "ram.aliyuncs.com", ALIYUN_RAM_API_VERSION, apiName, params, self.debug)
}
type SRole struct {
Arn string
CreateDate time.Time
Description string
RoleId string
RoleName string
AssumeRolePolicyDocument string
}
func (self *SAliyunClient) ListRoles() ([]SRole, error) {
body, err := self.ramRequest("ListRoles", nil)
if err != nil {
log.Errorf("listRoles fail %s", err)
return nil, err
}
roles := make([]SRole, 0)
err = body.Unmarshal(&roles, "Roles", "Role")
if err != nil {
return nil, err
}
return roles, nil
}
func (self *SAliyunClient) GetRole(roleName string) (*SRole, error) {
params := make(map[string]string)
params["RoleName"] = roleName
body, err := self.ramRequest("GetRole", params)
if err != nil {
if isError(err, "EntityNotExist.Role") {
return nil, cloudprovider.ErrNotFound
}
return nil, err
}
role := SRole{}
err = body.Unmarshal(&role, "Role")
if err != nil {
return nil, err
}
return &role, nil
}
func (self *SAliyunClient) createRole(roleName string, document string, desc string) (*SRole, error) {
params := make(map[string]string)
params["RoleName"] = roleName
params["AssumeRolePolicyDocument"] = document
if len(desc) > 0 {
params["Description"] = desc
}
body, err := self.ramRequest("CreateRole", params)
if err != nil {
return nil, err
}
role := SRole{}
err = body.Unmarshal(&role, "Role")
if err != nil {
return nil, err
}
return &role, nil
}
/**
{"AttachmentCount":0,
"CreateDate":"2018-10-12T05:05:16Z",
"DefaultVersion":"v1",
"Description":"只读访问Data Lake Analytics的权限",
"PolicyName":"AliyunDLAReadOnlyAccess",
"PolicyType":"System",
"UpdateDate":"2018-10-12T05:05:16Z"}
*/
type SPolicy struct {
AttachmentCount int
CreateDate time.Time
UpdateDate time.Time
DefaultVersion string
Description string
PolicyName string
PolicyType string
}
func (self *SAliyunClient) ListPolicies(policyType string, role string) ([]SPolicy, error) {
var action string
params := make(map[string]string)
if len(role) > 0 {
params["RoleName"] = role
action = "ListPoliciesForRole"
} else {
params["MaxItems"] = "1000"
if len(policyType) > 0 {
params["PolicyType"] = policyType
}
action = "ListPolicies"
}
body, err := self.ramRequest(action, params)
if err != nil {
log.Errorf("listPolicies fail %s", err)
return nil, err
}
policies := make([]SPolicy, 0)
err = body.Unmarshal(&policies, "Policies", "Policy")
if err != nil {
return nil, err
}
return policies, nil
}
func (self *SAliyunClient) GetPolicy(policyType string, policyName string) (*SPolicy, error) {
params := make(map[string]string)
params["PolicyType"] = policyType
params["PolicyName"] = policyName
body, err := self.ramRequest("GetPolicy", params)
if err != nil {
if isError(err, "EntityNotExist.Role") {
return nil, cloudprovider.ErrNotFound
}
return nil, err
}
policy := SPolicy{}
err = body.Unmarshal(&policy, "Policy")
if err != nil {
return nil, err
}
return &policy, nil
}
func (self *SAliyunClient) createPolicy(name string, document string, desc string) (*SPolicy, error) {
params := make(map[string]string)
params["PolicyName"] = name
params["PolicyDocument"] = document
if len(desc) > 0 {
params["Description"] = desc
}
body, err := self.ramRequest("CreatePolicy", params)
if err != nil {
return nil, err
}
policy := SPolicy{}
err = body.Unmarshal(&policy, "Policy")
if err != nil {
return nil, err
}
return &policy, nil
}
func (self *SAliyunClient) DeletePolicy(policyType string, policyName string) error {
params := make(map[string]string)
params["PolicyName"] = policyName
params["PolicyType"] = policyType
_, err := self.ramRequest("DeletePolicy", params)
return err
}
func (self *SAliyunClient) DeleteRole(roleName string) error {
params := make(map[string]string)
params["RoleName"] = roleName
_, err := self.ramRequest("DeleteRole", params)
return err
}
func (self *SAliyunClient) attachPolicy2Role(policyType string, policyName string, roleName string) error {
params := make(map[string]string)
params["PolicyType"] = policyType
params["PolicyName"] = policyName
params["RoleName"] = roleName
_, err := self.ramRequest("AttachPolicyToRole", params)
if err != nil {
return err
}
return nil
}