#!/bin/bash completion for ocicli

if [ -r /usr/share/openstack-cluster-installer/variables.json ] ; then
	VARIABLE_FILE=/usr/share/openstack-cluster-installer/variables.json
elif [ -r /etc/ocicli/variables.json ] ; then
	VARIABLE_FILE=/etc/ocicli/variables.json
fi

_ocicli() {
	local cur prev cmd_name
	COMPREPLY=()
	cur="${COMP_WORDS[COMP_CWORD]}"
	prev="${COMP_WORDS[COMP_CWORD-1]}"
	cmd_name="${COMP_WORDS[1]}"

	opts="password-list password-show password-set machine-list machine-console machine-save-ipmi-pass machine-forget-ipmi-pass machine-wipe machine-show machine-ipmi-adopt machine-blk profile-list machine-guessed-profile machine-check-megacli-applied machine-megacli-apply machine-megacli-reset-raid machine-guess-racking machine-auto-add machine-auto-rack machine-to-dns machine-out-of-dns machine-out-of-monitoring machine-to-monitoring machine-gen-root-pass machine-forget-root-pass machine-report-counter-reset machine-set machine-add machine-remove machine-destroy machine-replace machine-reboot-on-hdd machine-reboot-on-live machine-ipmi-reboot-on-hdd machine-ipmi-reboot-on-live machine-hpe-ilo-license-install machine-activate-ipmi-over-lan machine-ipmi-cmd machine-ipmi-assign-ip machine-install-os machine-display-install-cmd machine-install-log machine-set-ipmi machine-apply-ipmi machine-ip-add machine-ip-list machine-ip-remove machine-renew-ipmi-password ipmi-assign-check check-all-ipmi location-list location-create location-delete network-create network-list network-delete network-add network-remove network-set cluster-list cluster-create cluster-delete cluster-set cluster-show cluster-show-networks cluster-show-machines cluster-show-ips cluster-install cluster-reset cluster-rolecounts-list cluster-rolecounts-set swift-region-list swift-region-create swift-region-delete swift-calculate-ring swift-publish-ring role-list role-create role-delete filebeat-output-host-list filebeat-output-host-create filebeat-output-host-delete"
	iface_names="none eth0 eth1 eth2 eth3 eth4 eth5 10m1 10m2 10m3 10m4 100m1 100m2 100m3 100m4 1g1 1g2 1g3 1g4 10g1 10g2 10g3 10g4"

	case "${cmd_name}" in
	password-list)
		if [ "${prev}" = "-f" ] || [ "${prev}" = "--filter" ] ; then
			COMPREPLY=( $(compgen -W "id cluster service passtype az" -- ${cur}) )
		else
			COMPREPLY=( $(compgen -W "--filter -f" -- ${cur}) )
		fi
		return 0
	;;
	password-show|password-set)
		case ${COMP_CWORD} in
		2)
			local id_list=$(ocicli -csv password-list | q -d, -H "SELECT id FROM -" | tr \\n " " | sort --version-sort)
			COMPREPLY=( $(compgen -W "${id_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	check-all-ipmi)
		case ${COMP_CWORD} in
		2)
			COMPREPLY=( $(compgen -W "--filter -f" -- ${cur}) )
			return 0
		;;
		3)
			COMPREPLY=( $(compgen -W "memory dhcp_ip ipaddr serial system_manufacturer product_name hostname installed puppet_status status role cluster_name ipmi_addr ipmi_username ipmi_password ipmi_default_gw loc_dc loc_row loc_rack loc_u_start loc_u_end bios_version dell_lifecycle_version ipmi_firmware_version ipmi_detected_ip use_ceph_if_available dest_blk install_on_raid raid_type raid_dev0 raid_dev1 serial_console_dev use_gpu gpu_name gpu_vendor_id gpu_product_id gpu_device_type vfio_ids nested_virt cpu_mode cpu_model hw_machine_type force_dhcp_agent swift_store_account swift_store_container swift_store_object ceph_osd_initial_setup force_no_bgp2host use_oci_sort_dev cpu_vendor cpu_model_name cpu_mhz cpu_threads cpu_core_per_socket cpu_sockets boot_uefi secure_boot" -- ${cur}) )
			return 0
		;;
		esac
	;;
	machine-list)
		if [ "${prev}" = "-o" ] || [ "${prev}" = "--order" ] ; then
			COMPREPLY=( $(compgen -W "hostname racking zoning" -- ${cur}) )
		elif [ "${prev}" = "-f" ] || [ "${prev}" = "--filter" ] ; then
			COMPREPLY=( $(compgen -W "memory dhcp_ip ipaddr serial system_manufacturer product_name hostname installed puppet_status status role cluster_name ipmi_addr ipmi_username ipmi_password ipmi_default_gw loc_dc loc_row loc_rack loc_u_start loc_u_end bios_version dell_lifecycle_version ipmi_firmware_version ipmi_detected_ip use_ceph_if_available dest_blk install_on_raid raid_type raid_dev0 raid_dev1 serial_console_dev use_gpu gpu_name gpu_vendor_id gpu_product_id gpu_device_type vfio_ids nested_virt cpu_mode cpu_model cpu_model_extra_flags hw_machine_type force_dhcp_agent swift_store_account swift_store_container swift_store_object ceph_osd_initial_setup force_no_bgp2host use_oci_sort_dev cpu_vendor cpu_model_name cpu_mhz cpu_threads cpu_core_per_socket cpu_sockets boot_uefi secure_boot" -- ${cur}) )
		else
			COMPREPLY=( $(compgen -W "--all --order -o --versions -v --status -s --zones -z --racking -r --network -n --ethernet -e --hardware -h --blockdevs -b --ipmi -i --links -l --filter -f" -- ${cur}) )
		fi
		return 0
	;;
	machine-replace|machine-show|machine-ipmi-adopt|machine-blk|machine-apply-ipmi|machine-destroy|machine-reboot-on-hdd|machine-reboot-on-live|machine-ipmi-reboot-on-hdd|machine-ipmi-reboot-on-live|machine-hpe-ilo-license-install|machine-activate-ipmi-over-lan|machine-ipmi-cmd|machine-set-ipmi|machine-guessed-profile|machine-check-megacli-applied|machine-guess-racking|machine-auto-add|machine-auto-rack|machine-to-monitoring|machine-to-dns|machine-out-of-dns|machine-to-monitoring|machine-out-of-monitoring|machine-gen-root-pass|machine-forget-root-pass|machine-megacli-reset-raid|machine-report-counter-reset|machine-renew-ipmi-password)
		local serial_list=$(ocicli -csv machine-list | q -d, -H "SELECT serial FROM -" | cut -d, -f1 | tr \\n " ")
		local hostname_list=$(ocicli -csv machine-list | q -d, -H "SELECT hostname FROM - WHERE hostname!='-'" | cut -d, -f1 | tr \\n " ")
		COMPREPLY=( $(compgen -W "${serial_list} ${hostname_list}" -- ${cur}) )
		return 0
	;;
	machine-ipmi-assign-ip)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list | q -d, -H "SELECT serial FROM -" | cut -d, -f1 | tr \\n " ")
			local hostname_list=$(ocicli -csv machine-list | q -d, -H "SELECT hostname FROM - WHERE hostname!='-'" | cut -d, -f1 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list} ${hostname_list}" -- ${cur}) )
			return 0
		;;
		3)
			local net_list=$(ocicli -csv network-list | q -d, -H "SELECT name FROM - WHERE role='ipmi'" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${net_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	machine-check-megacli-applied|machine-megacli-apply)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list | q -d, -H "SELECT serial FROM -" | cut -d, -f1 | tr \\n " ")
			local hostname_list=$(ocicli -csv machine-list | q -d, -H "SELECT hostname FROM - WHERE hostname!='-'" | cut -d, -f1 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list} ${hostname_list}" -- ${cur}) )
			return 0
		;;
		3)
			local profile_list=$(ocicli -csv profile-list | q -d, -H "SELECT profile_name FROM -" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${profile_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	machine-install-os|machine-display-install-cmd)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT serial FROM - WHERE cluster NOT LIKE '-' AND status='live'" | tr \\n " ")
			local hostname_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT hostname FROM - WHERE hostname!='-' AND cluster NOT LIKE '-' AND status='live'" | cut -d, -f1 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list} ${hostname_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	machine-install-log)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT serial FROM - WHERE cluster NOT LIKE '-' AND (status='installing' OR (status='installed' AND puppet='running'))" | tr \\n " ")
			local hostname_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT hostname FROM - WHERE cluster NOT LIKE '-' AND (status='installing' OR (status='installed' AND puppet='running'))" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list} ${hostname_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	machine-console|machine-save-ipmi-pass|machine-forget-ipmi-pass|machine-wipe)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list | q -d, -H "SELECT serial FROM -" | tr \\n " ")
			local hostname_list=$(ocicli -csv machine-list | q -d, -H "SELECT hostname FROM -" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list} ${hostname_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	machine-remove)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT serial FROM - WHERE cluster NOT LIKE '-'" | tr \\n " ")
			local hostname_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT hostname FROM - WHERE cluster NOT LIKE '-'" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list} ${hostname_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	machine-set)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list | q -d, -H "SELECT serial FROM -" | tr \\n " ")
			local hostname_list=$(ocicli -csv machine-list | q -d, -H "SELECT hostname FROM -" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list} ${hostname_list}" -- ${cur}) )
			return 0
		;;
		3|5|7|9|11|13|15|17|19|21|23|25|27|29|31|33|35|37|39|41|43|45|47|49|51|53|55|57|59|61|63|65|67|69|70|72|74|76|78)
			ALL_OPTIONS=""
			if [ -r "${VARIABLE_FILE}" ] ; then
				for OPTION in $(cat /etc/ocicli/variables.json | jq -r '.machines | keys[]' | tr '\n' ' ') ; do
					ALL_OPTIONS="${ALL_OPTIONS} --"$(echo ${OPTION} | sed 's/_/-/g')
				done
			fi
			COMPREPLY=( $(compgen -W "--use_ceph_if_available --ceph-use-if-available --ceph-az --dest-blk --install-on-raid --raid-type --raid-dev0 --raid-dev1 --raid-dev2 --raid-dev3 --raid-dev4 --serial-console-device --dc --row --rack --ustart --uend --use-gpu --gpu-name --gpu-vendor-id --gpu-produc-id --gpu-device-type --vfio-ids --nested-virt --cpu-mode --cpu-model --cpu-model-extra-flags --hw-machine-type --nova-skip-cpu-compare-on-dest --nova-skip-cpu-compare-at-startup --nova-skip-hypervisor-version-check-on-lm--force-dhcp-agent --swift-store-account --swift-store-container --swift-store-object --hostname --notes --ipmi-use --ipmi-call-chassis-bootdev --ipmi-username --ipmi-password --ipmi-addr --ipmi-port --ipmi-netmask --ipmi-default-gw --ipmi-vlan --ceph-osd-initial-setup --force-no-bgp2host --force-frr --force-frr-nic1 --force-frr-nic2 --force-frr-vlan ${ALL_OPTIONS}" -- ${cur}) )
			return 0
		;;
		4|6|8|10|12|14|16|18|20|22|24|26|28|30|32|34|36|38|42|44|46|48|50|52|54|56|58|60|62|64|66|68|70|71|73|75|77|79)
			case "${prev}" in
                        "--ceph-use-if-available"|"--use_ceph_if_available"|"--install-on-raid"|"--use-gpu"|"--swift-store-account"|"--swift-store-container"|"--swift-store-object"|"--force-dhcp-agent"|"--ipmi-call-chassis-bootdev"|"--ipmi-use"|"--force-no-bgp2host"|"--force-frr"|"--ceph-osd-initial-setup")
				COMPREPLY=( $(compgen -W "yes no" -- ${cur}) )
				return 0
			;;
                        "--nested-virt"|"--nova-skip-cpu-compare-on-dest"|"--nova-skip-cpu-compare-at-startup"|"--nova-skip-hypervisor-version-check-on-lm")
				COMPREPLY=( $(compgen -W "yes no cluster_value" -- ${cur}) )
				return 0
			;;
			"--dest-blk")
				local machine_name=${COMP_WORDS[2]}
				local blk_list=$(ocicli -csv machine-blk $machine_name | q -d, -H "SELECT name FROM -" | tr \\n " ")
				COMPREPLY=( $(compgen -W "$blk_list" -- ${cur}) )
				return 0
			;;
			"--ceph-az")
				COMPREPLY=( $(compgen -W "0 1 2 3 4 5 6 7 8 9" -- ${cur}) )
				return 0
			;;
			"--raid-type")
				COMPREPLY=( $(compgen -W "0 1 10" -- ${cur}) )
				return 0
			;;
			"--raid-dev0"|"--raid-dev1"|"--raid-dev2"|"--raid-dev3")
				local machine_name=${COMP_WORDS[2]}
				local blk_list=$(ocicli -csv machine-blk $machine_name | q -d, -H "SELECT name FROM -" | tr \\n " ")
				COMPREPLY=( $(compgen -W "$blk_list" -- ${cur}) )
				return 0
			;;
			"--serial-console-device")
				COMPREPLY=( $(compgen -W "ttyS0 ttyS1 ttyS2 ttyS4 none" -- ${cur}) )
				return 0
			;;
			"--cpu-mode")
				COMPREPLY=( $(compgen -W "cluster_value host-model host-passthrough custom" -- ${cur}) )
				return 0
			;;
			"--cpu-model")
				COMPREPLY=( $(compgen -W "cluster_value 486 486-v1 Broadwell Broadwell-IBRS Broadwell-noTSX Broadwell-noTSX-IBRS Broadwell-v1 Broadwell-v2 Broadwell-v3 Broadwell-v4 Cascadelake-Server Cascadelake-Server-noTSX Cascadelake-Server-v1 Cascadelake-Server-v2 Cascadelake-Server-v3 Cascadelake-Server-v4 Cascadelake-Server-v5 Conroe Conroe-v1 Cooperlake Cooperlake-v1 Cooperlake-v2 Denverton Denverton-v1 Denverton-v2 Denverton-v3 Dhyana Dhyana-v1 Dhyana-v2 EPYC EPYC-Genoa EPYC-Genoa-v1 EPYC-IBPB EPYC-Milan EPYC-Milan-v1 EPYC-Milan-v2 EPYC-Rome EPYC-Rome-v1 EPYC-Rome-v2 EPYC-Rome-v3 EPYC-Rome-v4 EPYC-v1 EPYC-v2 EPYC-v3 EPYC-v4 GraniteRapids GraniteRapids-v1 Haswell Haswell-IBRS Haswell-noTSX Haswell-noTSX-IBRS Haswell-v1 Haswell-v2 Haswell-v3 Haswell-v4 Icelake-Server Icelake-Server-noTSX Icelake-Server-v1 Icelake-Server-v2 Icelake-Server-v3 Icelake-Server-v4 Icelake-Server-v5 Icelake-Server-v6 IvyBridge IvyBridge-IBRS IvyBridge-v1 IvyBridge-v2 KnightsMill KnightsMill-v1 Nehalem Nehalem-IBRS Nehalem-v1 Nehalem-v2 Opteron_G1 Opteron_G1-v1 Opteron_G2 Opteron_G2-v1 Opteron_G3 Opteron_G3-v1 Opteron_G4 Opteron_G4-v1 Opteron_G5 Opteron_G5-v1 Penryn Penryn-v1 SandyBridge SandyBridge-IBRS SandyBridge-v1 SandyBridge-v2 SapphireRapids SapphireRapids-v1 SapphireRapids-v2 Skylake-Client Skylake-Client-IBRS Skylake-Client-noTSX-IBRS Skylake-Client-v1 Skylake-Client-v2 Skylake-Client-v3 Skylake-Client-v4 Skylake-Server Skylake-Server-IBRS Skylake-Server-noTSX-IBRS Skylake-Server-v1 Skylake-Server-v2 Skylake-Server-v3 Skylake-Server-v4 Skylake-Server-v5 Snowridge Snowridge-v1 Snowridge-v2 Snowridge-v3 Snowridge-v4 Westmere Westmere-IBRS Westmere-v1 Westmere-v2 athlon athlon-v1 core2duo core2duo-v1 coreduo coreduo-v1 kvm32 kvm32-v1 kvm64 kvm64-v1 n270 n270-v1 pentium pentium-v1 pentium2 pentium2-v1 pentium3 pentium3-v1 phenom phenom-v1 qemu32 qemu32-v1 qemu64 qemu64-v1 base host max" -- ${cur}) )
				return 0
			;;
			"--hw-machine-type")
				COMPREPLY=( $(compgen -W "cluster_value microvm pc pc-i440fx-7.2 pc-i440fx-7.1 pc-i440fx-7.0 pc-i440fx-6.2 pc-i440fx-6.1 pc-i440fx-6.0 pc-i440fx-5.2 pc-i440fx-5.1 pc-i440fx-5.0 pc-i440fx-4.2 pc-i440fx-4.1 pc-i440fx-4.0 pc-i440fx-3.1 pc-i440fx-3.0 pc-i440fx-2.9 pc-i440fx-2.8 pc-i440fx-2.7 pc-i440fx-2.6 pc-i440fx-2.5 pc-i440fx-2.4 pc-i440fx-2.3 pc-i440fx-2.2 pc-i440fx-2.12 pc-i440fx-2.11 pc-i440fx-2.10 pc-i440fx-2.1 pc-i440fx-2.0 pc-i440fx-1.7 pc-i440fx-1.6 pc-i440fx-1.5 pc-i440fx-1.4 q35 pc-q35-7.2 pc-q35-7.1 pc-q35-7.0 pc-q35-6.2 pc-q35-6.1 pc-q35-6.0 pc-q35-5.2 pc-q35-5.1 pc-q35-5.0 pc-q35-4.2 pc-q35-4.1 pc-q35-4.0.1 pc-q35-4.0 pc-q35-3.1 pc-q35-3.0 pc-q35-2.9 pc-q35-2.8 pc-q35-2.7 pc-q35-2.6 pc-q35-2.5 pc-q35-2.4 pc-q35-2.12 pc-q35-2.11 pc-q35-2.10 isapc" -- ${cur}) )
				return 0
			;;
			"--gpu-device-type")
				COMPREPLY=( $(compgen -W "type-PCI type-PF type-VF" -- ${cur}) )
				return 0
			;;
			*)
				return 0
			;;
			esac
		;;
		*)
			return 0
		;;
		esac
	;;
	machine-add)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT serial FROM - WHERE cluster='null' OR cluster='-'" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list} --fixed-ip" -- ${cur}) )
			return 0
		;;
		3)
			if [ ${COMP_WORDS[2]} = "--fixed-ip" ] ; then
				return 0
			fi
			local cluster_list=$(ocicli -csv cluster-list | grep -v "id,name,domain" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
			return 0
		;;
		4)
			if [ ${COMP_WORDS[2]} = "--fixed-ip" ] ; then
				local serial_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT serial FROM - WHERE cluster='null' OR cluster='-'" | tr \\n " ")
				COMPREPLY=( $(compgen -W "${serial_list}" -- ${cur}) )
				return 0
			else
				local role_list=$(ocicli -csv role-list | grep -v "id,name" | cut -d, -f2 | tr \\n " ")
				COMPREPLY=( $(compgen -W "${role_list}" -- ${cur}) )
				return 0
			fi
		;;
		5)
			if [ ${COMP_WORDS[2]} = "--fixed-ip" ] ; then
				local cluster_list=$(ocicli -csv cluster-list | grep -v "id,name,domain" | cut -d, -f2 | tr \\n " ")
				COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
				return 0
			else
				local location_list=$(ocicli -csv location-list | grep -v "id,name,swiftregion" | cut -d, -f2 | tr \\n " ")
				COMPREPLY=( $(compgen -W "${location_list}" -- ${cur}) )
				return 0
			fi
		;;
		6)
			if [ ${COMP_WORDS[2]} = "--fixed-ip" ] ; then
				local role_list=$(ocicli -csv role-list | grep -v "id,name" | cut -d, -f2 | tr \\n " ")
				COMPREPLY=( $(compgen -W "${role_list}" -- ${cur}) )
				return 0
			else
				return 0
			fi
		;;
		7)
			if [ ${COMP_WORDS[2]} = "--fixed-ip" ] ; then
				local location_list=$(ocicli -csv location-list | grep -v "id,name,swiftregion" | cut -d, -f2 | tr \\n " ")
				COMPREPLY=( $(compgen -W "${location_list}" -- ${cur}) )
				return 0
			else
				return 0
			fi
		;;
		*)
			return 0
		;;
		esac
	;;
	machine-ip-remove)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list | q -d, -H "SELECT serial FROM -" | tr \\n " ")
			local hostname_list=$(ocicli -csv machine-list | q -d, -H "SELECT hostname FROM -" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list} ${hostname_list}" -- ${cur}) )
			return 0
		;;
		3)
			local ip_list=$(ocicli -csv machine-ip-list ${prev} | q -d, -H "SELECT ipaddr FROM -" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${ip_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	machine-ip-add)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list | q -d, -H "SELECT serial FROM -" | tr \\n " ")
			local hostname_list=$(ocicli -csv machine-list | q -d, -H "SELECT hostname FROM -" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list} ${hostname_list}" -- ${cur}) )
			return 0
		;;
		3)
			local network_list=$(ocicli -csv network-list | grep -v "name,ip,cidr" | cut -d, -f1 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${network_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	machine-ip-list)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT serial FROM - WHERE cluster='null' OR cluster='-'" | tr \\n " ")
			local hostname_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT hostname FROM - WHERE cluster='null' OR cluster='-'" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	cluster-set)
		case ${COMP_CWORD} in
		2)
			local cluster_list=$(ocicli -csv cluster-list | grep -v "id,name,domain" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
			return 0
		;;
		3|5|7|9|11|13|15|17|19|21|23|25|27|29|31|33|35|37|39|41|43|45|47|49|51|53|55|57|59|61|63|65|67|69|71|73|75|77|79|81|83|85|87)
                        ALL_OPTIONS=""
			if [ -r ${VARIABLE_FILE} ] ; then
				for OPTION in $(cat /etc/ocicli/variables.json | jq -r '.clusters | keys[]' | tr '\n' ' ') ; do
					ALL_OPTIONS="${ALL_OPTIONS} --"$(echo ${OPTION} | sed 's/_/-/g')
				done
			fi
			COMPREPLY=( $(compgen -W "--time-server-host --nameserver-v4-primary --nameserver-v4-secondary --nameserver-v6-primary --nameserver-v6-secondary --region-name --vip-hostname --swift-part-power --swift-proxy-hostname --swift-encryption-key-id --swift-disable-encryption --swift-object-replicator-concurrency --swift-rsync-connection-limit --swift-public-cloud-middlewares --swift-ac-on-proxy --amp-secgroup-list --amp-boot-network-list --disable-notifications --enable-monitoring-graphs --monitoring-graphite-host --monitoring-graphite-port --self-signed-api-cert --statsd-hostname --initial-cluster-setup --extswift-use-external --extswift-auth-url --extswift-region --extswift-proxy-url --extswift-project-name --extswift-project-domain-name --extswift-user-name --extswift-user-domain-name --extswift-password --nested-virt --use-ovs-ifaces --cpu-mode --cpu-model --cpu-model-extra-flags --hw-machine-type --nova-skip-cpu-compare-on-dest --nova-skip-cpu-compare-at-startup --nova-skip-hypervisor-version-check-on-lm --first-master --cephosd-automatic-provisionning --haproxy-custom-url ${ALL_OPTIONS}" -- ${cur}) )
			return 0
		;;
		4|6|8|10|12|14|16|18|20|22|24|26|28|30|32|34|36|38|40|42|44|46|48|50|52|54|56|58|60|62|64|66|68|70|72|74|76|78|80|82|84|86|88)
			case ${COMP_CWORD} in
			"--swift-disable-encryption"|"--disable-notifications"|"--enable-monitoring-graphs"|"--self-signed-api-cert"|"--initial-cluster-setup"|"--swift-ac-on-proxy"|"--extswift-use-external"|"--nested-virt"|"--use-ovs-ifaces"|"--cephosd-automatic-provisionning"|"--nova-skip-cpu-compare-on-dest"|"--nova-skip-cpu-compare-at-startup"|"--nova-skip-hypervisor-version-check-on-lm")
				COMPREPLY=( $(compgen -W "yes no" -- ${cur}) )
			;;
			"--cpu-mode")
				COMPREPLY=( $(compgen -W "host-model host-passthrough custom" -- ${cur}) )
			;;
			"--cpu-model")
				COMPREPLY=( $(compgen -W "486 486-v1 Broadwell Broadwell-IBRS Broadwell-noTSX Broadwell-noTSX-IBRS Broadwell-v1 Broadwell-v2 Broadwell-v3 Broadwell-v4 Cascadelake-Server Cascadelake-Server-noTSX Cascadelake-Server-v1 Cascadelake-Server-v2 Cascadelake-Server-v3 Cascadelake-Server-v4 Cascadelake-Server-v5 Conroe Conroe-v1 Cooperlake Cooperlake-v1 Cooperlake-v2 Denverton Denverton-v1 Denverton-v2 Denverton-v3 Dhyana Dhyana-v1 Dhyana-v2 EPYC EPYC-Genoa EPYC-Genoa-v1 EPYC-IBPB EPYC-Milan EPYC-Milan-v1 EPYC-Milan-v2 EPYC-Rome EPYC-Rome-v1 EPYC-Rome-v2 EPYC-Rome-v3 EPYC-Rome-v4 EPYC-v1 EPYC-v2 EPYC-v3 EPYC-v4 GraniteRapids GraniteRapids-v1 Haswell Haswell-IBRS Haswell-noTSX Haswell-noTSX-IBRS Haswell-v1 Haswell-v2 Haswell-v3 Haswell-v4 Icelake-Server Icelake-Server-noTSX Icelake-Server-v1 Icelake-Server-v2 Icelake-Server-v3 Icelake-Server-v4 Icelake-Server-v5 Icelake-Server-v6 IvyBridge IvyBridge-IBRS IvyBridge-v1 IvyBridge-v2 KnightsMill KnightsMill-v1 Nehalem Nehalem-IBRS Nehalem-v1 Nehalem-v2 Opteron_G1 Opteron_G1-v1 Opteron_G2 Opteron_G2-v1 Opteron_G3 Opteron_G3-v1 Opteron_G4 Opteron_G4-v1 Opteron_G5 Opteron_G5-v1 Penryn Penryn-v1 SandyBridge SandyBridge-IBRS SandyBridge-v1 SandyBridge-v2 SapphireRapids SapphireRapids-v1 SapphireRapids-v2 Skylake-Client Skylake-Client-IBRS Skylake-Client-noTSX-IBRS Skylake-Client-v1 Skylake-Client-v2 Skylake-Client-v3 Skylake-Client-v4 Skylake-Server Skylake-Server-IBRS Skylake-Server-noTSX-IBRS Skylake-Server-v1 Skylake-Server-v2 Skylake-Server-v3 Skylake-Server-v4 Skylake-Server-v5 Snowridge Snowridge-v1 Snowridge-v2 Snowridge-v3 Snowridge-v4 Westmere Westmere-IBRS Westmere-v1 Westmere-v2 athlon athlon-v1 core2duo core2duo-v1 coreduo coreduo-v1 kvm32 kvm32-v1 kvm64 kvm64-v1 n270 n270-v1 pentium pentium-v1 pentium2 pentium2-v1 pentium3 pentium3-v1 phenom phenom-v1 qemu32 qemu32-v1 qemu64 qemu64-v1 base host max" -- ${cur}) )
			;;
			"--hw-machine-type")
				COMPREPLY=( $(compgen -W "microvm pc pc-i440fx-7.2 pc-i440fx-7.1 pc-i440fx-7.0 pc-i440fx-6.2 pc-i440fx-6.1 pc-i440fx-6.0 pc-i440fx-5.2 pc-i440fx-5.1 pc-i440fx-5.0 pc-i440fx-4.2 pc-i440fx-4.1 pc-i440fx-4.0 pc-i440fx-3.1 pc-i440fx-3.0 pc-i440fx-2.9 pc-i440fx-2.8 pc-i440fx-2.7 pc-i440fx-2.6 pc-i440fx-2.5 pc-i440fx-2.4 pc-i440fx-2.3 pc-i440fx-2.2 pc-i440fx-2.12 pc-i440fx-2.11 pc-i440fx-2.10 pc-i440fx-2.1 pc-i440fx-2.0 pc-i440fx-1.7 pc-i440fx-1.6 pc-i440fx-1.5 pc-i440fx-1.4 q35 pc-q35-7.2 pc-q35-7.1 pc-q35-7.0 pc-q35-6.2 pc-q35-6.1 pc-q35-6.0 pc-q35-5.2 pc-q35-5.1 pc-q35-5.0 pc-q35-4.2 pc-q35-4.1 pc-q35-4.0.1 pc-q35-4.0 pc-q35-3.1 pc-q35-3.0 pc-q35-2.9 pc-q35-2.8 pc-q35-2.7 pc-q35-2.6 pc-q35-2.5 pc-q35-2.4 pc-q35-2.12 pc-q35-2.11 pc-q35-2.10 isapc" -- ${cur}) )
			;;
			"--first-master")
				local machine_list=$(ocicli -csv machine-list -a | q -d, -H "SELECT serial FROM - WHERE role='controller'" | tr \\n " ")
				COMPREPLY=( $(compgen -W "${machine_list}" -- ${cur}) )
			;;
			*)
				echo -n ""
			;;
			esac
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	cluster-rolecounts-set)
		case ${COMP_CWORD} in
		2)
			local cluster_list=$(ocicli -csv cluster-list | grep -v "id,name,domain" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
			return 0
		;;
		3)
			local role_list=$(ocicli -csv role-list | q -H -d, "SELECT name FROM -" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${role_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	swift-calculate-ring)
		case ${COMP_CWORD} in
		2)
			local cluster_list=$(ocicli -csv cluster-list | grep -v "id,name,domain" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
			return 0
		;;
		*)
			COMPREPLY=( $(compgen -W "--ec-only 1000 yes no" -- ${cur}) )
			return 0
		;;
		esac
	;;
	filebeat-output-host-create)
		case ${COMP_CWORD} in
		2)
			local cluster_list=$(ocicli -csv cluster-list | grep -v "id,name,domain" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	filebeat-output-host-delete)
		case ${COMP_CWORD} in
		2)
			local cluster_list=$(ocicli -csv cluster-list | grep -v "id,name,domain" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
			return 0
		;;
		3)
			local cluster_list=$(ocicli -csv filebeat-output-host-list ${COMP_WORDS[COMP_CWORD-1]} | q -H -d, "SELECT hostname FROM -" | tr '\n' ' ')
			COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
			return 0
		;;
		4)
			local cluster_list=$(ocicli -csv filebeat-output-host-list ${COMP_WORDS[COMP_CWORD-2]} | q -H -d, "SELECT port FROM -" | tr '\n' ' ')
			COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	cluster-show-machines|cluster-show-networks|cluster-show-ips|cluster-delete|cluster-show|cluster-install|cluster-reset|cluster-rolecounts-list|swift-publish-ring|filebeat-output-host-list)
		local cluster_list=$(ocicli -csv cluster-list | grep -v "id,name,domain" | cut -d, -f2 | tr \\n " ")
		COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
		return 0
	;;
	network-remove)
		local network_list=$(ocicli -csv network-list | q -d, -H "SELECT name FROM - WHERE cluster_name NOT LIKE 'null' AND cluster_name NOT LIKE '-'" | cut -d, -f1 | tr \\n " ")
		COMPREPLY=( $(compgen -W "${network_list}" -- ${cur}) )
		return 0
	;;
	network-add)
		case ${COMP_CWORD} in
		2)
			local serial_list=$(ocicli -csv network-list | q -d, -H "SELECT name FROM - WHERE cluster_name='null' OR cluster_name='-'" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${serial_list}" -- ${cur}) )
			return 0
		;;
		3)
			local cluster_list=$(ocicli -csv cluster-list | grep -v "id,name,domain" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${cluster_list}" -- ${cur}) )
			return 0
		;;
		4)
			local role_list=$(ocicli -csv role-list | grep -v "id,name" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "all vm-net ovs-bridge ceph-cluster ipmi ${role_list}" -- ${cur}) )
			return 0
		;;
		5|6)
			COMPREPLY=( $(compgen -W "${iface_names}" -- ${cur}) )
			return 0
		;;
		*)
		;;
		esac
	;;
	network-create)
		case ${COMP_CWORD} in
		4)
			COMPREPLY=( $(compgen -W "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32" -- ${cur}) )
			return 0
		;;
		5)
			local location_list=$(ocicli -csv location-list | grep -v "id,name,swiftregion" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${location_list}" -- ${cur}) )
			return 0
		;;
		6)
			local location_list=$(ocicli -csv location-list | grep -v "id,name,swiftregion" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "yes no" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	network-delete)
		local network_list=$(ocicli -csv network-list | grep -v name,ip,cidr,is_public,cluster,role,iface1,iface2,location_id | cut -d, -f1 | tr \\n " ")
		COMPREPLY=( $(compgen -W "${network_list}" -- ${cur}) )
		return 0
	;;
	network-set)
		case ${COMP_CWORD} in
		2)
			local network_list=$(ocicli -csv network-list | q -H -d, "SELECT name FROM -" | tr \\n " ")
			COMPREPLY=( $(compgen -W "${network_list}" -- ${cur}) )
			return 0
		;;
		3|5|7|9|11|13|15|17|19|21|23|25|27|29|31)
			COMPREPLY=( $(compgen -W "--role --vip-usage --iface1 --iface2 --lldp-match --ip --cidr --is-public --mtu --vlan --location --bridge-name --ipmi-match-addr --ipmi-match-cidr --ipmi-mode --first-ip --last-ip" -- ${cur}) )
			return 0
		;;
		4|6|8|10|12|14|16|18|20|22|24|26|28|30|32)
			case "${prev}" in
			"--role")
				local role_list=$(ocicli -csv role-list | grep -v "id,name" | cut -d, -f2 | tr \\n " ")
				COMPREPLY=( $(compgen -W "all vm-net ${role_list}" -- ${cur}) )
				return 0
			;;
			"--vip-usage")
				COMPREPLY=( $(compgen -W "controller messaging sql sqlmsg" -- ${cur}) )
				return 0
			;;
			"--iface1"|"--iface2")
				COMPREPLY=( $(compgen -W "${iface_names}" -- ${cur}) )
				return 0
			;;
			"--ipmi-mode")
				COMPREPLY=( $(compgen -W "ocimanaged externaldhcp" -- ${cur}) )
				return 0
			;;
			"--ip"|"--mtu"|"--vlan")
				return 0
			;;
			"--cidr"|"--ipmi-match-cidr")
				COMPREPLY=( $(compgen -W "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32" -- ${cur}) )
				return 0
			;;
			"--is-public")
				COMPREPLY=( $(compgen -W "yes no" -- ${cur}) )
				return 0
			;;
			"--location")
				local location_list=$(ocicli -csv location-list | grep -v "id,name,swiftregion" | cut -d, -f2 | tr \\n " ")
				COMPREPLY=( $(compgen -W "${location_list}" -- ${cur}) )
				return 0
			;;
			*)
				return 0
			;;
			esac
		;;
		*)
		;;
		esac
	;;
	role-delete)
		local role_list=$(ocicli -csv role-list | grep -v "id,name" | cut -d, -f2 | tr \\n " ")
		COMPREPLY=( $(compgen -W "${role_list}" -- ${cur}) )
		return 0
	;;
	swift-region-delete)
		local swiftregion_list=$(ocicli -csv swift-region-list | grep -v "id,name" | cut -d, -f2 | tr \\n " ")
		COMPREPLY=( $(compgen -W "${swiftregion_list}" -- ${cur}) )
		return 0
	;;
	location-create)
		case ${COMP_CWORD} in
		3)
			local swiftregion_list=$(ocicli -csv swift-region-list | grep -v "id,name" | cut -d, -f2 | tr \\n " ")
			COMPREPLY=( $(compgen -W "${swiftregion_list}" -- ${cur}) )
			return 0
		;;
		*)
			return 0
		;;
		esac
	;;
	location-delete)
		local location_list=$(ocicli -csv location-list | grep -v "id,name,swiftregion" | cut -d, -f2 | tr \\n " ")
		COMPREPLY=( $(compgen -W "${location_list}" -- ${cur}) )
		return 0
	;;
	*)
	;;
	esac

	COMPREPLY=($(compgen -W "${opts}" -- "${cur}"))
}

complete -F _ocicli ocicli
