ceph/qa/workunits/cephadm/test_iscsi_setup.sh
Adam King 92fde258bb qa/cephadm: extend iscsi teuth test
This extends the basic cephadm iscsi deployment test
to do some very basic gw and client setup. The iscsi
service setup is likely to be altered with the future
addition of sidecar containers in cephadm, so the
hope is this will provide a bit more coverage

Signed-off-by: Adam King <adking@redhat.com>
2023-11-30 12:55:05 -05:00

100 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
# very basic set up of iscsi gw and client
# to make sure things are working
set -ex
if ! grep -q rhel /etc/*-release; then
echo "The script only supports CentOS."
exit 1
fi
# teuthology tends to put the cephadm binary built for our testing
# branch in /home/ubuntu/cephtest/. If it's there, lets just move it
# so we don't need to reference the full path.
if ! command -v cephadm && ls /home/ubuntu/cephtest/cephadm; then
sudo cp /home/ubuntu/cephtest/cephadm /usr/sbin/
fi
# make sure we haven't already created luns
! sudo ls /dev/disk/by-path | grep iscsi
sudo dnf install jq -y
ISCSI_CONT_ID=$(sudo podman ps -qa --filter='name=iscsi' | head -n 1)
ISCSI_DAEMON_NAME=$(sudo cephadm ls --no-detail | jq -r '.[] | select(.name | startswith("iscsi")) | .name')
ISCSI_DAEMON_ID=$(cut -d '.' -f2- <<< "$ISCSI_DAEMON_NAME")
HOSTNAME=$(sudo cephadm shell -- ceph orch ps --daemon-id "$ISCSI_DAEMON_ID" -f json | jq -r '.[] | .hostname')
NODE_IP=$(sudo cephadm shell -- ceph orch host ls --format json | jq --arg HOSTNAME "$HOSTNAME" -r '.[] | select(.hostname == $HOSTNAME) | .addr')
# The result of this python line is what iscsi will expect for the first gateway name
FQDN=$(python3 -c 'import socket; print(socket.getfqdn())')
# I am running this twice on purpose. I don't know why but in my testing the first time this would
# run it would return a different result then all subsequent runs (and take significantly longer to run).
# The result from the first run would cause gateway creation to fail when the return value is used
# later on. It was likely specific to my env, but it doesn't hurt to run it twice anyway. This
# was the case whether I ran it through cephadm shell or directly on the host machine.
FQDN=$(python3 -c 'import socket; print(socket.getfqdn())')
ISCSI_POOL=$(sudo cephadm shell -- ceph orch ls iscsi --format json | jq -r '.[] | .spec | .pool')
ISCSI_USER="adminadmin"
ISCSI_PASSWORD="adminadminadmin"
# gateway setup
container_gwcli() {
sudo podman exec -it ${ISCSI_CONT_ID} gwcli "$@"
}
container_gwcli /iscsi-targets create iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw
# I've seen this give a nonzero error code with an error message even when
# creating the gateway successfully, so this command is allowed to fail
# If it actually failed to make the gateway, some of the follow up commands will fail
container_gwcli /iscsi-targets/iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/gateways create ${FQDN} ${NODE_IP} || true
container_gwcli /disks create pool=${ISCSI_POOL} image=disk_1 size=2G
container_gwcli /disks create pool=${ISCSI_POOL} image=disk_2 size=2G
container_gwcli /iscsi-targets/iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/hosts create iqn.1994-05.com.redhat:client1
container_gwcli /iscsi-targets/iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/hosts/iqn.1994-05.com.redhat:client1 auth username=${ISCSI_USER} password=${ISCSI_PASSWORD}
container_gwcli /iscsi-targets/iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/hosts/iqn.1994-05.com.redhat:client1 disk add ${ISCSI_POOL}/disk_1
container_gwcli /iscsi-targets/iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/hosts/iqn.1994-05.com.redhat:client1 disk add ${ISCSI_POOL}/disk_2
# set up multipath and some iscsi config options
sudo dnf install -y iscsi-initiator-utils device-mapper-multipath
# this next line is purposely being done without "-a" on the tee command to
# overwrite the current initiatorname.iscsi file if it is there
echo "GenerateName=no" | sudo tee /etc/iscsi/initiatorname.iscsi
echo "InitiatorName=iqn.1994-05.com.redhat:client1" | sudo tee -a /etc/iscsi/initiatorname.iscsi
echo "node.session.auth.authmethod = CHAP" | sudo tee -a /etc/iscsi/iscsid.conf
echo "node.session.auth.username = ${ISCSI_USER}" | sudo tee -a /etc/iscsi/iscsid.conf
echo "node.session.auth.password = ${ISCSI_PASSWORD}" | sudo tee -a /etc/iscsi/iscsid.conf
sudo tee -a /etc/multipath.conf > /dev/null << EOF
devices {
device {
vendor "LIO-ORG"
product "TCMU device"
hardware_handler "1 alua"
path_grouping_policy "failover"
path_selector "queue-length 0"
failback 60
path_checker tur
prio alua
prio_args exclusive_pref_bit
fast_io_fail_tmo 25
no_path_retry queue
}
}
EOF
sudo systemctl restart multipathd
sudo systemctl restart iscsid
# client setup
sudo iscsiadm -m discovery -t st -p ${NODE_IP}
sudo iscsiadm -m node -T iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw -l
sudo iscsiadm -m session --rescan
sleep 5
# make sure we can now see luns
sudo ls /dev/disk/by-path | grep iscsi