// Set is called by 'flag' package when parsing command line options. func (tags *Tags) Set(value string) error { err := common.ValidateInstanceTag(value) if err != nil { return err } *tags = append(*tags, value) return nil }
func tagsEndpoint(pin common.Pin, tags []string) (string, error) { if err := common.ValidatePin(pin); err != nil { return "", err } for _, tag := range tags { if err := common.ValidateInstanceTag(tag); err != nil { return "", err } } params := url.Values{} params.Add("package_name", pin.PackageName) params.Add("instance_id", pin.InstanceID) for _, tag := range tags { params.Add("tag", tag) } return "repo/v1/tags?" + params.Encode(), nil }
func (r *remoteImpl) attachTags(pin common.Pin, tags []string) error { // Tags will be passed in the request body, not via URL. endpoint, err := tagsEndpoint(pin, nil) if err != nil { return err } for _, tag := range tags { err = common.ValidateInstanceTag(tag) if err != nil { return err } } var request struct { Tags []string `json:"tags"` } request.Tags = tags var reply struct { Status string `json:"status"` ErrorMessage string `json:"error_message"` } err = r.makeRequest(endpoint, "POST", &request, &reply) if err != nil { return err } switch reply.Status { case "SUCCESS": return nil case "PROCESSING_NOT_FINISHED_YET": return &pendingProcessingError{reply.ErrorMessage} case "ERROR", "PROCESSING_FAILED": return errors.New(reply.ErrorMessage) } return fmt.Errorf("Unexpected status when attaching tags: %s", reply.Status) }