802 строки
36 KiB
YAML
802 строки
36 KiB
YAML
# Blobfuse2 Nightly Build-Sanity Pipeline
|
|
|
|
# In case of failure on a Self-Hosted Agent perform the following steps to get the vm back online:
|
|
# 1. Check which vm is offline by going to agent-pools in Azure pipelines portal
|
|
# 2. Log into the VM that is offline
|
|
# 3. Clear the _work or work directory which must be in myagent or $(HOME) directory
|
|
# 4. Verify whether system is online from the Azure pipelines portal
|
|
|
|
parameters:
|
|
- name: coverage_test
|
|
displayName: 'Code Coverage'
|
|
type: boolean
|
|
default: true
|
|
|
|
- name: cleanup_test
|
|
displayName: 'Account Cleanup'
|
|
type: boolean
|
|
default: true
|
|
|
|
|
|
stages:
|
|
- ${{ if eq(parameters.coverage_test, true) }}:
|
|
- stage: BuildAndTest
|
|
jobs:
|
|
- job: Coverage
|
|
timeoutInMinutes: 300
|
|
strategy:
|
|
matrix:
|
|
Ubuntu-20:
|
|
AgentName: 'blobfuse-ubuntu20'
|
|
imageName: 'ubuntu-20.04'
|
|
containerName: 'test-cnt-ubn-20'
|
|
fuselib: 'libfuse-dev'
|
|
fuselib2: 'fuse'
|
|
tags: 'fuse2'
|
|
Ubuntu-22:
|
|
AgentName: 'blobfuse-ubuntu22'
|
|
imageName: 'ubuntu-22.04'
|
|
containerName: 'test-cnt-ubn-22'
|
|
fuselib: 'libfuse3-dev'
|
|
fuselib2: 'fuse3'
|
|
tags: 'fuse3'
|
|
|
|
pool:
|
|
name: "blobfuse-ubuntu-pool"
|
|
demands:
|
|
- ImageOverride -equals $(AgentName)
|
|
|
|
variables:
|
|
- group: NightlyBlobFuse
|
|
- name: MOUNT_DIR
|
|
value: '$(Pipeline.Workspace)/blob_mnt'
|
|
- name: TEMP_DIR
|
|
value: '$(Pipeline.Workspace)/blobfuse2_tmp'
|
|
- name: BLOBFUSE2_CFG
|
|
value: '$(Pipeline.Workspace)/blobfuse2.yaml'
|
|
- name: BLOBFUSE2_STREAM_CFG
|
|
value: '$(Pipeline.Workspace)/blobfuse2_stream.yaml'
|
|
- name: BLOBFUSE2_ADLS_CFG
|
|
value: '$(Pipeline.Workspace)/blobfuse2.adls.yaml'
|
|
- name: GOPATH
|
|
value: '$(Pipeline.Workspace)/go'
|
|
- name: ROOT_DIR
|
|
value: '$(System.DefaultWorkingDirectory)'
|
|
- name: WORK_DIR
|
|
value: '$(System.DefaultWorkingDirectory)/azure-storage-fuse'
|
|
|
|
steps:
|
|
- checkout: none
|
|
|
|
# Clone the repo
|
|
- script: |
|
|
git clone https://github.com/Azure/azure-storage-fuse
|
|
displayName: 'Checkout Code'
|
|
workingDirectory: $(ROOT_DIR)
|
|
|
|
# Checkout the branch
|
|
- script: |
|
|
git checkout `echo $(Build.SourceBranch) | cut -d "/" -f 1,2 --complement`
|
|
displayName: 'Checkout Branch'
|
|
workingDirectory: $(WORK_DIR)
|
|
|
|
- script: |
|
|
sudo apt-get update --fix-missing -o Dpkg::Options::="--force-confnew"
|
|
sudo apt-get install make cmake gcc g++ parallel $(fuselib) $(fuselib2) -y -o Dpkg::Options::="--force-confnew"
|
|
displayName: 'Install libfuse'
|
|
|
|
|
|
# Create directory structure
|
|
- script: |
|
|
sudo mkdir -p $(ROOT_DIR)
|
|
sudo chown -R `whoami` $(ROOT_DIR)
|
|
chmod 777 $(ROOT_DIR)
|
|
displayName: 'Create Directory Structure'
|
|
|
|
# -------------------------------------------------------
|
|
# Pull and build the code
|
|
- template: 'azure-pipeline-templates/build.yml'
|
|
parameters:
|
|
working_directory: $(WORK_DIR)
|
|
root_dir: $(Pipeline.Workspace)
|
|
mount_dir: $(MOUNT_DIR)
|
|
temp_dir: $(TEMP_DIR)
|
|
gopath: $(GOPATH)
|
|
container: $(containerName)
|
|
tags: $(tags)
|
|
fuselib: $(fuselib)
|
|
skip_msi: "false"
|
|
|
|
# -------------------------------------------------------
|
|
# UT based code coverage test
|
|
- script: |
|
|
go test -v -timeout=1h ./... --tags=unittest,$(tags) -covermode count -coverprofile ./blobfuse2_ut.cov
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "UT Code Coverage"
|
|
|
|
# -------------------------------------------------------
|
|
# Build code coverage binary
|
|
- script: |
|
|
go test -coverpkg="./..." -covermode=count -c --tags=$(tags) -o blobfuse2.test
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "Build coverage binary"
|
|
|
|
# -------------------------------------------------------
|
|
# Config Generation (Block Blob)
|
|
- script: |
|
|
cd $(WORK_DIR)
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_gentest1.cov gen-test-config --config-file=azure_key.yaml --container-name=$(containerName) --temp-path=$(TEMP_DIR) --output-file=$(BLOBFUSE2_CFG)
|
|
env:
|
|
NIGHTLY_STO_ACC_NAME: $(NIGHTLY_STO_BLOB_ACC_NAME)
|
|
NIGHTLY_STO_ACC_KEY: $(NIGHTLY_STO_BLOB_ACC_KEY)
|
|
ACCOUNT_TYPE: 'block'
|
|
ACCOUNT_ENDPOINT: 'https://$(NIGHTLY_STO_BLOB_ACC_NAME).blob.core.windows.net'
|
|
VERBOSE_LOG: false
|
|
USE_HTTP: false
|
|
displayName: 'Create Config File - Block Blob'
|
|
workingDirectory: $(WORK_DIR)
|
|
continueOnError: false
|
|
|
|
# Code Coverage with e2e-tests for block blob
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_block.cov mount $(MOUNT_DIR) --config-file=$(BLOBFUSE2_CFG) --foreground=true &
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
rm -rf $(MOUNT_DIR)/*
|
|
cd test/e2e_tests
|
|
go test -v -timeout=7200s ./... -args -mnt-path=$(MOUNT_DIR) -tmp-path=$(TEMP_DIR)
|
|
cd -
|
|
sudo fusermount -u $(MOUNT_DIR)
|
|
sleep 5
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "Block Blob Coverage"
|
|
|
|
# Code Coverage with health monitor, dynamic, CPU and mem profilers enabled for block blob
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
cp $(BLOBFUSE2_CFG) /tmp/configBlockProfilerTemp.yaml
|
|
echo "dynamic-profile: true" >> /tmp/configBlockProfilerTemp.yaml
|
|
echo "cpu-profile: /tmp/cpuBlockProfTmp" >> /tmp/configBlockProfilerTemp.yaml
|
|
echo "mem-profile: /tmp/memBlockProfTmp" >> /tmp/configBlockProfilerTemp.yaml
|
|
echo "health_monitor:" >> /tmp/configBlockProfilerTemp.yaml
|
|
echo " enable-monitoring: true" >> /tmp/configBlockProfilerTemp.yaml
|
|
echo " monitor-disable-list:" >> /tmp/configBlockProfilerTemp.yaml
|
|
echo " - blobfuse_stats" >> /tmp/configBlockProfilerTemp.yaml
|
|
cat /tmp/configBlockProfilerTemp.yaml
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_block_profiler.cov mount $(MOUNT_DIR) --config-file=/tmp/configBlockProfilerTemp.yaml --foreground=true &
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
rm -rf $(MOUNT_DIR)/*
|
|
cd test/e2e_tests
|
|
go test -v -timeout=7200s ./... -args -mnt-path=$(MOUNT_DIR) -tmp-path=$(TEMP_DIR)
|
|
cd -
|
|
sudo fusermount -u $(MOUNT_DIR)
|
|
sleep 5
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "Block Blob Coverage with profilers"
|
|
|
|
# Config Generation (ADLS)
|
|
- script: |
|
|
cd $(WORK_DIR)
|
|
$(WORK_DIR)/blobfuse2 gen-test-config --config-file=azure_key.yaml --container-name=$(containerName) --temp-path=$(TEMP_DIR) --output-file=$(BLOBFUSE2_ADLS_CFG)
|
|
env:
|
|
NIGHTLY_STO_ACC_NAME: $(AZTEST_ADLS_ACC_NAME)
|
|
NIGHTLY_STO_ACC_KEY: $(AZTEST_ADLS_KEY)
|
|
ACCOUNT_TYPE: 'adls'
|
|
ACCOUNT_ENDPOINT: 'https://$(AZTEST_ADLS_ACC_NAME).dfs.core.windows.net'
|
|
VERBOSE_LOG: false
|
|
USE_HTTP: false
|
|
displayName: 'Create Config File - ADLS'
|
|
continueOnError: false
|
|
|
|
# Code Coverage with e2e-tests for ADLS
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_adls.cov mount $(MOUNT_DIR) --config-file=$(BLOBFUSE2_ADLS_CFG) --foreground=true &
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
rm -rf $(MOUNT_DIR)/*
|
|
cd test/e2e_tests
|
|
go test -v -timeout=7200s ./... -args -mnt-path=$(MOUNT_DIR) -adls=true -tmp-path=$(TEMP_DIR)
|
|
cd -
|
|
./blobfuse2 unmount all
|
|
sleep 5
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "ADLS Coverage"
|
|
|
|
# Code Coverage with health monitor, dynamic, CPU and mem profilers enabled for adls
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
cp $(BLOBFUSE2_ADLS_CFG) /tmp/configAdlsProfilerTemp.yaml
|
|
echo "dynamic-profile: true" >> /tmp/configAdlsProfilerTemp.yaml
|
|
echo "cpu-profile: /tmp/cpuAdlsProfTmp" >> /tmp/configAdlsProfilerTemp.yaml
|
|
echo "mem-profile: /tmp/memAdlsProfTmp" >> /tmp/configAdlsProfilerTemp.yaml
|
|
echo "health_monitor:" >> /tmp/configAdlsProfilerTemp.yaml
|
|
echo " enable-monitoring: true" >> /tmp/configAdlsProfilerTemp.yaml
|
|
echo " monitor-disable-list:" >> /tmp/configAdlsProfilerTemp.yaml
|
|
echo " - blobfuse_stats" >> /tmp/configAdlsProfilerTemp.yaml
|
|
cat /tmp/configAdlsProfilerTemp.yaml
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_adls_profiler.cov mount $(MOUNT_DIR) --config-file=/tmp/configAdlsProfilerTemp.yaml --foreground=true &
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
rm -rf $(MOUNT_DIR)/*
|
|
cd test/e2e_tests
|
|
go test -v -timeout=7200s ./... -args -mnt-path=$(MOUNT_DIR) -tmp-path=$(TEMP_DIR)
|
|
cd -
|
|
sudo fusermount -u $(MOUNT_DIR)
|
|
sleep 5
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "ADLS Coverage with profilers"
|
|
|
|
|
|
# -------------------------------------------------------
|
|
# Config Generation (Block Blob - LFU policy)
|
|
- script: |
|
|
cd $(WORK_DIR)
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_gentest2.cov gen-test-config --config-file=azure_key_lfu.yaml --container-name=$(containerName) --temp-path=$(TEMP_DIR) --output-file=$(BLOBFUSE2_CFG)
|
|
env:
|
|
NIGHTLY_STO_ACC_NAME: $(NIGHTLY_STO_BLOB_ACC_NAME)
|
|
NIGHTLY_STO_ACC_KEY: $(NIGHTLY_STO_BLOB_ACC_KEY)
|
|
ACCOUNT_TYPE: 'block'
|
|
ACCOUNT_ENDPOINT: 'https://$(NIGHTLY_STO_BLOB_ACC_NAME).blob.core.windows.net'
|
|
VERBOSE_LOG: false
|
|
displayName: 'Create Config File - LFU'
|
|
continueOnError: false
|
|
workingDirectory: $(WORK_DIR)
|
|
|
|
# Code Coverage with e2e-tests for block blob with lfu policy
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_block_lfu.cov mount $(MOUNT_DIR) --config-file=$(BLOBFUSE2_CFG) --foreground=true &
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
rm -rf $(MOUNT_DIR)/*
|
|
cd test/e2e_tests
|
|
go test -v -timeout=7200s ./... -args -mnt-path=$(MOUNT_DIR) -tmp-path=$(TEMP_DIR)
|
|
cd -
|
|
./blobfuse2 unmount $(MOUNT_DIR)
|
|
sleep 5
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "Block Blob LFU Coverage"
|
|
|
|
|
|
# -------------------------------------------------------
|
|
# Config Generation (Block Blob - Stream)
|
|
- script: |
|
|
cd $(WORK_DIR)
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_gentest3.cov gen-test-config --config-file=azure_stream.yaml --container-name=$(containerName) --temp-path=$(TEMP_DIR) --output-file=$(BLOBFUSE2_STREAM_CFG)
|
|
displayName: 'Create Config File - Stream'
|
|
env:
|
|
NIGHTLY_STO_ACC_NAME: $(NIGHTLY_STO_BLOB_ACC_NAME)
|
|
NIGHTLY_STO_ACC_KEY: $(NIGHTLY_STO_BLOB_ACC_KEY)
|
|
ACCOUNT_TYPE: 'block'
|
|
ACCOUNT_ENDPOINT: 'https://$(NIGHTLY_STO_BLOB_ACC_NAME).blob.core.windows.net'
|
|
VERBOSE_LOG: false
|
|
continueOnError: false
|
|
workingDirectory: $(WORK_DIR)
|
|
|
|
# Streaming test preparation
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_stream_prep.cov mount $(MOUNT_DIR) --config-file=$(BLOBFUSE2_CFG) --foreground=true &
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
for i in {10,50,100,200,500,1024}; do echo $i; done | parallel --will-cite -j 5 'head -c {}M < /dev/urandom > $(WORK_DIR)/myfile_{}'
|
|
for i in {10,50,100,200,500,1024}; do echo $i; done | parallel --will-cite -j 5 'cp $(WORK_DIR)/myfile_{} $(MOUNT_DIR)/'
|
|
./blobfuse2 unmount "$(MOUNT_DIR)*"
|
|
sudo fusermount -u $(MOUNT_DIR)
|
|
sleep 5
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "Block Blob Stream Preparation"
|
|
|
|
# Code Coverage with e2e-tests for block blob with streaming on
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_stream.cov mount $(MOUNT_DIR) --config-file=$(BLOBFUSE2_STREAM_CFG) --foreground=true &
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
./blobfuse2 mount list
|
|
for i in {10,50,100,200,500,1024}; do echo $i; done | parallel --will-cite -j 5 'diff $(WORK_DIR)/myfile_{} $(MOUNT_DIR)/myfile_{}'
|
|
sudo fusermount -u $(MOUNT_DIR)
|
|
sleep 5
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "Block Blob Stream Coverage"
|
|
|
|
|
|
# -------------------------------------------------------
|
|
# Config Generation (Block Blob) for cli options
|
|
- script: |
|
|
cd $(WORK_DIR)
|
|
$(WORK_DIR)/blobfuse2 gen-test-config --config-file=azure_key.yaml --container-name=$(containerName) --temp-path=$(TEMP_DIR) --output-file=$(BLOBFUSE2_CFG)
|
|
displayName: 'Create Config File - Block Blob'
|
|
env:
|
|
NIGHTLY_STO_ACC_NAME: $(NIGHTLY_STO_BLOB_ACC_NAME)
|
|
NIGHTLY_STO_ACC_KEY: $(NIGHTLY_STO_BLOB_ACC_KEY)
|
|
ACCOUNT_TYPE: 'block'
|
|
ACCOUNT_ENDPOINT: 'https://$(NIGHTLY_STO_BLOB_ACC_NAME).blob.core.windows.net'
|
|
VERBOSE_LOG: false
|
|
USE_HTTP: false
|
|
|
|
# Component generation code coverage
|
|
- script: |
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/generate_cmd.cov generate test_component
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Component Generation"
|
|
|
|
# Mount / Unmount / List code coverage
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/list_empty_cmd.cov mount list
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Mount List"
|
|
|
|
- script: |
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/mount_cmd.cov mount all $(MOUNT_DIR) --config-file=$(BLOBFUSE2_CFG) --log-level=log_debug
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
sleep 20
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/list_cmd_all.cov mount list
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
./blobfuse2 unmount all
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Mount all and List"
|
|
|
|
- script: |
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/mount_cmd_all.cov mount all $(MOUNT_DIR) --config-file=$(BLOBFUSE2_CFG) --log-level=log_debug
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
sleep 20
|
|
cd $(MOUNT_DIR)/$(containerName)
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/umnt_cmd_cont_fail.cov unmount $(MOUNT_DIR)/$(containerName)
|
|
cd -
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/umnt_cmd_cont.cov unmount $(MOUNT_DIR)/$(containerName)
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/umnt_wild_cmd.cov unmount "testmut*"
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/umnt_wild_cmd.cov unmount "abcdef*"
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/umnt_negative_cmd.cov unmount abcdef
|
|
if [ $? -ne 1 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
for i in {1..5}; do ./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/umnt_all_cmd$i.cov unmount all; done
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Unmount options"
|
|
|
|
|
|
# Mount / Unmount Negative tests
|
|
- script: |
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/mount_neg.cov mount all /abc --config-file=$(BLOBFUSE2_CFG) --log-level=log_debug
|
|
if [ $? -eq 0 ]; then
|
|
exit 1
|
|
fi
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Invalid mount path"
|
|
timeoutInMinutes: 2
|
|
|
|
- script: |
|
|
./blobfuse2 unmount all
|
|
cp $(BLOBFUSE2_CFG) /tmp/configMountall.yaml
|
|
echo "mountall:" >> /tmp/configMountall.yaml
|
|
echo " container-allowlist:" >> /tmp/configMountall.yaml
|
|
echo " - abcd" >> /tmp/configMountall.yaml
|
|
cat /tmp/configMountall.yaml
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/secure_encrypt_all.cov secure encrypt --config-file=/tmp/configMountall.yaml --output-file=$(Pipeline.Workspace)/blobfuse2.azsec --passphrase=123123123123123123123123
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/mount_all_cmd_secure.cov mount all $(MOUNT_DIR) --config-file=$(Pipeline.Workspace)/blobfuse2.azsec --passphrase=123123123123123123123123 --log-level=log_debug --foreground=true &
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
sleep 5
|
|
./blobfuse2 unmount all
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Mount all with secure config"
|
|
timeoutInMinutes: 2
|
|
|
|
- script: |
|
|
./blobfuse2 unmount all
|
|
cp $(BLOBFUSE2_CFG) /tmp/configMountall.yaml
|
|
echo "mountall:" >> /tmp/configMountall.yaml
|
|
echo " container-denylist:" >> /tmp/configMountall.yaml
|
|
echo " - abcd" >> /tmp/configMountall.yaml
|
|
cat /tmp/configMountall.yaml
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/secure_encrypt_all2.cov secure encrypt --config-file=/tmp/configMountall.yaml --output-file=$(Pipeline.Workspace)/blobfuse2.azsec --passphrase=123123123123123123123123
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/mount_all_cmd_secure2.cov mount all $(MOUNT_DIR) --config-file=$(Pipeline.Workspace)/blobfuse2.azsec --passphrase=123123123123123123123123 --log-level=log_debug --foreground=true &
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
sleep 5
|
|
./blobfuse2 unmount all
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Mount all with secure config 2"
|
|
timeoutInMinutes: 2
|
|
|
|
- script: |
|
|
./blobfuse2 unmount all
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/mount_foreg.cov mount $(MOUNT_DIR) --config-file=$(BLOBFUSE2_CFG) --log-level=log_debug --foreground=true &
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
sleep 5
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/mount_remount.cov mount $(MOUNT_DIR) --config-file=$(BLOBFUSE2_CFG) --log-level=log_debug
|
|
if [ $? -eq 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
sleep 5
|
|
./blobfuse2 unmount all
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Remount test"
|
|
timeoutInMinutes: 2
|
|
|
|
# Doc generation tests
|
|
- script: |
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/doc1.cov doc
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/doc2.cov doc --output-location /notexists
|
|
touch ~/a.txt
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/doc2.cov doc --output-location ~/a.txt
|
|
rm -rf ~/a.txt
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : doc generation"
|
|
timeoutInMinutes: 2
|
|
|
|
# Version check
|
|
- script: |
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/version1.cov --version
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/version2.cov version
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/version2.cov version --check
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : version"
|
|
timeoutInMinutes: 2
|
|
|
|
# Simulate config change
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
./blobfuse2 unmount all
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/mount_foreg_2.cov mount all $(MOUNT_DIR) --config-file=$(BLOBFUSE2_CFG) --log-level=log_debug --foreground=true &
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
sleep 5
|
|
echo -e "\n\nlogging:\n level:log_debug\n type:base" >> $(BLOBFUSE2_CFG)
|
|
sed -i 's/timeout:.*/timeout: 300/' $(BLOBFUSE2_CFG)
|
|
sleep 5
|
|
|
|
./blobfuse2 unmount all
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Config change simulator"
|
|
|
|
# Secure Config, fine to use insecure passphrase as this is just for testing
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
./blobfuse2 unmount all
|
|
./blobfuse2 gen-test-config --config-file=azure_key.yaml --container-name=$(containerName) --temp-path=$(TEMP_DIR) --output-file=$(BLOBFUSE2_CFG)
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/secure_encrypt.cov secure encrypt --config-file=$(BLOBFUSE2_CFG) --output-file=$(Pipeline.Workspace)/blobfuse2.azsec --passphrase=123123123123123123123123
|
|
if [ $? -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/mount_secure.cov mount $(MOUNT_DIR) --config-file=$(Pipeline.Workspace)/blobfuse2.azsec --passphrase=123123123123123123123123 &
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
rm -rf $(MOUNT_DIR)/*
|
|
cd test/e2e_tests
|
|
go test -v -timeout=7200s ./... -args -mnt-path=$(MOUNT_DIR) -adls=false -tmp-path=$(TEMP_DIR)
|
|
cd -
|
|
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/secure_set.cov secure set --config-file=$(Pipeline.Workspace)/blobfuse2.azsec --passphrase=123123123123123123123123 --key=logging.level --value=log_debug
|
|
./blobfuse2 unmount all
|
|
sleep 5
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Secure Config"
|
|
env:
|
|
NIGHTLY_STO_ACC_NAME: $(NIGHTLY_STO_BLOB_ACC_NAME)
|
|
NIGHTLY_STO_ACC_KEY: $(NIGHTLY_STO_BLOB_ACC_KEY)
|
|
ACCOUNT_TYPE: 'block'
|
|
ACCOUNT_ENDPOINT: 'https://$(NIGHTLY_STO_BLOB_ACC_NAME).blob.core.windows.net'
|
|
VERBOSE_LOG: false
|
|
USE_HTTP: false
|
|
|
|
# stop health monitor binary associated with a given blobfuse2 pid
|
|
- script: |
|
|
./blobfuse2 unmount all
|
|
sudo kill -9 `pidof blobfuse2.test`
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
mkdir -p $(MOUNT_DIR)/hmon_test
|
|
|
|
sudo ln -s `pwd`/bfusemon /usr/local/bin/bfusemon
|
|
ls -l /usr/local/bin/bfusemon*
|
|
|
|
cat /tmp/configAdlsProfilerTemp.yaml
|
|
./blobfuse2 mount $(MOUNT_DIR)/hmon_test --config-file=/tmp/configAdlsProfilerTemp.yaml
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
ps -aux | grep bfusemon
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/bfusemon_stop_pid.cov health-monitor stop --pid=`pidof blobfuse2`
|
|
./blobfuse2 unmount all
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Health monitor stop pid"
|
|
|
|
# stop all health monitor binaries
|
|
- script: |
|
|
./blobfuse2 unmount all
|
|
sudo kill -9 `pidof blobfuse2.test`
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
mkdir -p $(MOUNT_DIR)/hmon_test
|
|
|
|
cat /tmp/configAdlsProfilerTemp.yaml
|
|
./blobfuse2 mount $(MOUNT_DIR)/hmon_test --config-file=/tmp/configAdlsProfilerTemp.yaml
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
ps -aux | grep bfusemon
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/bfusemon_stop_all.cov health-monitor stop all
|
|
./blobfuse2 unmount all
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "CLI : Health monitor stop all"
|
|
|
|
# Start Proxy
|
|
- script: |
|
|
sudo apt-get update --fix-missing -y
|
|
sudo apt remove mitmproxy -y
|
|
sudo apt-get install python3-setuptools -y
|
|
sudo apt install python3-pip -y
|
|
sudo pip3 install mitmproxy
|
|
mitmdump -w proxy_logs.txt &
|
|
displayName: 'Install & Start Proxy'
|
|
|
|
# Configure Proxy cert & env
|
|
- script: |
|
|
sudo mkdir /usr/local/share/ca-certificates/extra
|
|
sudo cp ~/.mitmproxy/mitmproxy-ca-cert.cer /usr/local/share/ca-certificates/extra/mitmproxy-ca-cert.crt
|
|
sudo update-ca-certificates
|
|
export https_proxy="127.0.0.1:8080"
|
|
export http_proxy="127.0.0.1:8080"
|
|
displayName: 'Configure Proxy'
|
|
|
|
# Config Generation (Block Blob Proxy)
|
|
- script: |
|
|
cd $(WORK_DIR)
|
|
$(WORK_DIR)/blobfuse2 gen-test-config --config-file=azure_key_proxy.yaml --container-name=$(containerName) --temp-path=$(TEMP_DIR) --output-file=$(BLOBFUSE2_CFG)
|
|
env:
|
|
NIGHTLY_STO_ACC_NAME: $(NIGHTLY_STO_BLOB_ACC_NAME)
|
|
NIGHTLY_STO_ACC_KEY: $(NIGHTLY_STO_BLOB_ACC_KEY)
|
|
ACCOUNT_TYPE: 'block'
|
|
ACCOUNT_ENDPOINT: 'https://$(NIGHTLY_STO_BLOB_ACC_NAME).blob.core.windows.net'
|
|
VERBOSE_LOG: false
|
|
USE_HTTP: false
|
|
displayName: 'Create Config File - Block Blob Proxy'
|
|
workingDirectory: $(WORK_DIR)
|
|
continueOnError: false
|
|
|
|
# Code Coverage with e2e-tests for block blob Proxy
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_block_proxy.cov mount $(MOUNT_DIR) --config-file=$(BLOBFUSE2_CFG) --disable-compression=true --foreground=true &
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
rm -rf $(MOUNT_DIR)/*
|
|
cd test/e2e_tests
|
|
go test -v -timeout=7200s ./... -args -mnt-path=$(MOUNT_DIR) -tmp-path=$(TEMP_DIR)
|
|
cd -
|
|
sudo fusermount -u $(MOUNT_DIR)
|
|
sleep 5
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "Block Blob Coverage Proxy"
|
|
|
|
# Config Generation (ADLS Proxy)
|
|
- script: |
|
|
cd $(WORK_DIR)
|
|
$(WORK_DIR)/blobfuse2 gen-test-config --config-file=azure_key_proxy.yaml --container-name=$(containerName) --temp-path=$(TEMP_DIR) --output-file=$(BLOBFUSE2_ADLS_CFG)
|
|
env:
|
|
NIGHTLY_STO_ACC_NAME: $(AZTEST_ADLS_ACC_NAME)
|
|
NIGHTLY_STO_ACC_KEY: $(AZTEST_ADLS_KEY)
|
|
ACCOUNT_TYPE: 'adls'
|
|
ACCOUNT_ENDPOINT: 'https://$(AZTEST_ADLS_ACC_NAME).dfs.core.windows.net'
|
|
VERBOSE_LOG: false
|
|
USE_HTTP: false
|
|
displayName: 'Create Config File - ADLS Proxy'
|
|
continueOnError: false
|
|
|
|
# Code Coverage with e2e-tests for ADLS Proxy
|
|
- script: |
|
|
rm -rf $(MOUNT_DIR)/*
|
|
rm -rf $(TEMP_DIR)/*
|
|
./blobfuse2.test -test.v -test.coverprofile=$(WORK_DIR)/blobfuse2_adls_proxy.cov mount $(MOUNT_DIR) --config-file=$(BLOBFUSE2_ADLS_CFG) --foreground=true &
|
|
sleep 10
|
|
ps -aux | grep blobfuse2
|
|
rm -rf $(MOUNT_DIR)/*
|
|
cd test/e2e_tests
|
|
go test -v -timeout=7200s ./... -args -mnt-path=$(MOUNT_DIR) -adls=true -tmp-path=$(TEMP_DIR)
|
|
cd -
|
|
./blobfuse2 unmount all
|
|
sleep 5
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "ADLS Coverage Proxy"
|
|
|
|
# -------------------------------------------------------
|
|
# Coverage report consolidation
|
|
- script: |
|
|
echo 'mode: count' > ./blobfuse2_coverage_raw.rpt
|
|
tail -q -n +2 ./*.cov >> ./blobfuse2_coverage_raw.rpt
|
|
cat ./blobfuse2_coverage_raw.rpt | grep -v mock_component | grep -v base_component | grep -v loopback | grep -v tools | grep -v "common/log" | grep -v "common/exectime" | grep -v "internal/stats_manager" | grep -v "main.go" | grep -v "component/azstorage/azauthmsi.go" > ./blobfuse2_coverage.rpt
|
|
go tool cover -func blobfuse2_coverage.rpt > ./blobfuse2_func_cover.rpt
|
|
go tool cover -html=./blobfuse2_coverage.rpt -o ./blobfuse2_coverage.html
|
|
go tool cover -html=./blobfuse2_ut.cov -o ./blobfuse2_ut.html
|
|
cp ./*.rpt $(Build.ArtifactStagingDirectory)/
|
|
cp ./*.cov $(Build.ArtifactStagingDirectory)/
|
|
cp ./*.html $(Build.ArtifactStagingDirectory)/
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "Save coverage report"
|
|
|
|
# Publish the Artifacts
|
|
- task: PublishBuildArtifacts@1
|
|
inputs:
|
|
artifactName: 'Blobfuse2 Coverage $(tags)'
|
|
displayName: 'Publish Artifacts for blobfuse2 code coverage'
|
|
condition: succeeded()
|
|
|
|
# Overall code coverage check
|
|
- script: |
|
|
chmod 777 ./test/scripts/coveragecheck.sh
|
|
./test/scripts/coveragecheck.sh
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "Overall coverage check"
|
|
|
|
# File level code coverage check
|
|
- script: |
|
|
./test/scripts/coveragecheck.sh file
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: "File level coverage check"
|
|
condition: always()
|
|
|
|
|
|
|
|
- ${{ if eq(parameters.cleanup_test, true) }}:
|
|
- stage: AccountCleanup
|
|
condition: always()
|
|
jobs:
|
|
- job: Cleanup
|
|
timeoutInMinutes: 300
|
|
strategy:
|
|
matrix:
|
|
Ubuntu-20:
|
|
AgentName: 'blobfuse-ubuntu20'
|
|
imageName: 'ubuntu-20.04'
|
|
containerName: 'test-cnt-ubn-20'
|
|
fuselib: 'libfuse3-dev'
|
|
fuselib2: 'fuse3'
|
|
tags: 'fuse3'
|
|
|
|
pool:
|
|
name: "blobfuse-ubuntu-pool"
|
|
demands:
|
|
- ImageOverride -equals $(AgentName)
|
|
|
|
variables:
|
|
- group: NightlyBlobFuse
|
|
- name: MOUNT_DIR
|
|
value: '$(Pipeline.Workspace)/blob_mnt'
|
|
- name: TEMP_DIR
|
|
value: '$(Pipeline.Workspace)/blobfuse2_tmp'
|
|
- name: BLOBFUSE2_CFG
|
|
value: '$(Pipeline.Workspace)/blobfuse2.yaml'
|
|
- name: BLOBFUSE2_STREAM_CFG
|
|
value: '$(Pipeline.Workspace)/blobfuse2_stream.yaml'
|
|
- name: BLOBFUSE2_ADLS_CFG
|
|
value: '$(Pipeline.Workspace)/blobfuse2.adls.yaml'
|
|
- name: GOPATH
|
|
value: '$(Pipeline.Workspace)/go'
|
|
- name: ROOT_DIR
|
|
value: '$(System.DefaultWorkingDirectory)'
|
|
- name: WORK_DIR
|
|
value: '$(System.DefaultWorkingDirectory)/azure-storage-fuse'
|
|
|
|
steps:
|
|
- checkout: none
|
|
|
|
- script: |
|
|
sudo apt-get update --fix-missing -o Dpkg::Options::="--force-confnew"
|
|
sudo apt-get install make cmake gcc g++ parallel $(fuselib) $(fuselib2) git -y -o Dpkg::Options::="--force-confnew"
|
|
displayName: 'Install dependency'
|
|
|
|
# Clone the repo
|
|
- script: |
|
|
git clone https://github.com/Azure/azure-storage-fuse
|
|
displayName: 'Checkout Code'
|
|
workingDirectory: $(ROOT_DIR)
|
|
|
|
# Checkout the branch
|
|
- script: |
|
|
git checkout `echo $(Build.SourceBranch) | cut -d "/" -f 1,2 --complement`
|
|
displayName: 'Checkout Branch'
|
|
workingDirectory: $(WORK_DIR)
|
|
|
|
# Custom script to install Go-lang
|
|
- task: ShellScript@2
|
|
inputs:
|
|
scriptPath: "$(work_dir)/go_installer.sh"
|
|
args: "$(root_dir)/"
|
|
displayName: "GoTool Custom Setup"
|
|
|
|
# Run the block blob cleanup
|
|
- task: Go@0
|
|
inputs:
|
|
command: 'test'
|
|
arguments: '-timeout 120m -v test/accoutcleanup/accountcleanup_test.go'
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: 'Block Blob cleanup'
|
|
timeoutInMinutes: 120
|
|
continueOnError: true
|
|
env:
|
|
STORAGE_ACCOUNT_NAME: $(NIGHTLY_STO_BLOB_ACC_NAME)
|
|
STORAGE_ACCOUNT_Key: $(NIGHTLY_STO_BLOB_ACC_KEY)
|
|
|
|
# Run the gen2 cleanup
|
|
- task: Go@0
|
|
inputs:
|
|
command: 'test'
|
|
arguments: '-timeout 120m -v test/accoutcleanup/accountcleanup_test.go'
|
|
workingDirectory: $(WORK_DIR)
|
|
displayName: 'Gen2 cleanup'
|
|
timeoutInMinutes: 120
|
|
continueOnError: true
|
|
env:
|
|
STORAGE_ACCOUNT_NAME: $(AZTEST_ADLS_ACC_NAME)
|
|
STORAGE_ACCOUNT_Key: $(AZTEST_ADLS_KEY)
|
|
|