Snapshots instead of multiple installations

Usage de snapshot pour les installations de base.
Réduit la durée des tests en évitant de réinstaller l'application plusieurs fois avec les mêmes paramètres.
This commit is contained in:
Maniack Crudelis 2017-05-10 22:47:23 +02:00
parent e1ed044b00
commit f663f69f27
3 changed files with 132 additions and 51 deletions

View file

@ -929,14 +929,14 @@ then
public_private_arg=$(echo "$line" | grep -o "|private=[[:alnum:]]*" | cut -d "=" -f2) public_private_arg=$(echo "$line" | grep -o "|private=[[:alnum:]]*" | cut -d "=" -f2)
fi fi
if echo "$LIGNE" | grep -q "(PATH)"; then # Path dans le manifest if echo "$LIGNE" | grep -q "(PATH)"; then # Path dans le manifest
MANIFEST_PATH=$(echo "$LIGNE" | cut -d '=' -f1) # Récupère la clé du manifest correspondant au path MANIFEST_PATH=$(echo "$LIGNE" | cut -d '=' -f1) # Récupère la clé du manifest correspondant au path
parse_path=$(echo "$LIGNE" | cut -d '"' -f2) # Lit le path du check_process parse_path=$(echo "$LIGNE" | cut -d '"' -f2) # Lit le path du check_process
if [ -n "$parse_path" ]; then # Si le path n'est pas null, utilise ce path au lieu de la valeur par défaut. if [ -n "$parse_path" ]; then # Si le path n'est pas null, utilise ce path au lieu de la valeur par défaut.
PATH_TEST=$(echo "$LIGNE" | cut -d '"' -f2) PATH_TEST=$(echo "$LIGNE" | cut -d '"' -f2)
fi fi
LIGNE=$(echo "$LIGNE" | cut -d '(' -f1) # Retire l'indicateur de clé de manifest à la fin de la ligne LIGNE=$(echo "$LIGNE" | cut -d '(' -f1) # Retire l'indicateur de clé de manifest à la fin de la ligne
fi fi
# Parse all tests to perform # Parse all tests to perform
# Extract the checks options section from the second partial file # Extract the checks options section from the second partial file
@ -1003,6 +1003,9 @@ fi
# Print the final results of the tests # Print the final results of the tests
TEST_RESULTS TEST_RESULTS
# Destroy all snapshots other than snap0
destroy_temporary_snapshot
done <<< "$(grep "^;; " "$check_process")" done <<< "$(grep "^;; " "$check_process")"
# No check_process file. Try to parse the manifest. # No check_process file. Try to parse the manifest.

View file

