From 53e8b80ed36a9193627862427fa224ed38375d3a Mon Sep 17 00:00:00 2001 From: Martin Hiner Date: Mon, 21 Nov 2022 18:38:57 +0100 Subject: Add container engine option to scripts This patch add a way to choose container engine inside tool and test scripts. This is in preparation for Podman introduction but still leaves Docker as default container engine. Signed-off-by: Martin Hiner Change-Id: I395d2bdb0dfb4b325b6ad197c8893c8a0f768324 --- tools/cleanup-containers | 37 ++++++++++++++++++++----------- tools/cleanup-images | 36 ++++++++++++++++++++++-------- tools/diag | 18 ++++++++------- tools/kolla-libvirt-guests-docker.service | 19 ++++++++++++++++ tools/kolla-libvirt-guests-podman.service | 17 ++++++++++++++ tools/kolla-libvirt-guests.service | 19 ---------------- tools/loc | 4 +++- tools/setup-compute-libvirt.yml | 2 +- tools/validate-all-file.py | 21 ++++++++++-------- tools/validate-docker-execute.sh | 7 +++--- 10 files changed, 117 insertions(+), 63 deletions(-) create mode 100644 tools/kolla-libvirt-guests-docker.service create mode 100644 tools/kolla-libvirt-guests-podman.service delete mode 100644 tools/kolla-libvirt-guests.service (limited to 'tools') diff --git a/tools/cleanup-containers b/tools/cleanup-containers index 493bdcac6..549fa553d 100755 --- a/tools/cleanup-containers +++ b/tools/cleanup-containers @@ -1,32 +1,43 @@ #!/usr/bin/env bash -containers_running=$(sudo docker ps --filter "label=kolla_version" --format "{{.Names}}") +# default to docker if not specified +engine="${1:-docker}" +shift 1 + +if ! [[ "$engine" =~ ^(docker|podman)$ ]]; then + echo "Invalid container engine: ${engine}" + exit 1 +fi + +echo "Using container engine: $engine" + +containers_running=$(sudo $engine ps --filter "label=kolla_version" --format "{{.Names}}") QEMU_PIDS=$(pgrep -l qemu | awk '!/qemu-ga/ && !/qemu-img/ {print $1}') if [[ "${containers_running}" =~ "nova_libvirt" ]] && [[ $QEMU_PIDS ]] && [[ $(ps --no-headers wwwup $QEMU_PIDS | grep --invert-match '\-xen\-domid 0') ]]; then echo "Some qemu processes were detected." - echo "Docker will not be able to stop the nova_libvirt container with those running." + echo "Container engine ($engine) will not be able to stop the nova_libvirt container with those running." echo "Please clean them up before rerunning this script." exit 1 -fi +fi if [ -n "$1" ]; then - containers_to_kill=$(sudo docker ps --filter "label=kolla_version" --format "{{.Names}}" -a | grep -E "$1" | awk '{print $1}') - volumes_to_remove=$(sudo docker inspect -f '{{range .Mounts}} {{printf "%s\n" .Name }}{{end}}' ${containers_to_kill} | \ + containers_to_kill=$(sudo $engine ps --filter "label=kolla_version" --format "{{.Names}}" -a | grep -E "$1" | awk '{print $1}') + volumes_to_remove=$(sudo $engine inspect -f '{{range .Mounts}} {{printf "%s\n" .Name }}{{end}}' ${containers_to_kill} | \ egrep -v '(^\s*$)' | sort | uniq) else - containers_to_kill=$(sudo docker ps --filter "label=kolla_version" --format "{{.Names}}" -a) + containers_to_kill=$(sudo $engine ps --filter "label=kolla_version" --format "{{.Names}}" -a) - volumes_to_remove=$(sudo docker inspect -f '{{range .Mounts}} {{printf "%s\n" .Name }}{{end}}' ${containers_to_kill} | \ + volumes_to_remove=$(sudo $engine inspect -f '{{range .Mounts}} {{printf "%s\n" .Name }}{{end}}' ${containers_to_kill} | \ egrep -v '(^\s*$)' | sort | uniq) fi if [[ "${containers_to_kill}" =~ "openvswitch_vswitchd" ]] && [[ "${containers_running}" =~ "neutron_openvswitch_agent" ]]; then echo "Removing ovs bridge..." -(sudo docker exec -u root neutron_openvswitch_agent neutron-ovs-cleanup \ +(sudo $engine exec -u root neutron_openvswitch_agent neutron-ovs-cleanup \ --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/openvswitch_agent.ini \ --ovs_all_ports) > /dev/null -(sudo docker exec -it openvswitch_vswitchd bash -c 'for br in `ovs-vsctl list-br`;do ovs-vsctl --if-exists del-br $br;done') > /dev/null +(sudo $engine exec -it openvswitch_vswitchd bash -c 'for br in `ovs-vsctl list-br`;do ovs-vsctl --if-exists del-br $br;done') > /dev/null fi echo "Stopping containers..." @@ -35,15 +46,15 @@ sudo systemctl stop kolla-${container}-container.service done echo "Removing containers..." -(sudo docker rm -v -f ${containers_to_kill} 2>&1) > /dev/null +(sudo $engine rm -v -f ${containers_to_kill} 2>&1) > /dev/null -echo "Disconnecting containers from docker host network" +echo "Disconnecting containers from $engine host network" for container in ${containers_to_kill}; do -(sudo docker network disconnect -f host $container 2>&1) > /dev/null +(sudo $engine network disconnect -f host $container 2>&1) > /dev/null done echo "Removing volumes..." -(sudo docker volume rm ${volumes_to_remove} 2>&1) > /dev/null +(sudo $engine volume rm ${volumes_to_remove} 2>&1) > /dev/null echo "Removing link of kolla_log volume..." (sudo rm -f /var/log/kolla 2>&1) > /dev/null diff --git a/tools/cleanup-images b/tools/cleanup-images index 87b2084ac..3d08883c7 100755 --- a/tools/cleanup-images +++ b/tools/cleanup-images @@ -1,7 +1,9 @@ #!/usr/bin/env bash +container_engine="docker" + # Move to top level directory -REAL_PATH=$(python -c "import os;print os.path.realpath('$0')") +REAL_PATH=$(python3 -c "import os;print(os.path.realpath('$0'))") cd "$(dirname "$REAL_PATH")/.." function process_cmd { @@ -28,34 +30,50 @@ Options: --help, -h Show this usage information --image, -i Delete selected images --image-version Set Kolla image version + --engine, -e Container engine to be used EOF } -SHORT_OPTS="ahi:" -LONG_OPTS="all,dangling,help,image:,image-version:" +SHORT_OPTS="ahi:e:" +LONG_OPTS="all,dangling,help,image:,image-version:,engine:" ARGS=$(getopt -o "${SHORT_OPTS}" -l "${LONG_OPTS}" --name "$0" -- "$@") || { usage >&2; exit 2; } -eval set -- "$ARGS" + +for arg do + shift + if [ "$arg" = "-e" ] || [ "$arg" = "--engine" ]; then + container_engine="$1" + continue + elif [ "$arg" = "$container_engine" ]; then + continue + fi + eval set -- "$@" "$arg" +done + +# catch empty arguments +if [ "$ARGS" = " --" ]; then + eval set -- "$ARGS" +fi case "$1" in (--all|-a) - KOLLA_IMAGES="$(sudo docker images -a --filter "label=kolla_version" --format "{{.ID}}")" + KOLLA_IMAGES="$(sudo ${container_engine} images -a --filter "label=kolla_version" --format "{{.ID}}")" shift ;; (--dangling) - KOLLA_IMAGES="$(sudo docker images -a --filter dangling=true --format "{{.ID}}")" + KOLLA_IMAGES="$(sudo ${container_engine} images -a --filter dangling=true --format "{{.ID}}")" shift ;; (--image|-i) - KOLLA_IMAGES="$(sudo docker images -a --filter "label=kolla_version" --format "{{.Repository}}\t{{.ID}}" | grep -E "$2" | awk '{print $2}')" + KOLLA_IMAGES="$(sudo ${container_engine} images -a --filter "label=kolla_version" --format "{{.Repository}}\t{{.ID}}" | grep -E "$2" | awk '{print $2}')" shift 2 ;; (--image-version) - KOLLA_IMAGES="$(sudo docker images -a --filter "label=kolla_version=${2}" --format "{{.ID}}")" + KOLLA_IMAGES="$(sudo ${container_engine} images -a --filter "label=kolla_version=${2}" --format "{{.ID}}")" shift 2 ;; @@ -73,5 +91,5 @@ case "$1" in esac -CMD="sudo docker rmi -f $@ $KOLLA_IMAGES" +CMD="sudo ${container_engine} rmi -f $@ -- $KOLLA_IMAGES" process_cmd diff --git a/tools/diag b/tools/diag index 2dc5f7880..157747343 100755 --- a/tools/diag +++ b/tools/diag @@ -1,13 +1,15 @@ #!/usr/bin/env bash +container_engine="${1:-docker}" + echo "##### System Identification #####" egrep -w 'PRETTY_NAME|VERSION_ID' /etc/os-release -echo "##### Docker Version #####" -docker --version +echo "##### ${container_engine^} Version #####" +$container_engine --version -echo "##### Docker Info #####" -docker info +echo "##### ${container_engine^} Info #####" +$container_engine info echo "##### Ansible Version #####" ansible --version @@ -19,11 +21,11 @@ echo "##### Globals.yml file #####" egrep -w 'kolla_base_distro|openstack_release' /etc/kolla/globals.yml cat /etc/kolla/globals.yml | grep ^enable_ -echo "##### Docker Images #####" -docker images -a --filter "label=kolla_version" --filter "dangling=false" --format "{{.ID}} - {{.Repository}}:{{.Tag}} - {{.CreatedSince}}" +echo "##### ${container_engine^} Images #####" +$container_engine images -a --filter "label=kolla_version" --filter "dangling=false" --format "{{.ID}} - {{.Repository}}:{{.Tag}} - {{.CreatedSince}}" -echo "##### All Docker Containers #####" -docker ps -a +echo "##### All ${container_engine^} Containers #####" +$container_engine ps -a echo "##### Ip Link Show #####" ip link show diff --git a/tools/kolla-libvirt-guests-docker.service b/tools/kolla-libvirt-guests-docker.service new file mode 100644 index 000000000..b43910ce5 --- /dev/null +++ b/tools/kolla-libvirt-guests-docker.service @@ -0,0 +1,19 @@ +[Unit] +Description=Manage libvirt guests in kolla safely +After=docker.service +After=systemd-machined.service +After=virt-guest-shutdown.target +Requires=docker.service +Requires=virt-guest-shutdown.target + +[Install] +WantedBy=multi-user.target + +[Service] +Type=oneshot +RemainAfterExit=yes +TimeoutStopSec=610 +ExecStart=-/usr/bin/docker exec nova_libvirt /bin/rm -f /var/lib/libvirt/libvirt-guests +ExecStart=-/usr/bin/docker start nova_compute +ExecStop=/usr/bin/docker stop nova_compute +ExecStop=/usr/bin/docker exec nova_libvirt /bin/sh -x /usr/libexec/libvirt-guests.sh shutdown diff --git a/tools/kolla-libvirt-guests-podman.service b/tools/kolla-libvirt-guests-podman.service new file mode 100644 index 000000000..d692ab1b9 --- /dev/null +++ b/tools/kolla-libvirt-guests-podman.service @@ -0,0 +1,17 @@ +[Unit] +Description=Manage libvirt guests in kolla safely +After=systemd-machined.service +After=virt-guest-shutdown.target +Requires=virt-guest-shutdown.target + +[Install] +WantedBy=multi-user.target + +[Service] +Type=oneshot +RemainAfterExit=yes +TimeoutStopSec=610 +ExecStart=-/usr/bin/podman exec nova_libvirt /bin/rm -f /var/lib/libvirt/libvirt-guests +ExecStart=-/usr/bin/podman start nova_compute +ExecStop=/usr/bin/podman stop nova_compute +ExecStop=/usr/bin/podman exec nova_libvirt /bin/sh -x /usr/libexec/libvirt-guests.sh shutdown diff --git a/tools/kolla-libvirt-guests.service b/tools/kolla-libvirt-guests.service deleted file mode 100644 index b43910ce5..000000000 --- a/tools/kolla-libvirt-guests.service +++ /dev/null @@ -1,19 +0,0 @@ -[Unit] -Description=Manage libvirt guests in kolla safely -After=docker.service -After=systemd-machined.service -After=virt-guest-shutdown.target -Requires=docker.service -Requires=virt-guest-shutdown.target - -[Install] -WantedBy=multi-user.target - -[Service] -Type=oneshot -RemainAfterExit=yes -TimeoutStopSec=610 -ExecStart=-/usr/bin/docker exec nova_libvirt /bin/rm -f /var/lib/libvirt/libvirt-guests -ExecStart=-/usr/bin/docker start nova_compute -ExecStop=/usr/bin/docker stop nova_compute -ExecStop=/usr/bin/docker exec nova_libvirt /bin/sh -x /usr/libexec/libvirt-guests.sh shutdown diff --git a/tools/loc b/tools/loc index 5abecbc97..1cd34ecdf 100755 --- a/tools/loc +++ b/tools/loc @@ -2,6 +2,7 @@ ANSIBLE=`find ansible -type f -exec cat {} \; | wc -l` DOCKER=`find docker -type f -exec cat {} \; | wc -l` +PODMAN=`find podman -type f -exec cat {} \; | wc -l` DOC=`find doc -type f -exec cat {} \; | wc -l` TESTS=`find tests -type f -exec cat {} \; | wc -l` BUILD=`find kolla -type f -exec cat {} \; | wc -l` @@ -12,7 +13,7 @@ ETC=`find etc -type f -exec cat {} \; | wc -l` TOOLS=`find tools -type f -exec cat {} \; | wc -l` VAGRANT=`find contrib/dev/vagrant -type f -exec cat {} \; | wc -l` -CORE=$(($ANSIBLE+$DOCKER+$TESTS+$DOCS+$BUILD)) +CORE=$(($ANSIBLE+$DOCKER+$PODMAN+$TESTS+$DOCS+$BUILD)) SUPP=$(($DEMOS+$HEAT+$SPECS+$ETC+$TOOLS+$VAGRANT)) TOTAL=$(($CORE+$SUPP)) @@ -23,6 +24,7 @@ echo "Demos $DEMOS" echo "Doc $DOC" echo "Etc $ETC" echo "Docker $DOCKER" +echo "Podman $PODMAN" echo "Specs $SPECS" echo "Tests $TESTS" echo "Tools $TOOLS" diff --git a/tools/setup-compute-libvirt.yml b/tools/setup-compute-libvirt.yml index 8c3f46a54..9df033bec 100644 --- a/tools/setup-compute-libvirt.yml +++ b/tools/setup-compute-libvirt.yml @@ -7,7 +7,7 @@ become: true vars: systemd_artifacts: - - kolla-libvirt-guests.service + - "kolla-libvirt-guests-{{ container_engine }}.service" - virt-guest-shutdown.target tasks: - name: Install systemd artifacts diff --git a/tools/validate-all-file.py b/tools/validate-all-file.py index 777c47b09..33d3032bf 100755 --- a/tools/validate-all-file.py +++ b/tools/validate-all-file.py @@ -154,7 +154,7 @@ def check_docker_become(): for x in YAML_INCLUDE_PATTERNS]) excludes = r'|'.join([fnmatch.translate(x) for x in YAML_EXCLUDE_PATTERNS]) - docker_modules = ('kolla_docker', 'kolla_container_facts', 'kolla_toolbox') + ce_modules = ('kolla_docker', 'kolla_container_facts', 'kolla_toolbox') cmd_modules = ('command', 'shell') return_code = 0 roles_path = os.path.join(PROJECT_ROOT, 'ansible', 'roles') @@ -168,24 +168,27 @@ def check_docker_become(): tasks = yaml.safe_load(fp) tasks = tasks or [] for task in tasks: - for module in docker_modules: + for module in ce_modules: if module in task and not task.get('become'): return_code = 1 LOG.error("Use of %s module without become in " "task %s in %s", module, task['name'], fullpath) for module in cmd_modules: - docker_without_become = False + ce_without_become = False if (module in task and not task.get('become')): if (isinstance(task[module], str) and - (task[module]).startswith('docker')): - docker_without_become = True + ((task[module]).startswith('docker') or + (task[module]).startswith('podman'))): + ce_without_become = True if (isinstance(task[module], dict) and - task[module]['cmd'].startswith('docker')): - docker_without_become = True - if docker_without_become: + (task[module]['cmd'].startswith('docker') or + task[module]['cmd'].startswith('podman'))): + ce_without_become = True + if ce_without_become: return_code = 1 - LOG.error("Use of docker in %s module without " + LOG.error("Use of container engine in %s " + "module without " "become in task %s in %s", module, task['name'], fullpath) diff --git a/tools/validate-docker-execute.sh b/tools/validate-docker-execute.sh index 4db81e1e2..cca6589dd 100755 --- a/tools/validate-docker-execute.sh +++ b/tools/validate-docker-execute.sh @@ -1,13 +1,14 @@ #!/usr/bin/env bash # # This script can be used to check user privilege to execute -# docker commands +# docker or podman commands depending on CONTAINER_ENGINE +# environment variable function check_dockerexecute { - sudo docker ps &>/dev/null + sudo $CONTAINER_ENGINE ps &>/dev/null return_val=$? if [ $return_val -ne 0 ]; then - echo "User $USER can't seem to run Docker commands. Verify product documentation to allow user to execute docker commands" 1>&2 + echo "User $USER can't seem to run ${CONTAINER_ENGINE^} commands. Verify product documentation to allow user to execute ${CONTAINER_ENGINE^} commands" 1>&2 exit 1 fi } -- cgit v1.2.3