in cmd/syncProcessor.go [275:418]
func (b *remoteResourceDeleter) delete(object StoredObject) error {
/* knarasim: This needs to be taken care of
if b.targetLocation == common.ELocation.BlobFS() && object.entityType == common.EEntityType.Folder() {
b.clientOptions.PerCallPolicies = append([]policy.Policy{common.NewRecursivePolicy()}, b.clientOptions.PerCallPolicies...)
}
*/
objectPath := path.Join(b.rootPath, object.relativePath)
if object.relativePath == "\x00" && b.targetLocation != common.ELocation.Blob() {
return nil // Do nothing, we don't want to accidentally delete the root.
} else if object.relativePath == "\x00" { // this is acceptable on blob, though. Dir stubs are a thing, and they aren't necessary for normal function.
objectPath = b.rootPath
}
if strings.HasSuffix(object.relativePath, "/") && !strings.HasSuffix(objectPath, "/") && b.targetLocation == common.ELocation.Blob() {
// If we were targeting a directory, we still need to be. path.join breaks that.
// We also want to defensively code around this, and make sure we are not putting folder// or trying to put a weird URI in to an endpoint that can't do this.
objectPath += "/"
}
sc := b.remoteClient
if object.entityType == common.EEntityType.File() {
// TODO: use b.targetLocation.String() in the next line, instead of "object", if we can make it come out as string
msg := "Deleting extra object: " + object.relativePath
glcm.Info(msg)
if azcopyScanningLogger != nil {
azcopyScanningLogger.Log(common.LogInfo, msg)
}
var err error
var objURL *url.URL
switch b.targetLocation {
case common.ELocation.Blob():
bsc, _ := sc.BlobServiceClient()
var blobClient *blob.Client = bsc.NewContainerClient(b.containerName).NewBlobClient(objectPath)
objURL, err = b.getObjectURL(blobClient.URL())
if err != nil {
break
}
b.folderManager.RecordChildExists(objURL)
defer b.folderManager.RecordChildDeleted(objURL)
_, err = blobClient.Delete(b.ctx, nil)
case common.ELocation.File():
fsc, _ := sc.FileServiceClient()
fileClient := fsc.NewShareClient(b.containerName).NewRootDirectoryClient().NewFileClient(objectPath)
objURL, err = b.getObjectURL(fileClient.URL())
if err != nil {
break
}
b.folderManager.RecordChildExists(objURL)
defer b.folderManager.RecordChildDeleted(objURL)
err = common.DoWithOverrideReadOnlyOnAzureFiles(b.ctx, func() (interface{}, error) {
return fileClient.Delete(b.ctx, nil)
}, fileClient, b.forceIfReadOnly)
case common.ELocation.BlobFS():
dsc, _ := sc.DatalakeServiceClient()
fileClient := dsc.NewFileSystemClient(b.containerName).NewFileClient(objectPath)
objURL, err = b.getObjectURL(fileClient.DFSURL())
if err != nil {
break
}
b.folderManager.RecordChildExists(objURL)
defer b.folderManager.RecordChildDeleted(objURL)
_, err = fileClient.Delete(b.ctx, nil)
default:
panic("not implemented, check your code")
}
if err != nil {
msg := fmt.Sprintf("error %s deleting the object %s", err.Error(), object.relativePath)
glcm.Info(msg + "; check the scanning log file for more details")
if azcopyScanningLogger != nil {
azcopyScanningLogger.Log(common.LogError, msg+": "+err.Error())
}
return err
}
return nil
} else {
if b.folderOption == common.EFolderPropertiesOption.NoFolders() {
return nil
}
var deleteFunc func(ctx context.Context, logger common.ILogger) bool
var objURL *url.URL
var err error
switch b.targetLocation {
case common.ELocation.Blob():
bsc, _ := sc.BlobServiceClient()
blobClient := bsc.NewContainerClient(b.containerName).NewBlobClient(objectPath)
// HNS endpoint doesn't like delete snapshots on a directory
objURL, err = b.getObjectURL(blobClient.URL())
if err != nil {
return err
}
deleteFunc = func(ctx context.Context, logger common.ILogger) bool {
_, err = blobClient.Delete(b.ctx, nil)
return (err == nil)
}
case common.ELocation.File():
fsc, _ := sc.FileServiceClient()
dirClient := fsc.NewShareClient(b.containerName).NewDirectoryClient(objectPath)
objURL, err = b.getObjectURL(dirClient.URL())
if err != nil {
return err
}
deleteFunc = func(ctx context.Context, logger common.ILogger) bool {
err = common.DoWithOverrideReadOnlyOnAzureFiles(b.ctx, func() (interface{}, error) {
return dirClient.Delete(b.ctx, nil)
}, dirClient, b.forceIfReadOnly)
return (err == nil)
}
case common.ELocation.BlobFS():
dsc, _ := sc.DatalakeServiceClient()
directoryClient := dsc.NewFileSystemClient(b.containerName).NewDirectoryClient(objectPath)
objURL, err = b.getObjectURL(directoryClient.DFSURL())
if err != nil {
return err
}
deleteFunc = func(ctx context.Context, logger common.ILogger) bool {
recursiveContext := common.WithRecursive(b.ctx, false)
_, err = directoryClient.Delete(recursiveContext, nil)
return (err == nil)
}
default:
panic("not implemented, check your code")
}
b.folderManager.RecordChildExists(objURL)
b.folderManager.RequestDeletion(objURL, deleteFunc)
return nil
}
}