diff --git a/sdk/storage/azfile/assets.json b/sdk/storage/azfile/assets.json index 23448376d5cc..d22014681ec8 100644 --- a/sdk/storage/azfile/assets.json +++ b/sdk/storage/azfile/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/storage/azfile", - "Tag": "go/storage/azfile_5b5e44362e" + "Tag": "go/storage/azfile_413a85db89" } diff --git a/sdk/storage/azfile/file/client_test.go b/sdk/storage/azfile/file/client_test.go index b50b90babc2e..9a61a5f696b8 100644 --- a/sdk/storage/azfile/file/client_test.go +++ b/sdk/storage/azfile/file/client_test.go @@ -714,22 +714,7 @@ func (f *FileRecordedTestsSuite) TestFileSetMetadataInvalidField() { _require.Error(err) } -func waitForCopy(_require *require.Assertions, copyFClient *file.Client, fileCopyResponse file.StartCopyFromURLResponse) { - status := fileCopyResponse.CopyStatus - // Wait for the copy to finish. If the copy takes longer than a minute, we will fail - start := time.Now() - for *status != file.CopyStatusTypeSuccess { - GetPropertiesResp, err := copyFClient.GetProperties(context.Background(), nil) - _require.NoError(err) - status = GetPropertiesResp.CopyStatus - currentTime := time.Now() - if currentTime.Sub(start) >= time.Minute && *status != file.CopyStatusTypeSuccess { - _require.Fail("Copy status is " + string(*status) + "after 1 minute") - } - } -} - -func (f *FileUnrecordedTestsSuite) TestFileStartCopyMetadata() { +func (f *FileRecordedTestsSuite) TestFileStartCopyMetadata() { _require := require.New(f.T()) testName := f.T().Name() @@ -749,16 +734,18 @@ func (f *FileUnrecordedTestsSuite) TestFileStartCopyMetadata() { "Foo": to.Ptr("Foovalue"), "Bar": to.Ptr("Barvalue"), } - resp, err := copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{Metadata: basicMetadata}) + + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{Metadata: basicMetadata}) _require.NoError(err) - waitForCopy(_require, copyFClient, resp) + + time.Sleep(4 * time.Second) resp2, err := copyFClient.GetProperties(context.Background(), nil) _require.NoError(err) _require.EqualValues(resp2.Metadata, basicMetadata) } -func (f *FileUnrecordedTestsSuite) TestFileStartCopyMetadataNil() { +func (f *FileRecordedTestsSuite) TestFileStartCopyMetadataNil() { _require := require.New(f.T()) testName := f.T().Name() @@ -787,17 +774,17 @@ func (f *FileUnrecordedTestsSuite) TestFileStartCopyMetadataNil() { _require.NoError(err) _require.EqualValues(gResp.Metadata, basicMetadata) - resp, err := copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), nil) + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), nil) _require.NoError(err) - waitForCopy(_require, copyFClient, resp) + time.Sleep(4 * time.Second) resp2, err := copyFClient.GetProperties(context.Background(), nil) _require.NoError(err) _require.Len(resp2.Metadata, 0) } -func (f *FileUnrecordedTestsSuite) TestFileStartCopyMetadataEmpty() { +func (f *FileRecordedTestsSuite) TestFileStartCopyMetadataEmpty() { _require := require.New(f.T()) testName := f.T().Name() @@ -826,10 +813,10 @@ func (f *FileUnrecordedTestsSuite) TestFileStartCopyMetadataEmpty() { _require.NoError(err) _require.EqualValues(gResp.Metadata, basicMetadata) - resp, err := copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{Metadata: map[string]*string{}}) + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{Metadata: map[string]*string{}}) _require.NoError(err) - waitForCopy(_require, copyFClient, resp) + time.Sleep(4 * time.Second) resp2, err := copyFClient.GetProperties(context.Background(), nil) _require.NoError(err) @@ -858,6 +845,377 @@ func (f *FileRecordedTestsSuite) TestFileStartCopyNegativeMetadataInvalidField() _require.Error(err) } +func (f *FileRecordedTestsSuite) TestFileStartCopySourceCreationTime() { + _require := require.New(f.T()) + testName := f.T().Name() + + svcClient, err := testcommon.GetServiceClient(f.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + shareClient := testcommon.CreateNewShare(context.Background(), _require, testcommon.GenerateShareName(testName), svcClient) + defer testcommon.DeleteShare(context.Background(), _require, shareClient) + + fClient := shareClient.NewRootDirectoryClient().NewFileClient("src" + testcommon.GenerateFileName(testName)) + copyFClient := shareClient.NewRootDirectoryClient().NewFileClient("dst" + testcommon.GenerateFileName(testName)) + + currTime, err := time.Parse(time.UnixDate, "Fri Mar 31 21:00:00 GMT 2023") + _require.NoError(err) + + cResp, err := fClient.Create(context.Background(), 0, &file.CreateOptions{ + SMBProperties: &file.SMBProperties{ + Attributes: &file.NTFSFileAttributes{ReadOnly: true, Hidden: true}, + CreationTime: to.Ptr(currTime.Add(5 * time.Minute)), + LastWriteTime: to.Ptr(currTime.Add(2 * time.Minute)), + }, + }) + _require.NoError(err) + _require.NotNil(cResp.FileCreationTime) + _require.NotNil(cResp.FileLastWriteTime) + _require.NotNil(cResp.FileAttributes) + _require.NotNil(cResp.FilePermissionKey) + + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{ + CopyFileSMBInfo: &file.CopyFileSMBInfo{ + CreationTime: file.SourceCopyFileCreationTime{}, + }, + }) + _require.NoError(err) + + time.Sleep(4 * time.Second) + + resp2, err := copyFClient.GetProperties(context.Background(), nil) + _require.NoError(err) + _require.EqualValues(resp2.FileCreationTime, cResp.FileCreationTime) + _require.NotEqualValues(resp2.FileLastWriteTime, cResp.FileLastWriteTime) + _require.NotEqualValues(resp2.FileAttributes, cResp.FileAttributes) +} + +func (f *FileRecordedTestsSuite) TestFileStartCopySourceProperties() { + _require := require.New(f.T()) + testName := f.T().Name() + + svcClient, err := testcommon.GetServiceClient(f.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + shareClient := testcommon.CreateNewShare(context.Background(), _require, testcommon.GenerateShareName(testName), svcClient) + defer testcommon.DeleteShare(context.Background(), _require, shareClient) + + fClient := shareClient.NewRootDirectoryClient().NewFileClient("src" + testcommon.GenerateFileName(testName)) + copyFClient := shareClient.NewRootDirectoryClient().NewFileClient("dst" + testcommon.GenerateFileName(testName)) + + currTime, err := time.Parse(time.UnixDate, "Fri Mar 31 20:00:00 GMT 2023") + _require.NoError(err) + + cResp, err := fClient.Create(context.Background(), 0, &file.CreateOptions{ + SMBProperties: &file.SMBProperties{ + Attributes: &file.NTFSFileAttributes{System: true}, + CreationTime: to.Ptr(currTime.Add(1 * time.Minute)), + LastWriteTime: to.Ptr(currTime.Add(2 * time.Minute)), + }, + }) + _require.NoError(err) + _require.NotNil(cResp.FileCreationTime) + _require.NotNil(cResp.FileLastWriteTime) + _require.NotNil(cResp.FileAttributes) + _require.NotNil(cResp.FilePermissionKey) + + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{ + CopyFileSMBInfo: &file.CopyFileSMBInfo{ + CreationTime: file.SourceCopyFileCreationTime{}, + LastWriteTime: file.SourceCopyFileLastWriteTime{}, + Attributes: file.SourceCopyFileAttributes{}, + PermissionCopyMode: to.Ptr(file.PermissionCopyModeTypeSource), + }, + }) + _require.NoError(err) + + time.Sleep(4 * time.Second) + + resp2, err := copyFClient.GetProperties(context.Background(), nil) + _require.NoError(err) + _require.EqualValues(resp2.FileCreationTime, cResp.FileCreationTime) + _require.EqualValues(resp2.FileLastWriteTime, cResp.FileLastWriteTime) + _require.EqualValues(resp2.FileAttributes, cResp.FileAttributes) + _require.EqualValues(resp2.FilePermissionKey, cResp.FilePermissionKey) +} + +func (f *FileRecordedTestsSuite) TestFileStartCopyDifferentProperties() { + _require := require.New(f.T()) + testName := f.T().Name() + + svcClient, err := testcommon.GetServiceClient(f.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + shareClient := testcommon.CreateNewShare(context.Background(), _require, testcommon.GenerateShareName(testName), svcClient) + defer testcommon.DeleteShare(context.Background(), _require, shareClient) + + fClient := shareClient.NewRootDirectoryClient().NewFileClient("src" + testcommon.GenerateFileName(testName)) + copyFClient := shareClient.NewRootDirectoryClient().NewFileClient("dst" + testcommon.GenerateFileName(testName)) + + currTime, err := time.Parse(time.UnixDate, "Fri Mar 31 20:00:00 GMT 2023") + _require.NoError(err) + + cResp, err := fClient.Create(context.Background(), 0, &file.CreateOptions{ + SMBProperties: &file.SMBProperties{ + Attributes: &file.NTFSFileAttributes{System: true}, + CreationTime: to.Ptr(currTime.Add(1 * time.Minute)), + LastWriteTime: to.Ptr(currTime.Add(2 * time.Minute)), + }, + }) + _require.NoError(err) + _require.NotNil(cResp.FileCreationTime) + _require.NotNil(cResp.FileLastWriteTime) + _require.NotNil(cResp.FileAttributes) + _require.NotNil(cResp.FilePermissionKey) + + destCreationTime := currTime.Add(5 * time.Minute) + destLastWriteTIme := currTime.Add(6 * time.Minute) + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{ + CopyFileSMBInfo: &file.CopyFileSMBInfo{ + CreationTime: file.DestinationCopyFileCreationTime(destCreationTime), + LastWriteTime: file.DestinationCopyFileLastWriteTime(destLastWriteTIme), + Attributes: file.DestinationCopyFileAttributes{ReadOnly: true}, + }, + }) + _require.NoError(err) + + time.Sleep(4 * time.Second) + + resp2, err := copyFClient.GetProperties(context.Background(), nil) + _require.NoError(err) + _require.NotEqualValues(resp2.FileCreationTime, cResp.FileCreationTime) + _require.EqualValues(*resp2.FileCreationTime, destCreationTime.UTC()) + _require.NotEqualValues(resp2.FileLastWriteTime, cResp.FileLastWriteTime) + _require.EqualValues(*resp2.FileLastWriteTime, destLastWriteTIme.UTC()) + _require.NotEqualValues(resp2.FileAttributes, cResp.FileAttributes) + _require.EqualValues(resp2.FilePermissionKey, cResp.FilePermissionKey) +} + +func (f *FileRecordedTestsSuite) TestFileStartCopyOverrideMode() { + _require := require.New(f.T()) + testName := f.T().Name() + + svcClient, err := testcommon.GetServiceClient(f.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + shareClient := testcommon.CreateNewShare(context.Background(), _require, testcommon.GenerateShareName(testName), svcClient) + defer testcommon.DeleteShare(context.Background(), _require, shareClient) + + fClient := shareClient.NewRootDirectoryClient().NewFileClient("src" + testcommon.GenerateFileName(testName)) + copyFClient := shareClient.NewRootDirectoryClient().NewFileClient("dst" + testcommon.GenerateFileName(testName)) + + cResp, err := fClient.Create(context.Background(), 0, nil) + _require.NoError(err) + _require.NotNil(cResp.FileCreationTime) + _require.NotNil(cResp.FileLastWriteTime) + _require.NotNil(cResp.FileAttributes) + _require.NotNil(cResp.FilePermissionKey) + + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{ + Permissions: &file.Permissions{ + Permission: to.Ptr(testcommon.SampleSDDL), + }, + CopyFileSMBInfo: &file.CopyFileSMBInfo{ + PermissionCopyMode: to.Ptr(file.PermissionCopyModeTypeOverride), + }, + }) + _require.NoError(err) + + time.Sleep(4 * time.Second) + + resp2, err := copyFClient.GetProperties(context.Background(), nil) + _require.NoError(err) + _require.NotEqualValues(resp2.FileCreationTime, cResp.FileCreationTime) + _require.NotEqualValues(resp2.FileLastWriteTime, cResp.FileLastWriteTime) + _require.NotEqualValues(resp2.FilePermissionKey, cResp.FilePermissionKey) +} + +func (f *FileRecordedTestsSuite) TestNegativeFileStartCopyOverrideMode() { + _require := require.New(f.T()) + testName := f.T().Name() + + svcClient, err := testcommon.GetServiceClient(f.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + shareClient := testcommon.CreateNewShare(context.Background(), _require, testcommon.GenerateShareName(testName), svcClient) + defer testcommon.DeleteShare(context.Background(), _require, shareClient) + + fClient := shareClient.NewRootDirectoryClient().NewFileClient("src" + testcommon.GenerateFileName(testName)) + copyFClient := shareClient.NewRootDirectoryClient().NewFileClient("dst" + testcommon.GenerateFileName(testName)) + + cResp, err := fClient.Create(context.Background(), 0, nil) + _require.NoError(err) + _require.NotNil(cResp.FileCreationTime) + _require.NotNil(cResp.FileLastWriteTime) + _require.NotNil(cResp.FileAttributes) + _require.NotNil(cResp.FilePermissionKey) + + // permission or permission key is required when the PermissionCopyMode is override. + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{ + CopyFileSMBInfo: &file.CopyFileSMBInfo{ + PermissionCopyMode: to.Ptr(file.PermissionCopyModeTypeOverride), + }, + }) + _require.Error(err) + testcommon.ValidateFileErrorCode(_require, err, fileerror.MissingRequiredHeader) +} + +func (f *FileRecordedTestsSuite) TestFileStartCopySetArchiveAttributeTrue() { + _require := require.New(f.T()) + testName := f.T().Name() + + svcClient, err := testcommon.GetServiceClient(f.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + shareClient := testcommon.CreateNewShare(context.Background(), _require, testcommon.GenerateShareName(testName), svcClient) + defer testcommon.DeleteShare(context.Background(), _require, shareClient) + + fClient := shareClient.NewRootDirectoryClient().NewFileClient("src" + testcommon.GenerateFileName(testName)) + copyFClient := shareClient.NewRootDirectoryClient().NewFileClient("dst" + testcommon.GenerateFileName(testName)) + + cResp, err := fClient.Create(context.Background(), 0, &file.CreateOptions{ + SMBProperties: &file.SMBProperties{ + Attributes: &file.NTFSFileAttributes{ReadOnly: true, Hidden: true}, + }, + }) + _require.NoError(err) + _require.NotNil(cResp.FileCreationTime) + _require.NotNil(cResp.FileLastWriteTime) + _require.NotNil(cResp.FileAttributes) + _require.NotNil(cResp.FilePermissionKey) + + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{ + CopyFileSMBInfo: &file.CopyFileSMBInfo{ + Attributes: file.DestinationCopyFileAttributes{System: true, ReadOnly: true}, + SetArchiveAttribute: to.Ptr(true), + }, + }) + _require.NoError(err) + + time.Sleep(4 * time.Second) + + resp2, err := copyFClient.GetProperties(context.Background(), nil) + _require.NoError(err) + _require.NotEqualValues(resp2.FileCreationTime, cResp.FileCreationTime) + _require.NotEqualValues(resp2.FileLastWriteTime, cResp.FileLastWriteTime) + _require.Contains(*resp2.FileAttributes, "Archive") +} + +func (f *FileRecordedTestsSuite) TestFileStartCopySetArchiveAttributeFalse() { + _require := require.New(f.T()) + testName := f.T().Name() + + svcClient, err := testcommon.GetServiceClient(f.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + shareClient := testcommon.CreateNewShare(context.Background(), _require, testcommon.GenerateShareName(testName), svcClient) + defer testcommon.DeleteShare(context.Background(), _require, shareClient) + + fClient := shareClient.NewRootDirectoryClient().NewFileClient("src" + testcommon.GenerateFileName(testName)) + copyFClient := shareClient.NewRootDirectoryClient().NewFileClient("dst" + testcommon.GenerateFileName(testName)) + + cResp, err := fClient.Create(context.Background(), 0, &file.CreateOptions{ + SMBProperties: &file.SMBProperties{ + Attributes: &file.NTFSFileAttributes{ReadOnly: true, Hidden: true}, + }, + }) + _require.NoError(err) + _require.NotNil(cResp.FileCreationTime) + _require.NotNil(cResp.FileLastWriteTime) + _require.NotNil(cResp.FileAttributes) + _require.NotNil(cResp.FilePermissionKey) + + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{ + CopyFileSMBInfo: &file.CopyFileSMBInfo{ + Attributes: file.DestinationCopyFileAttributes{System: true, ReadOnly: true}, + SetArchiveAttribute: to.Ptr(false), + }, + }) + _require.NoError(err) + + time.Sleep(4 * time.Second) + + resp2, err := copyFClient.GetProperties(context.Background(), nil) + _require.NoError(err) + _require.NotEqualValues(resp2.FileCreationTime, cResp.FileCreationTime) + _require.NotEqualValues(resp2.FileLastWriteTime, cResp.FileLastWriteTime) + _require.NotContains(*resp2.FileAttributes, "Archive") +} + +func (f *FileRecordedTestsSuite) TestFileStartCopyDestReadOnly() { + _require := require.New(f.T()) + testName := f.T().Name() + + svcClient, err := testcommon.GetServiceClient(f.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + shareClient := testcommon.CreateNewShare(context.Background(), _require, testcommon.GenerateShareName(testName), svcClient) + defer testcommon.DeleteShare(context.Background(), _require, shareClient) + + fClient := shareClient.NewRootDirectoryClient().NewFileClient("src" + testcommon.GenerateFileName(testName)) + copyFClient := shareClient.NewRootDirectoryClient().NewFileClient("dst" + testcommon.GenerateFileName(testName)) + + cResp, err := fClient.Create(context.Background(), 0, nil) + _require.NoError(err) + _require.NotNil(cResp.FileCreationTime) + _require.NotNil(cResp.FileLastWriteTime) + _require.NotNil(cResp.FileAttributes) + _require.NotNil(cResp.FilePermissionKey) + + _, err = copyFClient.Create(context.Background(), 0, &file.CreateOptions{ + SMBProperties: &file.SMBProperties{ + Attributes: &file.NTFSFileAttributes{ReadOnly: true}, + }, + }) + _require.NoError(err) + + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), &file.StartCopyFromURLOptions{ + CopyFileSMBInfo: &file.CopyFileSMBInfo{ + IgnoreReadOnly: to.Ptr(true), + }, + }) + _require.NoError(err) + + time.Sleep(4 * time.Second) + + resp2, err := copyFClient.GetProperties(context.Background(), nil) + _require.NoError(err) + _require.NotEqualValues(resp2.FileCreationTime, cResp.FileCreationTime) + _require.NotEqualValues(resp2.FileLastWriteTime, cResp.FileLastWriteTime) +} + +func (f *FileRecordedTestsSuite) TestNegativeFileStartCopyDestReadOnly() { + _require := require.New(f.T()) + testName := f.T().Name() + + svcClient, err := testcommon.GetServiceClient(f.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + shareClient := testcommon.CreateNewShare(context.Background(), _require, testcommon.GenerateShareName(testName), svcClient) + defer testcommon.DeleteShare(context.Background(), _require, shareClient) + + fClient := shareClient.NewRootDirectoryClient().NewFileClient("src" + testcommon.GenerateFileName(testName)) + copyFClient := shareClient.NewRootDirectoryClient().NewFileClient("dst" + testcommon.GenerateFileName(testName)) + + cResp, err := fClient.Create(context.Background(), 0, nil) + _require.NoError(err) + _require.NotNil(cResp.FileCreationTime) + _require.NotNil(cResp.FileLastWriteTime) + _require.NotNil(cResp.FileAttributes) + _require.NotNil(cResp.FilePermissionKey) + + _, err = copyFClient.Create(context.Background(), 0, &file.CreateOptions{ + SMBProperties: &file.SMBProperties{ + Attributes: &file.NTFSFileAttributes{ReadOnly: true}, + }, + }) + _require.NoError(err) + + _, err = copyFClient.StartCopyFromURL(context.Background(), fClient.URL(), nil) + _require.Error(err) + testcommon.ValidateFileErrorCode(_require, err, fileerror.ReadOnlyAttribute) +} + func (f *FileRecordedTestsSuite) TestFileStartCopySourceNonExistent() { _require := require.New(f.T()) testName := f.T().Name() diff --git a/sdk/storage/azfile/file/models.go b/sdk/storage/azfile/file/models.go index 8ffdfdcbba84..b0417b617d40 100644 --- a/sdk/storage/azfile/file/models.go +++ b/sdk/storage/azfile/file/models.go @@ -36,9 +36,6 @@ type LeaseAccessConditions = generated.LeaseAccessConditions // SourceModifiedAccessConditions contains a group of parameters for the FileClient.UploadRangeFromURL method. type SourceModifiedAccessConditions = generated.SourceModifiedAccessConditions -// CopyFileSMBInfo contains a group of parameters for the FileClient.StartCopy method. -type CopyFileSMBInfo = generated.CopyFileSMBInfo - // HTTPRange defines a range of bytes within an HTTP resource, starting at offset and // ending at offset+count. A zero-value HTTPRange indicates the entire resource. An HTTPRange // which has an offset but no zero value count indicates from the offset to the resource's end. @@ -216,9 +213,84 @@ func (o *StartCopyFromURLOptions) format() (*generated.FileClientStartCopyOption FilePermissionKey: permissionKey, Metadata: o.Metadata, } - return opts, o.CopyFileSMBInfo, o.LeaseAccessConditions + return opts, o.CopyFileSMBInfo.format(), o.LeaseAccessConditions } +// CopyFileSMBInfo contains a group of parameters for the FileClient.StartCopy method. +type CopyFileSMBInfo struct { + // Specifies either the option to copy file attributes from a source file(source) to a target file or a list of attributes + // to set on a target file. + Attributes CopyFileAttributes + // Specifies either the option to copy file creation time from a source file(source) to a target file or a time value in ISO + // 8601 format to set as creation time on a target file. + CreationTime CopyFileCreationTime + // Specifies either the option to copy file last write time from a source file(source) to a target file or a time value in + // ISO 8601 format to set as last write time on a target file. + LastWriteTime CopyFileLastWriteTime + // Specifies the option to copy file security descriptor from source file or to set it using the value which is defined by + // the header value of x-ms-file-permission or x-ms-file-permission-key. + PermissionCopyMode *PermissionCopyModeType + // Specifies the option to overwrite the target file if it already exists and has read-only attribute set. + IgnoreReadOnly *bool + // Specifies the option to set archive attribute on a target file. True means archive attribute will be set on a target file + // despite attribute overrides or a source file state. + SetArchiveAttribute *bool +} + +func (c *CopyFileSMBInfo) format() *generated.CopyFileSMBInfo { + if c == nil { + return nil + } + + opts := &generated.CopyFileSMBInfo{ + FilePermissionCopyMode: c.PermissionCopyMode, + IgnoreReadOnly: c.IgnoreReadOnly, + SetArchiveAttribute: c.SetArchiveAttribute, + } + + if c.Attributes != nil { + opts.FileAttributes = c.Attributes.FormatAttributes() + } + if c.CreationTime != nil { + opts.FileCreationTime = c.CreationTime.FormatCreationTime() + } + if c.LastWriteTime != nil { + opts.FileLastWriteTime = c.LastWriteTime.FormatLastWriteTime() + } + + return opts +} + +// CopyFileAttributes specifies either the option to copy file attributes from a source file(source) to a target file or +// a list of attributes to set on a target file. +type CopyFileAttributes = exported.CopyFileAttributes + +// SourceCopyFileAttributes specifies to copy file attributes from a source file(source) to a target file +type SourceCopyFileAttributes = exported.SourceCopyFileAttributes + +// DestinationCopyFileAttributes specifies a list of attributes to set on a target file. +type DestinationCopyFileAttributes = exported.DestinationCopyFileAttributes + +// CopyFileCreationTime specifies either the option to copy file creation time from a source file(source) to a target file or +// a time value in ISO 8601 format to set as creation time on a target file. +type CopyFileCreationTime = exported.CopyFileCreationTime + +// SourceCopyFileCreationTime specifies to copy file creation time from a source file(source) to a target file. +type SourceCopyFileCreationTime = exported.SourceCopyFileCreationTime + +// DestinationCopyFileCreationTime specifies a time value in ISO 8601 format to set as creation time on a target file. +type DestinationCopyFileCreationTime = exported.DestinationCopyFileCreationTime + +// CopyFileLastWriteTime specifies either the option to copy file last write time from a source file(source) to a target file or +// a time value in ISO 8601 format to set as last write time on a target file. +type CopyFileLastWriteTime = exported.CopyFileLastWriteTime + +// SourceCopyFileLastWriteTime specifies to copy file last write time from a source file(source) to a target file. +type SourceCopyFileLastWriteTime = exported.SourceCopyFileLastWriteTime + +// DestinationCopyFileLastWriteTime specifies a time value in ISO 8601 format to set as last write time on a target file. +type DestinationCopyFileLastWriteTime = exported.DestinationCopyFileLastWriteTime + // --------------------------------------------------------------------------------------------------------------------- // AbortCopyOptions contains the optional parameters for the Client.AbortCopy method. diff --git a/sdk/storage/azfile/internal/exported/copy_file_smb_options.go b/sdk/storage/azfile/internal/exported/copy_file_smb_options.go new file mode 100644 index 000000000000..9f0da40bba4d --- /dev/null +++ b/sdk/storage/azfile/internal/exported/copy_file_smb_options.go @@ -0,0 +1,96 @@ +//go:build go1.18 +// +build go1.18 + +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +package exported + +import ( + "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" + "github.com/Azure/azure-sdk-for-go/sdk/storage/azfile/internal/generated" + "time" +) + +// CopyFileCreationTime specifies either the option to copy file creation time from a source file(source) to a target file or +// a time value in ISO 8601 format to set as creation time on a target file. +type CopyFileCreationTime interface { + FormatCreationTime() *string + notPubliclyImplementable() +} + +// SourceCopyFileCreationTime specifies to copy file creation time from a source file(source) to a target file. +type SourceCopyFileCreationTime struct { +} + +func (s SourceCopyFileCreationTime) FormatCreationTime() *string { + return to.Ptr("source") +} + +func (s SourceCopyFileCreationTime) notPubliclyImplementable() {} + +// DestinationCopyFileCreationTime specifies a time value in ISO 8601 format to set as creation time on a target file. +type DestinationCopyFileCreationTime time.Time + +func (d DestinationCopyFileCreationTime) FormatCreationTime() *string { + return to.Ptr(time.Time(d).UTC().Format(generated.ISO8601)) +} + +func (d DestinationCopyFileCreationTime) notPubliclyImplementable() {} + +// --------------------------------------------------------------------------------------------------------------------- + +// CopyFileLastWriteTime specifies either the option to copy file last write time from a source file(source) to a target file or +// a time value in ISO 8601 format to set as last write time on a target file. +type CopyFileLastWriteTime interface { + FormatLastWriteTime() *string + notPubliclyImplementable() +} + +// SourceCopyFileLastWriteTime specifies to copy file last write time from a source file(source) to a target file. +type SourceCopyFileLastWriteTime struct { +} + +func (s SourceCopyFileLastWriteTime) FormatLastWriteTime() *string { + return to.Ptr("source") +} + +func (s SourceCopyFileLastWriteTime) notPubliclyImplementable() {} + +// DestinationCopyFileLastWriteTime specifies a time value in ISO 8601 format to set as last write time on a target file. +type DestinationCopyFileLastWriteTime time.Time + +func (d DestinationCopyFileLastWriteTime) FormatLastWriteTime() *string { + return to.Ptr(time.Time(d).UTC().Format(generated.ISO8601)) +} + +func (d DestinationCopyFileLastWriteTime) notPubliclyImplementable() {} + +// --------------------------------------------------------------------------------------------------------------------- + +// CopyFileAttributes specifies either the option to copy file attributes from a source file(source) to a target file or +// a list of attributes to set on a target file. +type CopyFileAttributes interface { + FormatAttributes() *string + notPubliclyImplementable() +} + +// SourceCopyFileAttributes specifies to copy file attributes from a source file(source) to a target file +type SourceCopyFileAttributes struct { +} + +func (s SourceCopyFileAttributes) FormatAttributes() *string { + return to.Ptr("source") +} + +func (s SourceCopyFileAttributes) notPubliclyImplementable() {} + +// DestinationCopyFileAttributes specifies a list of attributes to set on a target file. +type DestinationCopyFileAttributes NTFSFileAttributes + +func (d DestinationCopyFileAttributes) FormatAttributes() *string { + attributes := NTFSFileAttributes(d) + return to.Ptr(attributes.String()) +} + +func (d DestinationCopyFileAttributes) notPubliclyImplementable() {}