{"id":955,"date":"2015-07-07T22:55:36","date_gmt":"2015-07-08T03:55:36","guid":{"rendered":"https:\/\/www.softwareab.net\/wordpress\/?p=955"},"modified":"2015-07-07T23:09:23","modified_gmt":"2015-07-08T04:09:23","slug":"openstack-tenants-and-nagios-integration-script","status":"publish","type":"post","link":"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/","title":{"rendered":"OpenStack Tenants and Nagios Integration Script"},"content":{"rendered":"<p>Hi All! A detailed article to integrate OpenStack tenants with Nagios! While my promised articles on implementing High Availability within OpenStack (which I&#8217;ve done now for Icehouse and Kilo) are still just in my brain, here&#8217;s something else to keep my blog happy with a little more content \ud83d\ude42<\/p>\n<h3>Scenario: Nagios Core and Telemetry<\/h3>\n<p>So you have Telemetry installed and running (bonus questions: did you get the Telemetry controller build process completely automated? And handle <code>mongodb<\/code> database size?) And you have a functional Nagios core. So how to integrate your <strong>OpenStack Tenants<\/strong> as elements in your Nagios?<\/p>\n<p>Here&#8217;s my answer, which unfortunately does rely on running from my Nagios server rather than trapping SNMP alerts sent from the Telemetry (Ceilometer) server. And the iteration process below is kinda slow and therefore lame. But on the good side: it gets my OpenStack Tenants shown in Nagios core!<\/p>\n<p>Here&#8217;s a picture of how the tenants look when displayed in Nagios&#8230;note that I created a Nagios &#8220;hostgroup&#8221; called <code>openstack-tenants<\/code> so that they all show up together:<br \/>\n<a href=\"\/wordpress\/wp-content\/uploads\/2015\/07\/010-OpenStack-Tenants-Nagios.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wordpress\/wp-content\/uploads\/2015\/07\/010-OpenStack-Tenants-Nagios-300x298.png\" alt=\"010-OpenStack-Tenants-Nagios\" width=\"300\" height=\"298\" class=\"alignnone size-medium wp-image-956\" srcset=\"https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/010-OpenStack-Tenants-Nagios-300x298.png 300w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/010-OpenStack-Tenants-Nagios-150x149.png 150w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/010-OpenStack-Tenants-Nagios-50x50.png 50w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/010-OpenStack-Tenants-Nagios-100x99.png 100w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/010-OpenStack-Tenants-Nagios-200x199.png 200w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/010-OpenStack-Tenants-Nagios.png 364w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<h3>Approach<\/h3>\n<p>We&#8217;ll treat each OpenStack tenant as a Nagios &#8220;host&#8221; record. That means, since we&#8217;re using Nagios Core, that we&#8217;ll provide a separate configuration file that defines each OpenStack tenant with information filled in. Fortunately, Nagios permits descriptive information about each host to be expressed using standard HTML tables; we take advantage of this as shown:<\/p>\n<pre><code>\r\ndefine host {\r\n  host_name                      ostenant-common\r\n  hostgroups                     openstack-tenants\r\n  retry_interval                 1\r\n  notification_options           n\r\n  check_interval                 5\r\n  contact_groups                 admins\r\n  register                       1\r\n  max_check_attempts             10\r\n  name                           ostenant-common\r\n  check_period                   24x7\r\n  notification_interval          120\r\n  use                            generic-host\r\n  check_command                  command-true\r\n  notification_period            24x7\r\n  notes                          &lt;table&gt;&lt;tr&gt;&lt;th&gt;ID&lt;\/th&gt;&lt;td&gt;3e263cf06ad0460882f20ca402b6508b&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Name&lt;\/th&gt;&lt;td&gt;common&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Description&lt;\/th&gt;&lt;td&gt;Common services&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Enabled?&lt;\/th&gt;&lt;td&gt;True&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Hypervisors&lt;\/th&gt;&lt;td&gt;lposhostx020.hlsdev.local:lposhostx010.hlsdev.local:&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Total VMs&lt;\/th&gt;&lt;td&gt;3&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Active VMs&lt;\/th&gt;&lt;td&gt;3&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Disk (GB)&lt;\/th&gt;&lt;td&gt;24&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;vCPUs&lt;\/th&gt;&lt;td&gt;5&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;RAM&lt;\/th&gt;&lt;td&gt;2053&lt;\/td&gt;&lt;\/tr&gt;&lt;\/table&gt;\r\n  notes_url                      \/nagios\/cgi-bin\/status.cgi?host=ostenant-common\r\n}\r\n<\/code><\/pre>\n<p>We&#8217;ll generate this code by analyzing each OpenStack Tenant. The result will be a display that looks like the following:<br \/>\n<a href=\"\/wordpress\/wp-content\/uploads\/2015\/07\/015-OpenStack-Tenants-Nagios.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wordpress\/wp-content\/uploads\/2015\/07\/015-OpenStack-Tenants-Nagios-300x227.png\" alt=\"015-OpenStack-Tenants-Nagios\" width=\"300\" height=\"227\" class=\"alignnone size-medium wp-image-957\" srcset=\"https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/015-OpenStack-Tenants-Nagios-300x227.png 300w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/015-OpenStack-Tenants-Nagios-100x76.png 100w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/015-OpenStack-Tenants-Nagios-150x113.png 150w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/015-OpenStack-Tenants-Nagios-200x151.png 200w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/015-OpenStack-Tenants-Nagios-450x340.png 450w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/015-OpenStack-Tenants-Nagios-600x453.png 600w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/015-OpenStack-Tenants-Nagios.png 839w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Finally&#8230;by using Telemetry calls I get a whole bunch of detail information about the tenant:<br \/>\n<a href=\"\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios-300x104.png\" alt=\"020-OpenStack-Tenants-Nagios\" width=\"300\" height=\"104\" class=\"alignnone size-medium wp-image-958\" srcset=\"https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios-300x104.png 300w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios-1024x355.png 1024w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios-100x35.png 100w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios-150x52.png 150w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios-200x69.png 200w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios-450x156.png 450w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios-600x208.png 600w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios-900x312.png 900w, https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2015\/07\/020-OpenStack-Tenants-Nagios.png 1128w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>The way I get this Telemetry information is by using a Nagios command script, which I wrote and installed to the Nagios plugins folder (<code>\/usr\/lib64\/nagios\/plugins<\/code> on my CentOS 6.5 x64 server) as follows:<\/p>\n<pre><code>\r\ndefine command {\r\n        command_line                   $USER1$\/check_ceilometer -H $HOSTNAME$ -e \"$ARG1$\" -s cpu_util -n\r\n        command_name                   check_ceilometer_cpu_util\r\n}\r\n\r\ndefine command {\r\n        command_line                   $USER1$\/check_ceilometer -H $HOSTNAME$ -e \"$ARG1$\" -s disk.read.bytes -n\r\n        command_name                   check_ceilometer_disk_read_bytes\r\n}\r\n<em>...lots more commands, one for each function supported<\/em>\r\n<\/code><\/pre>\n<p>There are two scripts which I need to have for this to work, along with OpenStack credentials (and clients installed) on the Nagios server. I don&#8217;t like that approach (having credentials in a shell script!) but that&#8217;s on my list of Things To Fix! I mitigate the risk by making the credentials readable only by my service account on Nagios, and hiding the Nagios server from the outside world.<\/p>\n<pre><code>\r\n#!\/bin\/bash\r\n# check_ceilometer ABr, 20141212\r\n# invoke ceilometer API for Nagios integration\r\n# Change Log\r\n# ----------\r\n# 20150422, ABr: integrated to puppet\r\n\r\n# default values (overridden by arguments)\r\nTENANT=demo\r\nSERVICE='cpu_util'\r\nIGNORE=0\r\nTHRESHOLD='50.0'\r\nCRITICAL_THRESHOLD='80.0'\r\n\r\n# assume file exists\r\nsource ~\/lvosksclu100-rc-telemetry-access\r\n\r\n# function to print the help info\r\nprintusage() {\r\n  echo \"This plug-in uses the OpenStack Ceilometer API to let Nagios query Ceilometer metrics of VMs.\"\r\n  echo \"usage:\"\r\n  echo \"ceilometer-call -q [event|sample|statistics] -e [tenant_name] -v [server_name] -s metric_name -t nagios_warning_threshold -T nagios_critical_threshold\"\r\n  echo \"-h: print this message\"\r\n  echo \"-H: nagios hostname\"\r\n  echo \"-e: tenant name\"\r\n  echo \"-s service: valid name from ceilometer meter-list\"\r\n  echo \"-n object: no thresholds (ignore)\"\r\n  echo \"-t threshold: Threshold value which causes Nagios to create a warning message\"\r\n  echo \"-T threshold for alert: Threshold value which causes Nagios to send a critical alert message\"\r\n  exit ${EXITPROB}\r\n}\r\n\r\ngetvalue() {\r\n  local l_tmp=\"$1\"\r\n  local l_col=\"$2\"\r\n  local l_value=$(cat $l_tmp | cut -d'|' -f $l_col)\r\n  if [ -z \"$l_value\" ] ; then\r\n    l_value=\"0\"\r\n  else\r\n    l_value=$(echo $l_value | sed -e 's# ##g')\r\n    if echo \"$l_value\" | grep --quiet -v -e '^[0-9\\.EPep]\\+$' 2&gt;\/dev\/null; then\r\n      l_value=\"0\"\r\n    fi\r\n  fi\r\n  set +x\r\n  echo $l_value\r\n  return 0\r\n}\r\n\r\n#parse the arguments\r\nwhile getopts \":hH:e:s:nt:T:\" opt; do\r\n  case $opt in\r\n    H )     l_HOSTNAME=${OPTARG};;\r\n    h )     printusage;;\r\n    e )     TENANT=${OPTARG};;\r\n    s )     SERVICE=${OPTARG};;\r\n    n )     IGNORE=1;;\r\n    t )     THRESHOLD=${OPTARG};;\r\n    T )     CRITICAL_THRESHOLD=${OPTARG};;\r\n    ? )     printusage;;\r\n  esac\r\ndone\r\n\r\nif [ ! -z \"$l_HOSTNAME\" ]; then\r\n  if echo $l_HOSTNAME | grep --quiet -e \"^ostenant-\" 2&gt;&amp;1; then\r\n    TENANT=$(echo $l_HOSTNAME | sed -e 's#^ostenant-\\(.*\\)#\\1#')\r\n  fi\r\nfi\r\n\r\n# very simple plugin :)\r\nl_tmp=\"\/tmp\/ceilometer.$$\"\r\nceilometer --os-tenant-name=$TENANT statistics -m $SERVICE | head -n -1 | tail -n 1 2&gt;\/dev\/null &gt; $l_tmp 2&gt;&amp;1\r\nl_max=$(getvalue \"$l_tmp\" 5)\r\nl_min=$(getvalue \"$l_tmp\" 6)\r\nl_avg=$(getvalue \"$l_tmp\" 7)\r\nl_count=$(getvalue \"$l_tmp\" 9)\r\n#logger \"ceilometer: rm -f \\\"$l_tmp\\\"\"\r\nrm -f \"$l_tmp\"\r\nl_db_name=$SERVICE\r\n[ \"$l_db_name\" = \"cpu_util\" ] &amp;&amp; l_db_name=\"cpu\"\r\necho \"Max:$l_max; Min:$l_min; Avg:$l_avg; Cnt:$l_count|$l_db_name=$l_avg;;;$l_min;$l_max\"\r\necho $RETURNCODE\r\n<\/code><\/pre>\n<p>This command script outputs performance information in a format suitable for Nagios Graph so &#8211; over time &#8211; I can even get trends on CPU \/ RAM \/ HDD usage within a tenant.<\/p>\n<h3>Integrate Nagios with OpenStac<\/h3>\n<p>The actual script I use to create the faux Nagios &#8220;hosts&#8221; as representations of OpenStack tenants follows. Here&#8217;s the script &#8211; with annotations. I run the script as part of a <code>cron<\/code> job every day at 2:45AM because the script is, well, slow. (Remember: it&#8217;s iterating Every VM within Every Tenant in the OpenStack cluster.) However, the script could be run much more often if desired!<\/p>\n<pre><code>\r\n#!\/bin\/bash\r\n# sab-lvos-telemetry-nagios.sh, ABr, 20141212\r\n# Integrate OpenStack Telemetry with Nagios\r\n# Change Log:\r\n# -----------\r\n# 20141212, ABr: initial creation\r\n# 20141215, ABr: placing into production\r\n# 20150102, ABr: save last run\r\n\r\n########################################################################\r\n# globals\r\n\r\n# our runtime directory - accounts for being run in separate shell or\r\n# from source.\r\ng_SAB_LVOS_TELEMETRY_DIR_TEST=\"$(dirname \"$0\" 2&amp;gt;&amp;1)\"\r\ng_SAB_LVOS_TELEMETRY_RC_TEST=$?\r\nif [ $g_SAB_LVOS_TELEMETRY_RC_TEST -eq 0 ]; then\r\n  g_SAB_LVOS_TELEMETRY_NAGIOS_DIR_RUN=\"$(cd $(dirname \"$0\"); pwd)\"\r\nelse\r\n  g_SAB_LVOS_TELEMETRY_NAGIOS_DIR_RUN=\"$(pwd)\"\r\nfi\r\n\r\n# the folder where we stuff extra files for Nagios to include.\r\n# be sure \/etc\/nagios\/nagios.cfg has:\r\n#   cfg_dir=\/etc\/nagios\/extra-cfg\r\ng_SAB_LVOS_TELEMETRY_NAGIOS_DIR_CFG='\/etc\/nagios\/extra-cfg'\r\n\r\n# the resource file with your OpenStack credentials in it. yes, this\r\n# is horrible...it's on my many backlogged tasks to Fix This.\r\ng_SAB_LVOS_TELEMETRY_NAGIOS_FILE_RC_NAME='openstack_rc_file'\r\ng_SAB_LVOS_TELEMETRY_NAGIOS_FILE_RC_PATH=\"$g_SAB_LVOS_TELEMETRY_NAGIOS_DIR_RUN\/$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_RC_NAME\"\r\n\r\n# temp file where we put our results\r\ng_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_NAME='tenants'\r\ng_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_TMP_PATH=\"\/tmp\/$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_NAME.$$\"\r\ng_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_PATH=\"$g_SAB_LVOS_TELEMETRY_NAGIOS_DIR_CFG\/$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_NAME.cfg\"\r\ng_SAB_LVOS_TELEMETRY_NAGIOS_LAST_RUN_PATH=\"\/tmp\/$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_NAME.lastrun\"\r\n\r\ng_SAB_LVOS_TELEMETRY_NAGIOS_RC_OK=0\r\ng_SAB_LVOS_TELEMETRY_NAGIOS_RC_ERROR=1\r\n\r\n########################################################################\r\n# functions\r\n\r\n# cleanup: called before exit\r\nfunction sab-lvos-telemetry-nagios-i-cleanup {\r\n  yes | cp $g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_TMP_PATH $g_SAB_LVOS_TELEMETRY_NAGIOS_LAST_RUN_PATH\r\n  rm -f $g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_TMP_PATH\r\n  return 0\r\n}\r\n\r\n# exit system with cleanup\r\nfunction sab-lvos-telemetry-nagios-i-exit {\r\n  local l_rc=$1\r\n  shift\r\n  [ \"$l_rc\" -ne 0 ] &amp;&amp; echo -n \"ERROR: \"\r\n  echo \"$* ($l_rc)\"\r\n  sab-lvos-telemetry-nagios-i-cleanup\r\n  exit $l_rc\r\n}\r\n\r\n# exit only if error (where first parm is non-zero)\r\nfunction sab-lvos-telemetry-nagios-i-error-exit {\r\n  local l_rc=$1\r\n  [ \"$l_rc\" -ne 0 ] &amp;&amp; sab-lvos-telemetry-nagios-i-exit $*\r\n  return 0\r\n}\r\n\r\n# read OpenStack file and source credentials\r\nfunction sab-lvos-telemetry-nagios-i-source-rc {\r\n  [ ! -f \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_RC_PATH\" ] &amp;&amp; \\\r\n    sab-lvos-telemetry-nagios-i-error-exit $g_SAB_LVOS_TELEMETRY_NAGIOS_RC_ERROR \\\r\n    \"Missing $g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_RC_NAME\"\r\n  source \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_RC_PATH\"\r\n  return 0\r\n}\r\n\r\n# load all tenants (assumes that OpenStack credentials are set)\r\nfunction sab-lvos-telemetry-nagios-i-get-tenants {\r\n  # note that, as of latest OpenStack clients, keystone is deprecated.\r\n  # so we ignore errors (at some point I'll update to use \"openstack\" client)\r\n  local l_tenant_ids=$(keystone tenant-list 2&gt;\/dev\/null | tail -n +4 | head -n -1 | sort -k 3 | cut -d'|' -f 2)\r\n  local l_rc=$?\r\n  sab-lvos-telemetry-nagios-i-error-exit $l_rc $l_tenant_ids\r\n  echo $l_tenant_ids\r\n  return 0\r\n}\r\n\r\n# we have an OpenStack tenant ID, so get the details to put into Nagios\r\nfunction sab-lvos-telemetry-nagios-i-tenant-dtl {\r\n  local l_tenant_id=$1\r\n  local l_attr=$2\r\n  local l_result=$(keystone tenant-get $l_tenant_id 2&gt;\/dev\/null | grep -e \"| \\+$l_attr\" | cut -d'|' -f 3)\r\n  local l_rc=$?\r\n  sab-lvos-telemetry-nagios-i-error-exit $l_rc \"Tenant $l_tenant_id: \" $l_result\r\n  echo $l_result\r\n  return 0\r\n}\r\n\r\n# we have an OpenStack VM's ID, so get its details to analyze\r\nfunction sab-lvos-telemetry-nagios-i-vm-dtl {\r\n  local l_vm_id=$1\r\n  local l_attr=$2\r\n  local l_result=$(nova show $l_vm_id 2&gt;&amp;1 | grep -e \"| \\+$l_attr\" | cut -d'|' -f 3)\r\n  local l_rc=$?\r\n  sab-lvos-telemetry-nagios-i-error-exit $l_rc \"VM $l_vm_id: \" $l_result\r\n  echo $l_result\r\n  return 0\r\n}\r\n\r\n# an OpenStack \"flavor\" defines disk \/ CPU \/ RAM usage. we get these\r\n# details so we can determine how many resources an OpenStack tenant is\r\n# using and report that data to Nagios.\r\nfunction sab-lvos-telemetry-nagios-i-flavor-dtl {\r\n  local l_flavor_id=$1\r\n  local l_attr=$2\r\n  local l_result=$(nova flavor-show $l_flavor_id 2&gt;&amp;1 | grep -e \"| \\+$l_attr\" | cut -d'|' -f 3)\r\n  local l_rc=$?\r\n  sab-lvos-telemetry-nagios-i-error-exit $l_rc \"Flavor $l_flavor_id: \" $l_result\r\n  echo $l_result\r\n  return 0\r\n}\r\n\r\n# here's the magic sauce where we take an OpenStack tenant and get lots of\r\n# information that we can then display within Nagios.\r\nfunction sab-lvos-telemetry-nagios-i-tenant-metadisplay {\r\n  local l_tenant_id=\"$1\"\r\n  local l_tenant_name=\"$2\"\r\n  local l_tenant_description=\"$3\"\r\n  local l_tenant_enabled=\"$4\"\r\n\r\n  # first, get the list of VMs\r\n  local l_tenant_vms=$(nova --os-tenant-id=$l_tenant_id list 2&gt;&amp;1 | tail -n +4 | head -n -1 | cut -d'|' -f 2)\r\n\r\n  # and we do some countin' to find how many resources this tenant uses...\r\n  local l_ctr=0\r\n  local l_active=0\r\n  local l_vcpus=0\r\n  local l_ram=0\r\n  local l_disk=0\r\n  local l_used_hosts=''\r\n  for i_tenant_vm in $l_tenant_vms; do\r\n    l_ctr=$((l_ctr+1))\r\n\r\n    # attributes we want to analyze\r\n    local l_status=$(sab-lvos-telemetry-nagios-i-vm-dtl $i_tenant_vm status)\r\n    local l_flavor_text=$(sab-lvos-telemetry-nagios-i-vm-dtl $i_tenant_vm flavor)\r\n    local l_hostname=$(sab-lvos-telemetry-nagios-i-vm-dtl $i_tenant_vm 'OS-EXT-SRV-ATTR:hypervisor_hostname')\r\n\r\n    # is the VM active?\r\n    [ \"$l_status\" = \"ACTIVE\" ] &amp;&amp; l_active=$((l_active+1))\r\n\r\n    # get the HDD \/ RAM \/ CPU information used by this VM\r\n    local l_flavor_id=$(echo $l_flavor_text | sed -e 's#.*(\\(.*\\)).*#\\1#')\r\n    local l_flavor_disk=$(sab-lvos-telemetry-nagios-i-flavor-dtl $l_flavor_id disk)\r\n    local l_flavor_ram=$(sab-lvos-telemetry-nagios-i-flavor-dtl $l_flavor_id ram)\r\n    local l_flavor_vcpus=$(sab-lvos-telemetry-nagios-i-flavor-dtl $l_flavor_id vcpus)\r\n\r\n    # add to totals\r\n    l_disk=$((l_vcpus+$l_flavor_disk))\r\n    l_vcpus=$((l_vcpus+$l_flavor_vcpus))\r\n    l_ram=$((l_vcpus+$l_flavor_ram))\r\n\r\n    # append hostname to used hosts\r\n    if echo $l_used_hosts | grep --quiet -v -e \"$l_hostname:\"; then\r\n      l_used_hosts=$(echo \"$l_hostname:$l_used_hosts\" | sort -t':')\r\n    fi\r\n  done\r\n\r\n  # get the results in a table format we can feed to Nagios\r\n  echo '&lt;table&gt;&lt;tr&gt;&lt;th&gt;ID&lt;\/th&gt;&lt;td&gt;'$l_tenant_id'&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Name&lt;\/th&gt;&lt;td&gt;'$l_tenant_name'&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Description&lt;\/th&gt;&lt;td&gt;'$l_tenant_description'&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Enabled?&lt;\/th&gt;&lt;td&gt;'$l_tenant_enabled'&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Hypervisors&lt;\/th&gt;&lt;td&gt;'$l_used_hosts'&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Total VMs&lt;\/th&gt;&lt;td&gt;'$l_ctr'&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Active VMs&lt;\/th&gt;&lt;td&gt;'$l_active'&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;Disk (GB)&lt;\/th&gt;&lt;td&gt;'$l_disk'&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;vCPUs&lt;\/th&gt;&lt;td&gt;'$l_vcpus'&lt;\/td&gt;&lt;\/tr&gt;&lt;tr&gt;&lt;th&gt;RAM&lt;\/th&gt;&lt;td&gt;'$l_ram'&lt;\/td&gt;&lt;\/tr&gt;&lt;\/table&gt;'\r\n  return 0\r\n}\r\n\r\n# build meta-data for one tenant\r\nfunction sab-lvos-telemetry-nagios-i-bld-tenant-meta {\r\n  local l_tenant_id=$i\r\n\r\n  echo \"  Getting basic tenant info...\"\r\n  local l_tenant_name=$(sab-lvos-telemetry-nagios-i-tenant-dtl $i_tenant_id name)\r\n  local l_tenant_nagios_name=\"ostenant-$l_tenant_name\"\r\n  local l_tenant_description=$(sab-lvos-telemetry-nagios-i-tenant-dtl $i_tenant_id description)\r\n  local l_tenant_notes_url=\"\/nagios\/cgi-bin\/status.cgi?host=$l_tenant_nagios_name\"\r\n  local l_tenant_enabled=$(sab-lvos-telemetry-nagios-i-tenant-dtl $i_tenant_id enabled)\r\n\r\n  echo \"  Getting VM details for tenant...\"\r\n  local l_tenant_metadisplay=$(sab-lvos-telemetry-nagios-i-tenant-metadisplay $i_tenant_id \"$l_tenant_name\" \"$l_tenant_description\" \"$l_tenant_enabled\")\r\n\r\n  # this is where we export information to Nagios. we treat the OpenStack tenant\r\n  # as a Nagios \"host\"\r\n  cat &gt;&gt; \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_TMP_PATH\" &lt;&lt; EOF\r\ndefine host {\r\n  host_name                      $l_tenant_nagios_name\r\n  hostgroups                     openstack-tenants\r\n  retry_interval                 1\r\n  notification_options           n\r\n  check_interval                 5\r\n  contact_groups                 admins\r\n  register                       1\r\n  max_check_attempts             10\r\n  name                           $l_tenant_nagios_name\r\n  check_period                   24x7\r\n  notification_interval          120\r\n  use                            generic-host\r\n  check_command                  command-true\r\n  notification_period            24x7\r\n  notes                          $l_tenant_metadisplay\r\n  notes_url                      $l_tenant_notes_url\r\n}\r\nEOF\r\n\r\n  return 0\r\n}\r\n\r\n# iterate over all OpenStack tenants, output information to Nagios for each one.\r\nfunction sab-lvos-telemetry-nagios-i-bld-all-meta {\r\n  local l_tenant_ids=$*\r\n\r\n  echo '' &gt; \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_TMP_PATH\"\r\n  for i_tenant_id in $l_tenant_ids; do\r\n    echo \"Processing tenant '$i_tenant_id'...\"\r\n    sab-lvos-telemetry-nagios-i-bld-tenant-meta $i_tenant_id\r\n  done\r\n  return 0\r\n}\r\n\r\n# finally, update Nagios from our results. we will restart Nagios if\r\n# we detected a change in the OpenStack tenant display.\r\nfunction sab-lvos-telemetry-nagios-i-update {\r\n  local l_update=0\r\n  if [ ! -f \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_PATH\" ]; then\r\n    l_update=1\r\n  else\r\n    if diff \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_TMP_PATH\" \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_PATH\" 2&gt;&amp;1 &gt;\/dev\/null; then\r\n      l_update=1\r\n    fi\r\n  fi\r\n  if [ $l_update -eq 1 ]; then\r\n    echo \"Updating Nagios tenant file '$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_PATH'...\"\r\n\r\n    # overwrite our existing Nagios configuration file\r\n    yes | cp \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_TMP_PATH\" \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_PATH\"\r\n    chown root:nagios \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_PATH\"\r\n    chmod 640 \"$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_PATH\"\r\n\r\n    # we have a difference; force Nagios to reload itself\r\n    service nagios restart\r\n  else\r\n    echo \"Nagios tenant file '$g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_PATH' is up-to-date.\"\r\n  fi\r\n  return 0\r\n}\r\n\r\nfunction sab-lvos-telemetry-nagios-run {\r\n  echo \"Sourcing RC file...\"\r\n  sab-lvos-telemetry-nagios-i-source-rc\r\n  echo \"Scanning all tenants...\"\r\n  local l_tenant_ids=$(sab-lvos-telemetry-nagios-i-get-tenants)\r\n  sab-lvos-telemetry-nagios-i-bld-all-meta \"$l_tenant_ids\"\r\n  sab-lvos-telemetry-nagios-i-update $\r\n\r\n  # only do this if you want details from our work shown\r\n#  cat $g_SAB_LVOS_TELEMETRY_NAGIOS_FILE_TENANTS_TMP_PATH\r\n  sab-lvos-telemetry-nagios-i-exit 0 \"OK\"\r\n}\r\n\r\n# do the work\r\nsab-lvos-telemetry-nagios-run\r\n<\/code><\/pre>\n<p>Enjoy&#8230;and Happy Computing!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hi All! A detailed article to integrate OpenStack tenants with Nagios! While my promised articles on implementing High Availability within OpenStack (which I&#8217;ve done now for Icehouse and Kilo) are still just in my brain, here&#8217;s something else to keep &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"more-link\" href=\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/\"> <span class=\"screen-reader-text\">OpenStack Tenants and Nagios Integration Script<\/span> Read More &raquo;<\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69,1],"tags":[42,86,22,18,71],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>OpenStack Tenants and Nagios Integration Script - softwareab<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OpenStack Tenants and Nagios Integration Script - softwareab\" \/>\n<meta property=\"og:description\" content=\"Hi All! A detailed article to integrate OpenStack tenants with Nagios! While my promised articles on implementing High Availability within OpenStack (which I&#8217;ve done now for Icehouse and Kilo) are still just in my brain, here&#8217;s something else to keep &hellip; OpenStack Tenants and Nagios Integration Script Read More &raquo;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/\" \/>\n<meta property=\"og:site_name\" content=\"softwareab\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/cloudraticsolutions\/\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/cloudraticsolutions\/\" \/>\n<meta property=\"article:published_time\" content=\"2015-07-08T03:55:36+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-07-08T04:09:23+00:00\" \/>\n<meta name=\"author\" content=\"Andrew Bruce\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@realcloudratics\" \/>\n<meta name=\"twitter:site\" content=\"@realcloudratics\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andrew Bruce\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/\"},\"author\":{\"name\":\"Andrew Bruce\",\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600\"},\"headline\":\"OpenStack Tenants and Nagios Integration Script\",\"datePublished\":\"2015-07-08T03:55:36+00:00\",\"dateModified\":\"2015-07-08T04:09:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/\"},\"wordCount\":473,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600\"},\"keywords\":[\"centos\",\"OpenStack\",\"scripting\",\"sysadmin\",\"virtualization\"],\"articleSection\":[\"OpenStack\",\"Teknocratica\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/\",\"url\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/\",\"name\":\"OpenStack Tenants and Nagios Integration Script - softwareab\",\"isPartOf\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#website\"},\"datePublished\":\"2015-07-08T03:55:36+00:00\",\"dateModified\":\"2015-07-08T04:09:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.softwareab.net\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"centos\",\"item\":\"https:\/\/www.softwareab.net\/wordpress\/tag\/centos\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"OpenStack Tenants and Nagios Integration Script\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#website\",\"url\":\"https:\/\/www.softwareab.net\/wordpress\/\",\"name\":\"softwareab\",\"description\":\"Technocratica, Technopolitik, Technophobia\",\"publisher\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.softwareab.net\/wordpress\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600\",\"name\":\"Andrew Bruce\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2024\/03\/andy-cartoon.jpg\",\"contentUrl\":\"https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2024\/03\/andy-cartoon.jpg\",\"width\":400,\"height\":330,\"caption\":\"Andrew Bruce\"},\"logo\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/image\/\"},\"description\":\"Team-oriented systems mentor with deep knowledge of numerous software methodologies, technologies, languages, and operating systems. Excited about turning emerging technology into working production-ready systems. Focused on moving software teams to a higher level of world-class application development. Specialties:Software analysis and development...Product management through the entire lifecycle...Discrete product integration specialist!\",\"sameAs\":[\"http:\/\/cloudraticsolutions.net\/\",\"https:\/\/www.facebook.com\/cloudraticsolutions\/\",\"https:\/\/twitter.com\/realcloudratics\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"OpenStack Tenants and Nagios Integration Script - softwareab","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/","og_locale":"en_US","og_type":"article","og_title":"OpenStack Tenants and Nagios Integration Script - softwareab","og_description":"Hi All! A detailed article to integrate OpenStack tenants with Nagios! While my promised articles on implementing High Availability within OpenStack (which I&#8217;ve done now for Icehouse and Kilo) are still just in my brain, here&#8217;s something else to keep &hellip; OpenStack Tenants and Nagios Integration Script Read More &raquo;","og_url":"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/","og_site_name":"softwareab","article_publisher":"https:\/\/www.facebook.com\/cloudraticsolutions\/","article_author":"https:\/\/www.facebook.com\/cloudraticsolutions\/","article_published_time":"2015-07-08T03:55:36+00:00","article_modified_time":"2015-07-08T04:09:23+00:00","author":"Andrew Bruce","twitter_card":"summary_large_image","twitter_creator":"@realcloudratics","twitter_site":"@realcloudratics","twitter_misc":{"Written by":"Andrew Bruce","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/#article","isPartOf":{"@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/"},"author":{"name":"Andrew Bruce","@id":"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600"},"headline":"OpenStack Tenants and Nagios Integration Script","datePublished":"2015-07-08T03:55:36+00:00","dateModified":"2015-07-08T04:09:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/"},"wordCount":473,"commentCount":0,"publisher":{"@id":"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600"},"keywords":["centos","OpenStack","scripting","sysadmin","virtualization"],"articleSection":["OpenStack","Teknocratica"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/","url":"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/","name":"OpenStack Tenants and Nagios Integration Script - softwareab","isPartOf":{"@id":"https:\/\/www.softwareab.net\/wordpress\/#website"},"datePublished":"2015-07-08T03:55:36+00:00","dateModified":"2015-07-08T04:09:23+00:00","breadcrumb":{"@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-tenants-and-nagios-integration-script\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.softwareab.net\/wordpress\/"},{"@type":"ListItem","position":2,"name":"centos","item":"https:\/\/www.softwareab.net\/wordpress\/tag\/centos\/"},{"@type":"ListItem","position":3,"name":"OpenStack Tenants and Nagios Integration Script"}]},{"@type":"WebSite","@id":"https:\/\/www.softwareab.net\/wordpress\/#website","url":"https:\/\/www.softwareab.net\/wordpress\/","name":"softwareab","description":"Technocratica, Technopolitik, Technophobia","publisher":{"@id":"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.softwareab.net\/wordpress\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600","name":"Andrew Bruce","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/image\/","url":"https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2024\/03\/andy-cartoon.jpg","contentUrl":"https:\/\/www.softwareab.net\/wordpress\/wp-content\/uploads\/2024\/03\/andy-cartoon.jpg","width":400,"height":330,"caption":"Andrew Bruce"},"logo":{"@id":"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/image\/"},"description":"Team-oriented systems mentor with deep knowledge of numerous software methodologies, technologies, languages, and operating systems. Excited about turning emerging technology into working production-ready systems. Focused on moving software teams to a higher level of world-class application development. Specialties:Software analysis and development...Product management through the entire lifecycle...Discrete product integration specialist!","sameAs":["http:\/\/cloudraticsolutions.net\/","https:\/\/www.facebook.com\/cloudraticsolutions\/","https:\/\/twitter.com\/realcloudratics"]}]}},"_links":{"self":[{"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/posts\/955"}],"collection":[{"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/comments?post=955"}],"version-history":[{"count":5,"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/posts\/955\/revisions"}],"predecessor-version":[{"id":963,"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/posts\/955\/revisions\/963"}],"wp:attachment":[{"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/media?parent=955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/categories?post=955"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/tags?post=955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}