diff --git a/osreport/README.md b/osreport/README.md new file mode 100644 index 0000000..4a28c24 --- /dev/null +++ b/osreport/README.md @@ -0,0 +1,29 @@ +# OpenStack Report Plugin + +Collects OpenStack information for a cloud. + +Usage: openstack-toolkit.osreport + +Description: + Collects OpenStack information for a cloud and builds useful relations + between the cloud resources. + +Options: + --help: Print this info. + --plugins : Can be any of: neutron, nova, nova-hypervisors or octavia. You can + use multiple options separated by commas. + --all-plugins: Runs all the above plugins. Can take some time to run. + +Environment: + OS_AUTH_URL + OS_AUTH_VERSION + OS_IDENTITY_API_VERSION + OS_PASSWORD + OS_PROJECT_DOMAIN_NAME + OS_PROJECT_NAME + OS_REGION_NAME + OS_USERNAME + OS_USER_DOMAIN_NAME + + + diff --git a/osreport/api/plugins.d/agent/README b/osreport/api/plugins.d/agent/README new file mode 100644 index 0000000..318c2a6 --- /dev/null +++ b/osreport/api/plugins.d/agent/README @@ -0,0 +1 @@ +Plugins that can be run on a host running agents. diff --git a/osreport/api/plugins.d/neutron b/osreport/api/plugins.d/neutron new file mode 100644 index 0000000..9cc8fc3 --- /dev/null +++ b/osreport/api/plugins.d/neutron @@ -0,0 +1,47 @@ +#!/bin/bash -eu + +OUTPUT_DIR=${OSREPORT_OUTPUT_DIR}/neutron_info +mkdir -p ${OUTPUT_DIR} + +NETWORKS_OUTPUT_DIR=${OUTPUT_DIR}/networks +mkdir -p ${NETWORKS_OUTPUT_DIR} +openstack network list > ${NETWORKS_OUTPUT_DIR}/list +for i in $(openstack network list -c ID -f value); do + mkdir -p ${NETWORKS_OUTPUT_DIR}/${i} + openstack network show ${i} > ${NETWORKS_OUTPUT_DIR}/${i}/info + mkdir -p ${NETWORKS_OUTPUT_DIR}/${i}/ports + openstack port list --network ${i} > ${NETWORKS_OUTPUT_DIR}/${i}/ports/list + for j in $(openstack port list --network ${i} -c ID -f value); do + ln -rs ${OUTPUT_DIR}/ports/${j} ${NETWORKS_OUTPUT_DIR}/${i}/ports/${j} + done +done + +SUBNETS_OUTPUT_DIR=${OUTPUT_DIR}/subnets +mkdir -p ${SUBNETS_OUTPUT_DIR} +openstack subnet list > ${SUBNETS_OUTPUT_DIR}/list +for i in $(openstack subnet list -c ID -f value); do + mkdir -p ${SUBNETS_OUTPUT_DIR}/${i} + openstack subnet show ${i} > ${SUBNETS_OUTPUT_DIR}/${i}/info +done + +SECGROUP_OUTPUT_DIR=${OUTPUT_DIR}/secgroups +mkdir -p ${SECGROUP_OUTPUT_DIR} +openstack security group list > ${SECGROUP_OUTPUT_DIR}/list +for i in $(openstack security group list -c ID -f value); do + mkdir -p ${SECGROUP_OUTPUT_DIR}/${i} + openstack security group show ${i} > ${SECGROUP_OUTPUT_DIR}/${i}/info +done + +ROUTERS_OUTPUT_DIR=${OUTPUT_DIR}/routers +mkdir -p ${ROUTERS_OUTPUT_DIR} +openstack router list > ${ROUTERS_OUTPUT_DIR}/list +for i in $(openstack router list -c ID -f value); do + mkdir -p ${ROUTERS_OUTPUT_DIR}/${i} + openstack router show ${i} > ${ROUTERS_OUTPUT_DIR}/${i}/info + + mkdir -p ${ROUTERS_OUTPUT_DIR}/${i}/ports + openstack port list --router ${i} > ${ROUTERS_OUTPUT_DIR}/${i}/ports/list + for j in $(openstack port list --router ${i} -c ID -f value); do + ln -rs ${OUTPUT_DIR}/ports/${j} ${ROUTERS_OUTPUT_DIR}/${i}/ports/${j} + done +done diff --git a/osreport/api/plugins.d/neutron-common b/osreport/api/plugins.d/neutron-common new file mode 100644 index 0000000..e7d2632 --- /dev/null +++ b/osreport/api/plugins.d/neutron-common @@ -0,0 +1,20 @@ +#!/bin/bash -eux + +OUTPUT_DIR=${OSREPORT_OUTPUT_DIR}/neutron_info +mkdir -p ${OUTPUT_DIR} + +PORTS_OUTPUT_DIR=${OUTPUT_DIR}/ports +mkdir -p ${PORTS_OUTPUT_DIR} +openstack port list > ${PORTS_OUTPUT_DIR}/list +for i in $(openstack port list -c ID -f value); do + mkdir -p ${PORTS_OUTPUT_DIR}/${i} + openstack port show ${i} > ${PORTS_OUTPUT_DIR}/${i}/info +done + +AGENTS_OUTPUT_DIR=${OUTPUT_DIR}/agents +mkdir -p ${AGENTS_OUTPUT_DIR} +openstack network agent list > ${AGENTS_OUTPUT_DIR}/list +for i in $(openstack network agent list -c ID -f value); do + mkdir -p ${AGENTS_OUTPUT_DIR}/${i} + openstack network agent show ${i} > ${AGENTS_OUTPUT_DIR}/${i}/info +done \ No newline at end of file diff --git a/osreport/api/plugins.d/nova b/osreport/api/plugins.d/nova new file mode 100644 index 0000000..2ed9747 --- /dev/null +++ b/osreport/api/plugins.d/nova @@ -0,0 +1,3 @@ +#!/bin/bash -eu + +# Basic nova information already collected in the nova-common module \ No newline at end of file diff --git a/osreport/api/plugins.d/nova-common b/osreport/api/plugins.d/nova-common new file mode 100644 index 0000000..c3bacd5 --- /dev/null +++ b/osreport/api/plugins.d/nova-common @@ -0,0 +1,27 @@ +#!/bin/bash -eu + +# Depends-on neutron + +OUTPUT_DIR=${OSREPORT_OUTPUT_DIR}/nova_info +mkdir -p ${OUTPUT_DIR} + +SERVERS_OUTPUT_DIR=${OUTPUT_DIR}/servers +mkdir -p ${SERVERS_OUTPUT_DIR} +openstack server list > ${SERVERS_OUTPUT_DIR}/list +for i in $(openstack server list -c ID -f value); do + mkdir -p ${SERVERS_OUTPUT_DIR}/${i} + openstack server show ${i} > ${OUTPUT_DIR}/servers/${i}/info + mkdir -p ${SERVERS_OUTPUT_DIR}/${i}/ports + openstack port list --server ${i} > ${OUTPUT_DIR}/servers/${i}/ports/list + for j in $(openstack port list --server ${i} -c ID -f value); do + ln -rs ${OSREPORT_OUTPUT_DIR}/neutron_info/ports/${j}/ ${OUTPUT_DIR}/servers/${i}/ports/${j} + done +done + +AGENTS_OUTPUT_DIR=${OUTPUT_DIR}/agents +mkdir -p ${AGENTS_OUTPUT_DIR} +openstack port list > ${AGENTS_OUTPUT_DIR}/list +for i in $(openstack port list -c ID -f value); do + mkdir -p ${AGENTS_OUTPUT_DIR}/${i} + openstack port show ${i} > ${AGENTS_OUTPUT_DIR}/${i}/info +done \ No newline at end of file diff --git a/osreport/api/plugins.d/nova-hypervisors b/osreport/api/plugins.d/nova-hypervisors new file mode 100644 index 0000000..e8882c0 --- /dev/null +++ b/osreport/api/plugins.d/nova-hypervisors @@ -0,0 +1,25 @@ +#!/bin/bash -eu + +OUTPUT_DIR=${OSREPORT_OUTPUT_DIR}/nova-hypervisors_info +mkdir -p ${OUTPUT_DIR} + +HYPERVISORS_OUTPUT_DIR=${OUTPUT_DIR}/hypervisors +mkdir -p ${HYPERVISORS_OUTPUT_DIR} +openstack hypervisor list > ${HYPERVISORS_OUTPUT_DIR}/list +for i in $(openstack hypervisor list -c 'Hypervisor Hostname' -f value); do + mkdir -p ${HYPERVISORS_OUTPUT_DIR}/${i} + openstack hypervisor show ${i} > ${HYPERVISORS_OUTPUT_DIR}/${i}/info + mkdir -p ${HYPERVISORS_OUTPUT_DIR}/${i}/servers + openstack server list --all-projects --host ${i} > ${HYPERVISORS_OUTPUT_DIR}/${i}/servers/list + for j in $(openstack server list --all-projects --host ${i} -c ID -f value); do + ln -rs ${OSREPORT_OUTPUT_DIR}/nova_info/servers/${j} ${HYPERVISORS_OUTPUT_DIR}/${i}/servers/${j} + done + + mkdir -p ${HYPERVISORS_OUTPUT_DIR}/${i}/agents/network + openstack network agent list --host ${i} > ${HYPERVISORS_OUTPUT_DIR}/${i}/agents/network/list + + for j in $(openstack network agent list -c ID -f value); do + ln -rs ${OSREPORT_OUTPUT_DIR}/neutron_info/agents/${j} ${HYPERVISORS_OUTPUT_DIR}/${i}/agents/network/${j} + done +done + diff --git a/osreport/api/plugins.d/octavia b/osreport/api/plugins.d/octavia new file mode 100644 index 0000000..6db67a7 --- /dev/null +++ b/osreport/api/plugins.d/octavia @@ -0,0 +1,85 @@ +#!/bin/bash -eu + +OUTPUT_DIR=${OSREPORT_OUTPUT_DIR}/octavia_info +mkdir -p ${OUTPUT_DIR} + +openstack loadbalancer list > ${OUTPUT_DIR}/openstack_loadbalancer_list.out +mkdir -p ${OUTPUT_DIR}/loadbalancer_info +mkdir -p ${OUTPUT_DIR}/loadbalancer_stats +mkdir -p ${OUTPUT_DIR}/loadbalancer_status +for i in $(openstack loadbalancer list -c id -f value); do + openstack loadbalancer show ${i} > ${OUTPUT_DIR}/loadbalancer_info/${i}.out + openstack loadbalancer stats show ${i} > ${OUTPUT_DIR}/loadbalancer_stats/${i}.out + openstack loadbalancer status show ${i} > ${OUTPUT_DIR}/loadbalancer_status/${i}.out +done + +openstack loadbalancer amphora list > ${OUTPUT_DIR}/openstack_loadbalancer_amphora_list.out +mkdir -p ${OUTPUT_DIR}/amphora_info +mkdir -p ${OUTPUT_DIR}/amphora_stats +for i in $(openstack loadbalancer amphora list -c id -f value); do + openstack loadbalancer amphora show ${i} > ${OUTPUT_DIR}/amphora_info/${i}.out + openstack loadbalancer amphora stats show ${i} > ${OUTPUT_DIR}/amphora_stats/${i}.out +done + +openstack loadbalancer availabilityzone list > ${OUTPUT_DIR}/openstack_loadbalancer_availabilityzone_list.out +mkdir -p ${OUTPUT_DIR}/availabilityzone_info +for i in $(openstack loadbalancer availabilityzone list -c id -f value); do + openstack loadbalancer availabilityzone show ${i} > ${OUTPUT_DIR}/availabilityzone_info/${i}.out +done + +openstack loadbalancer flavor list > ${OUTPUT_DIR}/openstack_loadbalancer_flavor_list.out +mkdir -p ${OUTPUT_DIR}/flavor_info +for i in $(openstack loadbalancer flavor list -c id -f value); do + openstack loadbalancer flavor show ${i} > ${OUTPUT_DIR}/flavor_info/${i}.out +done + +openstack loadbalancer flavorprofile list > ${OUTPUT_DIR}/openstack_loadbalancer_flavorprofile_list.out +mkdir -p ${OUTPUT_DIR}/flavorprofile_info +for i in $(openstack loadbalancer flavorprofile list -c id -f value); do + openstack loadbalancer flavorprofile show ${i} > ${OUTPUT_DIR}/flavorprofile_info/${i}.out +done + +openstack loadbalancer healthmonitor list > ${OUTPUT_DIR}/openstack_loadbalancer_healthmonitor_list.out +mkdir -p ${OUTPUT_DIR}/healthmonitor_info +for i in $(openstack loadbalancer healthmonitor list -c id -f value); do + openstack loadbalancer healthmonitor show ${i} > ${OUTPUT_DIR}/healthmonitor_info/${i}.out +done + +openstack loadbalancer l7policy list > ${OUTPUT_DIR}/openstack_loadbalancer_l7policy_list.out +mkdir -p ${OUTPUT_DIR}/l7policy_info +for i in $(openstack loadbalancer l7policy list -c id -f value); do + openstack loadbalancer l7policy show ${i} > ${OUTPUT_DIR}/l7policy_info/${i}.out + openstack loadbalancer l7rule list ${i} > ${OUTPUT_DIR}/l7policy_info/${i}_rules.out + mkdir -p ${OUTPUT_DIR}/l7policy_info/${i}_rules_info + mkdir -p ${OUTPUT_DIR}/l7rule_info + for j in $(openstack loadbalancer l7rule list ${i} -c id -f value); do + openstack loadbalancer l7rule show ${i} ${j} > ${OUTPUT_DIR}/l7rule_info/${j}.out + done +done + +openstack loadbalancer listener list > ${OUTPUT_DIR}/openstack_loadbalancer_listener_list.out +mkdir -p ${OUTPUT_DIR}/listener_info +mkdir -p ${OUTPUT_DIR}/listener_stats +for i in $(openstack loadbalancer listener list -c id -f value); do + openstack loadbalancer listener show ${i} > ${OUTPUT_DIR}/listener_info/${i}.out + openstack loadbalancer listener stats show ${i} > ${OUTPUT_DIR}/listener_stats/${i}.out +done + +openstack loadbalancer pool list > ${OUTPUT_DIR}/openstack_loadbalancer_pool_list.out +mkdir -p ${OUTPUT_DIR}/pool_info +for i in $(openstack loadbalancer pool list -c id -f value); do + openstack loadbalancer pool show ${i} > ${OUTPUT_DIR}/pool_info/${i}.out + openstack loadbalancer member list ${i} > ${OUTPUT_DIR}/pool_info/${i}_member_list.out + mkdir -p ${OUTPUT_DIR}/pool_info/${i}_member_list_info + for j in $(openstack loadbalancer member list ${i} -c id -f value); do + openstack loadbalancer member show ${i} ${j} > ${OUTPUT_DIR}/pool_info/${i}_member_list_info/${j}.out + done +done + +openstack loadbalancer quota defaults show > ${OUTPUT_DIR}/openstack_loadbalancer_quota_defaults_show.out + +openstack loadbalancer quota list > ${OUTPUT_DIR}/openstack_loadbalancer_quota_list.out +mkdir -p ${OUTPUT_DIR}/quota_info +for i in $(openstack loadbalancer quota list -c project_id -f value); do + openstack loadbalancer quota show ${i} > ${OUTPUT_DIR}/quota_info/${i}.out +done \ No newline at end of file diff --git a/osreport/cmdlist.py b/osreport/cmdlist.py new file mode 100644 index 0000000..d7fc3a6 --- /dev/null +++ b/osreport/cmdlist.py @@ -0,0 +1,167 @@ +# # nova-hosts +# openstack aggregate list', +# openstack aggregate show' + +# openstack host list', +# openstack host show' +# openstack hypervisor list', +# openstack hypervisor show' +# openstack region list', +# openstack region show' +# openstack service list', +# openstack service show' +# openstack service provider list', +# openstack service provider show' +# openstack compute agent list', +# openstack compute service list', + +# # nova servers +# openstack availability zone list' +# openstack hypervisor stats show' +# openstack versions show' +# openstack flavor list', +# openstack flavor show' +# openstack floating ip list', +# openstack floating ip show' +# openstack image list', +# openstack image show', +# openstack image member list' +# openstack keypair list', +# openstack keypair show' +# openstack quota list', +# openstack quota show' +# openstack server list', +# openstack server show', +# openstack server event show' +# openstack server group list', +# openstack server group show' + +# # keystone +# openstack domain list +# openstack domain show + +# openstack catalog list +# openstack catalog show + +# openstack endpoint group list +# openstack endpoint group show + +# openstack endpoint list +# openstack endpoint show + +# openstack group list +# openstack group show + +# openstack identity provider list +# openstack identity provider show + +# openstack project list +# openstack project show + +# openstack user list +# openstack user show + +# openstack role list +# openstack role show + + +# # placement # --os-placement-api-version 1.6 +# openstack resource provider aggregate list +# openstack resource provider aggregate set +# openstack resource provider allocation show +# openstack resource provider inventory list +# openstack resource provider inventory set +# openstack resource provider inventory show +# openstack resource provider list +# openstack resource provider show +# openstack resource provider trait list +# openstack resource provider trait set +# openstack resource provider usage show +# openstack resource usage show + +# # neutron +# openstack ip availability list +# openstack ip availability show + +# openstack network agent list - OK +# openstack network agent show - OK + +# openstack network flavor list +# openstack network flavor show + +# openstack network list - OK +# openstack network show - OK + +# openstack network meter list +# openstack network meter show + +# openstack network rbac list +# openstack network rbac show + +# openstack network segment list + +# openstack network segment show +# openstack network service provider list + +# openstack subnet list +# openstack subnet show + +# openstack subnet pool list +# openstack subnet pool show + +# openstack port list +# openstack port show + +# openstack router list +# openstack router show + +# openstack security group list +# openstack security group rule list + +# openstack security group rule show +# openstack security group show + +# # octavia +# openstack loadbalancer list +# openstack loadbalancer show +# openstack loadbalancer stats show +# openstack loadbalancer status show + +# openstack loadbalancer amphora list +# openstack loadbalancer amphora show +# openstack loadbalancer amphora stats show + +# openstack loadbalancer flavor list +# openstack loadbalancer flavor show + +# openstack loadbalancer healthmonitor list +# openstack loadbalancer healthmonitor show + +# openstack loadbalancer l7policy list +# openstack loadbalancer l7policy show + +# openstack loadbalancer l7rule list +# openstack loadbalancer l7rule show + +# openstack loadbalancer pool list +# openstack loadbalancer pool show +# openstack loadbalancer member list +# openstack loadbalancer member show + +# openstack loadbalancer listener list +# openstack loadbalancer listener show +# openstack loadbalancer listener stats show + + +# # volume +# openstack volume backup list +# openstack volume backup show + +# openstack volume list +# openstack volume show + +# openstack volume snapshot list +# openstack volume snapshot show + +# openstack volume type list +# openstack volume type show diff --git a/osreport/run.sh b/osreport/run.sh new file mode 100755 index 0000000..3ed6771 --- /dev/null +++ b/osreport/run.sh @@ -0,0 +1,117 @@ +#!/bin/bash -u +export LIB_PATH=$(dirname $0)/../lib + +export OSREPORT_OUTPUT_DIR=$(mktemp -d -p . osreport.XXXXXX) + +SUPPORTED_PLUGINS="neutron,nova,octavia,nova-hypervisors" + +check_plugin_list(){ + IFS="," + for plugin in $1; do + supported="False" + for supported_plugin in ${SUPPORTED_PLUGINS}; do + if [ "${plugin}" == "${supported_plugin}" ]; then + supported=True + break + fi + done + + if [ "${supported}" == "False" ]; then + echo "${plugin} is not a supported plugin" + usage + exit 1 + fi + done + IFS=$' \t\n' +} + +usage () { +cat << EOF +Usage: openstack-toolkit.osreport + +Description: + Collects OpenStack information for a cloud and builds useful relations + between the cloud resources. + +Options: + --help: Print this info. + --plugins : Can be any of: neutron, nova, nova-hypervisors or octavia. You can + use multiple options separated by commas. + --all-plugins: Runs all the above plugins. Can take some time to run. + +Environment: + OS_AUTH_URL + OS_AUTH_VERSION + OS_IDENTITY_API_VERSION + OS_PASSWORD + OS_PROJECT_DOMAIN_NAME + OS_PROJECT_NAME + OS_REGION_NAME + OS_USERNAME + OS_USER_DOMAIN_NAME +EOF +} + +plugins=${SUPPORTED_PLUGINS} +while (($#)); do + case "$1" in + --plugins) + plugins=${2:-} + shift + ;; + --all-plugins) + plugins=${SUPPORTED_PLUGINS} + ;; + --help|-h) + usage + exit 0 + ;; + esac + shift +done + +api_plugins=`dirname $0`/api/plugins.d +agent_plugins=`dirname $0`/agent/plugins.d + +if [ -z ${OS_AUTH_URL} ] || [ -z ${OS_PROJECT_NAME} ] || [ -z ${OS_USERNAME} ]; +then + echo "OS_ environment vars should be set" + usage + exit 1 +fi + +if [ ${OS_USERNAME} != "admin" ]; then + echo "OS_USERNAME must be admin" + exit 1 +fi + +if [ -e ${plugins} ]; then + echo "No plugins selected". + usage + exit 1 +fi + +echo "Plugins list is: ${plugins}" +check_plugin_list ${plugins} + +mkdir -p ${OSREPORT_OUTPUT_DIR} + +## Run common scripts in the sequence they need to be +for common_src in "neutron-common" "nova-common"; do + echo "Collecting ${common_src} information..." + . ${api_plugins}/${common_src} +done + +IFS="," +for plugin in ${plugins}; do + IFS=$' \t\n' + + echo "Collecting ${plugin} information..." + . ${api_plugins}/${plugin} +done + +echo "Compressing results..." +REPORT_NAME="osreport-$(date +%Y-%m-%d_%H%M).tar.xz" +tar -Jcvf ${REPORT_NAME} ${OSREPORT_OUTPUT_DIR} &> /dev/null +echo "Done. Report created in ${REPORT_NAME}" +