This commit is contained in:
vibhansa-msft 2023-05-10 18:15:38 +05:30
Родитель 037eadd482 9a0589a445
Коммит fb411f4869
68 изменённых файлов: 2489 добавлений и 697 удалений

Просмотреть файл

@ -1,3 +1,11 @@
## 2.0.4 (WIP)
**Features**
- Added new config parameter "max-fuse-threads" under "libfuse" config to control max threads allowed at libfuse layer.
- Added new config parameter 'refresh-sec' in 'file-cache'. When file-cache-timeout is set to a large value, this field can control when to refresh the file if file in container has changed.
**Bug Fixes**
- [#1116](https://github.com/Azure/azure-storage-fuse/issues/1116)] Relative path for tmp-cache is resulting into file read-write failure.
## 2.0.3 (2023-04-26)
**Bug Fixes**
- [#1080](https://github.com/Azure/azure-storage-fuse/issues/1080) HNS rename flow does not encode source path correctly.

1593
NOTICE

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -17,7 +17,7 @@ steps:
- task: ShellScript@2
inputs:
scriptPath: "${{ parameters.work_dir }}/go_installer.sh"
args: "${{ parameters.root_dir }}/ 1.16.2"
args: "${{ parameters.root_dir }}/ 1.19.9"
displayName: "Installing Go tools"
# Installing Blobfuse2 Dependencies via go get

Просмотреть файл

@ -41,7 +41,7 @@ steps:
# GoTool task used only for Microsoft Hosted Agents to install Go-lang
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
condition: ${{ parameters.hostedAgent }}
displayName: "GoTool Setup"
@ -49,7 +49,7 @@ steps:
- task: ShellScript@2
inputs:
scriptPath: "${{ parameters.working_directory }}/go_installer.sh"
args: "${{ parameters.root_dir }}/ 1.16.2"
args: "${{ parameters.root_dir }}/ 1.19.9"
condition: not(${{parameters.hostedAgent }})
displayName: "GoTool Custom Setup"

Просмотреть файл

@ -16,7 +16,7 @@ steps:
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "GoTool Setup"
# Create directory structure and prepare to mount

Просмотреть файл

@ -36,7 +36,7 @@ jobs:
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "Select Go Version"
- task: Go@0

Просмотреть файл

@ -752,7 +752,7 @@ stages:
# GoTool task used only for Microsoft Hosted Agents to install Go-lang
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "GoTool Setup"
- script: |

Просмотреть файл

@ -738,7 +738,7 @@ stages:
# Go tool installer
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "Install Go Version"
- script: |
@ -822,7 +822,7 @@ stages:
# Go tool installer
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "Install Go Version"
- script: |
@ -897,7 +897,7 @@ stages:
# Go tool installer
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "Install Go Version"
- template: 'azure-pipeline-templates/distro-tests.yml'
@ -971,7 +971,7 @@ stages:
# Go tool installer
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "Install Go Version"
- template: 'azure-pipeline-templates/distro-tests.yml'
@ -1040,7 +1040,7 @@ stages:
# Go tool installer
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "Install Go Version"
- template: 'azure-pipeline-templates/distro-tests.yml'
@ -1111,7 +1111,7 @@ stages:
# Go tool installer
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "Install Go Version"
- template: 'azure-pipeline-templates/distro-tests.yml'
@ -1859,7 +1859,7 @@ stages:
- task: ShellScript@2
inputs:
scriptPath: "$(WORK_DIR)/go_installer.sh"
args: "$(ROOT_DIR)/ 1.16.2"
args: "$(ROOT_DIR)/ 1.19.9"
displayName: "GoTool Custom Setup"
# Downloading Go dependency packages

Просмотреть файл

@ -268,7 +268,7 @@ stages:
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "GoTool Setup"
- script: |
@ -367,7 +367,7 @@ stages:
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "GoTool Setup"
- script: |
@ -461,7 +461,7 @@ stages:
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "GoTool Setup"
- script: |
@ -564,7 +564,7 @@ stages:
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "GoTool Setup"
- script: |
@ -681,7 +681,7 @@ stages:
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "GoTool Setup"
- script: |
@ -782,7 +782,7 @@ stages:
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "GoTool Setup"
- script: |
@ -872,7 +872,7 @@ stages:
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "GoTool Setup"
- script: |
@ -964,7 +964,7 @@ stages:
- task: GoTool@0
inputs:
version: '1.16.2'
version: '1.19.9'
displayName: "GoTool Setup"
- script: |

Просмотреть файл

@ -35,7 +35,6 @@ package cmd
import (
"fmt"
"io/ioutil"
"os"
"regexp"
"strings"
@ -66,9 +65,9 @@ var generateTestConfig = &cobra.Command{
var err error
if strings.Contains(opts.configFilePath, templatesDir) {
templateConfig, err = ioutil.ReadFile(opts.configFilePath)
templateConfig, err = os.ReadFile(opts.configFilePath)
} else {
templateConfig, err = ioutil.ReadFile(templatesDir + opts.configFilePath)
templateConfig, err = os.ReadFile(templatesDir + opts.configFilePath)
}
if err != nil {
@ -97,7 +96,7 @@ var generateTestConfig = &cobra.Command{
}
// write the config with the params to the output file
err = ioutil.WriteFile(opts.outputConfigPath, []byte(newConfig), 0700)
err = os.WriteFile(opts.outputConfigPath, []byte(newConfig), 0700)
if err != nil {
return fmt.Errorf("failed to write file [%s]", err.Error())
}

Просмотреть файл

@ -35,7 +35,6 @@ package cmd
import (
"fmt"
"io/ioutil"
"os"
"testing"
@ -100,7 +99,7 @@ func (suite *docTestSuite) TestDocsGenerationError() {
func (suite *docTestSuite) TestOutputDirIsFileError() {
defer suite.cleanupTest()
opFile, err := ioutil.TempFile("", "docfile*")
opFile, err := os.CreateTemp("", "docfile*")
suite.assert.Nil(err)
opFileName := opFile.Name()
opFile.Close()

Просмотреть файл

@ -35,7 +35,6 @@ package cmd
import (
"fmt"
"io/ioutil"
"os"
"testing"
@ -141,7 +140,7 @@ func (suite *hmonTestSuite) TestHmonInvalidConfigFile() {
func (suite *hmonTestSuite) TestHmonWithConfigFailure() {
defer suite.cleanupTest()
confFile, err := ioutil.TempFile("", "conf*.yaml")
confFile, err := os.CreateTemp("", "conf*.yaml")
suite.assert.Nil(err)
cfgFileHmonTest := confFile.Name()
defer os.Remove(cfgFileHmonTest)

Просмотреть файл

@ -38,7 +38,6 @@ import (
"context"
"errors"
"fmt"
"io/ioutil"
"net/http"
_ "net/http/pprof"
"os"
@ -201,7 +200,7 @@ func parseConfig() error {
return fmt.Errorf("no passphrase provided to decrypt the config file.\n Either use --passphrase cli option or store passphrase in BLOBFUSE2_SECURE_CONFIG_PASSPHRASE environment variable")
}
cipherText, err := ioutil.ReadFile(options.ConfigFile)
cipherText, err := os.ReadFile(options.ConfigFile)
if err != nil {
return fmt.Errorf("failed to read encrypted config file %s [%s]", options.ConfigFile, err.Error())
}
@ -466,7 +465,7 @@ var mountCmd = &cobra.Command{
// Get error string from the child, stderr or child was redirected to a file
log.Info("mount: Child [%v] terminated from %s", child.Pid, options.MountPath)
buff, err := ioutil.ReadFile(dmnCtx.LogFileName)
buff, err := os.ReadFile(dmnCtx.LogFileName)
if err != nil {
log.Err("mount: failed to read child [%v] failure logs [%s]", child.Pid, err.Error())
return Destroy(fmt.Sprintf("failed to mount, please check logs [%s]", err.Error()))

Просмотреть файл

@ -37,7 +37,6 @@ import (
"bytes"
"context"
"fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
@ -363,7 +362,7 @@ func writeConfigFile(contConfigFile string) error {
return fmt.Errorf("failed to encrypt yaml content [%s]", err.Error())
}
err = ioutil.WriteFile(contConfigFile, cipherText, 0777)
err = os.WriteFile(contConfigFile, cipherText, 0777)
if err != nil {
return fmt.Errorf("failed to write encrypted file [%s]", err.Error())
}

Просмотреть файл

@ -36,7 +36,6 @@ package cmd
import (
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"testing"
@ -131,7 +130,7 @@ func (suite *mountTestSuite) TestMountDirNotExists() {
func (suite *mountTestSuite) TestMountDirNotEmpty() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
tempDir := filepath.Join(mntDir, "tempdir")
@ -164,7 +163,7 @@ func (suite *mountTestSuite) TestMountPathNotProvided() {
func (suite *mountTestSuite) TestUnsupportedConfigFileType() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
defer os.RemoveAll(mntDir)
@ -178,7 +177,7 @@ func (suite *mountTestSuite) TestUnsupportedConfigFileType() {
func (suite *mountTestSuite) TestConfigFileNotFound() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
defer os.RemoveAll(mntDir)
@ -197,7 +196,7 @@ func (suite *mountTestSuite) TestConfigFileNotFound() {
func (suite *mountTestSuite) TestConfigFileNotProvided() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
defer os.RemoveAll(mntDir)
@ -209,7 +208,7 @@ func (suite *mountTestSuite) TestConfigFileNotProvided() {
func (suite *mountTestSuite) TestDefaultConfigFile() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
defer os.RemoveAll(mntDir)
@ -242,7 +241,7 @@ func (suite *mountTestSuite) TestDefaultConfigFile() {
func (suite *mountTestSuite) TestInvalidLogLevel() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
defer os.RemoveAll(mntDir)
@ -254,7 +253,7 @@ func (suite *mountTestSuite) TestInvalidLogLevel() {
func (suite *mountTestSuite) TestCliParamsV1() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
defer os.RemoveAll(mntDir)
@ -270,7 +269,7 @@ func (suite *mountTestSuite) TestCliParamsV1() {
func (suite *mountTestSuite) TestStreamAttrCacheOptionsV1() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
defer os.RemoveAll(mntDir)
@ -287,7 +286,7 @@ func (suite *mountTestSuite) TestStreamAttrCacheOptionsV1() {
func (suite *mountTestSuite) TestInvalidLibfuseOption() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
defer os.RemoveAll(mntDir)
@ -303,7 +302,7 @@ func (suite *mountTestSuite) TestInvalidLibfuseOption() {
func (suite *mountTestSuite) TestUndefinedLibfuseOption() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
defer os.RemoveAll(mntDir)
@ -319,7 +318,7 @@ func (suite *mountTestSuite) TestUndefinedLibfuseOption() {
func (suite *mountTestSuite) TestInvalidUmaskValue() {
defer suite.cleanupTest()
mntDir, err := ioutil.TempDir("", "mntdir")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
defer os.RemoveAll(mntDir)
@ -433,7 +432,7 @@ func (suite *mountTestSuite) TestMountOptionVaildate() {
}
func TestMountCommand(t *testing.T) {
confFile, err := ioutil.TempFile("", "conf*.yaml")
confFile, err := os.CreateTemp("", "conf*.yaml")
if err != nil {
t.Error("Failed to create config file")
}

Просмотреть файл

@ -35,7 +35,6 @@ package cmd
import (
"fmt"
"io/ioutil"
"os"
"testing"
@ -112,9 +111,9 @@ func TestGenOneConfig(t *testing.T) {
func (suite *genOneConfigTestSuite) TestConfigCreation() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
outFile, _ := ioutil.TempFile("", "adlsgen1fuse*.json")
mntDir, err := ioutil.TempDir("", "mntdir")
confFile, _ := os.CreateTemp("", "conf*.yaml")
outFile, _ := os.CreateTemp("", "adlsgen1fuse*.json")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
@ -145,9 +144,9 @@ func (suite *genOneConfigTestSuite) TestConfigCreation() {
func (suite *genOneConfigTestSuite) TestInvalidConfig() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
outFile, _ := ioutil.TempFile("", "adlsgen1fuse*.json")
mntDir, err := ioutil.TempDir("", "mntdir")
confFile, _ := os.CreateTemp("", "conf*.yaml")
outFile, _ := os.CreateTemp("", "adlsgen1fuse*.json")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
@ -164,9 +163,9 @@ func (suite *genOneConfigTestSuite) TestInvalidConfig() {
func (suite *genOneConfigTestSuite) TestInvalidAuthMode() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
outFile, _ := ioutil.TempFile("", "adlsgen1fuse*.json")
mntDir, err := ioutil.TempDir("", "mntdir")
confFile, _ := os.CreateTemp("", "conf*.yaml")
outFile, _ := os.CreateTemp("", "adlsgen1fuse*.json")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)
@ -183,9 +182,9 @@ func (suite *genOneConfigTestSuite) TestInvalidAuthMode() {
func (suite *genOneConfigTestSuite) TestGen1FuseMount() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
outFile, _ := ioutil.TempFile("", "adlsgen1fuse*.json")
mntDir, err := ioutil.TempDir("", "mntdir")
confFile, _ := os.CreateTemp("", "conf*.yaml")
outFile, _ := os.CreateTemp("", "adlsgen1fuse*.json")
mntDir, err := os.MkdirTemp("", "mntdir")
suite.assert.Nil(err)

Просмотреть файл

@ -38,7 +38,6 @@ import (
"bytes"
"errors"
"fmt"
"io/ioutil"
"log/syslog"
"os"
"strconv"
@ -255,7 +254,7 @@ var generateConfigCmd = &cobra.Command{
bfv2ComponentsConfigOptions}
data, _ := yaml.Marshal(&pConf)
err2 := ioutil.WriteFile(outputFilePath, data, 0700)
err2 := os.WriteFile(outputFilePath, data, 0700)
if err2 != nil {
return fmt.Errorf("failed to write file [%s]", err2.Error())
}

Просмотреть файл

@ -36,7 +36,6 @@ package cmd
import (
"bytes"
"fmt"
"io/ioutil"
"math/rand"
"os"
"testing"
@ -115,8 +114,8 @@ func generateFileName() string {
func (suite *generateConfigTestSuite) TestConfigFileInvalid() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName myOtherAccountName")
@ -128,8 +127,8 @@ func (suite *generateConfigTestSuite) TestConfigFileInvalid() {
func (suite *generateConfigTestSuite) TestConfigFileKey() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\naccountKey myAccountKey\nauthType Key\ncontainerName myContainerName\n")
@ -154,8 +153,8 @@ func (suite *generateConfigTestSuite) TestConfigFileKey() {
func (suite *generateConfigTestSuite) TestConfigFileSas() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\nsasToken mySasToken\nauthType SAS\ncontainerName myContainerName\n")
@ -180,8 +179,8 @@ func (suite *generateConfigTestSuite) TestConfigFileSas() {
func (suite *generateConfigTestSuite) TestConfigFileSPN() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\nservicePrincipalClientId clientId\nservicePrincipalTenantId tenantId\nservicePrincipalClientSecret clientSecret\naadEndpoint aadEndpoint\nauthType SPN\ncontainerName myContainerName\n")
@ -208,8 +207,8 @@ func (suite *generateConfigTestSuite) TestConfigFileSPN() {
func (suite *generateConfigTestSuite) TestConfigFileMSI() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\nidentityClientId clientId\nidentityObjectId objectId\nidentityResourceId resourceId\nauthType MSI\ncontainerName myContainerName\n")
@ -236,8 +235,8 @@ func (suite *generateConfigTestSuite) TestConfigFileMSI() {
func (suite *generateConfigTestSuite) TestConfigFileProxy() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\nhttpProxy httpProxy\nhttpsProxy httpsProxy\n")
@ -259,8 +258,8 @@ func (suite *generateConfigTestSuite) TestConfigFileProxy() {
func (suite *generateConfigTestSuite) TestConfigFileBlobEndpoint() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\nblobEndpoint blobEndpoint\n")
@ -281,8 +280,8 @@ func (suite *generateConfigTestSuite) TestConfigFileBlobEndpoint() {
func (suite *generateConfigTestSuite) TestConfigFileAccountType() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\naccountType adls\n")
@ -304,8 +303,8 @@ func (suite *generateConfigTestSuite) TestConfigFileAccountType() {
func (suite *generateConfigTestSuite) TestConfigFileAuthMode() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\nauthType Key\n")
@ -326,8 +325,8 @@ func (suite *generateConfigTestSuite) TestConfigFileAuthMode() {
func (suite *generateConfigTestSuite) TestConfigFileLogLevel() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\nlogLevel LOG_ERROR\n")
@ -348,8 +347,8 @@ func (suite *generateConfigTestSuite) TestConfigFileLogLevel() {
func (suite *generateConfigTestSuite) TestConfigFileIgnoreCommentsNewLine() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\nlogLevel LOG_ERROR\n# accountName myAccountName\n")
@ -370,8 +369,8 @@ func (suite *generateConfigTestSuite) TestConfigFileIgnoreCommentsNewLine() {
func (suite *generateConfigTestSuite) TestConfigFileIgnoreCommentsSameLine() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\nlogLevel LOG_ERROR #LOG_DEBUG\n")
@ -392,8 +391,8 @@ func (suite *generateConfigTestSuite) TestConfigFileIgnoreCommentsSameLine() {
func (suite *generateConfigTestSuite) TestConfigFileCaCertFileError() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\ncaCertFile caCertFile\n")
@ -405,8 +404,8 @@ func (suite *generateConfigTestSuite) TestConfigFileCaCertFileError() {
func (suite *generateConfigTestSuite) TestConfigFileDnsTypeError() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\ndnsType dnsType\n")
@ -418,8 +417,8 @@ func (suite *generateConfigTestSuite) TestConfigFileDnsTypeError() {
func (suite *generateConfigTestSuite) TestConfigCLILogLevel() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v1ConfigFile.Name())
defer os.Remove(v2ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\nlogLevel LOG_ERROR\n")
@ -440,11 +439,11 @@ func (suite *generateConfigTestSuite) TestConfigCLILogLevel() {
func (suite *generateConfigTestSuite) TestCLIParamLogging() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -467,10 +466,10 @@ func (suite *generateConfigTestSuite) TestCLIParamFileCache() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -504,10 +503,10 @@ func (suite *generateConfigTestSuite) TestCLIParamFileCache() {
func (suite *generateConfigTestSuite) TestAddStreamAndFileCache() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -532,10 +531,10 @@ func (suite *generateConfigTestSuite) TestAddStreamAndFileCache() {
func (suite *generateConfigTestSuite) TestComponentCorrectOrder() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -560,10 +559,10 @@ func (suite *generateConfigTestSuite) TestComponentCorrectOrder() {
func (suite *generateConfigTestSuite) TestCLIParamFileCacheUploadModifiedOnlyError() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -576,10 +575,10 @@ func (suite *generateConfigTestSuite) TestCLIParamFileCacheUploadModifiedOnlyErr
func (suite *generateConfigTestSuite) TestCLIParamFileCachePollTimeoutError() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -592,10 +591,10 @@ func (suite *generateConfigTestSuite) TestCLIParamFileCachePollTimeoutError() {
func (suite *generateConfigTestSuite) TestCLIParamStreaming() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -622,10 +621,10 @@ func (suite *generateConfigTestSuite) TestCLIParamStreaming() {
func (suite *generateConfigTestSuite) TestCLIParamAttrCache() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -650,10 +649,10 @@ func (suite *generateConfigTestSuite) TestCLIParamAttrCache() {
func (suite *generateConfigTestSuite) TestCLIParamStorage() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -693,10 +692,10 @@ func (suite *generateConfigTestSuite) TestCLIParamStorage() {
func (suite *generateConfigTestSuite) TestCLIParamStorageCaCertFileError() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -709,10 +708,10 @@ func (suite *generateConfigTestSuite) TestCLIParamStorageCaCertFileError() {
func (suite *generateConfigTestSuite) TestCLIParamStorageContentTypeError() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -725,10 +724,10 @@ func (suite *generateConfigTestSuite) TestCLIParamStorageContentTypeError() {
func (suite *generateConfigTestSuite) TestCLIParamStorageBackgroundDownloadError() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -741,10 +740,10 @@ func (suite *generateConfigTestSuite) TestCLIParamStorageBackgroundDownloadError
func (suite *generateConfigTestSuite) TestCLIParamStorageInvalidateOnSyncNoError() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -757,10 +756,10 @@ func (suite *generateConfigTestSuite) TestCLIParamStorageInvalidateOnSyncNoError
func (suite *generateConfigTestSuite) TestCLIParamPreMountValidateNoError() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -774,10 +773,10 @@ func (suite *generateConfigTestSuite) TestCLIParamPreMountValidateNoError() {
func (suite *generateConfigTestSuite) TestInvalidLibfuseOption() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -794,10 +793,10 @@ func (suite *generateConfigTestSuite) TestInvalidLibfuseOption() {
func (suite *generateConfigTestSuite) TestUndefinedLibfuseOption() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -814,10 +813,10 @@ func (suite *generateConfigTestSuite) TestUndefinedLibfuseOption() {
func (suite *generateConfigTestSuite) TestInvalidUmaskValue() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -834,10 +833,10 @@ func (suite *generateConfigTestSuite) TestInvalidUmaskValue() {
func (suite *generateConfigTestSuite) TestInvalidAttrTimeout() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -855,10 +854,10 @@ func (suite *generateConfigTestSuite) TestInvalidAttrTimeout() {
func (suite *generateConfigTestSuite) TestInvalidEntryTimeout() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -876,10 +875,10 @@ func (suite *generateConfigTestSuite) TestInvalidEntryTimeout() {
func (suite *generateConfigTestSuite) TestInvalidNegativeTimeout() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -896,7 +895,7 @@ func (suite *generateConfigTestSuite) TestInvalidNegativeTimeout() {
func (suite *generateConfigTestSuite) TestEnvVarAccountName() {
defer suite.cleanupTest()
name := generateFileName()
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -911,7 +910,7 @@ func (suite *generateConfigTestSuite) TestEnvVarAccountName() {
func (suite *generateConfigTestSuite) TestEnvVarAccountNameError() {
defer suite.cleanupTest()
name := generateFileName()
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())
@ -925,10 +924,10 @@ func (suite *generateConfigTestSuite) TestEnvVarAccountNameError() {
func (suite *generateConfigTestSuite) TestInvalidAccountType() {
defer suite.cleanupTest()
name := generateFileName()
v1ConfigFile, _ := ioutil.TempFile("", name+".tmp.cfg")
v1ConfigFile, _ := os.CreateTemp("", name+".tmp.cfg")
defer os.Remove(v1ConfigFile.Name())
v1ConfigFile.WriteString("accountName myAccountName\naccountType random")
v2ConfigFile, _ := ioutil.TempFile("", name+".tmp.yaml")
v2ConfigFile, _ := os.CreateTemp("", name+".tmp.yaml")
defer os.Remove(v2ConfigFile.Name())
outputFile := fmt.Sprintf("--output-file=%s", v2ConfigFile.Name())

Просмотреть файл

@ -37,7 +37,7 @@ import (
"encoding/xml"
"errors"
"fmt"
"io/ioutil"
"io"
"net/http"
"os"
"strings"
@ -98,7 +98,7 @@ func getRemoteVersion(req string) (string, error) {
return "", err
}
body, err := ioutil.ReadAll(resp.Body)
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Err("getRemoteVersion: error reading body of response [%s]", err.Error())
return "", err
@ -197,9 +197,9 @@ func ignoreCommand(cmdArgs []string) bool {
}
// parseArgs : Depending upon inputs are coming from /etc/fstab or CLI, parameter style may vary.
// /etc/fstab example : blobfuse2 mount <dir> -o suid,nodev,--config-file=config.yaml,--use-adls=true,allow_other
// cli command : blobfuse2 mount <dir> -o suid,nodev --config-file=config.yaml --use-adls=true -o allow_other
// As we need to support both the ways, here we convert the /etc/fstab style (comma separated list) to standard cli ways
// -- /etc/fstab example : blobfuse2 mount <dir> -o suid,nodev,--config-file=config.yaml,--use-adls=true,allow_other
// -- cli command : blobfuse2 mount <dir> -o suid,nodev --config-file=config.yaml --use-adls=true -o allow_other
// -- As we need to support both the ways, here we convert the /etc/fstab style (comma separated list) to standard cli ways
func parseArgs(cmdArgs []string) []string {
// Ignore binary name, rest all are arguments to blobfuse2
cmdArgs = cmdArgs[1:]

Просмотреть файл

@ -36,7 +36,6 @@ package cmd
import (
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"
@ -59,7 +58,7 @@ const SecureConfigExtension string = ".azsec"
var secOpts secureOptions
// Section defining all the command that we have in secure feature
// Section defining all the command that we have in secure feature
var secureCmd = &cobra.Command{
Use: "secure",
Short: "Encrypt / Decrypt your config file",
@ -145,7 +144,7 @@ func validateOptions() error {
// encryptConfigFile: Encrypt config file using the passphrase provided by user
func encryptConfigFile(saveConfig bool) ([]byte, error) {
plaintext, err := ioutil.ReadFile(secOpts.ConfigFile)
plaintext, err := os.ReadFile(secOpts.ConfigFile)
if err != nil {
return nil, err
}
@ -172,7 +171,7 @@ func encryptConfigFile(saveConfig bool) ([]byte, error) {
// decryptConfigFile: Decrypt config file using the passphrase provided by user
func decryptConfigFile(saveConfig bool) ([]byte, error) {
cipherText, err := ioutil.ReadFile(secOpts.ConfigFile)
cipherText, err := os.ReadFile(secOpts.ConfigFile)
if err != nil {
return nil, err
}
@ -200,7 +199,7 @@ func decryptConfigFile(saveConfig bool) ([]byte, error) {
// saveToFile: Save the newly generated config file and delete the source if requested
func saveToFile(configFileName string, data []byte, deleteSource bool) error {
err := ioutil.WriteFile(configFileName, data, 0777)
err := os.WriteFile(configFileName, data, 0777)
if err != nil {
return err
}

Просмотреть файл

@ -36,7 +36,6 @@ package cmd
import (
"bytes"
"fmt"
"io/ioutil"
"os"
"testing"
@ -118,8 +117,8 @@ libfuse:
func (suite *secureConfigTestSuite) TestSecureConfigEncrypt() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
outFile, _ := ioutil.TempFile("", "conf*.yaml")
confFile, _ := os.CreateTemp("", "conf*.yaml")
outFile, _ := os.CreateTemp("", "conf*.yaml")
defer os.Remove(confFile.Name())
defer os.Remove(outFile.Name())
@ -147,7 +146,7 @@ func (suite *secureConfigTestSuite) TestSecureConfigEncryptNoConfig() {
func (suite *secureConfigTestSuite) TestSecureConfigEncryptNoKey() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
confFile, _ := os.CreateTemp("", "conf*.yaml")
defer os.Remove(confFile.Name())
@ -160,8 +159,8 @@ func (suite *secureConfigTestSuite) TestSecureConfigEncryptNoKey() {
func (suite *secureConfigTestSuite) TestSecureConfigEncryptInvalidKey() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
outFile, _ := ioutil.TempFile("", "conf*.yaml")
confFile, _ := os.CreateTemp("", "conf*.yaml")
outFile, _ := os.CreateTemp("", "conf*.yaml")
defer os.Remove(confFile.Name())
defer os.Remove(outFile.Name())
@ -175,8 +174,8 @@ func (suite *secureConfigTestSuite) TestSecureConfigEncryptInvalidKey() {
func (suite *secureConfigTestSuite) TestSecureConfigDecrypt() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
outFile, _ := ioutil.TempFile("", "conf*.yaml")
confFile, _ := os.CreateTemp("", "conf*.yaml")
outFile, _ := os.CreateTemp("", "conf*.yaml")
defer os.Remove(confFile.Name())
defer os.Remove(outFile.Name())
@ -208,7 +207,7 @@ func (suite *secureConfigTestSuite) TestSecureConfigDecryptNoConfig() {
func (suite *secureConfigTestSuite) TestSecureConfigDecryptNoKey() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
confFile, _ := os.CreateTemp("", "conf*.yaml")
defer os.Remove(confFile.Name())
@ -221,8 +220,8 @@ func (suite *secureConfigTestSuite) TestSecureConfigDecryptNoKey() {
func (suite *secureConfigTestSuite) TestSecureConfigGet() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
outFile, _ := ioutil.TempFile("", "conf*.yaml")
confFile, _ := os.CreateTemp("", "conf*.yaml")
outFile, _ := os.CreateTemp("", "conf*.yaml")
defer os.Remove(confFile.Name())
defer os.Remove(outFile.Name())
@ -239,8 +238,8 @@ func (suite *secureConfigTestSuite) TestSecureConfigGet() {
func (suite *secureConfigTestSuite) TestSecureConfigGetInvalidKey() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
outFile, _ := ioutil.TempFile("", "conf*.yaml")
confFile, _ := os.CreateTemp("", "conf*.yaml")
outFile, _ := os.CreateTemp("", "conf*.yaml")
defer os.Remove(confFile.Name())
defer os.Remove(outFile.Name())
@ -257,8 +256,8 @@ func (suite *secureConfigTestSuite) TestSecureConfigGetInvalidKey() {
func (suite *secureConfigTestSuite) TestSecureConfigSet() {
defer suite.cleanupTest()
confFile, _ := ioutil.TempFile("", "conf*.yaml")
outFile, _ := ioutil.TempFile("", "conf*.yaml")
confFile, _ := os.CreateTemp("", "conf*.yaml")
outFile, _ := os.CreateTemp("", "conf*.yaml")
defer os.Remove(confFile.Name())
defer os.Remove(outFile.Name())

Просмотреть файл

@ -35,7 +35,6 @@ package cmd
import (
"fmt"
"io/ioutil"
"os"
"os/exec"
"testing"
@ -92,7 +91,7 @@ func (suite *unmountTestSuite) cleanupTest() {
func (suite *unmountTestSuite) TestUnmountCmd() {
defer suite.cleanupTest()
mountDirectory1, _ := ioutil.TempDir("", "TestUnMountTemp")
mountDirectory1, _ := os.MkdirTemp("", "TestUnMountTemp")
os.MkdirAll(mountDirectory1, 0777)
defer os.RemoveAll(mountDirectory1)
@ -109,7 +108,7 @@ func (suite *unmountTestSuite) TestUnmountCmd() {
func (suite *unmountTestSuite) TestUnmountCmdFail() {
defer suite.cleanupTest()
mountDirectory2, _ := ioutil.TempDir("", "TestUnMountTemp")
mountDirectory2, _ := os.MkdirTemp("", "TestUnMountTemp")
os.MkdirAll(mountDirectory2, 0777)
defer os.RemoveAll(mountDirectory2)
@ -133,7 +132,7 @@ func (suite *unmountTestSuite) TestUnmountCmdFail() {
func (suite *unmountTestSuite) TestUnmountCmdWildcard() {
defer suite.cleanupTest()
mountDirectory3, _ := ioutil.TempDir("", "TestUnMountTemp")
mountDirectory3, _ := os.MkdirTemp("", "TestUnMountTemp")
os.MkdirAll(mountDirectory3, 0777)
defer os.RemoveAll(mountDirectory3)
@ -149,7 +148,7 @@ func (suite *unmountTestSuite) TestUnmountCmdWildcard() {
func (suite *unmountTestSuite) TestUnmountCmdWildcardFail() {
defer suite.cleanupTest()
mountDirectory4, _ := ioutil.TempDir("", "TestUnMountTemp")
mountDirectory4, _ := os.MkdirTemp("", "TestUnMountTemp")
os.MkdirAll(mountDirectory4, 0777)
defer os.RemoveAll(mountDirectory4)
@ -177,7 +176,7 @@ func (suite *unmountTestSuite) TestUnmountCmdWildcardFail() {
func (suite *unmountTestSuite) TestUnmountCmdValidArg() {
defer suite.cleanupTest()
mountDirectory5, _ := ioutil.TempDir("", "TestUnMountTemp")
mountDirectory5, _ := os.MkdirTemp("", "TestUnMountTemp")
os.MkdirAll(mountDirectory5, 0777)
defer os.RemoveAll(mountDirectory5)
@ -200,13 +199,13 @@ func (suite *unmountTestSuite) TestUnmountCmdValidArg() {
}
func TestUnMountCommand(t *testing.T) {
confFile, err := ioutil.TempFile("", "conf*.yaml")
confFile, err := os.CreateTemp("", "conf*.yaml")
if err != nil {
t.Error("Failed to create config file")
}
currentDir, _ = os.Getwd()
tempDir, _ := ioutil.TempDir("", "TestUnMountTemp")
tempDir, _ := os.MkdirTemp("", "TestUnMountTemp")
confFileUnMntTest = confFile.Name()
defer os.Remove(confFileUnMntTest)

Просмотреть файл

@ -41,13 +41,13 @@ import (
"github.com/Azure/azure-storage-fuse/v2/common/log"
)
//KeyPair: the list node containing both block key and cache block values
// KeyPair: the list node containing both block key and cache block values
type KeyPair struct {
key int64
value *common.Block
}
//LRUCache definition for Least Recently Used Cache implementation
// LRUCache definition for Least Recently Used Cache implementation
type LRUCache struct {
sync.RWMutex
Capacity int64
@ -56,7 +56,7 @@ type LRUCache struct {
Occupied int64
}
//NewLRUCache: creates a new LRUCache object with the defined capacity
// NewLRUCache: creates a new LRUCache object with the defined capacity
func NewLRUCache(capacity int64) *LRUCache {
return &LRUCache{
Capacity: capacity,
@ -65,7 +65,7 @@ func NewLRUCache(capacity int64) *LRUCache {
}
}
//Get: returns the cache value stored for the key, cache hits the handle and moves the list pointer to front of the list
// Get: returns the cache value stored for the key, cache hits the handle and moves the list pointer to front of the list
func (cache *LRUCache) Get(bk int64) (*common.Block, bool) {
found := false
var cb *common.Block
@ -77,7 +77,7 @@ func (cache *LRUCache) Get(bk int64) (*common.Block, bool) {
return cb, found
}
//Resize: resizes a cached block and adjusts occupied size
// Resize: resizes a cached block and adjusts occupied size
func (cache *LRUCache) Resize(bk, newEndIndex int64) bool {
var cb *common.Block
if node, ok := cache.Elements[bk]; ok {
@ -90,7 +90,7 @@ func (cache *LRUCache) Resize(bk, newEndIndex int64) bool {
return false
}
//Put: Inserts the key,value pair in LRUCache. Return false if failed.
// Put: Inserts the key,value pair in LRUCache. Return false if failed.
func (cache *LRUCache) Put(key int64, value *common.Block) bool {
if cache.Occupied >= cache.Capacity {
evicted := cache.evict()
@ -116,7 +116,7 @@ func (cache *LRUCache) Print() {
}
}
//Keys: returns all the keys present in LRUCache
// Keys: returns all the keys present in LRUCache
func (cache *LRUCache) Keys() []int64 {
var keys []int64
for k := range cache.Elements {
@ -133,7 +133,7 @@ func (cache *LRUCache) LeastRecentlyUsed() *common.Block {
return getKeyPair(cache.List.Back()).value
}
//Remove: removes the entry for the respective key
// Remove: removes the entry for the respective key
func (cache *LRUCache) Remove(key int64) {
// get the keyPair associated with the blockKey
if node, ok := cache.Elements[key]; ok {
@ -142,14 +142,14 @@ func (cache *LRUCache) Remove(key int64) {
defer nodeKeyPair.value.Unlock()
// remove from capacity
cache.Occupied -= nodeKeyPair.value.EndIndex - nodeKeyPair.value.StartIndex
//if handle is not provided then we're on the handle cache we can just remove it from cache
// if handle is not provided then we're on the handle cache we can just remove it from cache
nodeKeyPair.value.Data = nil
delete(cache.Elements, key)
cache.List.Remove(node)
}
}
//Purge: clears LRUCache
// Purge: clears LRUCache
func (cache *LRUCache) Purge() {
for _, bk := range cache.Keys() {
cache.Remove(bk)
@ -160,7 +160,7 @@ func (cache *LRUCache) Purge() {
}
func getKeyPair(node *list.Element) KeyPair {
//uncast the keypair
// uncast the keypair
return node.Value.(*list.Element).Value.(KeyPair)
}

Просмотреть файл

@ -36,7 +36,6 @@ package config
import (
"fmt"
"io"
"io/ioutil"
"os"
"strings"
"time"
@ -61,7 +60,7 @@ import (
//Any of the bind functions can be put even in init function. Calling of ReadFromConfigFile is not necessary for binding.
//Any reads must happen only after calling ReadFromConfigFile.
//ConfigChangeEventHandler is the interface that must implemented by any object that wants to be notified of changes in the config file
// ConfigChangeEventHandler is the interface that must implemented by any object that wants to be notified of changes in the config file
type ConfigChangeEventHandler interface {
OnConfigChange()
}
@ -100,7 +99,7 @@ func SetConfigFile(configFilePath string) {
viper.SetConfigFile(userOptions.path)
}
//ReadFromConfigFile is used to the configFilePath and initialize viper object
// ReadFromConfigFile is used to the configFilePath and initialize viper object
func ReadFromConfigFile(configFilePath string) error {
userOptions.path = configFilePath
viper.SetConfigFile(userOptions.path)
@ -121,7 +120,7 @@ func loadConfigFromBufferToViper(configData []byte) error {
return nil
}
//ReadFromConfigBuffer is used to the configFilePath and initialize viper object
// ReadFromConfigBuffer is used to the configFilePath and initialize viper object
func ReadFromConfigBuffer(configData []byte) error {
err := loadConfigFromBufferToViper(configData)
if err != nil {
@ -132,29 +131,37 @@ func ReadFromConfigBuffer(configData []byte) error {
return nil
}
func DecryptConfigFile(fileName string, passphrase string) error {
cipherText, err := os.ReadFile(fileName)
if err != nil {
return fmt.Errorf("Failed to read encrypted config file [%s]", err.Error())
}
if len(cipherText) == 0 {
return fmt.Errorf("Encrypted config file is empty")
}
plainText, err := common.DecryptData(cipherText, []byte(passphrase))
if err != nil {
return fmt.Errorf("Failed to decrypt config file [%s]", err.Error())
}
err = loadConfigFromBufferToViper(plainText)
if err != nil {
return fmt.Errorf("Failed to load decrypted config file [%s]", err.Error())
}
return nil
}
func WatchConfig() {
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
viper.OnConfigChange(func(_ fsnotify.Event) {
log.Crit("WatchConfig : Config change detected")
if userOptions.secureConfig {
cipherText, err := ioutil.ReadFile(userOptions.path)
err := DecryptConfigFile(userOptions.path, userOptions.passphrase)
if err != nil {
log.Err("WatchConfig : Failed to read encrypted config file [%s]", err.Error())
return
}
if len(cipherText) == 0 {
return
}
plainText, err := common.DecryptData(cipherText, []byte(userOptions.passphrase))
if err != nil {
log.Err("WatchConfig : Failed to decrypt config file [%s]", err.Error())
return
}
err = loadConfigFromBufferToViper(plainText)
if err != nil {
log.Err("WatchConfig : Failed to load decrypted config file [%s]", err.Error())
log.Err("WatchConfig : %s", err.Error())
return
}
}
@ -171,7 +178,7 @@ func ReadConfigFromReader(reader io.Reader) error {
return nil
}
//AddConfigChangeEventListener function is used to register any ConfigChangeEventHandler
// AddConfigChangeEventListener function is used to register any ConfigChangeEventHandler
func AddConfigChangeEventListener(listener ConfigChangeEventHandler) {
userOptions.listeners = append(userOptions.listeners, listener)
}
@ -182,21 +189,25 @@ func OnConfigChange() {
}
}
//BindEnv binds the key parameter to a particular environment variable
//For a hierarchical structure pass the keys separated by a .
//For examples to access "name" field in the following structure:
// auth:
// name: value
// BindEnv binds the key parameter to a particular environment variable
// For a hierarchical structure pass the keys separated by a .
// For examples to access "name" field in the following structure:
//
// auth:
// name: value
//
// the key parameter should take on the value "auth.key"
func BindEnv(key string, envVarName string) {
userOptions.envTree.Insert(key, envVarName)
}
//BindPFlag binds the key parameter to a particular flag
//For a hierarchical structure pass the keys separated by a .
//For examples to access "name" field in the following structure:
// auth:
// name: value
// BindPFlag binds the key parameter to a particular flag
// For a hierarchical structure pass the keys separated by a .
// For examples to access "name" field in the following structure:
//
// auth:
// name: value
//
// the key parameter should take on the value "auth.key"
func BindPFlag(key string, flag *pflag.Flag) {
userOptions.flagTree.Insert(key, flag)
@ -206,11 +217,13 @@ func BindPFlag(key string, flag *pflag.Flag) {
// return viper.BindPFlag(key, userOptions.flags.Lookup(name))
//}
//UnmarshalKey is used to obtain a subtree starting from the key parameter
//For a hierarchical structure pass the keys separated by a .
//For examples to access "name" field in the following structure:
// auth:
// name: value
// UnmarshalKey is used to obtain a subtree starting from the key parameter
// For a hierarchical structure pass the keys separated by a .
// For examples to access "name" field in the following structure:
//
// auth:
// name: value
//
// the key parameter should take on the value "auth.key"
func UnmarshalKey(key string, obj interface{}) error {
err := viper.UnmarshalKey(key, obj, func(decodeConfig *mapstructure.DecoderConfig) { decodeConfig.TagName = STRUCT_TAG })
@ -237,8 +250,8 @@ func UnmarshalKey(key string, obj interface{}) error {
return nil
}
//Unmarshal populates the passed object and all the exported fields.
//use lower case attribute names to ignore a particular field
// Unmarshal populates the passed object and all the exported fields.
// use lower case attribute names to ignore a particular field
func Unmarshal(obj interface{}) error {
err := viper.Unmarshal(obj, func(decodeConfig *mapstructure.DecoderConfig) { decodeConfig.TagName = STRUCT_TAG })
if err != nil {
@ -288,7 +301,7 @@ func IsSet(key string) bool {
return node.value.(*pflag.Flag).Changed
}
//AttachToFlagSet is used to attach the flags in config to the cmd flags
// AttachToFlagSet is used to attach the flags in config to the cmd flags
func AttachToFlagSet(flagset *pflag.FlagSet) {
flagset.AddFlagSet(userOptions.flags)
}
@ -299,8 +312,8 @@ func AttachFlagCompletions(cmd *cobra.Command) {
}
}
//----------------------------------------------------------
//Functions to add flags from a component
// ----------------------------------------------------------
// Functions to add flags from a component
func AddStringFlag(name string, value string, usage string) *pflag.Flag {
userOptions.flags.String(name, value, usage)
return userOptions.flags.Lookup(name)

Просмотреть файл

@ -38,6 +38,7 @@ import (
"strings"
"testing"
"github.com/Azure/azure-storage-fuse/v2/common"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
)
@ -130,7 +131,7 @@ template:
app: web
`
//Function to test config reader when there is both env vars and cli flags that overlap config file.
// Function to test config reader when there is both env vars and cli flags that overlap config file.
func (suite *ConfigTestSuite) TestOverlapShadowConfigReader() {
defer suite.cleanupTest()
assert := assert.New(suite.T())
@ -172,7 +173,7 @@ func (suite *ConfigTestSuite) TestOverlapShadowConfigReader() {
}
//Function to test only config file reader: testcase 2
// Function to test only config file reader: testcase 2
func (suite *ConfigTestSuite) TestPlainConfig2Reader() {
defer suite.cleanupTest()
assert := assert.New(suite.T())
@ -261,7 +262,7 @@ func (suite *ConfigTestSuite) TestPlainConfig2Reader() {
assert.NotNil(err)
}
//Function to test only config file reader: testcase 1
// Function to test only config file reader: testcase 1
func (suite *ConfigTestSuite) TestPlainConfig1Reader() {
defer suite.cleanupTest()
assert := assert.New(suite.T())
@ -315,7 +316,7 @@ func (suite *ConfigTestSuite) TestPlainConfig1Reader() {
assert.Empty(randOpts)
}
//Function to test config reader when there is environment variables that shadow config file
// Function to test config reader when there is environment variables that shadow config file
func (suite *ConfigTestSuite) TestEnvShadowedConfigReader() {
defer suite.cleanupTest()
assert := assert.New(suite.T())
@ -353,7 +354,7 @@ func (suite *ConfigTestSuite) TestEnvShadowedConfigReader() {
}
//Function to test config reader when there is cli flags that shadow config file
// Function to test config reader when there is cli flags that shadow config file
func (suite *ConfigTestSuite) TestFlagShadowedConfigReader() {
defer suite.cleanupTest()
assert := assert.New(suite.T())
@ -406,6 +407,82 @@ func (suite *ConfigTestSuite) TestFlagShadowedConfigReader() {
}
func (suite *ConfigTestSuite) TestAddFlags() {
defer suite.cleanupTest()
assert := assert.New(suite.T())
flag := AddBoolFlag("boolFlag", false, "")
assert.NotNil(flag)
flag = AddBoolPFlag("b", false, "")
assert.NotNil(flag)
flag = AddDurationFlag("durationFlag", 5, "")
assert.NotNil(flag)
flag = AddFloat64Flag("Float64Flag", 5.0, "")
assert.NotNil(flag)
flag = AddIntFlag("intFlag", 5.0, "")
assert.NotNil(flag)
flag = AddInt8Flag("int8Flag", 5.0, "")
assert.NotNil(flag)
flag = AddInt16Flag("int16Flag", 5.0, "")
assert.NotNil(flag)
flag = AddInt32Flag("int32Flag", 5.0, "")
assert.NotNil(flag)
flag = AddInt64Flag("int64Flag", 5.0, "")
assert.NotNil(flag)
flag = AddUintFlag("uintFlag", 5.0, "")
assert.NotNil(flag)
flag = AddUint8Flag("uint8Flag", 5.0, "")
assert.NotNil(flag)
flag = AddUint16Flag("uint16Flag", 5.0, "")
assert.NotNil(flag)
flag = AddUint32Flag("uint32Flag", 5.0, "")
assert.NotNil(flag)
flag = AddUint64Flag("uint64Flag", 5.0, "")
assert.NotNil(flag)
flag = AddStringFlag("stringFlag", "abc", "")
assert.NotNil(flag)
Set("abcd", "1234")
SetBool("flag", true)
BindPFlag("abcd", flag)
BindEnv("abcd", "CF_TEST_ABCD")
}
func (suite *ConfigTestSuite) TestConfigFileDescryption() {
defer suite.cleanupTest()
assert := assert.New(suite.T())
os.WriteFile("test.yaml", []byte(config2), 0644)
plaintext, err := os.ReadFile("test.yaml")
assert.Nil(err)
assert.NotEqual(plaintext, nil)
cipherText, err := common.EncryptData(plaintext, []byte("123123123123123123123123"))
assert.Nil(err)
err = os.WriteFile("test_enc.yaml", cipherText, 0644)
assert.Nil(err)
err = DecryptConfigFile("test_enc.yaml", "123123123123123123123123")
assert.Nil(err)
_ = os.Remove("test.yaml")
_ = os.Remove("test_enc.yaml")
}
func (suite *ConfigTestSuite) cleanupTest() {
ResetConfig()
}

Просмотреть файл

@ -52,14 +52,14 @@ type Tree struct {
head *TreeNode
}
//NewTree returns a new Tree object with the head initialized to a default root TreeNode
// NewTree returns a new Tree object with the head initialized to a default root TreeNode
func NewTree() *Tree {
return &Tree{
head: NewTreeNode("root"),
}
}
//NewTreeNode returns a TreeNode initialized with the passed in string as name
// NewTreeNode returns a TreeNode initialized with the passed in string as name
func NewTreeNode(name string) *TreeNode {
return &TreeNode{
children: make(map[string]*TreeNode),
@ -67,9 +67,9 @@ func NewTreeNode(name string) *TreeNode {
}
}
//Insert function is used to insert a new object into the tree
//The key is specified as a dot separated hierarchical value
//For eg. root.child1.child2
// Insert function is used to insert a new object into the tree
// The key is specified as a dot separated hierarchical value
// For eg. root.child1.child2
func (tree *Tree) Insert(key string, value interface{}) {
subKeys := strings.Split(key, ".")
curNode := tree.head
@ -89,7 +89,7 @@ func (tree *Tree) Insert(key string, value interface{}) {
curNode.value = value
}
//Print is a utility function that prints the Tree in a level order fashion
// Print is a utility function that prints the Tree in a level order fashion
func (tree *Tree) Print() {
nodes := make([]*TreeNode, 0)
nodes = append(nodes, tree.head)
@ -103,8 +103,8 @@ func (tree *Tree) Print() {
}
}
//GetSubTree returns the sub Tree that is present from the last child of the key passed in.
//For eg. to retrieve the subtree starting from child2 the passed key can be root.child1.child2
// GetSubTree returns the sub Tree that is present from the last child of the key passed in.
// For eg. to retrieve the subtree starting from child2 the passed key can be root.child1.child2
func (tree *Tree) GetSubTree(key string) *TreeNode {
subKeys := strings.Split(key, ".")
curNode := tree.head
@ -117,7 +117,7 @@ func (tree *Tree) GetSubTree(key string) *TreeNode {
return curNode
}
//parseValue is a utility function that accepts a val and returns the parsed value of that type.
// parseValue is a utility function that accepts a val and returns the parsed value of that type.
func parseValue(val string, toType reflect.Kind) interface{} {
switch toType {
case reflect.Bool:
@ -217,9 +217,9 @@ func parseValue(val string, toType reflect.Kind) interface{} {
}
}
//MergeWithKey is used to merge the contained tree with the object (obj) that is passed in as parameter.
//getValue parameter is a function that accepts the value stored in a TreeNode and performs any business logic and returns the value that has to be placed in the obj parameter
//it must also return true|false based on which the value will be set in the obj parameter.
// MergeWithKey is used to merge the contained tree with the object (obj) that is passed in as parameter.
// getValue parameter is a function that accepts the value stored in a TreeNode and performs any business logic and returns the value that has to be placed in the obj parameter
// it must also return true|false based on which the value will be set in the obj parameter.
func (tree *Tree) MergeWithKey(key string, obj interface{}, getValue func(val interface{}) (res interface{}, ok bool)) {
subTree := tree.GetSubTree(key)
if subTree == nil {
@ -256,7 +256,7 @@ func (tree *Tree) MergeWithKey(key string, obj interface{}, getValue func(val in
}
}
//Merge performs the same function as MergeWithKey but at the root level
// Merge performs the same function as MergeWithKey but at the root level
func (tree *Tree) Merge(obj interface{}, getValue func(val interface{}) (res interface{}, ok bool)) {
subTree := tree.head
if subTree == nil {
@ -293,7 +293,7 @@ func (tree *Tree) Merge(obj interface{}, getValue func(val interface{}) (res int
}
}
//isPrimitiveType is a utility function that returns true if the kind parameter is a primitive data type or not
// isPrimitiveType is a utility function that returns true if the kind parameter is a primitive data type or not
func isPrimitiveType(kind reflect.Kind) bool {
switch kind {
case reflect.Bool:
@ -333,7 +333,7 @@ func isPrimitiveType(kind reflect.Kind) bool {
}
}
//assignToField is utility function to set the val to the passed field based on it's state
// assignToField is utility function to set the val to the passed field based on it's state
func assignToField(field reflect.Value, val interface{}) {
if field.CanSet() {
if reflect.TypeOf(val).Kind() == reflect.String {
@ -347,7 +347,7 @@ func assignToField(field reflect.Value, val interface{}) {
}
}
//getIdxFromField is a utility function that returns the key to index into the map based on struct tags.
// getIdxFromField is a utility function that returns the key to index into the map based on struct tags.
func getIdxFromField(structField reflect.StructField) string {
idx := structField.Tag.Get(STRUCT_TAG)
if idx == "" {

Просмотреть файл

@ -35,13 +35,15 @@ package common
import (
"sync"
"time"
)
// Lock item for each file
type LockMapItem struct {
handleCount uint32
exLocked bool
mtx sync.Mutex
handleCount uint32
exLocked bool
mtx sync.Mutex
downloadTime time.Time
}
// Map holding locks for all the files
@ -105,3 +107,13 @@ func (l *LockMapItem) Dec() {
func (l *LockMapItem) Count() uint32 {
return l.handleCount
}
// Set the download time of the file
func (l *LockMapItem) SetDownloadTime() {
l.downloadTime = time.Now()
}
// Get the download time of the file
func (l *LockMapItem) DownloadTime() time.Time {
return l.downloadTime
}

Просмотреть файл

@ -47,7 +47,7 @@ import (
// Standard config default values
const (
blobfuse2Version_ = "2.0.3"
blobfuse2Version_ = "2.0.4"
DefaultMaxLogFileSize = 512
DefaultLogFileCount = 10
@ -88,7 +88,7 @@ var BfsDisabled = false
var TransferPipe = "/tmp/transferPipe"
var PollingPipe = "/tmp/pollPipe"
//LogLevel enum
// LogLevel enum
type LogLevel int
var ELogLevel = LogLevel(0).INVALID()

Просмотреть файл

@ -40,7 +40,6 @@ import (
"crypto/rand"
"fmt"
"io"
"io/ioutil"
"os"
"os/user"
"path/filepath"
@ -55,9 +54,9 @@ import (
var RootMount bool
var ForegroundMount bool
//IsDirectoryMounted is a utility function that returns true if the directory is already mounted using fuse
// IsDirectoryMounted is a utility function that returns true if the directory is already mounted using fuse
func IsDirectoryMounted(path string) bool {
mntList, err := ioutil.ReadFile("/etc/mtab")
mntList, err := os.ReadFile("/etc/mtab")
if err != nil {
//fmt.Println("failed to read mount points : ", err.Error())
return false
@ -84,7 +83,7 @@ func IsDirectoryMounted(path string) bool {
return false
}
//IsDirectoryEmpty is a utility function that returns true if the directory at that path is empty or not
// IsDirectoryEmpty is a utility function that returns true if the directory at that path is empty or not
func IsDirectoryEmpty(path string) bool {
f, _ := os.Open(path)
defer f.Close()
@ -101,7 +100,7 @@ func IsDirectoryEmpty(path string) bool {
return false
}
//DirectoryExists is a utility function that returns true if the directory at that path exists and returns false if it does not exist.
// DirectoryExists is a utility function that returns true if the directory at that path exists and returns false if it does not exist.
func DirectoryExists(path string) bool {
_, err := os.Stat(path)
@ -113,7 +112,7 @@ func DirectoryExists(path string) bool {
return true
}
//GetCurrentUser is a utility function that returns the UID and GID of the user that invokes the blobfuse2 command.
// GetCurrentUser is a utility function that returns the UID and GID of the user that invokes the blobfuse2 command.
func GetCurrentUser() (uint32, uint32, error) {
var (
currentUser *user.User
@ -257,6 +256,10 @@ func MonitorBfs() bool {
// convert ~ to $HOME in path
func ExpandPath(path string) string {
if path == "" {
return path
}
if strings.HasPrefix(path, "~/") {
homeDir, err := os.UserHomeDir()
if err != nil {
@ -265,7 +268,9 @@ func ExpandPath(path string) string {
path = filepath.Join(homeDir, path[2:])
}
return os.ExpandEnv(path)
path = os.ExpandEnv(path)
path, _ = filepath.Abs(path)
return path
}
// NotifyMountToParent : Send a signal to parent process about successful mount

Просмотреть файл

@ -136,6 +136,11 @@ func (suite *utilTestSuite) TestExpandPath() {
return
}
pwd, err := os.Getwd()
if err != nil {
return
}
path := "~/a/b/c/d"
expandedPath := ExpandPath(path)
suite.assert.NotEqual(expandedPath, path)
@ -151,4 +156,33 @@ func (suite *utilTestSuite) TestExpandPath() {
path = "/a/b/c/d"
expandedPath = ExpandPath(path)
suite.assert.Equal(expandedPath, path)
path = "./a"
expandedPath = ExpandPath(path)
suite.assert.NotEqual(expandedPath, path)
suite.assert.Contains(expandedPath, pwd)
path = "./a/../a/b/c/d/../../../a/b/c/d/.././a"
expandedPath = ExpandPath(path)
suite.assert.NotEqual(expandedPath, path)
suite.assert.Contains(expandedPath, pwd)
path = "~/a/../$HOME/a/b/c/d/../../../a/b/c/d/.././a"
expandedPath = ExpandPath(path)
suite.assert.NotEqual(expandedPath, path)
suite.assert.Contains(expandedPath, homeDir)
path = "$HOME/a/b/c/d/../../../a/b/c/d/.././a"
expandedPath = ExpandPath(path)
suite.assert.NotEqual(expandedPath, path)
suite.assert.Contains(expandedPath, homeDir)
path = "/$HOME/a/b/c/d/../../../a/b/c/d/.././a"
expandedPath = ExpandPath(path)
suite.assert.NotEqual(expandedPath, path)
suite.assert.Contains(expandedPath, homeDir)
path = ""
expandedPath = ExpandPath(path)
suite.assert.Equal(expandedPath, path)
}

Просмотреть файл

@ -78,7 +78,7 @@ const compName = "attr_cache"
const maxFilesPerDir = 1000000 // 1 million max files to be cached per directory
const maxTotalFiles = 10000000 // 10 million max files overall to be cached
// Verification to check satisfaction criteria with Component Interface
// Verification to check satisfaction criteria with Component Interface
var _ internal.Component = &AttrCache{}
func (ac *AttrCache) Name() string {
@ -98,7 +98,8 @@ func (ac *AttrCache) Priority() internal.ComponentPriority {
}
// Start : Pipeline calls this method to start the component functionality
// this shall not block the call otherwise pipeline will not start
//
// this shall not block the call otherwise pipeline will not start
func (ac *AttrCache) Start(ctx context.Context) error {
log.Trace("AttrCache::Start : Starting component %s", ac.Name())
@ -116,7 +117,8 @@ func (ac *AttrCache) Stop() error {
}
// Configure : Pipeline will call this method after constructor so that you can read config and initialize yourself
// Return failure if any config is not valid to exit the process
//
// Return failure if any config is not valid to exit the process
func (ac *AttrCache) Configure(_ bool) error {
log.Trace("AttrCache::Configure : %s", ac.Name())

Просмотреть файл

@ -127,11 +127,15 @@ func assertUntouched(suite *attrCacheTestSuite, path string) {
// Directory structure
// a/
// a/c1/
// a/c1/gc1
// a/c2
//
// a/c1/
// a/c1/gc1
// a/c2
//
// ab/
// ab/c1
//
// ab/c1
//
// ac
func generateNestedDirectory(path string) (*list.List, *list.List, *list.List) {
aPaths := list.New()

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !authtest
// +build !authtest
/*
@ -38,7 +39,7 @@ package azstorage
import (
"encoding/json"
"fmt"
"io/ioutil"
"io"
"os"
"testing"
@ -111,7 +112,7 @@ func (suite *authTestSuite) SetupTest() {
os.Exit(1)
}
cfgData, _ := ioutil.ReadAll(cfgFile)
cfgData, _ := io.ReadAll(cfgFile)
err = json.Unmarshal(cfgData, &storageTestConfigurationParameters)
if err != nil {
fmt.Println("Failed to parse the config file")

Просмотреть файл

@ -67,6 +67,7 @@ func (azmsi *azAuthMSI) fetchToken() (*common.OAuthTokenInfo, error) {
ObjectID: azmsi.config.ObjectID,
MSIResID: azmsi.config.ResourceID},
}
token, err := oAuthTokenInfo.GetNewTokenFromMSI(context.Background())
if err != nil {
return nil, err

Просмотреть файл

@ -50,7 +50,7 @@ import (
"github.com/spf13/cobra"
)
//AzStorage Wrapper type around azure go-sdk (track-1)
// AzStorage Wrapper type around azure go-sdk (track-1)
type AzStorage struct {
internal.BaseComponent
storage AzConnection
@ -61,7 +61,7 @@ type AzStorage struct {
const compName = "azstorage"
//Verification to check satisfaction criteria with Component Interface
// Verification to check satisfaction criteria with Component Interface
var _ internal.Component = &AzStorage{}
var azStatsCollector *stats_manager.StatsCollector

Просмотреть файл

@ -1192,7 +1192,8 @@ func (bb *BlockBlob) stageAndCommitModifiedBlocks(name string, data []byte, offs
bb.blobAccCond,
bb.Config.defaultTier,
nil, // datalake doesn't support tags here
bb.downloadOptions.ClientProvidedKeyOptions)
bb.downloadOptions.ClientProvidedKeyOptions,
azblob.ImmutabilityPolicyOptions{})
if err != nil {
log.Err("BlockBlob::stageAndCommitModifiedBlocks : Failed to commit block list to blob %s [%s]", name, err.Error())
return err
@ -1241,7 +1242,8 @@ func (bb *BlockBlob) StageAndCommit(name string, bol *common.BlockOffsetList) er
// azblob.BlobAccessConditions{ModifiedAccessConditions: azblob.ModifiedAccessConditions{IfMatch: bol.Etag}},
bb.Config.defaultTier,
nil, // datalake doesn't support tags here
bb.downloadOptions.ClientProvidedKeyOptions)
bb.downloadOptions.ClientProvidedKeyOptions,
azblob.ImmutabilityPolicyOptions{})
if err != nil {
log.Err("BlockBlob::StageAndCommit : Failed to commit block list to blob %s [%s]", name, err.Error())
return err

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !authtest
// +build !authtest
/*
@ -44,7 +45,6 @@ import (
"errors"
"fmt"
"io"
"io/ioutil"
"math/rand"
"os"
"path/filepath"
@ -117,7 +117,7 @@ func uploadReaderAtToBlockBlob(ctx context.Context, reader io.ReaderAt, readerSi
if o.Progress != nil {
body = pipeline.NewRequestBodyProgress(body, o.Progress)
}
return blockBlobURL.Upload(ctx, body, o.BlobHTTPHeaders, o.Metadata, o.AccessConditions, o.BlobAccessTier, o.BlobTagsMap, o.ClientProvidedKeyOptions)
return blockBlobURL.Upload(ctx, body, o.BlobHTTPHeaders, o.Metadata, o.AccessConditions, o.BlobAccessTier, o.BlobTagsMap, o.ClientProvidedKeyOptions, azblob.ImmutabilityPolicyOptions{})
}
var numBlocks = uint16(((readerSize - 1) / o.BlockSize) + 1)
@ -161,7 +161,7 @@ func uploadReaderAtToBlockBlob(ctx context.Context, reader io.ReaderAt, readerSi
return nil, err
}
// All put blocks were successful, call Put Block List to finalize the blob
return blockBlobURL.CommitBlockList(ctx, blockIDList, o.BlobHTTPHeaders, o.Metadata, o.AccessConditions, o.BlobAccessTier, o.BlobTagsMap, o.ClientProvidedKeyOptions)
return blockBlobURL.CommitBlockList(ctx, blockIDList, o.BlobHTTPHeaders, o.Metadata, o.AccessConditions, o.BlobAccessTier, o.BlobTagsMap, o.ClientProvidedKeyOptions, azblob.ImmutabilityPolicyOptions{})
}
type blockBlobTestSuite struct {
@ -203,7 +203,7 @@ func (s *blockBlobTestSuite) SetupTest() {
os.Exit(1)
}
cfgData, _ := ioutil.ReadAll(cfgFile)
cfgData, _ := io.ReadAll(cfgFile)
err = json.Unmarshal(cfgData, &storageTestConfigurationParameters)
if err != nil {
fmt.Println("Failed to parse the config file")
@ -402,11 +402,15 @@ func (s *blockBlobTestSuite) TestDeleteDir() {
// Directory structure
// a/
// a/c1/
// a/c1/gc1
// a/c2
//
// a/c1/
// a/c1/gc1
// a/c2
//
// ab/
// ab/c1
//
// ab/c1
//
// ac
func generateNestedDirectory(path string) (*list.List, *list.List, *list.List) {
aPaths := list.New()
@ -1208,7 +1212,7 @@ func (s *blockBlobTestSuite) TestWriteFile() {
file := s.containerUrl.NewBlobURL(name)
resp, err := file.Download(ctx, 0, int64(len(data)), azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{})
s.assert.Nil(err)
output, _ := ioutil.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
s.assert.EqualValues(testData, output)
}
@ -1230,7 +1234,7 @@ func (s *blockBlobTestSuite) TestTruncateSmallFileSmaller() {
resp, err := file.Download(ctx, 0, int64(truncatedLength), azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{})
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
s.assert.EqualValues(testData[:truncatedLength], output)
}
@ -1256,7 +1260,7 @@ func (s *blockBlobTestSuite) TestTruncateChunkedFileSmaller() {
resp, err := file.Download(ctx, 0, int64(truncatedLength), azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{})
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
s.assert.EqualValues(testData[:truncatedLength], output)
}
@ -1278,7 +1282,7 @@ func (s *blockBlobTestSuite) TestTruncateSmallFileEqual() {
resp, err := file.Download(ctx, 0, int64(truncatedLength), azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{})
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
s.assert.EqualValues(testData, output)
}
@ -1304,7 +1308,7 @@ func (s *blockBlobTestSuite) TestTruncateChunkedFileEqual() {
resp, err := file.Download(ctx, 0, int64(truncatedLength), azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{})
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
s.assert.EqualValues(testData, output)
}
@ -1326,7 +1330,7 @@ func (s *blockBlobTestSuite) TestTruncateSmallFileBigger() {
resp, err := file.Download(ctx, 0, int64(truncatedLength), azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{})
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
s.assert.EqualValues(testData, output[:len(data)])
}
@ -1352,7 +1356,7 @@ func (s *blockBlobTestSuite) TestTruncateChunkedFileBigger() {
resp, err := file.Download(ctx, 0, int64(truncatedLength), azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{})
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
s.assert.EqualValues(testData, output[:len(data)])
}
@ -1376,7 +1380,7 @@ func (s *blockBlobTestSuite) TestWriteSmallFile() {
dataLen := len(data)
_, err := s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
err = s.az.CopyToFile(internal.CopyToFileOptions{Name: name, File: f})
@ -1401,7 +1405,7 @@ func (s *blockBlobTestSuite) TestOverwriteSmallFile() {
dataLen := len(data)
_, err := s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("newdata")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 5, Data: newTestData})
@ -1431,7 +1435,7 @@ func (s *blockBlobTestSuite) TestOverwriteAndAppendToSmallFile() {
_, err := s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("newdata")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 5, Data: newTestData})
@ -1462,7 +1466,7 @@ func (s *blockBlobTestSuite) TestAppendToSmallFile() {
_, err := s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("-newdata")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 9, Data: newTestData})
@ -1493,7 +1497,7 @@ func (s *blockBlobTestSuite) TestAppendOffsetLargerThanSmallFile() {
_, err := s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("newdata")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 12, Data: newTestData})
@ -1528,7 +1532,7 @@ func (s *blockBlobTestSuite) TestAppendBlocksToSmallFile() {
BlockSize: 8,
})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("-newdata-newdata-newdata")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 9, Data: newTestData})
@ -1562,7 +1566,7 @@ func (s *blockBlobTestSuite) TestOverwriteBlocks() {
BlockSize: 4,
})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("cake")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 16, Data: newTestData})
@ -1596,7 +1600,7 @@ func (s *blockBlobTestSuite) TestOverwriteAndAppendBlocks() {
BlockSize: 4,
})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("43211234cake")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 32, Data: newTestData})
@ -1629,7 +1633,7 @@ func (s *blockBlobTestSuite) TestAppendBlocks() {
BlockSize: 4,
})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("43211234cake")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: newTestData})
@ -1662,7 +1666,7 @@ func (s *blockBlobTestSuite) TestAppendOffsetLargerThanSize() {
BlockSize: 4,
})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("43211234cake")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 45, Data: newTestData})
@ -1686,7 +1690,7 @@ func (s *blockBlobTestSuite) TestCopyToFileError() {
defer s.cleanupTest()
// Setup
name := generateFileName()
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
err := s.az.CopyToFile(internal.CopyToFileOptions{Name: name, File: f})
@ -1701,7 +1705,7 @@ func (s *blockBlobTestSuite) TestCopyFromFile() {
testData := "test data"
data := []byte(testData)
homeDir, _ := os.UserHomeDir()
f, _ := ioutil.TempFile(homeDir, name+".tmp")
f, _ := os.CreateTemp(homeDir, name+".tmp")
defer os.Remove(f.Name())
f.Write(data)
@ -1713,7 +1717,7 @@ func (s *blockBlobTestSuite) TestCopyFromFile() {
file := s.containerUrl.NewBlobURL(name)
resp, err := file.Download(ctx, 0, int64(len(data)), azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{})
s.assert.Nil(err)
output, _ := ioutil.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
s.assert.EqualValues(testData, output)
}
@ -1737,7 +1741,7 @@ func (s *blockBlobTestSuite) TestCreateLink() {
s.assert.EqualValues("true", props.NewMetadata()[symlinkKey])
resp, err := link.Download(ctx, 0, props.ContentLength(), azblob.BlobAccessConditions{}, false, azblob.ClientProvidedKeyOptions{})
s.assert.Nil(err)
data, _ := ioutil.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
data, _ := io.ReadAll(resp.Body(azblob.RetryReaderOptions{}))
s.assert.EqualValues(target, data)
}

Просмотреть файл

@ -46,7 +46,7 @@ import (
"github.com/JeffreyRichter/enum/enum"
)
// AuthType Enum
// AuthType Enum
type AuthType int
var EAuthType = AuthType(0).INVALID_AUTH()
@ -83,7 +83,7 @@ func (a *AuthType) Parse(s string) error {
return err
}
// AccountType Enum
// AccountType Enum
type AccountType int
var EAccountType = AccountType(0).INVALID_ACC()
@ -181,7 +181,7 @@ type AzStorageOptions struct {
CaCertFile string `config:"ca-cert-file" yaml:"-"`
}
// RegisterEnvVariables : Register environment varilables
// RegisterEnvVariables : Register environment varilables
func RegisterEnvVariables() {
config.BindEnv("azstorage.account-name", EnvAzStorageAccount)
config.BindEnv("azstorage.type", EnvAzStorageAccountType)

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !authtest
// +build !authtest
/*
@ -41,7 +42,7 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
"io/ioutil"
"io"
"math/rand"
"os"
"strings"
@ -91,7 +92,7 @@ func (s *datalakeTestSuite) SetupTest() {
os.Exit(1)
}
cfgData, _ := ioutil.ReadAll(cfgFile)
cfgData, _ := io.ReadAll(cfgFile)
err = json.Unmarshal(cfgData, &storageTestConfigurationParameters)
if err != nil {
fmt.Println("Failed to parse the config file")
@ -726,7 +727,7 @@ func (s *datalakeTestSuite) TestWriteSmallFile() {
dataLen := len(data)
_, err := s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
err = s.az.CopyToFile(internal.CopyToFileOptions{Name: name, File: f})
@ -751,7 +752,7 @@ func (s *datalakeTestSuite) TestOverwriteSmallFile() {
dataLen := len(data)
_, err := s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("newdata")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 5, Data: newTestData})
@ -781,7 +782,7 @@ func (s *datalakeTestSuite) TestOverwriteAndAppendToSmallFile() {
_, err := s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("newdata")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 5, Data: newTestData})
@ -812,7 +813,7 @@ func (s *datalakeTestSuite) TestAppendOffsetLargerThanSmallFile() {
_, err := s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("newdata")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 12, Data: newTestData})
@ -843,7 +844,7 @@ func (s *datalakeTestSuite) TestAppendToSmallFile() {
_, err := s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("-newdata")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 9, Data: newTestData})
@ -883,7 +884,7 @@ func (s *datalakeTestSuite) TestAppendBlocksToSmallFile() {
BlockSize: 8,
})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("-newdata-newdata-newdata")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 9, Data: newTestData})
@ -923,7 +924,7 @@ func (s *datalakeTestSuite) TestOverwriteBlocks() {
BlockSize: 4,
})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("cake")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 16, Data: newTestData})
@ -963,7 +964,7 @@ func (s *datalakeTestSuite) TestOverwriteAndAppendBlocks() {
BlockSize: 4,
})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("43211234cake")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 32, Data: newTestData})
@ -1001,7 +1002,7 @@ func (s *datalakeTestSuite) TestAppendBlocks() {
BlockSize: 4,
})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("43211234cake")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: newTestData})
@ -1039,7 +1040,7 @@ func (s *datalakeTestSuite) TestAppendOffsetLargerThanSize() {
BlockSize: 4,
})
s.assert.Nil(err)
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
newTestData := []byte("43211234cake")
_, err = s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 45, Data: newTestData})
@ -1329,7 +1330,7 @@ func (s *datalakeTestSuite) TestWriteFile() {
file := s.containerUrl.NewRootDirectoryURL().NewFileURL(name)
resp, err := file.Download(ctx, 0, int64(len(data)))
s.assert.Nil(err)
output, _ := ioutil.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
s.assert.EqualValues(testData, output)
}
@ -1351,7 +1352,7 @@ func (s *datalakeTestSuite) TestTruncateSmallFileSmaller() {
resp, err := file.Download(ctx, 0, int64(truncatedLength))
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
s.assert.EqualValues(testData[:truncatedLength], output)
}
@ -1378,7 +1379,7 @@ func (s *datalakeTestSuite) TestTruncateChunkedFileSmaller() {
resp, err := file.Download(ctx, 0, int64(truncatedLength))
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
s.assert.EqualValues(testData[:truncatedLength], output)
}
@ -1400,7 +1401,7 @@ func (s *datalakeTestSuite) TestTruncateSmallFileEqual() {
resp, err := file.Download(ctx, 0, int64(truncatedLength))
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
s.assert.EqualValues(testData, output)
}
@ -1427,7 +1428,7 @@ func (s *datalakeTestSuite) TestTruncateChunkedFileEqual() {
resp, err := file.Download(ctx, 0, int64(truncatedLength))
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
s.assert.EqualValues(testData, output)
}
@ -1449,7 +1450,7 @@ func (s *datalakeTestSuite) TestTruncateSmallFileBigger() {
resp, err := file.Download(ctx, 0, int64(truncatedLength))
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
s.assert.EqualValues(testData, output[:len(data)])
}
@ -1476,7 +1477,7 @@ func (s *datalakeTestSuite) TestTruncateChunkedFileBigger() {
resp, err := file.Download(ctx, 0, int64(truncatedLength))
s.assert.Nil(err)
s.assert.EqualValues(truncatedLength, resp.ContentLength())
output, _ := ioutil.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
s.assert.EqualValues(testData, output[:len(data)])
}
@ -1499,7 +1500,7 @@ func (s *datalakeTestSuite) TestCopyToFile() {
data := []byte(testData)
dataLen := len(data)
s.az.WriteFile(internal.WriteFileOptions{Handle: h, Offset: 0, Data: data})
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
err := s.az.CopyToFile(internal.CopyToFileOptions{Name: name, File: f})
@ -1518,7 +1519,7 @@ func (s *datalakeTestSuite) TestCopyToFileError() {
defer s.cleanupTest()
// Setup
name := generateFileName()
f, _ := ioutil.TempFile("", name+".tmp")
f, _ := os.CreateTemp("", name+".tmp")
defer os.Remove(f.Name())
err := s.az.CopyToFile(internal.CopyToFileOptions{Name: name, File: f})
@ -1533,7 +1534,7 @@ func (s *datalakeTestSuite) TestCopyFromFile() {
testData := "test data"
data := []byte(testData)
homeDir, _ := os.UserHomeDir()
f, _ := ioutil.TempFile(homeDir, name+".tmp")
f, _ := os.CreateTemp(homeDir, name+".tmp")
defer os.Remove(f.Name())
f.Write(data)
@ -1545,7 +1546,7 @@ func (s *datalakeTestSuite) TestCopyFromFile() {
file := s.containerUrl.NewRootDirectoryURL().NewFileURL(name)
resp, err := file.Download(ctx, 0, int64(len(data)))
s.assert.Nil(err)
output, _ := ioutil.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
output, _ := io.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
s.assert.EqualValues(testData, output)
}
@ -1570,7 +1571,7 @@ func (s *datalakeTestSuite) TestCreateLink() {
s.assert.EqualValues("true", metadata["Is_symlink"])
resp, err := link.Download(ctx, 0, props.ContentLength())
s.assert.Nil(err)
data, _ := ioutil.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
data, _ := io.ReadAll(resp.Body(azbfs.RetryReaderOptions{}))
s.assert.EqualValues(target, data)
}

Просмотреть файл

@ -295,7 +295,7 @@ func getLogOptions(sdkLogging bool) pipeline.LogOptions {
}
}
// ----------- Store error code handling ---------------
// ----------- Store error code handling ---------------
const (
ErrNoErr uint16 = iota
ErrUnknown
@ -375,7 +375,8 @@ func storeFileErrToErr(err error) uint16 {
return ErrNoErr
}
// ----------- Metadata handling ---------------
// ----------- Metadata handling ---------------
//
// Converts datalake properties to a metadata map
func newMetadata(properties string) map[string]string {
metadata := make(map[string]string)
@ -502,7 +503,8 @@ func populateContentType(newSet string) error { //nolint
return nil
}
// ----------- Blob access tier type conversion ---------------
// ----------- Blob access tier type conversion ---------------
//
// AccessTierMap : Store config to access tier mapping
var AccessTiers = map[string]azblob.AccessTierType{
"none": azblob.AccessTierNone,

Просмотреть файл

@ -77,6 +77,8 @@ type FileCache struct {
maxCacheSize float64
defaultPermission os.FileMode
refreshSec uint32
}
// Structure defining your config parameters
@ -103,6 +105,8 @@ type FileCacheOptions struct {
V1Timeout uint32 `config:"file-cache-timeout-in-seconds" yaml:"-"`
EmptyDirCheck bool `config:"empty-dir-check" yaml:"-"`
SyncToFlush bool `config:"sync-to-flush" yaml:"sync-to-flush,omitempty"`
RefreshSec uint32 `config:"refresh-sec" yaml:"refresh-sec,omitempty"`
}
const (
@ -115,7 +119,7 @@ const (
MB = 1024 * 1024
)
// Verification to check satisfaction criteria with Component Interface
// Verification to check satisfaction criteria with Component Interface
var _ internal.Component = &FileCache{}
var fileCacheStatsCollector *stats_manager.StatsCollector
@ -137,7 +141,8 @@ func (c *FileCache) Priority() internal.ComponentPriority {
}
// Start : Pipeline calls this method to start the component functionality
// this shall not block the call otherwise pipeline will not start
//
// this shall not block the call otherwise pipeline will not start
func (c *FileCache) Start(ctx context.Context) error {
log.Trace("Starting component : %s", c.Name())
@ -194,7 +199,8 @@ func (c *FileCache) TempCacheCleanup() error {
}
// Configure : Pipeline will call this method after constructor so that you can read config and initialize yourself
// Return failure if any config is not valid to exit the process
//
// Return failure if any config is not valid to exit the process
func (c *FileCache) Configure(_ bool) error {
log.Trace("FileCache::Configure : %s", c.Name())
@ -223,6 +229,7 @@ func (c *FileCache) Configure(_ bool) error {
c.offloadIO = conf.OffloadIO
c.maxCacheSize = conf.MaxSizeMB
c.syncToFlush = conf.SyncToFlush
c.refreshSec = conf.RefreshSec
c.tmpPath = common.ExpandPath(conf.TmpPath)
if c.tmpPath == "" {
@ -294,8 +301,8 @@ func (c *FileCache) Configure(_ bool) error {
log.Warn("Sync will upload current contents of file.")
}
log.Info("FileCache::Configure : create-empty %t, cache-timeout %d, tmp-path %s, max-size-mb %d, high-mark %d, low-mark %d",
c.createEmptyFile, int(c.cacheTimeout), c.tmpPath, int(cacheConfig.maxSizeMB), int(cacheConfig.highThreshold), int(cacheConfig.lowThreshold))
log.Info("FileCache::Configure : create-empty %t, cache-timeout %d, tmp-path %s, max-size-mb %d, high-mark %d, low-mark %d, refresh-sec %v",
c.createEmptyFile, int(c.cacheTimeout), c.tmpPath, int(cacheConfig.maxSizeMB), int(cacheConfig.highThreshold), int(cacheConfig.lowThreshold), c.refreshSec)
return nil
}
@ -730,11 +737,13 @@ func (fc *FileCache) DeleteFile(options internal.DeleteFileOptions) error {
}
// isDownloadRequired: Whether or not the file needs to be downloaded to local cache.
func (fc *FileCache) isDownloadRequired(localPath string) (bool, bool) {
func (fc *FileCache) isDownloadRequired(localPath string, blobPath string, flock *common.LockMapItem) (bool, bool, *internal.ObjAttr) {
fileExists := false
downloadRequired := false
lmt := time.Time{}
var stat *syscall.Stat_t = nil
// The file is not cached
// The file is not cached then we need to download
if !fc.policy.IsCached(localPath) {
log.Debug("FileCache::isDownloadRequired : %s not present in local cache policy", localPath)
downloadRequired = true
@ -745,7 +754,7 @@ func (fc *FileCache) isDownloadRequired(localPath string) (bool, bool) {
// The file exists in local cache
// The file needs to be downloaded if the cacheTimeout elapsed (check last change time and last modified time)
fileExists = true
stat := finfo.Sys().(*syscall.Stat_t)
stat = finfo.Sys().(*syscall.Stat_t)
// Deciding based on last modified time is not correct. Last modified time is based on the file was last written
// so if file was last written back to container 2 days back then even downloading it now shall represent the same date
@ -754,6 +763,7 @@ func (fc *FileCache) isDownloadRequired(localPath string) (bool, bool) {
// container on the local disk by resetting last mod time of local disk with utimens)
// and hence last change time on local disk will then represent the download time.
lmt = finfo.ModTime()
if time.Since(finfo.ModTime()).Seconds() > fc.cacheTimeout &&
time.Since(time.Unix(stat.Ctim.Sec, stat.Ctim.Nsec)).Seconds() > fc.cacheTimeout {
log.Debug("FileCache::isDownloadRequired : %s not valid as per time checks", localPath)
@ -769,7 +779,41 @@ func (fc *FileCache) isDownloadRequired(localPath string) (bool, bool) {
downloadRequired = true
}
return downloadRequired, fileExists
if fileExists && flock.Count() > 0 {
// file exists in local cache and there is already an handle open for it
// In this case we can not redownload the file from container
log.Info("FileCache::isDownloadRequired : Need to re-download %s, but skipping as handle is already open", blobPath)
downloadRequired = false
}
var attr *internal.ObjAttr = nil
if downloadRequired ||
(fc.refreshSec != 0 && time.Since(flock.DownloadTime()).Seconds() > float64(fc.refreshSec)) {
attr, err = fc.NextComponent().GetAttr(internal.GetAttrOptions{Name: blobPath})
if err != nil {
log.Err("FileCache::isDownloadRequired : Failed to get attr of %s [%s]", blobPath, err.Error())
}
}
if fc.refreshSec != 0 && !downloadRequired && attr != nil && stat != nil {
// We decided that based on lmt of file file-cache-timeout has not expired
// However, user has configured refresh time then check time has elapsed since last download time of file or not
// If so, compare the lmt of file in local cache and once in container and redownload only if lmt of container is latest.
// If time matches but size does not then still we need to redownlaod the file.
if attr.Mtime.After(lmt) || stat.Size != attr.Size {
// File has not been modified at storage yet so no point in redownloading the file
log.Info("FileCache::isDownloadRequired : File is modified in container, so forcing redownload %s [A-%v : L-%v] [A-%v : L-%v]",
blobPath, attr.Mtime, lmt, attr.Size, stat.Size)
downloadRequired = true
// As we have decided to continue using old file, we reset the timer to check again after refresh time interval
flock.SetDownloadTime()
} else {
log.Info("FileCache::isDownloadRequired : File in container is not latest, skip redownload %s [A-%v : L-%v]", blobPath, attr.Mtime, lmt)
}
}
return downloadRequired, fileExists, attr
}
// OpenFile: Makes the file available in the local cache for further file operations.
@ -785,19 +829,16 @@ func (fc *FileCache) OpenFile(options internal.OpenFileOptions) (*handlemap.Hand
defer flock.Unlock()
fc.policy.CacheValid(localPath)
downloadRequired, fileExists := fc.isDownloadRequired(localPath)
if fileExists && flock.Count() > 0 {
// file exists in local cache and there is already an handle open for it
// In this case we can not redownload the file from container
log.Info("FileCache::OpenFile : Need to re-download %s, but skipping as handle is already open", options.Name)
downloadRequired = false
}
downloadRequired, fileExists, attr := fc.isDownloadRequired(localPath, options.Name, flock)
if downloadRequired {
log.Debug("FileCache::OpenFile : Need to re-download %s", options.Name)
fileSize := int64(0)
if attr != nil {
fileSize = int64(attr.Size)
}
if fileExists {
log.Debug("FileCache::OpenFile : Delete cached file %s", options.Name)
@ -821,18 +862,7 @@ func (fc *FileCache) OpenFile(options internal.OpenFileOptions) (*handlemap.Hand
return nil, err
}
attrReceived := false
fileSize := int64(0)
attr, err := fc.NextComponent().GetAttr(internal.GetAttrOptions{Name: options.Name})
if err != nil {
log.Err("FileCache::OpenFile : Failed to get attr of %s [%s]", options.Name, err.Error())
} else {
attrReceived = true
fileSize = int64(attr.Size)
}
if !attrReceived || fileSize > 0 {
if fileSize > 0 {
// Download/Copy the file from storage to the local file.
err = fc.NextComponent().CopyToFile(
internal.CopyToFileOptions{
@ -850,12 +880,15 @@ func (fc *FileCache) OpenFile(options internal.OpenFileOptions) (*handlemap.Hand
}
}
// Update the last download time of this file
flock.SetDownloadTime()
log.Debug("FileCache::OpenFile : Download of %s is complete", options.Name)
f.Close()
// After downloading the file, update the modified times and mode of the file.
fileMode := fc.defaultPermission
if attrReceived && !attr.IsModeDefault() {
if attr != nil && !attr.IsModeDefault() {
fileMode = attr.Mode
}
@ -866,14 +899,15 @@ func (fc *FileCache) OpenFile(options internal.OpenFileOptions) (*handlemap.Hand
}
// TODO: When chown is supported should we update that?
// chtimes shall be the last api otherwise calling chmod/chown will update the last change time
err = os.Chtimes(localPath, attr.Atime, attr.Mtime)
if err != nil {
log.Err("FileCache::OpenFile : Failed to change times of file %s [%s]", options.Name, err.Error())
if attr != nil {
// chtimes shall be the last api otherwise calling chmod/chown will update the last change time
err = os.Chtimes(localPath, attr.Atime, attr.Mtime)
if err != nil {
log.Err("FileCache::OpenFile : Failed to change times of file %s [%s]", options.Name, err.Error())
}
}
fileCacheStatsCollector.UpdateStats(stats_manager.Increment, dlFiles, (int64)(1))
} else {
log.Debug("FileCache::OpenFile : %s will be served from cache", options.Name)
fileCacheStatsCollector.UpdateStats(stats_manager.Increment, cacheServed, (int64)(1))

Просмотреть файл

@ -418,7 +418,7 @@ func (suite *fileCacheTestSuite) TestStreamDirCase1() {
suite.assert.EqualValues(subdir, dir[3].Path)
}
//TODO: case3 requires more thought due to the way loopback fs is designed, specifically getAttr and streamDir
// TODO: case3 requires more thought due to the way loopback fs is designed, specifically getAttr and streamDir
func (suite *fileCacheTestSuite) TestStreamDirCase2() {
defer suite.cleanupTest()
// Setup
@ -1514,6 +1514,57 @@ func (suite *fileCacheTestSuite) TestStatFS() {
suite.assert.NotEqual(stat, &syscall.Statfs_t{})
}
func (suite *fileCacheTestSuite) TestReadFileWithRefresh() {
defer suite.cleanupTest()
// Configure to create empty files so we create the file in storage
createEmptyFile := true
config := fmt.Sprintf("file_cache:\n path: %s\n offload-io: true\n create-empty-file: %t\n timeout-sec: 1000\n refresh-sec: 10\n\nloopbackfs:\n path: %s",
suite.cache_path, createEmptyFile, suite.fake_storage_path)
suite.setupTestHelper(config) // setup a new file cache with a custom config (teardown will occur after the test as usual)
path := "file"
err := os.WriteFile(suite.fake_storage_path+"/"+path, []byte("test data"), 0777)
suite.assert.Nil(err)
data := make([]byte, 20)
options := internal.OpenFileOptions{Name: path, Mode: 0777}
// Read file once and we shall get the same data
f, err := suite.fileCache.OpenFile(options)
suite.assert.Nil(err)
suite.assert.False(f.Dirty())
n, err := suite.fileCache.ReadInBuffer(internal.ReadInBufferOptions{Handle: f, Offset: 0, Data: data})
suite.assert.Nil(err)
suite.assert.Equal(9, n)
err = suite.fileCache.CloseFile(internal.CloseFileOptions{Handle: f})
suite.assert.Nil(err)
// Modify the fil ein background but we shall still get the old data
err = os.WriteFile(suite.fake_storage_path+"/"+path, []byte("test data1"), 0777)
suite.assert.Nil(err)
f, err = suite.fileCache.OpenFile(options)
suite.assert.Nil(err)
suite.assert.False(f.Dirty())
n, err = suite.fileCache.ReadInBuffer(internal.ReadInBufferOptions{Handle: f, Offset: 0, Data: data})
suite.assert.Nil(err)
suite.assert.Equal(9, n)
err = suite.fileCache.CloseFile(internal.CloseFileOptions{Handle: f})
suite.assert.Nil(err)
// Now wait for 5 seconds and we shall get the updated content on next read
err = os.WriteFile(suite.fake_storage_path+"/"+path, []byte("test data123456"), 0777)
suite.assert.Nil(err)
time.Sleep(12 * time.Second)
f, err = suite.fileCache.OpenFile(options)
suite.assert.Nil(err)
suite.assert.False(f.Dirty())
n, err = suite.fileCache.ReadInBuffer(internal.ReadInBufferOptions{Handle: f, Offset: 0, Data: data})
suite.assert.Nil(err)
suite.assert.Equal(15, n)
err = suite.fileCache.CloseFile(internal.CloseFileOptions{Handle: f})
suite.assert.Nil(err)
}
// In order for 'go test' to run this suite, we need to create
// a normal test function and pass our suite to suite.Run
func TestFileCacheTestSuite(t *testing.T) {

Просмотреть файл

@ -403,7 +403,7 @@ func (list *lfuList) get(key string) *dataNode {
}
}
//Requires Lock()
// Requires Lock()
func (list *lfuList) put(key string) {
if node, ok := list.dataNodeMap[key]; ok {
if list.cacheTimeout > 0 {
@ -439,7 +439,7 @@ func (list *lfuList) put(key string) {
}
}
//Requires Lock()
// Requires Lock()
func (list *lfuList) delete(key string) {
if node, ok := list.dataNodeMap[key]; ok {
if list.cacheTimeout > 0 {

Просмотреть файл

@ -200,7 +200,7 @@ func (p *lruPolicy) Name() string {
return "lru"
}
// On validate name of the file was pushed on this channel so now update the LRU list
// On validate name of the file was pushed on this channel so now update the LRU list
func (p *lruPolicy) asyncCacheValid() {
for {
select {
@ -411,6 +411,11 @@ func (p *lruPolicy) deleteItem(name string) {
log.Trace("lruPolicy::deleteItem : Deleting %s", name)
azPath := strings.TrimPrefix(name, p.tmpPath)
if azPath == "" {
log.Err("lruPolicy::DeleteItem : Empty file name formed name : %s, tmpPath : %s", name, p.tmpPath)
return
}
if azPath[0] == '/' {
azPath = azPath[1:]
}

Просмотреть файл

@ -71,6 +71,7 @@ type Libfuse struct {
ignoreOpenFlags bool
nonEmptyMount bool
lsFlags common.BitMap16
maxFuseThreads uint32
}
// To support pagination in readdir calls this structure holds a block of items for a given directory
@ -99,12 +100,14 @@ type LibfuseOptions struct {
nonEmptyMount bool `config:"nonempty" yaml:"nonempty,omitempty"`
Uid uint32 `config:"uid" yaml:"uid,omitempty"`
Gid uint32 `config:"gid" yaml:"uid,omitempty"`
MaxFuseThreads uint32 `config:"max-fuse-threads" yaml:"max-fuse-threads,omitempty"`
}
const compName = "libfuse"
const defaultEntryExpiration = 120
const defaultAttrExpiration = 120
const defaultNegativeEntryExpiration = 120
const defaultMaxFuseThreads = 128
var fuseFS *Libfuse
@ -119,7 +122,7 @@ var ignoreFiles = map[string]bool{
"autorun.inf": true,
}
// Verification to check satisfaction criteria with Component Interface
// Verification to check satisfaction criteria with Component Interface
var _ internal.Component = &Libfuse{}
func (lf *Libfuse) Name() string {
@ -135,7 +138,8 @@ func (lf *Libfuse) SetNextComponent(nc internal.Component) {
}
// Start : Pipeline calls this method to start the component functionality
// this shall not block the call otherwise pipeline will not start
//
// this shall not block the call otherwise pipeline will not start
func (lf *Libfuse) Start(ctx context.Context) error {
log.Trace("Libfuse::Start : Starting component %s", lf.Name())
@ -223,13 +227,21 @@ func (lf *Libfuse) Validate(opt *LibfuseOptions) error {
if config.IsSet(compName + ".gid") {
lf.ownerGID = opt.Gid
}
if config.IsSet(compName + ".max-fuse-threads") {
lf.maxFuseThreads = opt.MaxFuseThreads
} else {
lf.maxFuseThreads = defaultMaxFuseThreads
}
log.Info("Libfuse::Validate : UID %v, GID %v", lf.ownerUID, lf.ownerGID)
return nil
}
// Configure : Pipeline will call this method after constructor so that you can read config and initialize yourself
// Return failure if any config is not valid to exit the process
//
// Return failure if any config is not valid to exit the process
func (lf *Libfuse) Configure(_ bool) error {
log.Trace("Libfuse::Configure : %s", lf.Name())

Просмотреть файл

@ -274,10 +274,10 @@ func libfuse2_init(conn *C.fuse_conn_info_t) (res unsafe.Pointer) {
}
// Max background thread on the fuse layer for high parallelism
conn.max_background = 128
conn.max_background = C.uint(fuseFS.maxFuseThreads)
// While reading a file let kernel do readahed for better perf
conn.max_readahead = (4 * 1024 * 1024)
conn.max_readahead = (8 * 1024 * 1024)
return nil
}

Просмотреть файл

@ -1,3 +1,4 @@
//go:build fuse2
// +build fuse2
/*

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !fuse2
// +build !fuse2
/*
@ -304,10 +305,10 @@ func libfuse_init(conn *C.fuse_conn_info_t, cfg *C.fuse_config_t) (res unsafe.Po
}
// Max background thread on the fuse layer for high parallelism
conn.max_background = 128
conn.max_background = C.uint(fuseFS.maxFuseThreads)
// While reading a file let kernel do readahed for better perf
conn.max_readahead = (4 * 1024 * 1024)
conn.max_readahead = (8 * 1024 * 1024)
//conn.max_write = (4 * 1024 * 1024)
//conn.max_read = (4 * 1024 * 1024)

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !fuse2
// +build !fuse2
/*

Просмотреть файл

@ -37,7 +37,6 @@ import (
"context"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"strings"
@ -132,7 +131,7 @@ func (lfs *LoopbackFS) ReadDir(options internal.ReadDirOptions) ([]*internal.Obj
path := filepath.Join(lfs.path, options.Name)
log.Debug("LoopbackFS: ReadDir requested for %s", path)
files, err := ioutil.ReadDir(path)
files, err := os.ReadDir(path)
if err != nil {
log.Err("LoopbackFS: ReadDir error[%s]", err)
return nil, err
@ -140,12 +139,14 @@ func (lfs *LoopbackFS) ReadDir(options internal.ReadDirOptions) ([]*internal.Obj
log.Debug("LoopbackFS: ReadDir on %s returned %d items", path, len(files))
for _, file := range files {
info, _ := file.Info()
attr := &internal.ObjAttr{
Path: filepath.Join(options.Name, file.Name()),
Name: file.Name(),
Size: file.Size(),
Mode: file.Mode(),
Mtime: file.ModTime(),
Size: info.Size(),
Mode: info.Mode(),
Mtime: info.ModTime(),
}
attr.Flags.Set(internal.PropFlagMetadataRetrieved)
attr.Flags.Set(internal.PropFlagModeDefault)
@ -169,7 +170,7 @@ func (lfs *LoopbackFS) StreamDir(options internal.StreamDirOptions) ([]*internal
path := filepath.Join(lfs.path, options.Name)
log.Debug("LoopbackFS: StreamDir requested for %s", path)
files, err := ioutil.ReadDir(path)
files, err := os.ReadDir(path)
if err != nil {
log.Err("LoopbackFS: StreamDir error[%s]", err)
return nil, "", err
@ -177,12 +178,13 @@ func (lfs *LoopbackFS) StreamDir(options internal.StreamDirOptions) ([]*internal
log.Debug("LoopbackFS: StreamDir on %s returned %d items", path, len(files))
for _, file := range files {
info, _ := file.Info()
attr := &internal.ObjAttr{
Path: filepath.Join(options.Name, file.Name()),
Name: file.Name(),
Size: file.Size(),
Mode: file.Mode(),
Mtime: file.ModTime(),
Size: info.Size(),
Mode: info.Mode(),
Mtime: info.ModTime(),
}
attr.Flags.Set(internal.PropFlagMetadataRetrieved)
attr.Flags.Set(internal.PropFlagModeDefault)

Просмотреть файл

@ -148,13 +148,13 @@ func asyncCloseFile(suite *streamTestSuite, closeFileOptions internal.CloseFileO
// Assertion helpers ========================================================================
//assert that the block is cached
// assert that the block is cached
func assertBlockCached(suite *streamTestSuite, offset int64, handle *handlemap.Handle) {
_, found := handle.CacheObj.Get(offset)
suite.assert.Equal(found, true)
}
//assert the block is not cached and KeyNotFoundError is thrown
// assert the block is not cached and KeyNotFoundError is thrown
func assertBlockNotCached(suite *streamTestSuite, offset int64, handle *handlemap.Handle) {
_, found := handle.CacheObj.Get(offset)
suite.assert.Equal(found, false)

Просмотреть файл

@ -441,8 +441,8 @@ func (suite *streamTestSuite) TestFilenamePurgeOnClose() {
}
// ========================================================= Write tests =================================================================
//TODO: need to add an assertion on the blocks for their start and end indices as we append to them
//test appending to small file evicts older block if cache capacity full
// TODO: need to add an assertion on the blocks for their start and end indices as we append to them
// test appending to small file evicts older block if cache capacity full
func (suite *streamTestSuite) TestFilenameWriteToSmallFileEviction() {
defer suite.cleanupTest()
suite.cleanupTest()

Просмотреть файл

@ -441,8 +441,8 @@ func (suite *streamTestSuite) TestPurgeOnClose() {
}
// ========================================================= Write tests =================================================================
//TODO: need to add an assertion on the blocks for their start and end indices as we append to them
//test appending to small file evicts older block if cache capacity full
// TODO: need to add an assertion on the blocks for their start and end indices as we append to them
// test appending to small file evicts older block if cache capacity full
func (suite *streamTestSuite) TestWriteToSmallFileEviction() {
defer suite.cleanupTest()
suite.cleanupTest()

Просмотреть файл

@ -14,7 +14,7 @@ then
result=$(grep "+build" $i)
if [ $? -ne 1 ]
then
sed -i -e '3,32{R LICENSE' -e 'd}' $i
sed -i -e '5,32{R LICENSE' -e 'd}' $i
else
sed -i -e '2,31{R LICENSE' -e 'd}' $i
fi

82
go.mod
Просмотреть файл

@ -1,32 +1,86 @@
module github.com/Azure/azure-storage-fuse/v2
go 1.16
go 1.19
require (
github.com/Azure/azure-pipeline-go v0.2.3
github.com/Azure/azure-storage-azcopy/v10 v10.13.1-0.20211218014522-24209b81028e
github.com/Azure/azure-storage-blob-go v0.13.1-0.20210823171415-e7932f52ad61
github.com/Azure/azure-pipeline-go v0.2.4-0.20220425205405-09e6f201e1e4
github.com/Azure/azure-storage-azcopy/v10 v10.18.1
github.com/Azure/azure-storage-blob-go v0.15.0
github.com/Azure/azure-storage-file-go v0.6.1-0.20220815164042-f37a99d62e3f
github.com/Azure/go-autorest/autorest v0.11.27
github.com/Azure/go-autorest/autorest/adal v0.9.20
github.com/Azure/go-autorest/autorest v0.11.29
github.com/Azure/go-autorest/autorest/adal v0.9.23
github.com/JeffreyRichter/enum v0.0.0-20180725232043-2567042f9cda
github.com/fsnotify/fsnotify v1.4.9
github.com/fsnotify/fsnotify v1.6.0
github.com/golang/mock v1.6.0
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
github.com/mitchellh/mapstructure v1.4.1
github.com/mitchellh/mapstructure v1.5.0
github.com/montanaflynn/stats v0.6.6
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58
github.com/radovskyb/watcher v1.0.7
github.com/sevlyar/go-daemon v0.1.6
github.com/spf13/cobra v1.4.0
github.com/spf13/cobra v1.7.0
github.com/spf13/pflag v1.0.5
github.com/spf13/viper v1.8.1
github.com/stretchr/testify v1.8.1
go.uber.org/atomic v1.7.0
golang.org/x/text v0.7.0 // indirect
github.com/spf13/viper v1.15.0
github.com/stretchr/testify v1.8.2
go.uber.org/atomic v1.11.0
gopkg.in/ini.v1 v1.67.0
gopkg.in/yaml.v2 v2.4.0
gopkg.in/yaml.v3 v3.0.1
)
require (
cloud.google.com/go v0.110.2 // indirect
cloud.google.com/go/compute v1.19.2 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
cloud.google.com/go/iam v1.0.1 // indirect
cloud.google.com/go/storage v1.30.1 // indirect
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
github.com/Azure/go-autorest/logger v0.2.1 // indirect
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/danieljoos/wincred v1.1.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/s2a-go v0.1.3 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect
github.com/googleapis/gax-go/v2 v2.8.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hillu/go-ntdll v0.0.0-20230408164318-f8894bfa00af // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-ieproxy v0.0.10 // indirect
github.com/minio/minio-go v6.0.14+incompatible // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/pelletier/go-toml/v2 v2.0.7 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/xattr v0.4.9 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/spf13/afero v1.9.5 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/subosito/gotenv v1.4.2 // indirect
github.com/wastore/keychain v0.0.0-20180920053336-f2c902a3d807 // indirect
github.com/wastore/keyctl v0.3.1 // indirect
go.opencensus.io v0.24.0 // indirect
golang.org/x/crypto v0.9.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/oauth2 v0.8.0 // indirect
golang.org/x/sync v0.2.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
google.golang.org/api v0.122.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
google.golang.org/grpc v1.55.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
)
replace github.com/spf13/cobra => github.com/gapra-msft/cobra v1.4.1-0.20220411185530-5b83e8ba06dd

381
go.sum
Просмотреть файл

@ -3,6 +3,7 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
@ -15,25 +16,24 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
cloud.google.com/go v0.88.0/go.mod h1:dnKwfYbP9hQhefiUvpbcAyoGSHUrOxR20JVElLiUvEY=
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
cloud.google.com/go v0.91.1 h1:w+u8ttN/QtYrpvgXNUd2G6kwqrqCIQbkINlXQjHP1ek=
cloud.google.com/go v0.91.1/go.mod h1:V358WZfbFQkmC3gv5XCxzZq2e3h7OGvQR0IXtj77ylI=
cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
cloud.google.com/go v0.110.2 h1:sdFPBr6xG9/wkBbfhmUz/JmZC7X6LavQgcrVINrKiVA=
cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/compute v1.19.2 h1:GbJtPo8OKVHbVep8jvM57KidbYHxeE68LOVqouNLrDY=
cloud.google.com/go/compute v1.19.2/go.mod h1:5f5a+iC1IriXYauaQ0EyQmEAEq9CGRnV5xJSQSlTV08=
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
cloud.google.com/go/iam v1.0.1 h1:lyeCAU6jpnVNrE9zGQkTl3WgNgK/X+uWwaw0kynZJMU=
cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8=
cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
@ -43,28 +43,27 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
cloud.google.com/go/storage v1.16.0 h1:1UwAux2OZP4310YXg5ohqBEpV16Y93uZG4+qOX7K2Kg=
cloud.google.com/go/storage v1.16.0/go.mod h1:ieKBmUyzcftN5tbxwnXClMKH00CfcQ+xL6NN0r5QfmE=
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM=
cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U=
github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k=
github.com/Azure/azure-storage-azcopy/v10 v10.13.1-0.20211218014522-24209b81028e h1:dwmIXWf+f87yHPwMV4T61tQg+XyoFNFdfSm6NLem5jY=
github.com/Azure/azure-storage-azcopy/v10 v10.13.1-0.20211218014522-24209b81028e/go.mod h1:dEvWW3wzakcqNyp5ig2Xsc15COz7voF7RFLsUmOWgs8=
github.com/Azure/azure-storage-blob-go v0.13.1-0.20210823171415-e7932f52ad61 h1:/c2dpiywIP88Xu7K+4ZtbwwecYhR+jnlywZpvriBZzk=
github.com/Azure/azure-storage-blob-go v0.13.1-0.20210823171415-e7932f52ad61/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck=
github.com/Azure/azure-storage-file-go v0.6.1-0.20201111053559-3c1754dc00a5 h1:aHEvBM4oXIWSTOVdL55nCYXO0Cl7ie3Ui5xMQhLVez8=
github.com/Azure/azure-storage-file-go v0.6.1-0.20201111053559-3c1754dc00a5/go.mod h1:++L7GP2pRyUNuastZ7m02vYV69JHmqlWXfCaGoL0v4s=
github.com/Azure/azure-pipeline-go v0.2.4-0.20220425205405-09e6f201e1e4 h1:hDJImUzpTAeIw/UasFUUDB/+UsZm5Q/6x2/jKKvEUiw=
github.com/Azure/azure-pipeline-go v0.2.4-0.20220425205405-09e6f201e1e4/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k=
github.com/Azure/azure-storage-azcopy/v10 v10.18.1 h1:AT3PcMkLeLDXs+G6bPD9ZQ+T4YeEt7kwnXk6Bo1DkZU=
github.com/Azure/azure-storage-azcopy/v10 v10.18.1/go.mod h1:pEhwI7Rr1V90GC/tCzPjU/Hi7QI08s0GaW6yIAcTP5w=
github.com/Azure/azure-storage-blob-go v0.15.0 h1:rXtgp8tN1p29GvpGgfJetavIG0V7OgcSXPpwp3tx6qk=
github.com/Azure/azure-storage-blob-go v0.15.0/go.mod h1:vbjsVbX0dlxnRc4FFMPsS9BsJWPcne7GB7onqlPvz58=
github.com/Azure/azure-storage-file-go v0.6.1-0.20220815164042-f37a99d62e3f h1:2UzXCkwhkGuCW2tkl2WOzjGrCWZj8Fn0AlM6D7kMN5k=
github.com/Azure/azure-storage-file-go v0.6.1-0.20220815164042-f37a99d62e3f/go.mod h1:++L7GP2pRyUNuastZ7m02vYV69JHmqlWXfCaGoL0v4s=
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A=
github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U=
github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw=
github.com/Azure/go-autorest/autorest v0.11.29/go.mod h1:ZtEzC4Jy2JDrZLxvWs8LrBWEBycl1hbT1eknI8MtfAs=
github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
github.com/Azure/go-autorest/autorest/adal v0.9.14/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg=
github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk=
github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8=
github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c=
github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
@ -78,17 +77,11 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/JeffreyRichter/enum v0.0.0-20180725232043-2567042f9cda h1:NOo6+gM9NNPJ3W56nxOKb4164LEw094U0C8zYQM8mQU=
github.com/JeffreyRichter/enum v0.0.0-20180725232043-2567042f9cda/go.mod h1:2CaSFTh2ph9ymS6goiOKIBdfhwWUVsX4nQ5QjIYFHHs=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/PuerkitoBio/goquery v1.6.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc=
github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y=
github.com/PuerkitoBio/goquery v1.7.1/go.mod h1:XY0pP4kfraEmmV1O7Uf6XyjoslwsneBbgeDjLYuN8xY=
github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
@ -96,14 +89,15 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU=
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/danieljoos/wincred v1.1.1 h1:FgOybUqUGGwgBz+ga92qD4f/ZPvuPryRjashrk/p9IA=
github.com/danieljoos/wincred v1.1.1/go.mod h1:gSBQmTx6G0VmLowygiA7ZD0p0E09HJ68vta8z/RT2d0=
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0=
github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -112,27 +106,23 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/gapra-msft/cobra v1.4.1-0.20220411185530-5b83e8ba06dd h1:U3d5Jlb0ANsyxk2lnlhYh7/Ov4bZpIBUxJTsVuJM9G0=
github.com/gapra-msft/cobra v1.4.1-0.20220411185530-5b83e8ba06dd/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-ini/ini v1.62.0 h1:7VJT/ZXjzqSrvtraFp4ONq80hTcRQth1c9ZnQ3uNQvU=
github.com/go-ini/ini v1.62.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.2.0 h1:besgBTC8w8HjP6NzQdxwKH9Z5oQMZ24ThTrHp3cZ8eU=
github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@ -146,7 +136,6 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@ -164,10 +153,9 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@ -181,15 +169,13 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ=
github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
@ -199,152 +185,105 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210715191844-86eeefc3e471/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20210804190019-f964ff605595/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE=
github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k=
github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc=
github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/hillu/go-ntdll v0.0.0-20210404124636-a6f426aa8d92/go.mod h1:jsDwCq+VLI6qnVqFRAlfOC14FULjT1lt99vnszAZ6/Q=
github.com/hillu/go-ntdll v0.0.0-20230408164318-f8894bfa00af h1:6qDlty5ZH5RftbuLnx78wNTpPcWy3gUV1NbfBZR7e5g=
github.com/hillu/go-ntdll v0.0.0-20230408164318-f8894bfa00af/go.mod h1:cHjYsnAnSckPDx8/H01Y+owD1hf2adLA6VRiw4guEbA=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqfI=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mattn/go-ieproxy v0.0.10 h1:P+2QihaKCLgbs/32dhFLbxXlqsy8tIG1LUXHIoPaQPo=
github.com/mattn/go-ieproxy v0.0.10/go.mod h1:/NsJd+kxZBmjMc5hrJCKMbP57B84rvq9BiDRbtO9AS0=
github.com/minio/minio-go v6.0.14+incompatible h1:fnV+GD28LeqdN6vT2XdGKW8Qe/IfjJDswNVuni6km9o=
github.com/minio/minio-go v6.0.14+incompatible/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ=
github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0=
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pelletier/go-toml/v2 v2.0.7 h1:muncTPStnKRos5dpVKULv2FVd4bMOhNePj9CjgDb8Us=
github.com/pelletier/go-toml/v2 v2.0.7/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
github.com/pkg/xattr v0.4.9 h1:5883YPCtkSd8LFbs13nXplj9g9tlrwoJRjgpgMu1/fE=
github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/radovskyb/watcher v1.0.7 h1:AYePLih6dpmS32vlHfhCeli8127LzkIgwJGcwwe8tUE=
github.com/radovskyb/watcher v1.0.7/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sevlyar/go-daemon v0.1.6 h1:EUh1MDjEM4BI109Jign0EaknA2izkOyi0LV3ro3QQGs=
github.com/sevlyar/go-daemon v0.1.6/go.mod h1:6dJpPatBT9eUwM5VCw9Bt6CdX9Tk6UWvhW3MebLDRKE=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM=
github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44=
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU=
github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
github.com/wastore/keychain v0.0.0-20180920053336-f2c902a3d807 h1:Uzh85j0tl46Sf2OOx1wDePSWkz3Eq8XdCFkLXqaX8Bg=
github.com/wastore/keychain v0.0.0-20180920053336-f2c902a3d807/go.mod h1:zI8umr7xnBSyT9ZJ8wn48RiQ0EWXo4xmYLNw9FQvC9w=
github.com/wastore/keyctl v0.3.1 h1:wMkYW9y9jGbQ1ARBLGLwnDdbgrkbuSeuIQeHy+BZOU0=
@ -355,34 +294,31 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210812204632-0ba0e8f03122/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M=
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@ -406,8 +342,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
@ -419,13 +353,10 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@ -455,15 +386,16 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210610132358-84b48f89b13b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -473,15 +405,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210810183815-faf39c7919d5 h1:Ati8dO7+U7mxpkPSxBZQEvzHVUYB/MqCklCN8ig5w/o=
golang.org/x/oauth2 v0.0.0-20210810183815-faf39c7919d5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8=
golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -493,11 +418,10 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -507,7 +431,6 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191112214154-59a1497f0cea/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@ -531,38 +454,35 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210819135213-f52c844e1c1c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@ -572,7 +492,6 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
@ -582,7 +501,6 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@ -605,7 +523,6 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
@ -614,20 +531,16 @@ golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4f
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@ -647,17 +560,8 @@ google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz513
google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
google.golang.org/api v0.49.0/go.mod h1:BECiH72wsfwUvOVn3+btPD5WHi0LzavZReBndi42L18=
google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
google.golang.org/api v0.52.0/go.mod h1:Him/adpjt0sxtkWViy0b6xyKW/SD71CwdJ7HqJo7SrU=
google.golang.org/api v0.53.0 h1:tR42CQpqOvZcatWtP2TRJdQCQaD0SVxTDIv+vCphrZs=
google.golang.org/api v0.53.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
google.golang.org/api v0.122.0 h1:zDobeejm3E7pEG1mNHvdxvjs5XJoCMzyNH+CmwL94Es=
google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@ -701,26 +605,10 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
google.golang.org/genproto v0.0.0-20210624174822-c5cf32407d0a/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
google.golang.org/genproto v0.0.0-20210721163202-f1cecdd8b78a/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
google.golang.org/genproto v0.0.0-20210722135532-667f2b7c528f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
google.golang.org/genproto v0.0.0-20210811021853-ddbe55d93216 h1:qnrhhl4uoNFepTqE28u11llFcDH07Z6r/cQxpGR97A4=
google.golang.org/genproto v0.0.0-20210811021853-ddbe55d93216/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A=
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@ -739,15 +627,9 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv
google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q=
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag=
google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@ -760,24 +642,21 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

Просмотреть файл

@ -153,7 +153,7 @@ func (handle *Handle) Cleanup() {
handle.Unlock()
}
//defaultHandleMap holds a synchronized map[ HandleID ]*Handle
// defaultHandleMap holds a synchronized map[ HandleID ]*Handle
var defaultHandleMap sync.Map
var nextHandleID = *atomic.NewUint64(uint64(0))
@ -199,8 +199,8 @@ func Load(key HandleID) (*Handle, bool) {
return handle, true
}
//Store function must not be used in production application.
//This is a utility function present only for test scenarios.
// Store function must not be used in production application.
// This is a utility function present only for test scenarios.
func Store(key HandleID, path string, _ uintptr) *Handle {
handle := &Handle{
ID: key,

Просмотреть файл

@ -40,7 +40,7 @@ import (
"github.com/stretchr/testify/suite"
)
// Test compoennts
// Test compoennts
type ComponentA struct {
BaseComponent
}

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !unittest
// +build !unittest
/*

Просмотреть файл

@ -67,6 +67,7 @@ libfuse:
extension: <physical path to extension library>
disable-writeback-cache: true|false <disallow libfuse to buffer write requests if you must strictly open files in O_WRONLY or O_APPEND mode. alternatively, you can set ignore-open-flags.>
ignore-open-flags: true|false <ignore the append and write only flag since O_APPEND and O_WRONLY is not supported with writeback caching. alternatively, you can disable-writeback-cache. Default value is true>
max-fuse-threads: <number of threads allowed at libfuse layer for highly parallel operations, Default is 128>
# Streaming configuration
stream:
@ -94,6 +95,7 @@ file_cache:
policy-trace: true|false <generate eviction policy logs showing which files will expire soon>
offload-io: true|false <by default libfuse will service reads/writes to files for better perf. Set to true to make file-cache component service read/write calls.>
sync-to-flush: true|false <sync call to a file will force upload of the contents to storage account>
refresh-sec: <number of seconds after which compare lmt of file in local cache and container and refresh file if container has the latest copy>
# Attribute cache related configuration
attr_cache:

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !unittest
// +build !unittest
/*

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !unittest
// +build !unittest
/*
@ -38,7 +39,6 @@ package benchmark_test
import (
"flag"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strconv"
@ -64,7 +64,7 @@ func createSingleFile(size float32, path string) (float64, error) {
start := time.Now()
err := ioutil.WriteFile(path, buffer, os.FileMode(0755))
err := os.WriteFile(path, buffer, os.FileMode(0755))
if err != nil {
return 0, err
}

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !unittest
// +build !unittest
/*
@ -38,7 +39,6 @@ package e2e_tests
import (
"flag"
"fmt"
"io/ioutil"
"math/rand"
"os"
"os/exec"
@ -139,7 +139,7 @@ func (suite *dataValidationTestSuite) TestSmallFileData() {
srcFile.Close()
// write to file in the local directory
err = ioutil.WriteFile(localFilePath, minBuff, 0777)
err = os.WriteFile(localFilePath, minBuff, 0777)
suite.Equal(nil, err)
suite.copyToMountDir(localFilePath, remoteFilePath)
@ -168,7 +168,7 @@ func (suite *dataValidationTestSuite) TestMediumFileData() {
srcFile.Close()
// write to file in the local directory
err = ioutil.WriteFile(localFilePath, medBuff, 0777)
err = os.WriteFile(localFilePath, medBuff, 0777)
suite.Equal(nil, err)
suite.copyToMountDir(localFilePath, remoteFilePath)
@ -197,7 +197,7 @@ func (suite *dataValidationTestSuite) TestLargeFileData() {
srcFile.Close()
// write to file in the local directory
err = ioutil.WriteFile(localFilePath, largeBuff, 0777)
err = os.WriteFile(localFilePath, largeBuff, 0777)
suite.Equal(nil, err)
suite.copyToMountDir(localFilePath, remoteFilePath)
@ -222,7 +222,7 @@ func (suite *dataValidationTestSuite) TestDataValidationNegative() {
srcFile.Close()
// write to file in the local directory
err = ioutil.WriteFile(localFilePath, minBuff, 0777)
err = os.WriteFile(localFilePath, minBuff, 0777)
suite.Equal(nil, err)
// copy local file to mounted directory
@ -263,17 +263,17 @@ func validateMultipleFilesData(jobs <-chan int, results chan<- string, fileSize
// write to file in the local directory
if fileSize == "huge" {
err = ioutil.WriteFile(localFilePath, hugeBuff, 0777)
err = os.WriteFile(localFilePath, hugeBuff, 0777)
} else if fileSize == "large" {
if strings.ToLower(quickTest) == "true" {
err = ioutil.WriteFile(localFilePath, hugeBuff, 0777)
err = os.WriteFile(localFilePath, hugeBuff, 0777)
} else {
err = ioutil.WriteFile(localFilePath, largeBuff, 0777)
err = os.WriteFile(localFilePath, largeBuff, 0777)
}
} else if fileSize == "medium" {
err = ioutil.WriteFile(localFilePath, medBuff, 0777)
err = os.WriteFile(localFilePath, medBuff, 0777)
} else {
err = ioutil.WriteFile(localFilePath, minBuff, 0777)
err = os.WriteFile(localFilePath, minBuff, 0777)
}
suite.Equal(nil, err)

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !unittest
// +build !unittest
/*
@ -38,7 +39,6 @@ package e2e_tests
import (
"flag"
"fmt"
"io/ioutil"
"math/rand"
"os"
"os/exec"
@ -330,7 +330,7 @@ func (suite *dirTestSuite) TestDirList() {
suite.Equal(nil, err)
srcFile.Close()
files, err := ioutil.ReadDir(testDir)
files, err := os.ReadDir(testDir)
suite.Equal(nil, err)
suite.Equal(4, len(files))
@ -367,7 +367,7 @@ func (suite *dirTestSuite) TestDirList() {
// })
// suite.Equal(nil, err)
// testFiles, err := ioutil.ReadDir(testDir)
// testFiles, err := os.ReadDir(testDir)
// suite.Equal(nil, err)
// suite.Equal(4, len(testFiles))
@ -393,7 +393,7 @@ func (suite *dirTestSuite) TestDirRenameFull() {
for i := 0; i < 10; i++ {
newFile := fileName + strconv.Itoa(i)
err := ioutil.WriteFile(newFile, suite.medBuff, 0777)
err := os.WriteFile(newFile, suite.medBuff, 0777)
suite.Equal(nil, err)
}

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !unittest
// +build !unittest
/*
@ -39,7 +40,6 @@ import (
"flag"
"fmt"
"io"
"io/ioutil"
"math/rand"
"os"
"strconv"
@ -140,7 +140,7 @@ func (suite *fileTestSuite) TestFileCreatSpclChar() {
_, err = os.Stat(fileName)
suite.Equal(nil, err)
files, err := ioutil.ReadDir(suite.testPath)
files, err := os.ReadDir(suite.testPath)
suite.Equal(nil, err)
suite.GreaterOrEqual(len(files), 1)
@ -168,7 +168,7 @@ func (suite *fileTestSuite) TestFileCreatEncodeChar() {
_, err = os.Stat(fileName)
suite.Equal(nil, err)
files, err := ioutil.ReadDir(suite.testPath)
files, err := os.ReadDir(suite.testPath)
suite.Equal(nil, err)
suite.GreaterOrEqual(len(files), 1)
@ -211,7 +211,7 @@ func (suite *fileTestSuite) TestFileCreateMultiSpclCharWithinSpclDir() {
_, err = os.Stat(fileName)
suite.Equal(nil, err)
files, err := ioutil.ReadDir(speclDirName)
files, err := os.ReadDir(speclDirName)
suite.Equal(nil, err)
suite.GreaterOrEqual(len(files), 1)
@ -271,7 +271,7 @@ func (suite *fileTestSuite) TestFileWriteSmall() {
suite.Equal(nil, err)
srcFile.Close()
err = ioutil.WriteFile(fileName, suite.minBuff, 0777)
err = os.WriteFile(fileName, suite.minBuff, 0777)
suite.Equal(nil, err)
suite.fileTestCleanup([]string{fileName})
@ -284,10 +284,10 @@ func (suite *fileTestSuite) TestFileReadSmall() {
suite.Equal(nil, err)
srcFile.Close()
err = ioutil.WriteFile(fileName, suite.minBuff, 0777)
err = os.WriteFile(fileName, suite.minBuff, 0777)
suite.Equal(nil, err)
data, err := ioutil.ReadFile(fileName)
data, err := os.ReadFile(fileName)
suite.Equal(nil, err)
suite.Equal(len(data), len(suite.minBuff))
@ -318,7 +318,7 @@ func (suite *fileTestSuite) TestFileTruncate() {
err = os.Truncate(fileName, 2)
suite.Equal(nil, err)
data, err := ioutil.ReadFile(fileName)
data, err := os.ReadFile(fileName)
suite.Equal(nil, err)
suite.LessOrEqual(2, len(data))
@ -414,7 +414,7 @@ func (suite *fileTestSuite) TestFileCreateMulti() {
fileName := dirName + "/multi"
for i := 0; i < 10; i++ {
newFile := fileName + strconv.Itoa(i)
err := ioutil.WriteFile(newFile, suite.medBuff, 0777)
err := os.WriteFile(newFile, suite.medBuff, 0777)
suite.Equal(nil, err)
}
suite.fileTestCleanup([]string{dirName})
@ -439,7 +439,7 @@ func (suite *fileTestSuite) TestLinkCreate() {
suite.Equal(nil, err)
f.Close()
symName := suite.testPath + "/small.lnk"
err = ioutil.WriteFile(fileName, suite.minBuff, 0777)
err = os.WriteFile(fileName, suite.minBuff, 0777)
suite.Equal(nil, err)
err = os.Symlink(fileName, symName)
@ -460,9 +460,9 @@ func (suite *fileTestSuite) TestLinkRead() {
err = os.Symlink(fileName, symName)
suite.Equal(nil, err)
err = ioutil.WriteFile(fileName, suite.minBuff, 0777)
err = os.WriteFile(fileName, suite.minBuff, 0777)
suite.Equal(nil, err)
data, err := ioutil.ReadFile(fileName)
data, err := os.ReadFile(fileName)
suite.Equal(nil, err)
suite.Equal(len(data), len(suite.minBuff))
suite.fileTestCleanup([]string{fileName})
@ -503,7 +503,7 @@ func (suite *fileTestSuite) TestLinkRenameTarget() {
err = os.Rename(fileName, fileNameNew)
suite.Equal(nil, err)
_, err = ioutil.ReadFile(symName)
_, err = os.ReadFile(symName)
// we expect that to fail
suite.NotEqual(nil, err)
@ -525,13 +525,13 @@ func (suite *fileTestSuite) TestLinkDeleteReadTarget() {
f.Close()
err = os.Symlink(fileName, symName)
suite.Equal(nil, err)
err = ioutil.WriteFile(fileName, suite.minBuff, 0777)
err = os.WriteFile(fileName, suite.minBuff, 0777)
suite.Equal(nil, err)
err = os.Remove(symName)
suite.Equal(nil, err)
data, err := ioutil.ReadFile(fileName)
data, err := os.ReadFile(fileName)
suite.Equal(nil, err)
suite.Equal(len(data), len(suite.minBuff))

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !unittest
// +build !unittest
/*
@ -40,7 +41,6 @@ import (
"crypto/rand"
"flag"
"fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
@ -420,7 +420,7 @@ func (suite *mountSuite) TestWriteBackCacheAndIgnoreOpenFlags() {
// write to file in the local directory
buff := make([]byte, 200)
rand.Read(buff)
err := ioutil.WriteFile(remoteFilePath, buff, 0777)
err := os.WriteFile(remoteFilePath, buff, 0777)
suite.Nil(err)
// unmount

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !unittest
// +build !unittest
/*

Просмотреть файл

@ -1,3 +1,4 @@
//go:build !unittest
// +build !unittest
/*
@ -38,7 +39,6 @@ package stress_test
import (
"flag"
"fmt"
"io/ioutil"
"math/rand"
"os"
"path/filepath"
@ -68,7 +68,7 @@ func downloadWorker(t *testing.T, id int, jobs <-chan string, results chan<- int
f, errFile := os.Open(item)
if errFile == nil {
f.Close()
_, _ = ioutil.ReadFile(item)
_, _ = os.ReadFile(item)
//t.Log(data)
//t.Log(".")
break
@ -98,7 +98,7 @@ func uploadWorker(t *testing.T, id int, jobs <-chan workItem, results chan<- int
i := 0
var errFile error
for ; i < retryCount; i++ {
errFile = ioutil.WriteFile(item.baseDir+"/"+item.fileName+".tst", item.fileData, 0666)
errFile = os.WriteFile(item.baseDir+"/"+item.fileName+".tst", item.fileData, 0666)
if errFile == nil {
//t.Log(".")
break