client_tag.go (256 lines of code) (raw):

package sls import ( "encoding/json" "fmt" "io/ioutil" "net/url" ) // ResourceTag define type ResourceTag struct { Key string `json:"key"` Value string `json:"value"` } // ResourceFilterTag define type ResourceFilterTag struct { Key *string `json:"key"` Value *string `json:"value"` } // ResourceTags tag for tag sls resource, only support project type ResourceTags struct { ResourceType string `json:"resourceType"` ResourceID []string `json:"resourceId"` Tags []ResourceTag `json:"tags"` } // ResourceSystemTags system tag for tag sls resource type ResourceSystemTags struct { ResourceTags TagOwnerUid string `json:"tagOwnerUid"` Scope string `json:"scope,omitempty"` } // ResourceUnTags tag for untag sls resouce type ResourceUnTags struct { ResourceType string `json:"resourceType"` ResourceID []string `json:"resourceId"` Tags []string `json:"tags"` All bool `json:"all"` } // ResourceUnSystemTags system tag for untag sls resouce type ResourceUnSystemTags struct { ResourceUnTags TagOwnerUid string `json:"tagOwnerUid"` } // ResourceTagResponse used for ListTagResources type ResourceTagResponse struct { ResourceType string `json:"resourceType"` ResourceID string `json:"resourceId"` TagKey string `json:"tagKey"` TagValue string `json:"tagValue"` } // NewProjectTags create a project tags func NewProjectTags(project string, tags []ResourceTag) *ResourceTags { return &ResourceTags{ ResourceType: "project", ResourceID: []string{project}, Tags: tags, } } // NewProjectUnTags delete a project tags func NewProjectUnTags(project string, tags []string) *ResourceUnTags { return &ResourceUnTags{ ResourceType: "project", ResourceID: []string{project}, Tags: tags, } } // NewResourceTags create tags for resource of certain type func NewResourceTags(resourceType string, resourceId string, tags []ResourceTag) *ResourceTags { return &ResourceTags{ ResourceType: resourceType, ResourceID: []string{resourceId}, Tags: tags, } } // NewResourceUnTags delete tags for resource of certain type func NewResourceUnTags(resourceType string, resourceId string, tags []string) *ResourceUnTags { return &ResourceUnTags{ ResourceType: resourceType, ResourceID: []string{resourceId}, Tags: tags, All: false, } } // NewResourceSystemTags create system tags for resource of certain type func NewResourceSystemTags(resourceType string, resourceId string, tagOwnerUid string, tags []ResourceTag) *ResourceSystemTags { return &ResourceSystemTags{ ResourceTags: ResourceTags{ ResourceType: resourceType, ResourceID: []string{resourceId}, Tags: tags, }, TagOwnerUid: tagOwnerUid, } } // NewResourceUnSystemTags delete system tags for resource of certain type func NewResourceUnSystemTags(resourceType string, resourceId string, tagOwnerUid string, tags []string) *ResourceUnSystemTags { return &ResourceUnSystemTags{ ResourceUnTags{ ResourceType: resourceType, ResourceID: []string{resourceId}, Tags: tags, All: false, }, tagOwnerUid, } } // TagResources tag specific resource func (c *Client) TagResources(project string, tags *ResourceTags) error { body, err := json.Marshal(tags) if err != nil { return NewClientError(err) } h := map[string]string{ "x-log-bodyrawsize": fmt.Sprintf("%v", len(body)), "Content-Type": "application/json", } uri := "/tag" r, err := c.request(project, "POST", uri, h, body) if err != nil { return err } r.Body.Close() return nil } // UnTagResources untag specific resource func (c *Client) UnTagResources(project string, tags *ResourceUnTags) error { body, err := json.Marshal(tags) if err != nil { return NewClientError(err) } h := map[string]string{ "x-log-bodyrawsize": fmt.Sprintf("%v", len(body)), "Content-Type": "application/json", } uri := "/untag" r, err := c.request(project, "POST", uri, h, body) if err != nil { return err } r.Body.Close() return nil } // ListTagResources list rag resources func (c *Client) ListTagResources(project string, resourceType string, resourceIDs []string, tags []ResourceFilterTag, nextToken string) (respTags []*ResourceTagResponse, respNextToken string, err error) { tagsBuf, err := json.Marshal(tags) if err != nil { return nil, "", NewClientError(err) } resourceIDBuf, err := json.Marshal(resourceIDs) if err != nil { return nil, "", NewClientError(err) } h := map[string]string{ "x-log-bodyrawsize": "0", "Content-Type": "application/json", } v := url.Values{} v.Add("tags", string(tagsBuf)) v.Add("resourceType", resourceType) v.Add("resourceId", string(resourceIDBuf)) if nextToken != "" { v.Add("nextToken", nextToken) } uri := "/tags?" + v.Encode() r, err := c.request(project, "GET", uri, h, nil) if err != nil { return nil, "", err } defer r.Body.Close() type ListTagResp struct { NextToken string `json:"nextToken"` TagResource []*ResourceTagResponse `json:"tagResources"` } buf, err := ioutil.ReadAll(r.Body) if err != nil { return nil, "", readResponseError(err) } listTagResp := &ListTagResp{} if err = json.Unmarshal(buf, listTagResp); err != nil { err = NewClientError(err) } return listTagResp.TagResource, listTagResp.NextToken, err } // TagResourcesSystemTags tag specific resource func (c *Client) TagResourcesSystemTags(project string, tags *ResourceSystemTags) error { body, err := json.Marshal(tags) if err != nil { return NewClientError(err) } h := map[string]string{ "x-log-bodyrawsize": fmt.Sprintf("%v", len(body)), "Content-Type": "application/json", } uri := "/systemtag" r, err := c.request(project, "POST", uri, h, body) if err != nil { return err } r.Body.Close() return nil } // TagResourcesSystemTags untag specific resource func (c *Client) UnTagResourcesSystemTags(project string, tags *ResourceUnSystemTags) error { body, err := json.Marshal(tags) if err != nil { return NewClientError(err) } h := map[string]string{ "x-log-bodyrawsize": fmt.Sprintf("%v", len(body)), "Content-Type": "application/json", } uri := "/systemuntag" r, err := c.request(project, "POST", uri, h, body) if err != nil { return err } r.Body.Close() return nil } // ListSystemTagResources list system tag resources func (c *Client) ListSystemTagResources(project string, resourceType string, resourceIDs []string, tags []ResourceFilterTag, tagOwnerUid string, category string, scope string, nextToken string) (respTags []*ResourceTagResponse, respNextToken string, err error) { tagsBuf, err := json.Marshal(tags) if err != nil { return nil, "", NewClientError(err) } resourceIDBuf, err := json.Marshal(resourceIDs) if err != nil { return nil, "", NewClientError(err) } h := map[string]string{ "x-log-bodyrawsize": "0", "Content-Type": "application/json", } v := url.Values{} v.Add("tags", string(tagsBuf)) v.Add("resourceType", resourceType) v.Add("resourceId", string(resourceIDBuf)) v.Add("tagOwnerUid", tagOwnerUid) v.Add("category", category) v.Add("scope", scope) if nextToken != "" { v.Add("nextToken", nextToken) } uri := "/systemtags?" + v.Encode() r, err := c.request(project, "GET", uri, h, nil) if err != nil { return nil, "", err } defer r.Body.Close() type ListTagResp struct { NextToken string `json:"nextToken"` TagResource []*ResourceTagResponse `json:"tagResources"` } buf, err := ioutil.ReadAll(r.Body) if err != nil { return nil, "", readResponseError(err) } listTagResp := &ListTagResp{} if err = json.Unmarshal(buf, listTagResp); err != nil { err = NewClientError(err) } return listTagResp.TagResource, listTagResp.NextToken, err } // GenResourceId generate the resource id to tag (not used for project) func GenResourceId(project string, subResourceId string) string { return project + "#" + subResourceId }