Skip to content

Commit

Permalink
Merge 0a19fa0 into 882c164
Browse files Browse the repository at this point in the history
  • Loading branch information
kkuai committed Apr 21, 2020
2 parents 882c164 + 0a19fa0 commit 3c759f4
Show file tree
Hide file tree
Showing 12 changed files with 1,324 additions and 69 deletions.
435 changes: 435 additions & 0 deletions lib/bucket_inventory.go

Large diffs are not rendered by default.

645 changes: 645 additions & 0 deletions lib/bucket_inventory_test.go

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions lib/command.go
Expand Up @@ -696,5 +696,6 @@ func GetAllCommands() []interface{} {
&bucketPolicyCommand,
&requestPaymentCommand,
&objectTagCommand,
&bucketInventoryCommand,
}
}
8 changes: 8 additions & 0 deletions lib/command_test.go
Expand Up @@ -39,6 +39,8 @@ var (
proxyHost = ""
proxyUser = ""
proxyPwd = ""
accountID = ""
stsARN = ""
)

var (
Expand Down Expand Up @@ -132,6 +134,12 @@ func SetUpCredential() {
if proxyPwd == "" {
proxyPwd = os.Getenv("OSS_TEST_PROXY_PASSWORD")
}
if accountID == "" {
accountID = os.Getenv("OSS_TEST_ACCOUNT_ID")
}
if stsARN == "" {
stsARN = os.Getenv("OSS_TEST_STS_ARN")
}
}

func (s *OssutilCommandSuite) SetUpBucketEnv(c *C) {
Expand Down
3 changes: 2 additions & 1 deletion lib/const.go
Expand Up @@ -125,7 +125,7 @@ const (
const (
Package string = "ossutil"
ChannelBuf int = 1000
Version string = "v1.6.11"
Version string = "v1.6.12"
DefaultEndpoint string = "oss.aliyuncs.com"
ChineseLanguage = "CH"
EnglishLanguage = "EN"
Expand Down Expand Up @@ -170,6 +170,7 @@ const (
StorageStandard = string(oss.StorageStandard)
StorageIA = string(oss.StorageIA)
StorageArchive = string(oss.StorageArchive)
StorageColdArchive = string(oss.StorageColdArchive)
DefaultStorageClass = StorageStandard
DefaultMethod = string(oss.HTTPGet)
DefaultTimeout = 60
Expand Down
62 changes: 26 additions & 36 deletions lib/cp.go
Expand Up @@ -11,7 +11,6 @@ import (
"strconv"
"strings"
"sync"
"sync/atomic"
"time"

oss "github.com/aliyun/aliyun-oss-go-sdk/oss"
Expand Down Expand Up @@ -61,7 +60,6 @@ type copyOptionType struct {
enableSymlinkDir bool
onlyCurrentDir bool
disableDirObject bool
resumeProgress *OssResumeProgressListener
disableAllSymlink bool
tagging string
}
Expand Down Expand Up @@ -124,34 +122,25 @@ func (l *OssProgressListener) ProgressChanged(event *oss.ProgressEvent) {

// OssProgressListener resume progress listener
type OssResumeProgressListener struct {
monitor *CPMonitor
lastSize int64
currSize int64
failedEvent bool
monitor *CPMonitor
lastSize int64
currSize int64
failedEvent bool
breakSizeAdded bool
}

// ProgressChanged handle resume progress event
func (l *OssResumeProgressListener) ProgressChanged(event *oss.ProgressEvent) {
if event.EventType == oss.TransferDataEvent {
if event.EventType == oss.TransferStartedEvent && !l.breakSizeAdded {
l.monitor.updateDealSize(event.ConsumedBytes)
l.breakSizeAdded = true
} else if event.EventType == oss.TransferDataEvent {
l.monitor.updateTransferSize(event.RwBytes)
l.monitor.updateDealSize(event.RwBytes)
atomic.AddInt64(&l.currSize, event.RwBytes)
} else if event.EventType == oss.TransferStartedEvent {
if event.ConsumedBytes > 0 {
l.monitor.updateDealSize(event.ConsumedBytes)
atomic.StoreInt64(&l.currSize, event.ConsumedBytes)
}
}
freshProgress()
}

// Retry logic
func (l *OssResumeProgressListener) Retry() {
currSize := atomic.LoadInt64(&l.currSize)
l.monitor.updateDealSize(-currSize)
atomic.StoreInt64(&l.currSize, 0)
}

var specChineseCopy = SpecText{

synopsisText: "上传,下载或拷贝Objects",
Expand Down Expand Up @@ -1473,6 +1462,7 @@ func (cc *CopyCommand) RunCommand() error {
chProgressSignal = make(chan chProgressSignalType, 10)
go cc.progressBar()

startT := time.Now().UnixNano() / 1000 / 1000
switch opType {
case operationTypePut:
LogInfo("begin uploadFiles\n")
Expand All @@ -1484,6 +1474,12 @@ func (cc *CopyCommand) RunCommand() error {
LogInfo("begin copyFiles\n")
err = cc.copyFiles(srcURLList[0].(CloudURL), destURL.(CloudURL))
}
endT := time.Now().UnixNano() / 1000 / 1000
if endT-startT > 0 {
averSpeed := (cc.monitor.transferSize / (endT - startT)) * 1000
fmt.Printf("\naverage speed %d(byte/s)\n", averSpeed)
LogInfo("average speed %d(byte/s)\n", averSpeed)
}

cc.cpOption.reporter.Clear()

Expand Down Expand Up @@ -2060,8 +2056,7 @@ func (cc *CopyCommand) uploadFile(bucket *oss.Bucket, destURL CloudURL, file fil
return
}

var listener *OssResumeProgressListener = &OssResumeProgressListener{&cc.monitor, 0, 0, false}
cc.cpOption.resumeProgress = listener
var listener *OssResumeProgressListener = &OssResumeProgressListener{&cc.monitor, 0, 0, false, false}

//make options for resume multipart upload
//part size
Expand Down Expand Up @@ -2138,7 +2133,7 @@ func (cc *CopyCommand) ossPutObjectRetry(bucket *oss.Bucket, objectName string,
retryTimes, _ := GetInt(OptionRetryTimes, cc.command.options)
for i := 1; ; i++ {
if i > 1 {
time.Sleep(time.Duration(1) * time.Second)
time.Sleep(time.Duration(3) * time.Second)
if int64(i) >= retryTimes {
fmt.Printf("\nretry count:%d:put object:%s.\n", i-1, objectName)
}
Expand All @@ -2162,7 +2157,7 @@ func (cc *CopyCommand) ossUploadFileRetry(bucket *oss.Bucket, objectName string,
retryTimes, _ := GetInt(OptionRetryTimes, cc.command.options)
for i := 1; ; i++ {
if i > 1 {
time.Sleep(time.Duration(1) * time.Second)
time.Sleep(time.Duration(3) * time.Second)
if int64(i) >= retryTimes {
fmt.Printf("\nretry count:%d:upload file:%s\n", i-1, filePath)
}
Expand Down Expand Up @@ -2242,9 +2237,8 @@ func (cc *CopyCommand) calcPartSize(fileSize int64) (int64, int64) {
func (cc *CopyCommand) ossResumeUploadRetry(bucket *oss.Bucket, objectName string, filePath string, partSize int64, options ...oss.Option) error {
retryTimes, _ := GetInt(OptionRetryTimes, cc.command.options)
for i := 1; ; i++ {
cc.cpOption.resumeProgress.Retry()
if i > 1 {
time.Sleep(time.Duration(1) * time.Second)
time.Sleep(time.Duration(3) * time.Second)
if int64(i) >= retryTimes {
fmt.Printf("\nretry count:%d,multipart upload file:%s.\n", i-1, filePath)
}
Expand Down Expand Up @@ -2470,8 +2464,7 @@ func (cc *CopyCommand) downloadSingleFile(bucket *oss.Bucket, objectInfo objectI
return false, cc.ossDownloadFileRetry(bucket, object, fileName, downloadOptions...), 0, msg
}

var listener *OssResumeProgressListener = &OssResumeProgressListener{&cc.monitor, 0, 0, false}
cc.cpOption.resumeProgress = listener
var listener *OssResumeProgressListener = &OssResumeProgressListener{&cc.monitor, 0, 0, false, false}
downloadOptions = append(downloadOptions, oss.Progress(listener))

partSize, rt := cc.preparePartOption(size)
Expand Down Expand Up @@ -2532,7 +2525,7 @@ func (cc *CopyCommand) ossDownloadFileRetry(bucket *oss.Bucket, objectName, file
retryTimes, _ := GetInt(OptionRetryTimes, cc.command.options)
for i := 1; ; i++ {
if i > 1 {
time.Sleep(time.Duration(1) * time.Second)
time.Sleep(time.Duration(3) * time.Second)
if int64(i) >= retryTimes {
fmt.Printf("\nretry count:%d:get object to file:%s.\n", i-1, fileName)
}
Expand Down Expand Up @@ -2561,9 +2554,8 @@ func (cc *CopyCommand) ossDownloadFileRetry(bucket *oss.Bucket, objectName, file
func (cc *CopyCommand) ossResumeDownloadRetry(bucket *oss.Bucket, objectName string, filePath string, size, partSize int64, options ...oss.Option) error {
retryTimes, _ := GetInt(OptionRetryTimes, cc.command.options)
for i := 1; ; i++ {
cc.cpOption.resumeProgress.Retry()
if i > 1 {
time.Sleep(time.Duration(1) * time.Second)
time.Sleep(time.Duration(3) * time.Second)
if int64(i) >= retryTimes {
fmt.Printf("\nretry count:%d:mulitpart download file:%s.\n", i-1, objectName)
}
Expand Down Expand Up @@ -2924,8 +2916,7 @@ func (cc *CopyCommand) copySingleFile(bucket *oss.Bucket, objectInfo objectInfoT
return false, cc.ossCopyObjectRetry(bucket, srcObject, destURL.bucket, destObject), size, msg
}

var listener *OssResumeProgressListener = &OssResumeProgressListener{&cc.monitor, 0, 0, false}
cc.cpOption.resumeProgress = listener
var listener *OssResumeProgressListener = &OssResumeProgressListener{&cc.monitor, 0, 0, false, false}
partSize, rt := cc.preparePartOption(size)
cp := oss.CheckpointDir(true, cc.cpOption.cpDir)
options := cc.cpOption.options
Expand Down Expand Up @@ -2972,7 +2963,7 @@ func (cc *CopyCommand) ossCopyObjectRetry(bucket *oss.Bucket, objectName, destBu
options = append(options, oss.TaggingDirective(oss.TaggingReplace))
for i := 1; ; i++ {
if i > 1 {
time.Sleep(time.Duration(1) * time.Second)
time.Sleep(time.Duration(3) * time.Second)
if int64(i) >= retryTimes {
fmt.Printf("\nretry count:%d,copy object:%s.\n", i-1, objectName)
}
Expand All @@ -2998,9 +2989,8 @@ func (cc *CopyCommand) ossResumeCopyRetry(bucketName, objectName, destBucketName
}
retryTimes, _ := GetInt(OptionRetryTimes, cc.command.options)
for i := 1; ; i++ {
cc.cpOption.resumeProgress.Retry()
if i > 1 {
time.Sleep(time.Duration(1) * time.Second)
time.Sleep(time.Duration(3) * time.Second)
if int64(i) >= retryTimes {
fmt.Printf("\nretry count:%d, resume copy object:%s.\n", i-1, objectName)
}
Expand Down
8 changes: 6 additions & 2 deletions lib/mb.go
Expand Up @@ -11,6 +11,7 @@ var storageClassList = []string{
StorageStandard,
StorageIA,
StorageArchive,
StorageColdArchive,
}

func formatStorageClassString(sep string) string {
Expand Down Expand Up @@ -46,7 +47,7 @@ ACL:
StorageClass:
bucket的StorageClass有三种
bucket的StorageClass有四种
` + formatStorageClassString("\n ") + `
关于StorageClass的更多信息请参考:https://help.aliyun.com/document_detail/31959.html?spm=5176.doc31957.6.839.E1ifnh
Expand Down Expand Up @@ -104,7 +105,7 @@ ACL:
StorageClass:
There are three kinds of StorageClass:
There are four kinds of StorageClass:
` + formatStorageClassString("\n ") + `
More information about StorageClass see: https://help.aliyun.com/document_detail/31959.html?spm=5176.doc31957.6.839.E1ifnh
Expand Down Expand Up @@ -270,5 +271,8 @@ func (mc *MakeBucketCommand) getStorageClass() oss.StorageClassType {
if strings.EqualFold(storageClass, StorageArchive) {
return oss.StorageArchive
}
if strings.EqualFold(storageClass, StorageColdArchive) {
return oss.StorageColdArchive
}
return oss.StorageStandard
}
12 changes: 6 additions & 6 deletions lib/option.go
Expand Up @@ -46,7 +46,7 @@ var OptionMap = map[string]Option{
OptionAccessKeySecret: Option{"-k", "--access-key-secret", "", OptionTypeString, "", "", "访问oss使用的AccessKeySecret(该选项值会覆盖配置文件中的相应设置)。", "AccessKeySecret while access oss(Notice that the value of the option will cover the value in config file)."},
OptionSTSToken: Option{"-t", "--sts-token", "", OptionTypeString, "", "", "访问oss使用的STSToken(该选项值会覆盖配置文件中的相应设置),非必须设置项。", "STSToken while access oss(Notice that the value of the option will cover the value in config file), not necessary."},
OptionLimitedNum: Option{"", "--limited-num", strconv.Itoa(DefaultLimitedNum), OptionTypeInt64, strconv.FormatInt(MinLimitedNum, 10), "", "返回结果的最大个数。", "the limited number of return results."},
OptionMarker: Option{"", "--marker", "", OptionTypeString, "", "", "列举Buckets时的marker,或列举objects或Multipart Uploads时的key marker。", "the marker of bucket when list buckets, or the marker of key when list object or Multipart Uploads."},
OptionMarker: Option{"", "--marker", "", OptionTypeString, "", "", "列举Buckets时的marker,或列举objects或Multipart Uploads时的key marker, 或者其他有需要marker的地方。", "the marker of bucket when list buckets, or the marker of key when list object or Multipart Uploads, Or other places where a marker is needed"},
OptionUploadIDMarker: Option{"", "--upload-id-marker", "", OptionTypeString, "", "", "列举Multipart Uploads时的uploadID marker。", "the marker of object when list object or Multipart Uploads."},
OptionACL: Option{"", "--acl", "", OptionTypeString, "", "", "acl信息的配置。", "acl information."},
OptionShortFormat: Option{"-s", "--short-format", "", OptionTypeFlagTrue, "", "", "显示精简格式,如果未指定该选项,默认显示长格式。", "Show by short format, if the option is not specified, show long format by default."},
Expand All @@ -55,9 +55,9 @@ var OptionMap = map[string]Option{
OptionAllType: Option{"-a", "--all-type", "", OptionTypeFlagTrue, "", "", "指定操作的对象为bucket中的object和未完成的Multipart事件。", "Indicate that the subject of the command contains both objects and uncompleted Multipart Uploads."},
OptionRecursion: Option{"-r", "--recursive", "", OptionTypeFlagTrue, "", "", "递归进行操作。对于支持该选项的命令,当指定该选项时,命令会对bucket下所有符合条件的objects进行操作,否则只对url中指定的单个object进行操作。", "operate recursively, for those commands which support the option, when use them, if the option is specified, the command will operate on all match objects under the bucket, else we will search the specified object and operate on the single object."},
OptionBucket: Option{"-b", "--bucket", "", OptionTypeFlagTrue, "", "", "对bucket进行操作,该选项用于确认操作作用于bucket", "the option used to make sure the operation will operate on bucket"},
OptionStorageClass: Option{"", "--storage-class", DefaultStorageClass, OptionTypeAlternative, fmt.Sprintf("%s/%s/%s", StorageStandard, StorageIA, StorageArchive), "",
fmt.Sprintf("设置对象的存储方式,默认值:%s,取值范围:%s/%s/%s。", DefaultStorageClass, StorageStandard, StorageIA, StorageArchive),
fmt.Sprintf("set the storage class of bucket(default: %s), value range is: %s/%s/%s.", DefaultStorageClass, StorageStandard, StorageIA, StorageArchive)},
OptionStorageClass: Option{"", "--storage-class", DefaultStorageClass, OptionTypeAlternative, fmt.Sprintf("%s/%s/%s/%s", StorageStandard, StorageIA, StorageArchive, StorageColdArchive), "",
fmt.Sprintf("设置对象的存储方式,默认值:%s,取值范围:%s/%s/%s/%s。", DefaultStorageClass, StorageStandard, StorageIA, StorageArchive, StorageColdArchive),
fmt.Sprintf("set the storage class of bucket(default: %s), value range is: %s/%s/%s/%s.", DefaultStorageClass, StorageStandard, StorageIA, StorageArchive, StorageColdArchive)},
OptionForce: Option{"-f", "--force", "", OptionTypeFlagTrue, "", "", "强制操作,不进行询问提示。", "operate silently without asking user to confirm the operation."},
OptionUpdate: Option{"-u", "--update", "", OptionTypeFlagTrue, "", "", "更新操作", "update"},
OptionDelete: Option{"", "--delete", "", OptionTypeFlagTrue, "", "", "删除操作", "delete"},
Expand Down Expand Up @@ -140,8 +140,8 @@ var OptionMap = map[string]Option{
"表示不允许referer字段为空,主要在referer命令中使用",
"specifies that the referer field is not allowed to be empty,primarily used in referer command"},
OptionMethod: Option{"", "--method", "", OptionTypeString, "", "",
"表示http的请求类型,取值为PUT、GET、DELETE等",
"specifies the http method,value is PUTGETDELETE..."},
"表示命令的操作类型,取值为PUT、GET、DELETE、LIST等",
"specifies the command's operation type. the values ​​are PUT, GET, DELETE, LIST, etc"},
OptionOrigin: Option{"", "--origin", "", OptionTypeString, "", "",
"表示http请求头origin字段的值",
"specifies the value of origin field in http header"},
Expand Down

0 comments on commit 3c759f4

Please sign in to comment.