@ -7,6 +7,7 @@ echo -e "Loads functions from launcher.sh"
#================================================= #=================================================
arg_ssh="-tt" arg_ssh="-tt"
snapshot_path="/var/lib/lxcsnaps/$lxc_name"
#================================================= #=================================================
@ -14,6 +15,57 @@ is_lxc_running () {
sudo lxc-info --name=$lxc_name | grep --quiet "RUNNING" sudo lxc-info --name=$lxc_name | grep --quiet "RUNNING"
} }
create_temp_backup () {
# Create a temporary snapshot
# Check all the witness files, to verify if them still here
check_witness_files
# Stop the container, before its snapshot
sudo lxc-stop --name $lxc_name
# Create the snapshot.
sudo lxc-snapshot --name $lxc_name >> "$test_result" 2>&1
# Get the last created snapshot and return it
echo "$(sudo lxc-snapshot --name $lxc_name --list | head --lines=1 | cut --delimiter=' ' --fields=1)"
# Restart the container, after the snapshot
LXC_START "true" >&2
}
use_temp_snapshot () {
# Use a temporary snapshot, if it already exists
# $1 = Name of the snapshot to use
local snapshot_name=$1
# Restore this snapshot.
sudo rsync --acls --archive --delete --executability --itemize-changes --xattrs "$snapshot_path/$snapshot_name/rootfs/" "/var/lib/lxc/$lxc_name/rootfs/" > /dev/null 2>> "$test_result"
# Fake the yunohost_result return code of the installation
yunohost_result=0
}
destroy_temporary_snapshot () {
# Destroy all snapshots other than snap0
while true
do
local snapshot=$(sudo lxc-snapshot --name $lxc_name --list | head --lines=1 | cut --delimiter=' ' --fields=1)
if [ -n "$snapshot" ] && [ "$snapshot" != "snap0" ]
then
echo "Destroy temporary snapshot $snapshot."
sudo lxc-snapshot --name $lxc_name --destroy $snapshot
else
break
fi
done
# Clear the variables which contains the snapshot names
unset root_snapshot
unset subpath_snapshot
}
LXC_INIT () { LXC_INIT () {
# Initialize LXC network # Initialize LXC network
@ -119,8 +171,6 @@ LXC_START () {
LXC_STOP () { LXC_STOP () {
# Stop and restore the LXC container # Stop and restore the LXC container
local snapshot_path="/var/lib/lxcsnaps/$lxc_name/snap0"
# Stop the LXC container # Stop the LXC container
if is_lxc_running; then if is_lxc_running; then
echo "Stop the LXC container" | tee --append "$test_result" echo "Stop the LXC container" | tee --append "$test_result"
@ -129,22 +179,22 @@ LXC_STOP () {
# Fix the missing hostname in the hosts file # Fix the missing hostname in the hosts file
# If the hostname is missing in /etc/hosts inside the snapshot # If the hostname is missing in /etc/hosts inside the snapshot
if ! sudo grep --quiet "$lxc_name" "$snapshot_path/rootfs/etc/hosts" if ! sudo grep --quiet "$lxc_name" "$snapshot_path/snap0/rootfs/etc/hosts"
then then
# If the hostname was replaced by snap0, fix it # If the hostname was replaced by snap0, fix it
if sudo grep --quiet "snap0" "$snapshot_path/rootfs/etc/hosts" if sudo grep --quiet "snap0" "$snapshot_path/snap0/rootfs/etc/hosts"
then then
# Replace snap0 by the real hostname # Replace snap0 by the real hostname
sudo sed --in-place "s/snap0/$lxc_name/" "$snapshot_path/rootfs/etc/hosts" sudo sed --in-place "s/snap0/$lxc_name/" "$snapshot_path/snap0/rootfs/etc/hosts"
else else
# Otherwise, simply add the hostname # Otherwise, simply add the hostname
echo "127.0.0.1 $lxc_name" | sudo tee --append "$snapshot_path/rootfs/etc/hosts" > /dev/null echo "127.0.0.1 $lxc_name" | sudo tee --append "$snapshot_path/snap0/rootfs/etc/hosts" > /dev/null
fi fi
fi fi
# Restore the snapshot. # Restore the snapshot.
echo "Restore the previous snapshot." | tee --append "$test_result" echo "Restore the previous snapshot." | tee --append "$test_result"
sudo rsync --acls --archive --delete --executability --itemize-changes --xattrs "$snapshot_path/rootfs/" "/var/lib/lxc/$lxc_name/rootfs/" > /dev/null 2>> "$test_result" sudo rsync --acls --archive --delete --executability --itemize-changes --xattrs "$snapshot_path/snap0/rootfs/" "/var/lib/lxc/$lxc_name/rootfs/" > /dev/null 2>> "$test_result"
} }
LXC_TURNOFF () { LXC_TURNOFF () {
@ -169,6 +219,9 @@ LXC_TURNOFF () {
then then
sudo ifdown --force $lxc_bridge | tee --append "$test_result" 2>&1 sudo ifdown --force $lxc_bridge | tee --append "$test_result" 2>&1
fi fi
# Destroy all snapshots other than snap0
destroy_temporary_snapshot
} }
LXC_CONNECT_INFO () { LXC_CONNECT_INFO () {

View file

@ -46,6 +46,47 @@ SETUP_APP () {
# Retrieve the app id in the log. To manage the app after # Retrieve the app id in the log. To manage the app after
ynh_app_id=$(sudo tac "$yunohost_log" | grep --only-matching --max-count=1 "YNH_APP_INSTANCE_NAME=[^ ]*" | cut --delimiter='=' --fields=2) ynh_app_id=$(sudo tac "$yunohost_log" | grep --only-matching --max-count=1 "YNH_APP_INSTANCE_NAME=[^ ]*" | cut --delimiter='=' --fields=2)
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
}
STANDARD_SETUP_APP () {
# Try to find an existing snapshot for this install, or make an install
# If it's a root install
if [ "$check_path" = "/" ]
then
# Check if a snapshot already exist for this install
if [ -z "$root_snapshot" ]
then
# Make an installation
SETUP_APP
# Then create a snapshot
ECHO_FORMAT "Create a snapshot for root installation.\n" "white" clog
root_snapshot=$(create_temp_backup)
else
# Or uses an existing snapshot
ECHO_FORMAT "Uses an existing snapshot for root installation.\n" "white" clog
use_temp_snapshot $root_snapshot
fi
# In case of sub path install, use another snapshot
else
# Check if a snapshot already exist for this install
if [ -z "$subpath_snapshot" ]
then
# Make an installation
SETUP_APP
# Then create a snapshot
ECHO_FORMAT "Create a snapshot for sub path installation.\n" "white" clog
subpath_snapshot=$(create_temp_backup)
else
# Or uses an existing snapshot
ECHO_FORMAT "Uses an existing snapshot for sub path installation.\n" "white" clog
use_temp_snapshot $subpath_snapshot
fi
fi
} }
REMOVE_APP () { REMOVE_APP () {
@ -96,7 +137,7 @@ CHECK_URL () {
# Inform /etc/hosts with the IP of LXC to resolve the domain. # Inform /etc/hosts with the IP of LXC to resolve the domain.
# This is set only here and not before to prevent to help the app's scripts # This is set only here and not before to prevent to help the app's scripts
echo -e "$ip_range.2 $check_domain #package_check" | sudo tee --append /etc/hosts > /dev/null echo -e "$ip_range.2 $main_domain #package_check\n$ip_range.2 $sub_domain #package_check" | sudo tee --append /etc/hosts > /dev/null
# Try to resolv the domain during 10 seconds maximum. # Try to resolv the domain during 10 seconds maximum.
local i=0 local i=0
@ -378,10 +419,7 @@ CHECK_SETUP () {
replace_manifest_key "public" "$public_public_arg" replace_manifest_key "public" "$public_public_arg"
# Install the application in a LXC container # Install the application in a LXC container
SETUP_APP STANDARD_SETUP_APP
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
# Try to access the app by its url # Try to access the app by its url
CHECK_URL CHECK_URL
@ -457,10 +495,7 @@ CHECK_UPGRADE () {
# Install the application in a LXC container # Install the application in a LXC container
ECHO_FORMAT "\nPreliminary install...\n" "white" "bold" clog ECHO_FORMAT "\nPreliminary install...\n" "white" "bold" clog
SETUP_APP STANDARD_SETUP_APP
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
# Check if the install had work # Check if the install had work
if [ $yunohost_result -ne 0 ] if [ $yunohost_result -ne 0 ]
@ -580,9 +615,6 @@ CHECK_PUBLIC_PRIVATE () {
# Install the application in a LXC container # Install the application in a LXC container
SETUP_APP SETUP_APP
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
# Try to access the app by its url # Try to access the app by its url
CHECK_URL CHECK_URL
@ -681,9 +713,6 @@ CHECK_MULTI_INSTANCE () {
# Install the application in a LXC container # Install the application in a LXC container
SETUP_APP SETUP_APP
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
# Store the result in the correct variable # Store the result in the correct variable
# First installation # First installation
if [ $i -eq 1 ] if [ $i -eq 1 ]
@ -822,9 +851,6 @@ CHECK_COMMON_ERROR () {
# Install the application in a LXC container # Install the application in a LXC container
SETUP_APP SETUP_APP
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
# Try to access the app by its url # Try to access the app by its url
CHECK_URL CHECK_URL
@ -905,10 +931,7 @@ CHECK_BACKUP_RESTORE () {
fi fi
# Install the application in a LXC container # Install the application in a LXC container
SETUP_APP STANDARD_SETUP_APP
# Analyse the log to extract "warning" and "error" lines
LOG_EXTRACTOR
# BACKUP # BACKUP
# Made a backup if the installation succeed # Made a backup if the installation succeed
@ -1108,22 +1131,29 @@ CHECK_CHANGE_URL () {
# Install the application in a LXC container # Install the application in a LXC container
ECHO_FORMAT "\nPreliminary install...\n" "white" "bold" clog ECHO_FORMAT "\nPreliminary install...\n" "white" "bold" clog
SETUP_APP STANDARD_SETUP_APP
# Analyse the log to extract "warning" and "error" lines # Wait for next release...
LOG_EXTRACTOR LXC_START "yunohost app --help | grep --quiet change-url"
if [ $? -ne 0 ]
then
ECHO_FORMAT "change-url is only available on testing or unstable...\n" "red" "bold"
RESULT_change_url=0
return 0
fi
# ...
# Check if the install had work # Check if the install had work
if [ $yunohost_result -ne 0 ] if [ $yunohost_result -ne 0 ]
then then
ECHO_FORMAT "\nInstallation failed...\n" "red" "bold" ECHO_FORMAT "Installation failed...\n" "red" "bold"
else else
ECHO_FORMAT "\nChange the url from $sub_domain$check_path to $new_domain$new_path...\n" "white" "bold" clog ECHO_FORMAT "Change the url from $sub_domain$check_path to $new_domain$new_path...\n" "white" "bold" clog
# Change the url # Change the url
LXC_START "sudo yunohost --debug app change-url $ynh_app_id -d \"$new_domain\" -p \"$new_path\"" LXC_START "sudo yunohost --debug app change-url $ynh_app_id -d \"$new_domain\" -p \"$new_path\""
# yunohost_result gets the return code of the upgrade # yunohost_result gets the return code of the change-url script
yunohost_result=$? yunohost_result=$?
# Print the result of the change_url command # Print the result of the change_url command
@ -1207,7 +1237,7 @@ TEST_LAUNCHER () {
set_witness_files () { set_witness_files () {
# Create files to check if the remove script does not remove them accidentally # Create files to check if the remove script does not remove them accidentally
echo -n "Create witness files" | tee --append "$test_result" echo "Create witness files..." | tee --append "$test_result"
lxc_dir="/var/lib/lxc/$lxc_name/rootfs" lxc_dir="/var/lib/lxc/$lxc_name/rootfs"
@ -1245,13 +1275,8 @@ set_witness_files () {
create_witness_file "/etc/systemd/system/witnessfile.service" file create_witness_file "/etc/systemd/system/witnessfile.service" file
# Database # Database
for timeout in `seq 1 10` sudo lxc-attach --name=$lxc_name -- mysqladmin --user=root --password=$(sudo cat "$lxc_dir/etc/yunohost/mysql") --wait status > /dev/null 2>&1
do sudo lxc-attach --name=$lxc_name -- mysql --user=root --password=$(sudo cat "$lxc_dir/etc/yunohost/mysql") --wait --execute="CREATE DATABASE witnessdb" > /dev/null 2>&1
sudo lxc-attach --name=$lxc_name -- mysql --user=root --password=$(sudo cat "$lxc_dir/etc/yunohost/mysql") --wait --execute="CREATE DATABASE witnessdb" > /dev/null 2>&1 && break
echo -n "."
sleep 1
done
echo ""
} }
check_witness_files () { check_witness_files () {