jojoliang
5 years ago
10 changed files with 1070 additions and 11 deletions
-
262batch.go
-
389batch_test.go
-
5cos.go
-
2cos_test.go
-
140costesting/ci_test.go
-
99example/batch/create_job.go
-
44example/batch/describe_job.go
-
43example/batch/list_jobs.go
-
48example/batch/update_priority.go
-
49example/batch/update_status.go
@ -0,0 +1,262 @@ |
|||
package cos |
|||
|
|||
import ( |
|||
"context" |
|||
"encoding/xml" |
|||
"fmt" |
|||
"net/http" |
|||
) |
|||
|
|||
type BatchService service |
|||
|
|||
type BatchRequestHeaders struct { |
|||
XCosAppid int `header:"x-cos-appid"` |
|||
ContentLength string `header:"Content-Length,omitempty"` |
|||
ContentType string `header:"Content-Type,omitempty"` |
|||
Headers *http.Header `header:"-"` |
|||
} |
|||
|
|||
// BatchProgressSummary
|
|||
type BatchProgressSummary struct { |
|||
NumberOfTasksFailed int `xml:"NumberOfTasksFailed"` |
|||
NumberOfTasksSucceeded int `xml:"NumberOfTasksSucceeded"` |
|||
TotalNumberOfTasks int `xml:"TotalNumberOfTasks"` |
|||
} |
|||
|
|||
// BatchJobReport
|
|||
type BatchJobReport struct { |
|||
Bucket string `xml:"Bucket"` |
|||
Enabled string `xml:"Enabled"` |
|||
Format string `xml:"Format"` |
|||
Prefix string `xml:"Prefix,omitempty"` |
|||
ReportScope string `xml:"ReportScope"` |
|||
} |
|||
|
|||
// BatchJobOperationCopy
|
|||
type BatchMetadata struct { |
|||
Key string `xml:"Key"` |
|||
Value string `xml:"Value"` |
|||
} |
|||
type BatchNewObjectMetadata struct { |
|||
CacheControl string `xml:"CacheControl,omitempty"` |
|||
ContentDisposition string `xml:"ContentDisposition,omitempty"` |
|||
ContentEncoding string `xml:"ContentEncoding,omitempty"` |
|||
ContentType string `xml:"ContentType,omitempty"` |
|||
HttpExpiresDate string `xml:"HttpExpiresDate,omitempty"` |
|||
SSEAlgorithm string `xml:"SSEAlgorithm,omitempty"` |
|||
UserMetadata []BatchMetadata `xml:"UserMetadata>member,omitempty"` |
|||
} |
|||
type BatchGrantee struct { |
|||
DisplayName string `xml:"DisplayName,omitempty"` |
|||
Identifier string `xml:"Identifier"` |
|||
TypeIdentifier string `xml:"TypeIdentifier"` |
|||
} |
|||
type BatchCOSGrant struct { |
|||
Grantee *BatchGrantee `xml:"Grantee"` |
|||
Permission string `xml:"Permission"` |
|||
} |
|||
type BatchAccessControlGrants struct { |
|||
COSGrants *BatchCOSGrant `xml:"COSGrant,omitempty"` |
|||
} |
|||
type BatchJobOperationCopy struct { |
|||
AccessControlGrants *BatchAccessControlGrants `xml:"AccessControlGrants,omitempty"` |
|||
CannedAccessControlList string `xml:"CannedAccessControlList,omitempty"` |
|||
MetadataDirective string `xml:"MetadataDirective,omitempty"` |
|||
ModifiedSinceConstraint int64 `xml:"ModifiedSinceConstraint,omitempty"` |
|||
UnModifiedSinceConstraint int64 `xml:"UnModifiedSinceConstraint,omitempty"` |
|||
NewObjectMetadata *BatchNewObjectMetadata `xml:"NewObjectMetadata,omitempty"` |
|||
StorageClass string `xml:"StorageClass,omitempty"` |
|||
TargetResource string `xml:"TargetResource"` |
|||
} |
|||
|
|||
// BatchJobOperation
|
|||
type BatchJobOperation struct { |
|||
PutObjectCopy *BatchJobOperationCopy `xml:"COSPutObjectCopy,omitempty" header:"-"` |
|||
} |
|||
|
|||
// BatchJobManifest
|
|||
type BatchJobManifestLocation struct { |
|||
ETag string `xml:"ETag" header:"-"` |
|||
ObjectArn string `xml:"ObjectArn" header:"-"` |
|||
ObjectVersionId string `xml:"ObjectVersionId,omitempty" header:"-"` |
|||
} |
|||
type BatchJobManifestSpec struct { |
|||
Fields []string `xml:"Fields>member,omitempty" header:"-"` |
|||
Format string `xml:"Format" header:"-"` |
|||
} |
|||
type BatchJobManifest struct { |
|||
Location *BatchJobManifestLocation `xml:"Location" header:"-"` |
|||
Spec *BatchJobManifestSpec `xml:"Spec" header:"-"` |
|||
} |
|||
|
|||
type BatchCreateJobOptions struct { |
|||
XMLName xml.Name `xml:"CreateJobRequest" header:"-"` |
|||
ClientRequestToken string `xml:"ClientRequestToken" header:"-"` |
|||
ConfirmationRequired string `xml:"ConfirmationRequired,omitempty" header:"-"` |
|||
Description string `xml:"Description,omitempty" header:"-"` |
|||
Manifest *BatchJobManifest `xml:"Manifest" header:"-"` |
|||
Operation *BatchJobOperation `xml:"Operation" header:"-"` |
|||
Priority int `xml:"Priority" header:"-"` |
|||
Report *BatchJobReport `xml:"Report" header:"-"` |
|||
RoleArn string `xml:"RoleArn" header:"-"` |
|||
} |
|||
|
|||
type BatchCreateJobResult struct { |
|||
XMLName xml.Name `xml:"CreateJobResult"` |
|||
JobId string `xml:"JobId"` |
|||
} |
|||
|
|||
func processETag(opt *BatchCreateJobOptions) *BatchCreateJobOptions { |
|||
if opt != nil && opt.Manifest != nil && opt.Manifest.Location != nil { |
|||
opt.Manifest.Location.ETag = "<ETag>" + opt.Manifest.Location.ETag + "</ETag>" |
|||
} |
|||
return opt |
|||
} |
|||
|
|||
func (s *BatchService) CreateJob(ctx context.Context, opt *BatchCreateJobOptions, headers *BatchRequestHeaders) (*BatchCreateJobResult, *Response, error) { |
|||
var res BatchCreateJobResult |
|||
sendOpt := sendOptions{ |
|||
baseURL: s.client.BaseURL.BatchURL, |
|||
uri: "/jobs", |
|||
method: http.MethodPost, |
|||
optHeader: headers, |
|||
body: opt, |
|||
result: &res, |
|||
} |
|||
|
|||
resp, err := s.client.send(ctx, &sendOpt) |
|||
return &res, resp, err |
|||
} |
|||
|
|||
type BatchJobFailureReasons struct { |
|||
FailureCode string `xml:"FailureCode"` |
|||
FailureReason string `xml:"FailureReason"` |
|||
} |
|||
|
|||
type BatchDescribeJob struct { |
|||
ConfirmationRequired string `xml:"ConfirmationRequired,omitempty"` |
|||
CreationTime string `xml:"CreationTime,omitempty"` |
|||
Description string `xml:"Description,omitempty"` |
|||
FailureReasons *BatchJobFailureReasons `xml:"FailureReasons>JobFailure,omitempty"` |
|||
JobId string `xml:"JobId"` |
|||
Manifest *BatchJobManifest `xml:"Manifest"` |
|||
Operation *BatchJobOperation `xml:"Operation"` |
|||
Priority int `xml:"Priority"` |
|||
ProgressSummary *BatchProgressSummary `xml:"ProgressSummary"` |
|||
Report *BatchJobReport `xml:"Report,omitempty"` |
|||
RoleArn string `xml:"RoleArn,omitempty"` |
|||
Status string `xml:"Status,omitempty"` |
|||
StatusUpdateReason string `xml:"StatusUpdateReason,omitempty"` |
|||
SuspendedCause string `xml:"SuspendedCause,omitempty"` |
|||
SuspendedDate string `xml:"SuspendedDate,omitempty"` |
|||
TerminationDate string `xml:"TerminationDate,omitempty"` |
|||
} |
|||
type BatchDescribeJobResult struct { |
|||
XMLName xml.Name `xml:"DescribeJobResult"` |
|||
Job *BatchDescribeJob `xml:"Job"` |
|||
} |
|||
|
|||
func (s *BatchService) DescribeJob(ctx context.Context, id string, headers *BatchRequestHeaders) (*BatchDescribeJobResult, *Response, error) { |
|||
var res BatchDescribeJobResult |
|||
u := fmt.Sprintf("/jobs/%s", id) |
|||
sendOpt := sendOptions{ |
|||
baseURL: s.client.BaseURL.BatchURL, |
|||
uri: u, |
|||
method: http.MethodGet, |
|||
optHeader: headers, |
|||
result: &res, |
|||
} |
|||
resp, err := s.client.send(ctx, &sendOpt) |
|||
return &res, resp, err |
|||
} |
|||
|
|||
type BatchListJobsOptions struct { |
|||
JobStatuses string `url:"jobStatuses,omitempty" header:"-"` |
|||
MaxResults int `url:"maxResults,omitempty" header:"-"` |
|||
NextToken string `url:"nextToken,omitempty" header:"-"` |
|||
} |
|||
|
|||
type BatchListJobsMember struct { |
|||
CreationTime string `xml:"CreationTime,omitempty"` |
|||
Description string `xml:"Description,omitempty"` |
|||
JobId string `xml:"JobId,omitempty"` |
|||
Operation string `xml:"Operation,omitempty"` |
|||
Priority int `xml:"Priority,omitempty"` |
|||
ProgressSummary *BatchProgressSummary `xml:"ProgressSummary,omitempty"` |
|||
Status string `xml:"Status,omitempty"` |
|||
TerminationDate string `xml:"TerminationDate,omitempty"` |
|||
} |
|||
type BatchListJobs struct { |
|||
Members []BatchListJobsMember `xml:"member,omitempty"` |
|||
} |
|||
type BatchListJobsResult struct { |
|||
XMLName xml.Name `xml:"ListJobsResult"` |
|||
Jobs *BatchListJobs `xml:"Jobs"` |
|||
NextToken string `xml:"NextToken,omitempty"` |
|||
} |
|||
|
|||
func (s *BatchService) ListJobs(ctx context.Context, opt *BatchListJobsOptions, headers *BatchRequestHeaders) (*BatchListJobsResult, *Response, error) { |
|||
var res BatchListJobsResult |
|||
sendOpt := sendOptions{ |
|||
baseURL: s.client.BaseURL.BatchURL, |
|||
uri: "/jobs", |
|||
method: http.MethodGet, |
|||
optQuery: opt, |
|||
optHeader: headers, |
|||
result: &res, |
|||
} |
|||
resp, err := s.client.send(ctx, &sendOpt) |
|||
return &res, resp, err |
|||
} |
|||
|
|||
type BatchUpdatePriorityOptions struct { |
|||
JobId string `url:"-" header:"-" xml:"-"` |
|||
Priority int `url:"priority" header:"-" xml:"-"` |
|||
} |
|||
type BatchUpdatePriorityResult struct { |
|||
XMLName xml.Name `xml:"UpdateJobPriorityResult"` |
|||
JobId string `xml:"JobId,omitempty"` |
|||
Priority int `xml:"Priority,omitempty"` |
|||
} |
|||
|
|||
func (s *BatchService) UpdateJobPriority(ctx context.Context, opt *BatchUpdatePriorityOptions, headers *BatchRequestHeaders) (*BatchUpdatePriorityResult, *Response, error) { |
|||
u := fmt.Sprintf("/jobs/%s/priority", opt.JobId) |
|||
var res BatchUpdatePriorityResult |
|||
sendOpt := sendOptions{ |
|||
baseURL: s.client.BaseURL.BatchURL, |
|||
uri: u, |
|||
method: http.MethodPost, |
|||
optQuery: opt, |
|||
optHeader: headers, |
|||
result: &res, |
|||
} |
|||
resp, err := s.client.send(ctx, &sendOpt) |
|||
return &res, resp, err |
|||
} |
|||
|
|||
type BatchUpdateStatusOptions struct { |
|||
JobId string `header:"-" url:"-" xml:"-"` |
|||
RequestedJobStatus string `url:"requestedJobStatus" header:"-" xml:"-"` |
|||
StatusUpdateReason string `url:"statusUpdateReason,omitempty" header:"-", xml:"-"` |
|||
} |
|||
type BatchUpdateStatusResult struct { |
|||
XMLName xml.Name `xml:"UpdateJobStatusResult"` |
|||
JobId string `xml:"JobId,omitempty"` |
|||
Status string `xml:"Status,omitempty"` |
|||
StatusUpdateReason string `xml:"StatusUpdateReason,omitempty"` |
|||
} |
|||
|
|||
func (s *BatchService) UpdateJobStatus(ctx context.Context, opt *BatchUpdateStatusOptions, headers *BatchRequestHeaders) (*BatchUpdateStatusResult, *Response, error) { |
|||
u := fmt.Sprintf("/jobs/%s/status", opt.JobId) |
|||
var res BatchUpdateStatusResult |
|||
sendOpt := sendOptions{ |
|||
baseURL: s.client.BaseURL.BatchURL, |
|||
uri: u, |
|||
method: http.MethodPost, |
|||
optQuery: opt, |
|||
optHeader: headers, |
|||
result: &res, |
|||
} |
|||
resp, err := s.client.send(ctx, &sendOpt) |
|||
return &res, resp, err |
|||
} |
@ -0,0 +1,389 @@ |
|||
package cos |
|||
|
|||
import ( |
|||
"context" |
|||
"encoding/xml" |
|||
"fmt" |
|||
"net/http" |
|||
"reflect" |
|||
"testing" |
|||
|
|||
"github.com/google/uuid" |
|||
) |
|||
|
|||
func TestBatchService_CreateJob(t *testing.T) { |
|||
setup() |
|||
defer teardown() |
|||
uuid_str := uuid.New().String() |
|||
opt := &BatchCreateJobOptions{ |
|||
ClientRequestToken: uuid_str, |
|||
Description: "test batch", |
|||
Manifest: &BatchJobManifest{ |
|||
Location: &BatchJobManifestLocation{ |
|||
ETag: "15150651828fa9cdcb8356b6d1c7638b", |
|||
ObjectArn: "qcs::cos:ap-chengdu::sourcebucket-1250000000/manifests/batch-copy-manifest.csv", |
|||
}, |
|||
Spec: &BatchJobManifestSpec{ |
|||
Fields: []string{"Bucket", "Key"}, |
|||
Format: "COSBatchOperations_CSV_V1", |
|||
}, |
|||
}, |
|||
Operation: &BatchJobOperation{ |
|||
PutObjectCopy: &BatchJobOperationCopy{ |
|||
TargetResource: "qcs::cos:ap-chengdu::destinationbucket-1250000000", |
|||
}, |
|||
}, |
|||
Priority: 1, |
|||
Report: &BatchJobReport{ |
|||
Bucket: "qcs::cos:ap-chengdu::sourcebucket-1250000000", |
|||
Enabled: "true", |
|||
Format: "Report_CSV_V1", |
|||
Prefix: "job-result", |
|||
ReportScope: "AllTasks", |
|||
}, |
|||
RoleArn: "qcs::cam::uin/100000000001:roleName/COS_Batch_QcsRole", |
|||
} |
|||
|
|||
mux.HandleFunc("/jobs", func(w http.ResponseWriter, r *http.Request) { |
|||
testHeader(t, r, "x-cos-appid", "1250000000") |
|||
testMethod(t, r, http.MethodPost) |
|||
v := new(BatchCreateJobOptions) |
|||
xml.NewDecoder(r.Body).Decode(v) |
|||
|
|||
want := opt |
|||
want.XMLName = xml.Name{Local: "CreateJobRequest"} |
|||
if !reflect.DeepEqual(v, want) { |
|||
t.Errorf("Batch.CreateJob request body: %+v, want %+v", v, want) |
|||
} |
|||
fmt.Fprint(w, `<?xml version='1.0' encoding='utf-8' ?> |
|||
<CreateJobResult> |
|||
<JobId>53dc6228-c50b-46f7-8ad7-65e7159f1aae</JobId> |
|||
</CreateJobResult>`) |
|||
}) |
|||
|
|||
headers := &BatchRequestHeaders{ |
|||
XCosAppid: 1250000000, |
|||
} |
|||
ref, _, err := client.Batch.CreateJob(context.Background(), opt, headers) |
|||
if err != nil { |
|||
t.Fatalf("Batch.CreateJob returned error: %v", err) |
|||
} |
|||
|
|||
want := &BatchCreateJobResult{ |
|||
XMLName: xml.Name{Local: "CreateJobResult"}, |
|||
JobId: "53dc6228-c50b-46f7-8ad7-65e7159f1aae", |
|||
} |
|||
|
|||
if !reflect.DeepEqual(ref, want) { |
|||
t.Errorf("Batch.CreateJob returned %+v, want %+v", ref, want) |
|||
} |
|||
|
|||
} |
|||
|
|||
func TestBatchService_DescribeJob(t *testing.T) { |
|||
setup() |
|||
defer teardown() |
|||
|
|||
mux.HandleFunc("/jobs/53dc6228-c50b-46f7-8ad7-65e7159f1aae", func(w http.ResponseWriter, r *http.Request) { |
|||
testHeader(t, r, "x-cos-appid", "1250000000") |
|||
testMethod(t, r, http.MethodGet) |
|||
|
|||
fmt.Fprint(w, `<?xml version='1.0' encoding='utf-8' ?> |
|||
<DescribeJobResult> |
|||
<Job> |
|||
<ConfirmationRequired>false</ConfirmationRequired> |
|||
<CreationTime>2019-12-19T18:00:30Z</CreationTime> |
|||
<Description>example-job</Description> |
|||
<FailureReasons> |
|||
<JobFailure> |
|||
<FailureCode/> |
|||
<FailureReason/> |
|||
</JobFailure> |
|||
</FailureReasons> |
|||
<JobId>53dc6228-c50b-46f7-8ad7-65e7159f1aae</JobId> |
|||
<Manifest> |
|||
<Location> |
|||
<ETag>"15150651828fa9cdcb8356b6d1c7638b"</ETag> |
|||
<ObjectArn>qcs::cos:ap-chengdu::sourcebucket-1250000000/manifests/batch-copy-manifest.csv</ObjectArn> |
|||
</Location> |
|||
<Spec> |
|||
<Fields> |
|||
<member>Bucket</member> |
|||
<member>Key</member> |
|||
</Fields> |
|||
<Format>COSBatchOperations_CSV_V1</Format> |
|||
</Spec> |
|||
</Manifest> |
|||
<Operation> |
|||
<COSPutObjectCopy> |
|||
<TargetResource>qcs::cos:ap-chengdu::destinationbucket-1250000000</TargetResource> |
|||
</COSPutObjectCopy> |
|||
</Operation> |
|||
<Priority>10</Priority> |
|||
<ProgressSummary> |
|||
<NumberOfTasksFailed>0</NumberOfTasksFailed> |
|||
<NumberOfTasksSucceeded>10</NumberOfTasksSucceeded> |
|||
<TotalNumberOfTasks>10</TotalNumberOfTasks> |
|||
</ProgressSummary> |
|||
<Report> |
|||
<Bucket>qcs::cos:ap-chengdu::sourcebucket-1250000000</Bucket> |
|||
<Enabled>true</Enabled> |
|||
<Format>Report_CSV_V1</Format> |
|||
<Prefix>job-result</Prefix> |
|||
<ReportScope>AllTasks</ReportScope> |
|||
</Report> |
|||
<RoleArn>qcs::cam::uin/100000000001:roleName/COS_Batch_QcsRole</RoleArn> |
|||
<Status>Complete</Status> |
|||
<StatusUpdateReason>Job complete</StatusUpdateReason> |
|||
<TerminationDate>2019-12-19T18:00:42Z</TerminationDate> |
|||
</Job> |
|||
</DescribeJobResult>`) |
|||
}) |
|||
|
|||
headers := &BatchRequestHeaders{ |
|||
XCosAppid: 1250000000, |
|||
} |
|||
ref, _, err := client.Batch.DescribeJob(context.Background(), "53dc6228-c50b-46f7-8ad7-65e7159f1aae", headers) |
|||
if err != nil { |
|||
t.Fatalf("Batch.DescribeJob returned error: %v", err) |
|||
} |
|||
|
|||
want := &BatchDescribeJobResult{ |
|||
XMLName: xml.Name{Local: "DescribeJobResult"}, |
|||
Job: &BatchDescribeJob{ |
|||
ConfirmationRequired: "false", |
|||
CreationTime: "2019-12-19T18:00:30Z", |
|||
Description: "example-job", |
|||
FailureReasons: &BatchJobFailureReasons{}, |
|||
JobId: "53dc6228-c50b-46f7-8ad7-65e7159f1aae", |
|||
Manifest: &BatchJobManifest{ |
|||
Location: &BatchJobManifestLocation{ |
|||
ETag: "\"15150651828fa9cdcb8356b6d1c7638b\"", |
|||
ObjectArn: "qcs::cos:ap-chengdu::sourcebucket-1250000000/manifests/batch-copy-manifest.csv", |
|||
}, |
|||
Spec: &BatchJobManifestSpec{ |
|||
Fields: []string{"Bucket", "Key"}, |
|||
Format: "COSBatchOperations_CSV_V1", |
|||
}, |
|||
}, |
|||
Operation: &BatchJobOperation{ |
|||
PutObjectCopy: &BatchJobOperationCopy{ |
|||
TargetResource: "qcs::cos:ap-chengdu::destinationbucket-1250000000", |
|||
}, |
|||
}, |
|||
Priority: 10, |
|||
ProgressSummary: &BatchProgressSummary{ |
|||
NumberOfTasksFailed: 0, |
|||
NumberOfTasksSucceeded: 10, |
|||
TotalNumberOfTasks: 10, |
|||
}, |
|||
Report: &BatchJobReport{ |
|||
Bucket: "qcs::cos:ap-chengdu::sourcebucket-1250000000", |
|||
Enabled: "true", |
|||
Format: "Report_CSV_V1", |
|||
Prefix: "job-result", |
|||
ReportScope: "AllTasks", |
|||
}, |
|||
RoleArn: "qcs::cam::uin/100000000001:roleName/COS_Batch_QcsRole", |
|||
Status: "Complete", |
|||
StatusUpdateReason: "Job complete", |
|||
TerminationDate: "2019-12-19T18:00:42Z", |
|||
}, |
|||
} |
|||
|
|||
if !reflect.DeepEqual(ref, want) { |
|||
t.Errorf("Batch.DescribeJob returned %+v, want %+v", ref, want) |
|||
} |
|||
|
|||
} |
|||
|
|||
func TestBatchService_ListJobs(t *testing.T) { |
|||
setup() |
|||
defer teardown() |
|||
|
|||
mux.HandleFunc("/jobs", func(w http.ResponseWriter, r *http.Request) { |
|||
testHeader(t, r, "x-cos-appid", "1250000000") |
|||
testMethod(t, r, http.MethodGet) |
|||
vs := values{ |
|||
"maxResults": "2", |
|||
} |
|||
testFormValues(t, r, vs) |
|||
|
|||
fmt.Fprint(w, `<?xml version='1.0' encoding='utf-8' ?> |
|||
<ListJobsResult> |
|||
<Jobs> |
|||
<member> |
|||
<CreationTime>2019-12-19T11:05:40Z</CreationTime> |
|||
<Description>example-job</Description> |
|||
<JobId>021140d8-67ca-4e89-8089-0de9a1e40943</JobId> |
|||
<Operation>COSPutObjectCopy</Operation> |
|||
<Priority>10</Priority> |
|||
<ProgressSummary> |
|||
<NumberOfTasksFailed>0</NumberOfTasksFailed> |
|||
<NumberOfTasksSucceeded>10</NumberOfTasksSucceeded> |
|||
<TotalNumberOfTasks>10</TotalNumberOfTasks> |
|||
</ProgressSummary> |
|||
<Status>Complete</Status> |
|||
<TerminationDate>2019-12-19T11:05:56Z</TerminationDate> |
|||
</member> |
|||
<member> |
|||
<CreationTime>2019-12-19T11:07:05Z</CreationTime> |
|||
<Description>example-job</Description> |
|||
<JobId>066d919e-49b9-429e-b844-e17ea7b16421</JobId> |
|||
<Operation>COSPutObjectCopy</Operation> |
|||
<Priority>10</Priority> |
|||
<ProgressSummary> |
|||
<NumberOfTasksFailed>0</NumberOfTasksFailed> |
|||
<NumberOfTasksSucceeded>10</NumberOfTasksSucceeded> |
|||
<TotalNumberOfTasks>10</TotalNumberOfTasks> |
|||
</ProgressSummary> |
|||
<Status>Complete</Status> |
|||
<TerminationDate>2019-12-19T11:07:21Z</TerminationDate> |
|||
</member> |
|||
</Jobs> |
|||
<NextToken>066d919e-49b9-429e-b844-e17ea7b16421</NextToken> |
|||
</ListJobsResult>`) |
|||
}) |
|||
|
|||
opt := &BatchListJobsOptions{ |
|||
MaxResults: 2, |
|||
} |
|||
headers := &BatchRequestHeaders{ |
|||
XCosAppid: 1250000000, |
|||
} |
|||
|
|||
ref, _, err := client.Batch.ListJobs(context.Background(), opt, headers) |
|||
if err != nil { |
|||
t.Fatalf("Batch.DescribeJob returned error: %v", err) |
|||
} |
|||
|
|||
want := &BatchListJobsResult{ |
|||
XMLName: xml.Name{Local: "ListJobsResult"}, |
|||
Jobs: &BatchListJobs{ |
|||
Members: []BatchListJobsMember{ |
|||
{ |
|||
CreationTime: "2019-12-19T11:05:40Z", |
|||
Description: "example-job", |
|||
JobId: "021140d8-67ca-4e89-8089-0de9a1e40943", |
|||
Operation: "COSPutObjectCopy", |
|||
Priority: 10, |
|||
ProgressSummary: &BatchProgressSummary{ |
|||
NumberOfTasksFailed: 0, |
|||
NumberOfTasksSucceeded: 10, |
|||
TotalNumberOfTasks: 10, |
|||
}, |
|||
Status: "Complete", |
|||
TerminationDate: "2019-12-19T11:05:56Z", |
|||
}, |
|||
{ |
|||
CreationTime: "2019-12-19T11:07:05Z", |
|||
Description: "example-job", |
|||
JobId: "066d919e-49b9-429e-b844-e17ea7b16421", |
|||
Operation: "COSPutObjectCopy", |
|||
Priority: 10, |
|||
ProgressSummary: &BatchProgressSummary{ |
|||
NumberOfTasksFailed: 0, |
|||
NumberOfTasksSucceeded: 10, |
|||
TotalNumberOfTasks: 10, |
|||
}, |
|||
Status: "Complete", |
|||
TerminationDate: "2019-12-19T11:07:21Z", |
|||
}, |
|||
}, |
|||
}, |
|||
NextToken: "066d919e-49b9-429e-b844-e17ea7b16421", |
|||
} |
|||
if !reflect.DeepEqual(ref, want) { |
|||
t.Errorf("Batch.ListJobs returned %+v, want %+v", ref, want) |
|||
} |
|||
} |
|||
|
|||
func TestBatchService_UpdateJobsPriority(t *testing.T) { |
|||
setup() |
|||
defer teardown() |
|||
|
|||
mux.HandleFunc("/jobs/021140d8-67ca-4e89-8089-0de9a1e40943/priority", func(w http.ResponseWriter, r *http.Request) { |
|||
testHeader(t, r, "x-cos-appid", "1250000000") |
|||
testMethod(t, r, http.MethodPost) |
|||
vs := values{ |
|||
"priority": "10", |
|||
} |
|||
testFormValues(t, r, vs) |
|||
|
|||
fmt.Fprint(w, `<?xml version='1.0' encoding='utf-8' ?> |
|||
<UpdateJobPriorityResult> |
|||
<JobId>021140d8-67ca-4e89-8089-0de9a1e40943</JobId> |
|||
<Priority>10</Priority> |
|||
</UpdateJobPriorityResult>`) |
|||
}) |
|||
|
|||
opt := &BatchUpdatePriorityOptions{ |
|||
JobId: "021140d8-67ca-4e89-8089-0de9a1e40943", |
|||
Priority: 10, |
|||
} |
|||
|
|||
headers := &BatchRequestHeaders{ |
|||
XCosAppid: 1250000000, |
|||
} |
|||
|
|||
ref, _, err := client.Batch.UpdateJobPriority(context.Background(), opt, headers) |
|||
if err != nil { |
|||
t.Fatalf("Batch.UpdateJobPriority returned error: %v", err) |
|||
} |
|||
|
|||
want := &BatchUpdatePriorityResult{ |
|||
XMLName: xml.Name{Local: "UpdateJobPriorityResult"}, |
|||
JobId: "021140d8-67ca-4e89-8089-0de9a1e40943", |
|||
Priority: 10, |
|||
} |
|||
if !reflect.DeepEqual(ref, want) { |
|||
t.Errorf("Batch.UpdateJobsPriority returned %+v, want %+v", ref, want) |
|||
} |
|||
} |
|||
|
|||
func TestBatchService_UpdateJobsStatus(t *testing.T) { |
|||
setup() |
|||
defer teardown() |
|||
|
|||
mux.HandleFunc("/jobs/021140d8-67ca-4e89-8089-0de9a1e40943/status", func(w http.ResponseWriter, r *http.Request) { |
|||
testHeader(t, r, "x-cos-appid", "1250000000") |
|||
testMethod(t, r, http.MethodPost) |
|||
vs := values{ |
|||
"requestedJobStatus": "Ready", |
|||
"statusUpdateReason": "to do", |
|||
} |
|||
testFormValues(t, r, vs) |
|||
|
|||
fmt.Fprint(w, `<?xml version='1.0' encoding='utf-8' ?> |
|||
<UpdateJobStatusResult> |
|||
<JobId>021140d8-67ca-4e89-8089-0de9a1e40943</JobId> |
|||
<Status>Ready</Status> |
|||
<StatusUpdateReason>to do</StatusUpdateReason> |
|||
</UpdateJobStatusResult>`) |
|||
}) |
|||
|
|||
opt := &BatchUpdateStatusOptions{ |
|||
JobId: "021140d8-67ca-4e89-8089-0de9a1e40943", |
|||
RequestedJobStatus: "Ready", |
|||
StatusUpdateReason: "to do", |
|||
} |
|||
|
|||
headers := &BatchRequestHeaders{ |
|||
XCosAppid: 1250000000, |
|||
} |
|||
|
|||
ref, _, err := client.Batch.UpdateJobStatus(context.Background(), opt, headers) |
|||
if err != nil { |
|||
t.Fatalf("Batch.UpdateJobStatus returned error: %v", err) |
|||
} |
|||
|
|||
want := &BatchUpdateStatusResult{ |
|||
XMLName: xml.Name{Local: "UpdateJobStatusResult"}, |
|||
JobId: "021140d8-67ca-4e89-8089-0de9a1e40943", |
|||
Status: "Ready", |
|||
StatusUpdateReason: "to do", |
|||
} |
|||
if !reflect.DeepEqual(ref, want) { |
|||
t.Errorf("Batch.UpdateJobsStatus returned %+v, want %+v", ref, want) |
|||
} |
|||
} |
@ -0,0 +1,99 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"context" |
|||
"net/http" |
|||
"net/url" |
|||
"os" |
|||
"strings" |
|||
|
|||
"fmt" |
|||
"github.com/tencentyun/cos-go-sdk-v5" |
|||
"github.com/tencentyun/cos-go-sdk-v5/debug" |
|||
"github.com/google/uuid" |
|||
) |
|||
|
|||
func main() { |
|||
test_batch_bucket := "testcd-1259654469" |
|||
target_batch_bucket := "targetcd-1259654469" |
|||
appid := 1259654469 |
|||
uin := "100010805041" |
|||
region := "ap-chengdu" |
|||
|
|||
// bucket url:<Bucketname-Appid>.cos.<region>.mycloud.com
|
|||
bucketurl, _ := url.Parse("https://" + test_batch_bucket + ".cos." + region + ".myqcloud.com") |
|||
// batch url:<uin>.cos-control.<region>.myqcloud.ccom
|
|||
batchurl, _ := url.Parse("https://" + uin + ".cos-control." + region + ".myqcloud.com") |
|||
|
|||
b := &cos.BaseURL{BucketURL: bucketurl, BatchURL: batchurl} |
|||
c := cos.NewClient(b, &http.Client{ |
|||
Transport: &cos.AuthorizationTransport{ |
|||
SecretID: os.Getenv("COS_SECRETID"), |
|||
SecretKey: os.Getenv("COS_SECRETKEY"), |
|||
Transport: &debug.DebugRequestTransport{ |
|||
RequestHeader: true, |
|||
RequestBody: true, |
|||
ResponseHeader: true, |
|||
ResponseBody: true, |
|||
}, |
|||
}, |
|||
}) |
|||
|
|||
// 创建需要复制的文件
|
|||
source_name := "test/1.txt" |
|||
sf := strings.NewReader("batch test content") |
|||
_, err := c.Object.Put(context.Background(), source_name, sf, nil) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
|
|||
// 创建清单文件
|
|||
manifest_name := "test/manifest.csv" |
|||
f := strings.NewReader(test_batch_bucket + "," + source_name) |
|||
resp, err := c.Object.Put(context.Background(), manifest_name, f, nil) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
etag := resp.Header.Get("ETag") |
|||
|
|||
uuid_str := uuid.New().String() |
|||
opt := &cos.BatchCreateJobOptions{ |
|||
ClientRequestToken: uuid_str, |
|||
ConfirmationRequired: "true", |
|||
Description: "test batch", |
|||
Manifest: &cos.BatchJobManifest{ |
|||
Location: &cos.BatchJobManifestLocation{ |
|||
ETag: etag, |
|||
ObjectArn: "qcs::cos:" + region + "::" + test_batch_bucket + "/" + manifest_name, |
|||
}, |
|||
Spec: &cos.BatchJobManifestSpec{ |
|||
Fields: []string{"Bucket", "Key"}, |
|||
Format: "COSBatchOperations_CSV_V1", |
|||
}, |
|||
}, |
|||
Operation: &cos.BatchJobOperation{ |
|||
PutObjectCopy: &cos.BatchJobOperationCopy{ |
|||
TargetResource: "qcs::cos:" + region + "::" + target_batch_bucket, |
|||
}, |
|||
}, |
|||
Priority: 1, |
|||
Report: &cos.BatchJobReport{ |
|||
Bucket: "qcs::cos:" + region + "::" + test_batch_bucket, |
|||
Enabled: "true", |
|||
Format: "Report_CSV_V1", |
|||
Prefix: "job-result", |
|||
ReportScope: "AllTasks", |
|||
}, |
|||
RoleArn: "qcs::cam::uin/" + uin + ":roleName/COSBatch_QcsRole", |
|||
} |
|||
headers := &cos.BatchRequestHeaders{ |
|||
XCosAppid: appid, |
|||
} |
|||
|
|||
res, _, err := c.Batch.CreateJob(context.Background(), opt, headers) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
fmt.Println(res) |
|||
|
|||
} |
@ -0,0 +1,44 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"context" |
|||
"net/http" |
|||
"net/url" |
|||
"os" |
|||
|
|||
"fmt" |
|||
"github.com/tencentyun/cos-go-sdk-v5" |
|||
"github.com/tencentyun/cos-go-sdk-v5/debug" |
|||
) |
|||
|
|||
func main() { |
|||
uin := "100010805041" |
|||
appid := 1259654469 |
|||
jobid := "795ad997-5557-4869-9a19-b66ec087d460" |
|||
u, _ := url.Parse("https://" + uin + ".cos-control.ap-chengdu.myqcloud.com") |
|||
b := &cos.BaseURL{BatchURL: u} |
|||
c := cos.NewClient(b, &http.Client{ |
|||
Transport: &cos.AuthorizationTransport{ |
|||
SecretID: os.Getenv("COS_SECRETID"), |
|||
SecretKey: os.Getenv("COS_SECRETKEY"), |
|||
Transport: &debug.DebugRequestTransport{ |
|||
RequestHeader: true, |
|||
RequestBody: true, |
|||
ResponseHeader: true, |
|||
ResponseBody: true, |
|||
}, |
|||
}, |
|||
}) |
|||
|
|||
headers := &cos.BatchRequestHeaders{ |
|||
XCosAppid: appid, |
|||
} |
|||
|
|||
res, _, err := c.Batch.DescribeJob(context.Background(), jobid, headers) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
if res != nil && res.Job != nil { |
|||
fmt.Printf("%+v", res.Job) |
|||
} |
|||
} |
@ -0,0 +1,43 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"context" |
|||
"net/http" |
|||
"net/url" |
|||
"os" |
|||
|
|||
"fmt" |
|||
"github.com/tencentyun/cos-go-sdk-v5" |
|||
"github.com/tencentyun/cos-go-sdk-v5/debug" |
|||
) |
|||
|
|||
func main() { |
|||
uin := "100010805041" |
|||
appid := 1259654469 |
|||
u, _ := url.Parse("https://" + uin + ".cos-control.ap-chengdu.myqcloud.com") |
|||
b := &cos.BaseURL{BatchURL: u} |
|||
c := cos.NewClient(b, &http.Client{ |
|||
Transport: &cos.AuthorizationTransport{ |
|||
SecretID: os.Getenv("COS_SECRETID"), |
|||
SecretKey: os.Getenv("COS_SECRETKEY"), |
|||
Transport: &debug.DebugRequestTransport{ |
|||
RequestHeader: true, |
|||
RequestBody: true, |
|||
ResponseHeader: true, |
|||
ResponseBody: true, |
|||
}, |
|||
}, |
|||
}) |
|||
|
|||
headers := &cos.BatchRequestHeaders{ |
|||
XCosAppid: appid, |
|||
} |
|||
|
|||
res, _, err := c.Batch.ListJobs(context.Background(), nil, headers) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
if res != nil && res.Jobs != nil { |
|||
fmt.Printf("%+v", res.Jobs) |
|||
} |
|||
} |
@ -0,0 +1,48 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"context" |
|||
"net/http" |
|||
"net/url" |
|||
"os" |
|||
|
|||
"fmt" |
|||
"github.com/tencentyun/cos-go-sdk-v5" |
|||
"github.com/tencentyun/cos-go-sdk-v5/debug" |
|||
) |
|||
|
|||
func main() { |
|||
uin := "100010805041" |
|||
appid := 1259654469 |
|||
jobid := "795ad997-5557-4869-9a19-b66ec087d460" |
|||
u, _ := url.Parse("https://" + uin + ".cos-control.ap-chengdu.myqcloud.com") |
|||
b := &cos.BaseURL{BatchURL: u} |
|||
c := cos.NewClient(b, &http.Client{ |
|||
Transport: &cos.AuthorizationTransport{ |
|||
SecretID: os.Getenv("COS_SECRETID"), |
|||
SecretKey: os.Getenv("COS_SECRETKEY"), |
|||
Transport: &debug.DebugRequestTransport{ |
|||
RequestHeader: true, |
|||
RequestBody: true, |
|||
ResponseHeader: true, |
|||
ResponseBody: true, |
|||
}, |
|||
}, |
|||
}) |
|||
|
|||
opt := &cos.BatchUpdatePriorityOptions{ |
|||
JobId: jobid, |
|||
Priority: 3, |
|||
} |
|||
headers := &cos.BatchRequestHeaders{ |
|||
XCosAppid: appid, |
|||
} |
|||
|
|||
res, _, err := c.Batch.UpdateJobPriority(context.Background(), opt, headers) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
if res != nil { |
|||
fmt.Printf("%+v", res) |
|||
} |
|||
} |
@ -0,0 +1,49 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"context" |
|||
"net/http" |
|||
"net/url" |
|||
"os" |
|||
|
|||
"fmt" |
|||
"github.com/tencentyun/cos-go-sdk-v5" |
|||
"github.com/tencentyun/cos-go-sdk-v5/debug" |
|||
) |
|||
|
|||
func main() { |
|||
uin := "100010805041" |
|||
appid := 1259654469 |
|||
jobid := "289b0ea1-5ac5-453d-8a61-7f452dd4a209" |
|||
u, _ := url.Parse("https://" + uin + ".cos-control.ap-chengdu.myqcloud.com") |
|||
b := &cos.BaseURL{BatchURL: u} |
|||
c := cos.NewClient(b, &http.Client{ |
|||
Transport: &cos.AuthorizationTransport{ |
|||
SecretID: os.Getenv("COS_SECRETID"), |
|||
SecretKey: os.Getenv("COS_SECRETKEY"), |
|||
Transport: &debug.DebugRequestTransport{ |
|||
RequestHeader: true, |
|||
RequestBody: true, |
|||
ResponseHeader: true, |
|||
ResponseBody: true, |
|||
}, |
|||
}, |
|||
}) |
|||
|
|||
opt := &cos.BatchUpdateStatusOptions{ |
|||
JobId: jobid, |
|||
RequestedJobStatus: "Ready", // 允许状态转换见 https://cloud.tencent.com/document/product/436/38604
|
|||
StatusUpdateReason: "to test", |
|||
} |
|||
headers := &cos.BatchRequestHeaders{ |
|||
XCosAppid: appid, |
|||
} |
|||
|
|||
res, _, err := c.Batch.UpdateJobStatus(context.Background(), opt, headers) |
|||
if err != nil { |
|||
panic(err) |
|||
} |
|||
if res != nil { |
|||
fmt.Printf("%+v", res) |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue