{"id":857,"date":"2014-10-21T10:02:49","date_gmt":"2014-10-21T15:02:49","guid":{"rendered":"https:\/\/www.softwareab.net\/wordpress\/?p=857"},"modified":"2014-10-29T08:33:58","modified_gmt":"2014-10-29T13:33:58","slug":"openstack-find-orphaned-images-glance","status":"publish","type":"post","link":"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/","title":{"rendered":"OpenStack: Find Orphaned Images in Glance"},"content":{"rendered":"<p>Hello All &#8211; today&#8217;s post is on identifying and removing Glance images that are truly not used anywhere, such as when deleting a project (tenant) without first deleting private images within that project. Check out our script!<\/p>\n<p><!--more--><\/p>\n<p><em><strong>For the impatient:<\/strong> Here is the link to the <strong>updated<\/strong> script: <a href=\"\/wordpress\/wp-content\/uploads\/2014\/10\/os-glance-swift-crosscheck-sh.txt\">os-glance-swift-crosscheck-sh.txt<\/a>. Rename to <code>.sh<\/code> and run it.<\/em><\/p>\n<p>In my lab, I create and delete OpenStack tenants (projects) all the time. And I generally have images I upload to those projects&#8230;so it occurred to me to ask: &#8220;What happens to my tenant-specific projects when I delete the tenant?&#8221;<\/p>\n<p>If you work with OpenStack, you already know the answer: Nothing. The images are just left there. To take up space. Forever. And while you could go into the MySQL database and muck with columns to set ownership GUIDs&#8230;I *hate* that approach. Drives me nuts.<\/p>\n<p>Regardless of whether you plan to delete orphaned images and reclaim space or muck with database tables and (in effect) dynamically reassign an orphaned image, you still gotta know if they exist. Enter today&#8217;s script, which runs against my backing OpenStack Swift storage nodes and uses that information to correlate against OpenStack Glance. A future article will discuss <a href=\"http:\/\/docs.openstack.org\/openstack-ops\/content\/storage_decision.html\">OpenStack Storage Alternatives<\/a> and at some point I&#8217;ll extend the script to handle the <a href=\"http:\/\/docs.ceph.com\/docs\/giant\/rbd\/rbd-openstack\/\">Ceph (rbd devices)<\/a> in my lab; but I probably will never extend the script to handle Glance &#8220;file-backed&#8221; storage. You&#8217;d have to run the script on the Glance host&#8230;and what about <a href=\"http:\/\/docs.openstack.org\/high-availability-guide\/content\/s-glance-api.html\">Glance High Availability<\/a>? <em>(Which I will cover in a <strong>whole series<\/strong> of articles in the future.)<\/em><\/p>\n<p>Let&#8217;s take a look at how you would identify orphaned images. The first step is to find all your underlying images so you have a reference point. The following shows this for Swift storage:<\/p>\n<pre><code>\r\n[l.abruce@co1 rc_scripts(lvosksclu100-rc-admin)]$ <strong>swift --os-tenant-name=service list glance | cut -d'-' -f 1-5 | uniq<\/strong>\r\n<em>10e39389-e1c0-4f8c-b62a-39b3bd466f58\r\n141cdb83-739f-445e-b5a5-5452fd6bffd7\r\n17eb9711-53ec-4076-9b71-cbe86e527a36\r\n1b5693e5-e83d-491e-9754-d6d343e0966a\r\n1d338db3-e74b-4bda-a0e2-eedd294127af\r\n23eae911-eb5e-44e1-a7f5-541730895284\r\n2c108578-079e-445a-9775-e2c0f2c9bdc6\r\n33c6b3b1-77d6-4a62-a6bc-fc7eb52c4cba\r\n3564bda8-d649-4b4a-908e-20fb83e6d774\r\n6440e596-5cfe-4e42-b527-ee252f95991d\r\n65c87bae-d096-4061-8bef-de9943b36934\r\n805e79e5-6b97-41e6-8002-6946b2c03b2f\r\n80afe620-b668-49e8-921b-5c41981854da\r\nce343a10-3dbd-4035-8fe4-5632c5c31147\r\ne51a46cd-5218-478d-952a-860b3190bfa6\r\neb836e22-ca74-459c-99ca-5f288382f8e3\r\nf28f5ac8-72c5-4be9-adb3-0736daf343e9\r\nf6ab2e65-37ef-44cd-a52f-6b8abc825703\r\nf91e19b0-ee6c-4c32-9537-5a2ab9bca34d\r\nfb8a85e3-1ea2-415c-86d6-cacd2c99425c\r\nfe75d026-3385-4f0e-9592-a402cae5a034<\/em>\r\n<\/code><\/pre>\n<p>Now that we have all of our images, we need to correlate each one against Glance. Let&#8217;s pick one at random and do this:<\/p>\n<pre><code>\r\n[l.abruce@co1 rc_scripts(lvosksclu100-rc-admin)]$ <strong>glance image-show fb8a85e3-1ea2-415c-86d6-cacd2c99425c<\/strong>\r\n<em>+------------------+--------------------------------------+\r\n| Property         | Value                                |\r\n+------------------+--------------------------------------+\r\n| checksum         | c1ac2a09f7f662d3b191476741216d3d     |\r\n| container_format | bare                                 |\r\n| created_at       | 2014-09-26T17:55:58                  |\r\n| deleted          | False                                |\r\n| disk_format      | qcow2                                |\r\n| id               | fb8a85e3-1ea2-415c-86d6-cacd2c99425c |\r\n| is_public        | True                                 |\r\n| min_disk         | 0                                    |\r\n| min_ram          | 0                                    |\r\n| name             | 500MbSwift                           |\r\n| owner            | b4ecec89c305404c90c16d79511376a7     |\r\n| protected        | False                                |\r\n| size             | 502480000                            |\r\n| status           | active                               |\r\n| updated_at       | 2014-09-26T17:57:38                  |\r\n+------------------+--------------------------------------+<\/em>\r\n<\/code><\/pre>\n<p>This tells us that the image is in the Glance repository, that it has an owner (<code>b4ecec89c305404c90c16d79511376a7<\/code>), and that it is active. That&#8217;s a good thing, so let&#8217;s write the loop to handle that (given all image IDs in a variable):<\/p>\n<pre><code>\r\nl_tmp=\"\/tmp\/$$.tmp\"\r\nfor i in $l_swift_images; do\r\n  # get info\r\n  if glance image-show $i > $l_tmp 2>\/dev\/null; then\r\n    # extract what we want\r\n    l_image_is_orphan='False'\r\n    l_image_deleted=$(cat $l_tmp | grep -e \"| deleted \" | cut -d'|' -f 3 | sed -e 's#^ \\+##; s#[ \\t]*$##' 2>&1)\r\n    l_image_is_public=$(cat $l_tmp | grep -e \"| is_public \" | cut -d'|' -f 3 | sed -e 's#^ \\+##; s#[ \\t]*$##' 2>&1)\r\n    l_image_name=$(cat $l_tmp | grep -e \"| name \" | cut -d'|' -f 3 | sed -e 's#^ \\+##; s#[ \\t]*$##' 2>&1)\r\n    l_image_owner=$(cat $l_tmp | grep -e \"| owner \" | cut -d'|' -f 3 | sed -e 's#^ \\+##; s#[ \\t]*$##' 2>&1)\r\n    l_image_protected=$(cat $l_tmp | grep -e \"| protected \" | cut -d'|' -f 3 | sed -e 's#^ \\+##; s#[ \\t]*$##' 2>&1)\r\n    l_image_size=$(cat $l_tmp | grep -e \"| size \" | cut -d'|' -f 3 | sed -e 's#^ \\+##; s#[ \\t]*$##' 2>&1)\r\n    l_image_status=$(cat $l_tmp | grep -e \"| status \" | cut -d'|' -f 3 | sed -e 's#^ \\+##; s#[ \\t]*$##' 2>&1)\r\n  fi\r\n\r\n  # show the line\r\n  echo \"$l_image_is_orphan|$l_image_tenant ($l_image_owner)|$l_image_name ($i)|$l_image_size|$l_image_status|$l_image_deleted|$l_image_is_public|$l_image_protected\"\r\ndone\r\nrm -f $l_tmp\r\n<\/code><\/pre>\n<p>So the above is good, but it doesn&#8217;t account for missing owners (OpenStack &#8220;projects&#8221;). Let&#8217;s add some logic that will check for all the conditions we can think of:<\/p>\n<pre><code>\r\n    # get the tenant\r\n    if [ -n \"$l_image_owner\" ]; then\r\n      # do this way to prevent error messages\r\n      keystone tenant-get $l_image_owner 2>\/dev\/null >$l_tmp\r\n      l_rc=$?\r\n      if [ $l_rc -eq 0 ]; then\r\n        # the tenant is valid; get the name\r\n        l_image_tenant=$(cat $l_tmp  | grep -e \"| \\+name \" | cut -d'|' -f 3 | sed -e 's#^ \\+##; s#[ \\t]*$##' 2>&1)\r\n      else\r\n        # we have an orphan; project not found\r\n        l_image_is_orphan='True'\r\n        l_image_tenant=\"[n\/a] ($l_image_owner)\"\r\n      fi\r\n    else\r\n      l_image_tenant=\"none ([n\/a])\"\r\n    fi\r\n<\/code><\/pre>\n<p>Now that we have the pieces, we can build the complete script. It is included for you above, it walks all of the Swift images and validates them against Glance. Let&#8217;s take a look at my output so we can see how I identified my own orphaned images:<\/p>\n<pre><code>\r\nOrphan|Tenant|Name|Size|Status|Deleted|Is_Public|Protected\r\nFalse|none ([n\/a]) ()|DemoTenant (5f9427a1-a978-4db0-8e9a-ca81ae13e213)|1375|active|False|False|False\r\nTrue|[n\/a] (32380da42cdf499caf31c5e5a085107f) (32380da42cdf499caf31c5e5a085107f)|redmine.qcow2 (df26f521-d6a3-40be-af0a-f36675c6971d)|12941000704|active|False|False|False\r\n<\/code><\/pre>\n<p>The above shows two problems: the first line was created without an owner <em>(oh, I have <strong>much more<\/strong> to say about that fiasco!)<\/em> and the second line indicates an image that has an invalid owner (namely, a tenant I deleted). So a couple of quick calls to <code>glance image-delete<\/code> and I&#8217;m all clean again.<\/p>\n<p>Enjoy, and Happy Computing!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello All &#8211; today&#8217;s post is on identifying and removing Glance images that are truly not used anywhere, such as when deleting a project (tenant) without first deleting private images within that project. Check out our script!<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69,5,1],"tags":[67,86,31,71],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>OpenStack: Find Orphaned Images in Glance - 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-find-orphaned-images-glance\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OpenStack: Find Orphaned Images in Glance - softwareab\" \/>\n<meta property=\"og:description\" content=\"Hello All &#8211; today&#8217;s post is on identifying and removing Glance images that are truly not used anywhere, such as when deleting a project (tenant) without first deleting private images within that project. Check out our script!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/\" \/>\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=\"2014-10-21T15:02:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2014-10-29T13:33:58+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=\"6 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-find-orphaned-images-glance\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/\"},\"author\":{\"name\":\"Andrew Bruce\",\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600\"},\"headline\":\"OpenStack: Find Orphaned Images in Glance\",\"datePublished\":\"2014-10-21T15:02:49+00:00\",\"dateModified\":\"2014-10-29T13:33:58+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/\"},\"wordCount\":499,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600\"},\"keywords\":[\"cloud\",\"OpenStack\",\"storage\",\"virtualization\"],\"articleSection\":[\"OpenStack\",\"Storage\",\"Teknocratica\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/\",\"url\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/\",\"name\":\"OpenStack: Find Orphaned Images in Glance - softwareab\",\"isPartOf\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/#website\"},\"datePublished\":\"2014-10-21T15:02:49+00:00\",\"dateModified\":\"2014-10-29T13:33:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.softwareab.net\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"cloud\",\"item\":\"https:\/\/www.softwareab.net\/wordpress\/tag\/cloud-2\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"OpenStack: Find Orphaned Images in Glance\"}]},{\"@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: Find Orphaned Images in Glance - 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-find-orphaned-images-glance\/","og_locale":"en_US","og_type":"article","og_title":"OpenStack: Find Orphaned Images in Glance - softwareab","og_description":"Hello All &#8211; today&#8217;s post is on identifying and removing Glance images that are truly not used anywhere, such as when deleting a project (tenant) without first deleting private images within that project. Check out our script!","og_url":"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/","og_site_name":"softwareab","article_publisher":"https:\/\/www.facebook.com\/cloudraticsolutions\/","article_author":"https:\/\/www.facebook.com\/cloudraticsolutions\/","article_published_time":"2014-10-21T15:02:49+00:00","article_modified_time":"2014-10-29T13:33:58+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":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/#article","isPartOf":{"@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/"},"author":{"name":"Andrew Bruce","@id":"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600"},"headline":"OpenStack: Find Orphaned Images in Glance","datePublished":"2014-10-21T15:02:49+00:00","dateModified":"2014-10-29T13:33:58+00:00","mainEntityOfPage":{"@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/"},"wordCount":499,"commentCount":0,"publisher":{"@id":"https:\/\/www.softwareab.net\/wordpress\/#\/schema\/person\/1337443eaeb75104e0410b508e67f600"},"keywords":["cloud","OpenStack","storage","virtualization"],"articleSection":["OpenStack","Storage","Teknocratica"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/","url":"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/","name":"OpenStack: Find Orphaned Images in Glance - softwareab","isPartOf":{"@id":"https:\/\/www.softwareab.net\/wordpress\/#website"},"datePublished":"2014-10-21T15:02:49+00:00","dateModified":"2014-10-29T13:33:58+00:00","breadcrumb":{"@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.softwareab.net\/wordpress\/openstack-find-orphaned-images-glance\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.softwareab.net\/wordpress\/"},{"@type":"ListItem","position":2,"name":"cloud","item":"https:\/\/www.softwareab.net\/wordpress\/tag\/cloud-2\/"},{"@type":"ListItem","position":3,"name":"OpenStack: Find Orphaned Images in Glance"}]},{"@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\/857"}],"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=857"}],"version-history":[{"count":3,"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/posts\/857\/revisions"}],"predecessor-version":[{"id":879,"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/posts\/857\/revisions\/879"}],"wp:attachment":[{"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/media?parent=857"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/categories?post=857"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.softwareab.net\/wordpress\/wp-json\/wp\/v2\/tags?post=857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}