Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 10.17.0 #2029

Merged
merged 76 commits into from
Jan 23, 2023
Merged
Changes from 1 commit
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
ad503c1
Add mitigation for weird NtQuerySecurityObject behavior on NAS source…
adreed-msft Aug 31, 2022
314e041
Fix bad URL delete (#1892)
adreed-msft Sep 8, 2022
1b53a7b
Update MacOS testing pipeline (#1896)
adreed-msft Sep 19, 2022
13ef5e3
fixing small typo (,) in help of jobs clean (#1899)
mstenz Sep 22, 2022
46e205e
Implement MD OAuth testing (#1859)
adreed-msft Oct 3, 2022
a219955
Add "all" to documentation (#1902)
adreed-msft Oct 4, 2022
ec0a2e9
10.16.1 patch notes (#1913)
adreed-msft Oct 4, 2022
1aa28fe
Correct version
adreed-msft Oct 5, 2022
bea738d
Export Successfully Updated bytes (#1884)
nakulkar-msft Oct 10, 2022
65af689
Add info in error message for mkdir on Log/Plan (#1883)
ksaur Oct 10, 2022
e4f1c3e
Fix fixupTokenJson (#1890)
adam-orosz Oct 10, 2022
355ea4b
Do not log request/response for container creation error (#1893)
nakulkar-msft Oct 10, 2022
edeb82b
Expose AZCOPY_DOWNLOAD_TO_TEMP_PATH environment variable. (#1895)
adreed-msft Oct 10, 2022
8539454
Slice against the correct string (#1927)
adreed-msft Oct 24, 2022
fda0c83
UX improvement: avoid crash when copying S2S with user delegation SAS…
zezha-msft Oct 27, 2022
e73d0a2
Fix bad build + Prevent bad builds in the future (#1917)
adreed-msft Oct 27, 2022
c6f9c8c
Make sync use last write time for Azure Files (#1930)
adreed-msft Nov 3, 2022
616568d
10.16.2 Changelog (#1948)
adreed-msft Nov 3, 2022
0eacc61
Update azcopy version
adreed-msft Nov 3, 2022
cfca47d
Merge branch 'main' into dev
adreed-msft Nov 3, 2022
090d2d8
Fixed a bug where preserve permissions would not work with OAuth
gapra-msft Nov 15, 2022
945b8a1
Added CODEOWNERS file
gapra-msft Nov 16, 2022
03e02c5
Fixed issue where CPK would not be injected on retries
gapra-msft Nov 16, 2022
f92b840
Added CODEOWNERS file
gapra-msft Nov 16, 2022
21bea31
remove OAuth from test
gapra-msft Nov 16, 2022
f3ef735
Fixed issue where CPK would not be injected on retries
gapra-msft Nov 17, 2022
e6c1b7a
Merge pull request #1963 from Azure/gapra/getACLOAuth
gapra-msft Nov 21, 2022
1e8fc79
Updated version check string to indicate current AzCopy version (#1969)
gapra-msft Nov 21, 2022
bf3a84c
added codeowner
tasherif-msft Dec 1, 2022
ffbeb92
Enhance job summary with details about file/folders (#1952)
adreed-msft Dec 1, 2022
e653f23
Add flag to disable version check (#1950)
adreed-msft Dec 1, 2022
9d57431
Merge pull request #1980 from Azure/tasherif-codeowner
tasherif-msft Dec 1, 2022
3d8d0e1
darwin arm64
tasherif-msft Dec 3, 2022
d7c9d3a
Update golang version to 10.19.2 (#1925)
nakulkar-msft Dec 6, 2022
8f3f8f7
enable cgo
tasherif-msft Dec 6, 2022
73e8b32
added tests
tasherif-msft Dec 6, 2022
4557448
Minor fixes: More in description (#1968)
nakulkar-msft Dec 7, 2022
fcb87a5
azcopy fail to copy 12TB file to Storage containers in Dev.
reshmav18 Dec 20, 2022
fc51bde
Added extra logging when switching endpoints
tasherif-msft Dec 21, 2022
3d222a3
Enable support for preserving SMB info on Linux. (#1723)
linuxsmiths Dec 22, 2022
23a0a77
Added log indicating a sub-directory is being enqueued (#1999)
gapra-msft Dec 22, 2022
4ca0b60
Merge pull request #2002 from Azure/hns-logging
tasherif-msft Dec 22, 2022
8f0103b
Merge pull request #1997 from reshmav18/patch-3
tasherif-msft Dec 22, 2022
30958f8
Log sync deletions to scanning logger (#2000)
nakulkar-msft Dec 23, 2022
aecb217
ieproxy fix
tasherif-msft Jan 5, 2023
83b9a2a
Merge branch 'ieproxy-fix' into test-cross-comp
tasherif-msft Jan 5, 2023
411b5ec
remove cgo
tasherif-msft Jan 5, 2023
0fac383
fix
tasherif-msft Jan 5, 2023
8514d39
fix
tasherif-msft Jan 5, 2023
0960514
fix
tasherif-msft Jan 5, 2023
64ea538
more testing
tasherif-msft Jan 5, 2023
d239be8
more testing
tasherif-msft Jan 5, 2023
55de682
more testing
tasherif-msft Jan 5, 2023
b780635
more testing
tasherif-msft Jan 5, 2023
da6fde1
Merge branch 'dev' into test-cross-comp
tasherif-msft Jan 5, 2023
b923a3a
mod tidy
tasherif-msft Jan 5, 2023
98b4356
mod tidy
tasherif-msft Jan 5, 2023
db2e8b1
more testing
tasherif-msft Jan 5, 2023
b1139c2
Added codespell (#2008)
gapra-msft Jan 5, 2023
62ef70d
Added CodeQL (#2009)
gapra-msft Jan 6, 2023
5883086
Fix for rare infinite loop on mutex acquisition (#2012)
gapra-msft Jan 6, 2023
cd6b989
small fix
tasherif-msft Jan 8, 2023
cebc33f
Merge branch 'test-cross-comp' of github.com:Azure/azure-storage-azco…
tasherif-msft Jan 8, 2023
c824ad3
removed test
tasherif-msft Jan 8, 2023
2d15a37
Merge pull request #1983 from Azure/test-cross-comp
tasherif-msft Jan 9, 2023
052b801
Added trivy file (#2015)
gapra-msft Jan 9, 2023
e376658
Improve debug-ability of e2e tests by uploading logs of failed jobs (…
adreed-msft Jan 12, 2023
708a138
Fail copy job if single blob does not exist (#1981)
tasherif-msft Jan 12, 2023
0f466d5
Correct odd behavior around folder overwrites (#1961)
adreed-msft Jan 12, 2023
60c9aed
Fix files sync by determining which LMT to use via smb properties fla…
adreed-msft Jan 19, 2023
b023fc5
Fix metadata parsing (#1953)
adreed-msft Jan 19, 2023
4779674
Fix ADLSG2 intermittent failure (#1901)
adreed-msft Jan 20, 2023
16ca699
Store source token and pass to other threads (#1996)
tasherif-msft Jan 20, 2023
db0033d
Hash based sync (#2020)
adreed-msft Jan 20, 2023
e8e6233
Copy properties from Source (#1964)
nakulkar-msft Jan 21, 2023
30dfab5
Release notes and version update (#2028)
nakulkar-msft Jan 23, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Improve debug-ability of e2e tests by uploading logs of failed jobs (#…
…1898)

* Upload testing logs to storage account on failed test

* Handle as pipeline artifact instead

* mkdirall

* copy plan files too

* Fix failing tests

* Change overwrite to affect any "locked in"/completed state
  • Loading branch information
adreed-msft authored Jan 12, 2023
commit e3766587c02b70b0b143ac9a88229e4a2943376c
10 changes: 10 additions & 0 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
@@ -139,6 +139,7 @@ jobs:
AZCOPY_E2E_CLIENT_SECRET: $(AZCOPY_SPA_CLIENT_SECRET)
AZCOPY_E2E_CLASSIC_ACCOUNT_NAME: $(AZCOPY_E2E_CLASSIC_ACCOUNT_NAME)
AZCOPY_E2E_CLASSIC_ACCOUNT_KEY: $(AZCOPY_E2E_CLASSIC_ACCOUNT_KEY)
AZCOPY_E2E_LOG_OUTPUT: '$(System.DefaultWorkingDirectory)/logs'
AZCOPY_E2E_OAUTH_MANAGED_DISK_CONFIG: $(AZCOPY_E2E_OAUTH_MANAGED_DISK_CONFIG)
AZCOPY_E2E_STD_MANAGED_DISK_CONFIG: $(AZCOPY_E2E_STD_MANAGED_DISK_CONFIG)
CPK_ENCRYPTION_KEY: $(CPK_ENCRYPTION_KEY)
@@ -162,6 +163,7 @@ jobs:
AZCOPY_E2E_CLIENT_SECRET: $(AZCOPY_SPA_CLIENT_SECRET)
AZCOPY_E2E_CLASSIC_ACCOUNT_NAME: $(AZCOPY_E2E_CLASSIC_ACCOUNT_NAME)
AZCOPY_E2E_CLASSIC_ACCOUNT_KEY: $(AZCOPY_E2E_CLASSIC_ACCOUNT_KEY)
AZCOPY_E2E_LOG_OUTPUT: '$(System.DefaultWorkingDirectory)/logs'
AZCOPY_E2E_OAUTH_MANAGED_DISK_CONFIG: $(AZCOPY_E2E_OAUTH_MANAGED_DISK_CONFIG)
AZCOPY_E2E_STD_MANAGED_DISK_CONFIG: $(AZCOPY_E2E_STD_MANAGED_DISK_CONFIG)
CPK_ENCRYPTION_KEY: $(CPK_ENCRYPTION_KEY)
@@ -187,13 +189,21 @@ jobs:
AZCOPY_E2E_CLIENT_SECRET: $(AZCOPY_SPA_CLIENT_SECRET)
AZCOPY_E2E_CLASSIC_ACCOUNT_NAME: $(AZCOPY_E2E_CLASSIC_ACCOUNT_NAME)
AZCOPY_E2E_CLASSIC_ACCOUNT_KEY: $(AZCOPY_E2E_CLASSIC_ACCOUNT_KEY)
AZCOPY_E2E_LOG_OUTPUT: '$(System.DefaultWorkingDirectory)/logs'
AZCOPY_E2E_OAUTH_MANAGED_DISK_CONFIG: $(AZCOPY_E2E_OAUTH_MANAGED_DISK_CONFIG)
AZCOPY_E2E_STD_MANAGED_DISK_CONFIG: $(AZCOPY_E2E_STD_MANAGED_DISK_CONFIG)
CPK_ENCRYPTION_KEY: $(CPK_ENCRYPTION_KEY)
CPK_ENCRYPTION_KEY_SHA256: $(CPK_ENCRYPTION_KEY_SHA256)
displayName: 'E2E Test MacOs AMD64'
condition: eq(variables.type, 'mac-os')
- task: PublishBuildArtifacts@1
displayName: 'Publish logs'
condition: succeededOrFailed()
inputs:
pathToPublish: '$(System.DefaultWorkingDirectory)/logs'
artifactName: logs

- job: Test_On_Ubuntu
variables:
isMutexSet: 'false'
5 changes: 5 additions & 0 deletions common/fe-ste-models.go
Original file line number Diff line number Diff line change
@@ -670,6 +670,11 @@ var ETransferStatus = TransferStatus(0)

type TransferStatus int32 // Must be 32-bit for atomic operations; negative #s represent a specific failure code

func (t TransferStatus) StatusLocked() bool { // Is an overwrite necessary to change tx status?
// Any kind of failure, or success is considered "locked in".
return t <= ETransferStatus.Failed() || t == ETransferStatus.Success()
}

// Transfer is ready to transfer and not started transferring yet
func (TransferStatus) NotStarted() TransferStatus { return TransferStatus(0) }

56 changes: 45 additions & 11 deletions e2etest/declarativeScenario.go
Original file line number Diff line number Diff line change
@@ -70,6 +70,31 @@ type scenarioState struct {
func (s *scenario) Run() {
defer s.cleanup()

// setup runner
azcopyDir, err := os.MkdirTemp("", "")
if err != nil {
s.a.Error(err.Error())
return
}
azcopyRan := false
defer func() {
if os.Getenv("AZCOPY_E2E_LOG_OUTPUT") == "" {
s.a.Assert(os.RemoveAll(azcopyDir), equals(), nil)
return // no need, just delete logdir
}

err := os.MkdirAll(os.Getenv("AZCOPY_E2E_LOG_OUTPUT"), os.ModePerm|os.ModeDir)
if err != nil {
s.a.Assert(err, equals(), nil)
return
}
if azcopyRan && s.a.Failed() {
s.uploadLogs(azcopyDir)
s.a.(*testingAsserter).t.Log("uploaded logs for job " + s.state.result.jobID.String() + " as an artifact")
}
}()

// setup scenario
// First, validate the accounts make sense for the source/dests
if s.srcAccountType.IsBlobOnly() {
s.a.Assert(s.fromTo.From(), equals(), common.ELocation.Blob())
@@ -97,29 +122,30 @@ func (s *scenario) Run() {
}

// execute
s.runAzCopy()
azcopyRan = true
s.runAzCopy(azcopyDir)
if s.a.Failed() {
return // execution failed. No point in running validation
}

// resume if needed
if s.needResume {
tx, err := s.state.result.GetTransferList(common.ETransferStatus.Cancelled())
tx, err := s.state.result.GetTransferList(common.ETransferStatus.Cancelled(), azcopyDir)
s.a.AssertNoErr(err, "Failed to get transfer list for Cancelled")
s.a.Assert(len(tx), equals(), len(s.p.debugSkipFiles), "Job cancel didn't completely work")

if !s.runHook(s.hs.beforeResumeHook) {
return
}

s.resumeAzCopy()
s.resumeAzCopy(azcopyDir)
}
if s.a.Failed() {
return // resume failed. No point in running validation
}

// check
s.validateTransferStates()
s.validateTransferStates(azcopyDir)
if s.a.Failed() {
return // no point in doing more validation
}
@@ -138,6 +164,13 @@ func (s *scenario) Run() {
s.runHook(s.hs.afterValidation)
}

func (s *scenario) uploadLogs(logDir string) {
if s.state.result == nil || os.Getenv("AZCOPY_E2E_LOG_OUTPUT") == "" {
return // nothing to upload
}
s.a.Assert(os.Rename(logDir, filepath.Join(os.Getenv("AZCOPY_E2E_LOG_OUTPUT"), s.state.result.jobID.String())), equals(), nil)
}

func (s *scenario) runHook(h hookFunc) bool {
if h == nil {
return true // nothing to do. So "successful"
@@ -195,7 +228,7 @@ func (s *scenario) assignSourceAndDest() {
s.state.dest = createTestResource(s.fromTo.To(), false)
}

func (s *scenario) runAzCopy() {
func (s *scenario) runAzCopy(logDirectory string) {
s.chToStdin = make(chan string) // unubuffered seems the most predictable for our usages
defer close(s.chToStdin)

@@ -223,9 +256,9 @@ func (s *scenario) runAzCopy() {
result, wasClean, err := r.ExecuteAzCopyCommand(
s.operation,
s.state.source.getParam(s.stripTopDir, needsSAS(s.credTypes[0]), tf.objectTarget),
s.state.dest.getParam(false, needsSAS(s.credTypes[1]), common.IffString(tf.destTarget != "", tf.destTarget, tf.objectTarget)),
s.credTypes[0].IsAzureOAuth() || s.credTypes[1].IsAzureOAuth(), // needsOAuth
afterStart, s.chToStdin)
s.state.dest.getParam(false, needsSAS(s.credTypes[1]), common.IffString(tf.destTarget != "", tf.destTarget, tf.objectTarget)),
s.credTypes[0] == common.ECredentialType.OAuthToken() || s.credTypes[1] == common.ECredentialType.OAuthToken(), // needsOAuth
afterStart, s.chToStdin, logDirectory)

if !wasClean {
s.a.AssertNoErr(err, "running AzCopy")
@@ -243,7 +276,7 @@ func (s *scenario) runAzCopy() {
s.state.result = &result
}

func (s *scenario) resumeAzCopy() {
func (s *scenario) resumeAzCopy(logDir string) {
s.chToStdin = make(chan string) // unubuffered seems the most predictable for our usages
defer close(s.chToStdin)

@@ -274,6 +307,7 @@ func (s *scenario) resumeAzCopy() {
false,
afterStart,
s.chToStdin,
logDir,
)

if !wasClean {
@@ -295,7 +329,7 @@ func (s *scenario) validateRemove() {
}
}
}
func (s *scenario) validateTransferStates() {
func (s *scenario) validateTransferStates(azcopyDir string) {
if s.operation == eOperation.Remove() {
s.validateRemove()
return
@@ -318,7 +352,7 @@ func (s *scenario) validateTransferStates() {
// Is that OK? (Not sure what to do if it's not, because azcopy jobs show, apparently doesn't offer us a way to get the skipped list)
} {
expectedTransfers := s.fs.getForStatus(statusToTest, expectFolders, expectRootFolder)
actualTransfers, err := s.state.result.GetTransferList(statusToTest)
actualTransfers, err := s.state.result.GetTransferList(statusToTest, azcopyDir)
s.a.AssertNoErr(err)

Validator{}.ValidateCopyTransfersAreScheduled(s.a, isSrcEncoded, isDstEncoded, srcRoot, dstRoot, expectedTransfers, actualTransfers, statusToTest, s.FromTo(), s.srcAccountType, s.destAccountType)
22 changes: 17 additions & 5 deletions e2etest/runner.go
Original file line number Diff line number Diff line change
@@ -26,6 +26,7 @@ import (
"fmt"
"os"
"os/exec"
"path/filepath"
"strconv"
"strings"

@@ -184,7 +185,7 @@ func (t *TestRunner) execDebuggableWithOutput(name string, args []string, env []
return stdout.Bytes(), runErr
}

func (t *TestRunner) ExecuteAzCopyCommand(operation Operation, src, dst string, needsOAuth bool, afterStart func() string, chToStdin <-chan string) (CopyOrSyncCommandResult, bool, error) {
func (t *TestRunner) ExecuteAzCopyCommand(operation Operation, src, dst string, needsOAuth bool, afterStart func() string, chToStdin <-chan string, logDir string) (CopyOrSyncCommandResult, bool, error) {
capLen := func(b []byte) []byte {
if len(b) < 1024 {
return b
@@ -234,6 +235,11 @@ func (t *TestRunner) ExecuteAzCopyCommand(operation Operation, src, dst string,
}
}

if logDir != "" {
env = append(env, "AZCOPY_LOG_LOCATION="+logDir)
env = append(env, "AZCOPY_JOB_PLAN_LOCATION="+filepath.Join(logDir, "plans"))
}

out, err := t.execDebuggableWithOutput(GlobalInputManager{}.GetExecutablePath(), args, env, afterStart, chToStdin)

wasClean := true
@@ -268,9 +274,15 @@ func (t *TestRunner) SetTransferStatusFlag(value string) {
t.flags["with-status"] = value
}

func (t *TestRunner) ExecuteJobsShowCommand(jobID common.JobID) (JobsShowCommandResult, error) {
func (t *TestRunner) ExecuteJobsShowCommand(jobID common.JobID, azcopyDir string) (JobsShowCommandResult, error) {
args := append([]string{"jobs", "show", jobID.String()}, t.computeArgs()...)
out, err := exec.Command(GlobalInputManager{}.GetExecutablePath(), args...).Output()
cmd := exec.Command(GlobalInputManager{}.GetExecutablePath(), args...)

if azcopyDir != "" {
cmd.Env = append(cmd.Env, "AZCOPY_JOB_PLAN_LOCATION="+filepath.Join(azcopyDir, "plans"))
}

out, err := cmd.Output()
if err != nil {
return JobsShowCommandResult{}, err
}
@@ -307,12 +319,12 @@ func newCopyOrSyncCommandResult(rawOutput string) (CopyOrSyncCommandResult, bool
return CopyOrSyncCommandResult{jobID: jobSummary.JobID, finalStatus: jobSummary}, true
}

func (c *CopyOrSyncCommandResult) GetTransferList(status common.TransferStatus) ([]common.TransferDetail, error) {
func (c *CopyOrSyncCommandResult) GetTransferList(status common.TransferStatus, azcopyDir string) ([]common.TransferDetail, error) {
runner := newTestRunner()
runner.SetTransferStatusFlag(status.String())

// invoke AzCopy to get the status from the plan files
result, err := runner.ExecuteJobsShowCommand(c.jobID)
result, err := runner.ExecuteJobsShowCommand(c.jobID, azcopyDir)
if err != nil {
return make([]common.TransferDetail, 0), err
}
5 changes: 3 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
@@ -60,12 +60,13 @@ func main() {
// the user can optionally put the plan files somewhere else
if azcopyJobPlanFolder == "" {
// make the app path folder ".azcopy" first so we can make a plans folder in it
if err := os.Mkdir(azcopyAppPathFolder, os.ModeDir); err != nil && !os.IsExist(err) {
if err := os.MkdirAll(azcopyAppPathFolder, os.ModeDir); err != nil && !os.IsExist(err) {
common.PanicIfErr(err)
}
azcopyJobPlanFolder = path.Join(azcopyAppPathFolder, "plans")
}
if err := os.Mkdir(azcopyJobPlanFolder, os.ModeDir|os.ModePerm); err != nil && !os.IsExist(err) {

if err := os.MkdirAll(azcopyJobPlanFolder, os.ModeDir|os.ModePerm); err != nil && !os.IsExist(err) {
log.Fatalf("Problem making .azcopy directory. Try setting AZCOPY_PLAN_FILE_LOCATION env variable. %v", err)
}

5 changes: 2 additions & 3 deletions ste/JobPartPlan.go
Original file line number Diff line number Diff line change
@@ -409,9 +409,8 @@ func (jppt *JobPartPlanTransfer) SetTransferStatus(status common.TransferStatus,
if !overWrite {
common.AtomicMorphInt32((*int32)(&jppt.atomicTransferStatus),
func(startVal int32) (val int32, morphResult interface{}) {
// start value < 0 means that transfer status is already a failed value.
// If current transfer status has already failed value, then it will not be changed.
return common.Iffint32(startVal < 0, startVal, int32(status)), nil
// If current transfer status has some completed value, then it will not be changed.
return common.Iffint32(common.TransferStatus(startVal).StatusLocked(), startVal, int32(status)), nil
})
} else {
(&jppt.atomicTransferStatus).AtomicStore(status)