Browse Source

LXC: tooling box - add boilerplate to containers

Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Markus Heiser 5 years ago
parent
commit
e8cf225046
1 changed files with 80 additions and 29 deletions
  1. 80 29
      utils/lxc.sh

+ 80 - 29
utils/lxc.sh

@@ -27,12 +27,18 @@ TEST_IMAGES=(
     #"$LINUXCONTAINERS_ORG_NAME:fedora/31"     "fedora31"
     #"$LINUXCONTAINERS_ORG_NAME:fedora/31"     "fedora31"
 )
 )
 
 
+ubu1804_boilerplate="
+export DEBIAN_FRONTEND=noninteractive
+apt-get install -y git curl wget
+"
+ubu1904_boilerplate="$ubu1804_boilerplate"
+
 REMOTE_IMAGES=()
 REMOTE_IMAGES=()
 LOCAL_IMAGES=()
 LOCAL_IMAGES=()
 
 
 for ((i=0; i<${#TEST_IMAGES[@]}; i+=2)); do
 for ((i=0; i<${#TEST_IMAGES[@]}; i+=2)); do
     REMOTE_IMAGES=("${REMOTE_IMAGES[@]}" "${TEST_IMAGES[i]}")
     REMOTE_IMAGES=("${REMOTE_IMAGES[@]}" "${TEST_IMAGES[i]}")
-    LOCAL_IMAGES=("${LOCAL_IMAGES[@]}" "${TEST_IMAGES[i+1]}")
+    LOCAL_IMAGES=("${LOCAL_IMAGES[@]}" "${HOST_PREFIX}-${TEST_IMAGES[i+1]}")
 done
 done
 
 
 HOST_USER="${SUDO_USER:-$USER}"
 HOST_USER="${SUDO_USER:-$USER}"
@@ -72,9 +78,26 @@ EOF
     [ ! -z "${1+x}" ] &&  err_msg "$1"
     [ ! -z "${1+x}" ] &&  err_msg "$1"
 }
 }
 
 
+lxd_info() {
+
+    cat <<EOF
+
+LXD is needed, to install run::
+
+  snap install lxd
+  lxc init --auto
+
+EOF
+}
+
 main() {
 main() {
 
 
-    required_commands lxc || exit
+    local exit_val
+
+    if ! required_commands lxc; then
+        lxd_info
+        exit 42
+    fi
 
 
     local _usage="unknown or missing $1 command $2"
     local _usage="unknown or missing $1 command $2"
 
 
@@ -118,8 +141,13 @@ main() {
             sudo_or_exit
             sudo_or_exit
             shift
             shift
             for i in "${LOCAL_IMAGES[@]}"; do
             for i in "${LOCAL_IMAGES[@]}"; do
-                info_msg "lxc exec ${_BBlue}${HOST_PREFIX}-${i}${_creset} -- ${_BGreen}${*}${_creset}"
-                lxc exec "${HOST_PREFIX}-${i}" -- "$@"
+                info_msg "call ${_BBlue}${i}${_creset} -- ${_BGreen}${*}${_creset}"
+                wait_key 3
+                lxc exec "${i}" -- "$@"
+                exit_val=$?
+                if [ $exit_val -ne 0 ]; then
+                    err_msg "$exit_val ${_BBlue}${i}${_creset} -- ${_BGreen}${*}${_creset}"
+                fi
             done
             done
             ;;
             ;;
         *)
         *)
@@ -129,10 +157,18 @@ main() {
 
 
 build_instances() {
 build_instances() {
     rst_title "Build LXC instances"
     rst_title "Build LXC instances"
+
+    rst_title "copy images" section
+    echo
     lxc_copy_images_localy
     lxc_copy_images_localy
-    #lxc image list local: && wait_key
+    lxc image list local: && wait_key
+    echo
+    rst_title "build containers" section
+    echo
     lxc_init_containers
     lxc_init_containers
     lxc_config_containers
     lxc_config_containers
+    lxc_boilerplate_containers
+    echo
     lxc list "$HOST_PREFIX"
     lxc list "$HOST_PREFIX"
 }
 }
 
 
@@ -142,7 +178,8 @@ delete_instances() {
     if ask_yn "Do you really want to delete all images"; then
     if ask_yn "Do you really want to delete all images"; then
         lxc_delete_containers
         lxc_delete_containers
     fi
     fi
-    # lxc list "$HOST_PREFIX"
+    echo
+    lxc list "$HOST_PREFIX"
     # lxc image list local: && wait_key
     # lxc image list local: && wait_key
 }
 }
 
 
@@ -150,14 +187,13 @@ delete_instances() {
 # ------
 # ------
 
 
 lxc_copy_images_localy() {
 lxc_copy_images_localy() {
-    echo
     for ((i=0; i<${#TEST_IMAGES[@]}; i+=2)); do
     for ((i=0; i<${#TEST_IMAGES[@]}; i+=2)); do
         if lxc image info "local:${TEST_IMAGES[i+1]}" &>/dev/null; then
         if lxc image info "local:${TEST_IMAGES[i+1]}" &>/dev/null; then
             info_msg "image ${TEST_IMAGES[i]} already copied --> ${TEST_IMAGES[i+1]}"
             info_msg "image ${TEST_IMAGES[i]} already copied --> ${TEST_IMAGES[i+1]}"
         else
         else
             info_msg "copy image locally ${TEST_IMAGES[i]} --> ${TEST_IMAGES[i+1]}"
             info_msg "copy image locally ${TEST_IMAGES[i]} --> ${TEST_IMAGES[i+1]}"
             lxc image copy "${TEST_IMAGES[i]}" local: \
             lxc image copy "${TEST_IMAGES[i]}" local: \
-                --alias  "${TEST_IMAGES[i+1]}" prefix_stdout
+                --alias  "${TEST_IMAGES[i+1]}" | prefix_stdout
         fi
         fi
     done
     done
 }
 }
@@ -175,53 +211,68 @@ lxc_delete_images_localy() {
 # ---------
 # ---------
 
 
 lxc_cmd() {
 lxc_cmd() {
-    echo
     for i in "${LOCAL_IMAGES[@]}"; do
     for i in "${LOCAL_IMAGES[@]}"; do
-        info_msg "lxc $* $HOST_PREFIX-$i"
-        lxc "$@" "$HOST_PREFIX-$i"
+        info_msg "lxc $* $i"
+        lxc "$@" "$i"
     done
     done
 }
 }
 
 
 lxc_init_containers() {
 lxc_init_containers() {
-    echo
     for i in "${LOCAL_IMAGES[@]}"; do
     for i in "${LOCAL_IMAGES[@]}"; do
-        if lxc info "$HOST_PREFIX-$i" &>/dev/null; then
-            info_msg "conatiner '$HOST_PREFIX-$i' already exists"
+        if lxc info "$i" &>/dev/null; then
+            info_msg "conatiner '$i' already exists"
         else
         else
-            info_msg "create conatiner instance: $HOST_PREFIX-$i"
-            lxc init "local:$i" "$HOST_PREFIX-$i"
+            info_msg "create conatiner instance: $i"
+            lxc init "local:$i" "$i"
         fi
         fi
     done
     done
 }
 }
 
 
 lxc_config_containers() {
 lxc_config_containers() {
-    echo
     for i in "${LOCAL_IMAGES[@]}"; do
     for i in "${LOCAL_IMAGES[@]}"; do
+        info_msg "configure container: ${_BBlue}${i}${_creset}"
 
 
-        info_msg "map uid/gid from host to conatiner: $HOST_PREFIX-$i"
+        info_msg "map uid/gid from host to container"
         # https://lxd.readthedocs.io/en/latest/userns-idmap/#custom-idmaps
         # https://lxd.readthedocs.io/en/latest/userns-idmap/#custom-idmaps
         echo -e -n "uid $HOST_USER_ID 1000\\ngid $HOST_GROUP_ID 1000"\
         echo -e -n "uid $HOST_USER_ID 1000\\ngid $HOST_GROUP_ID 1000"\
-            | lxc config set "$HOST_PREFIX-$i" raw.idmap -
+            | lxc config set "$i" raw.idmap -
 
 
-        info_msg "share ${REPO_ROOT} (repo_share) from HOST into container: $HOST_PREFIX-$i"
+        info_msg "share ${REPO_ROOT} (repo_share) from HOST into container"
         # https://lxd.readthedocs.io/en/latest/instances/#type-disk
         # https://lxd.readthedocs.io/en/latest/instances/#type-disk
-        lxc config device add "$HOST_PREFIX-$i" repo_share disk \
+        lxc config device add "$i" repo_share disk \
             source="${REPO_ROOT}" \
             source="${REPO_ROOT}" \
-            path="/share/$(basename "${REPO_ROOT}")"
+            path="/share/$(basename "${REPO_ROOT}")" &>/dev/null
+        # lxc config show "$i" && wait_key
+    done
+}
 
 
-        # lxc config show "$HOST_PREFIX-$i" && wait_key
+lxc_boilerplate_containers() {
+    local shortname
+    local boilerplate_script
+    for ((i=0; i<${#TEST_IMAGES[@]}; i+=2)); do
+        shortname="${TEST_IMAGES[i+1]}"
+        info_msg "install boilerplate: ${_BBlue}${HOST_PREFIX}-${shortname}${_creset}"
+        lxc start -q "${HOST_PREFIX}-${shortname}" &>/dev/null
+        boilerplate_script="${shortname}_boilerplate"
+        boilerplate_script="${!boilerplate_script}"
+        if [[ ! -z "${boilerplate_script}" ]]; then
+            echo "$boilerplate_script" \
+                | lxc exec "${HOST_PREFIX}-${shortname}" -- bash \
+                | prefix_stdout " ${HOST_PREFIX}-${shortname} | "
+        else
+            warn_msg "no boilerplate for instance '$i'"
+        fi
     done
     done
 }
 }
 
 
 lxc_delete_containers() {
 lxc_delete_containers() {
-    echo
     for i in "${LOCAL_IMAGES[@]}"; do
     for i in "${LOCAL_IMAGES[@]}"; do
-        if lxc info "$HOST_PREFIX-$i" &>/dev/null; then
-            info_msg "stop & delete instance '$HOST_PREFIX-$i'"
-            lxc stop "$HOST_PREFIX-$i" &>/dev/null
-            lxc delete "$HOST_PREFIX-$i" | prefix_stdout
+        if lxc info "$i" &>/dev/null; then
+            info_msg "stop & delete instance '$i'"
+            lxc stop "$i" &>/dev/null
+            lxc delete "$i" | prefix_stdout
         else
         else
-            warn_msg "instance '$HOST_PREFIX-$i' does not exist / can't delete :o"
+            warn_msg "instance '$i' does not exist / can't delete :o"
         fi
         fi
     done
     done
 }
 }