{"id":45639,"date":"2015-01-16T19:28:28","date_gmt":"2015-01-16T16:28:28","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=45639"},"modified":"2021-12-17T18:15:39","modified_gmt":"2021-12-17T15:15:39","slug":"cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/","title":{"rendered":"Cloud Foundry Internals: How to Create Custom BOSH CLI Plugins"},"content":{"rendered":"<p dir=\"ltr\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright  wp-image-45640\" alt=\"cf-bosh-cli-custom-plugin\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/07\/cf-bosh-cli-custom-plugin.png\" width=\"210\" height=\"162\" \/>An ability to easily extend core functionality is a key for any system\u2019s evolution. Every popular config management or cloud orchestration tool offers a handy and effective way to do so. For instance, <a href=\"https:\/\/docs.chef.io\/workstation\/plugin_knife_custom\/\" target=\"_blank\" rel=\"noopener noreferrer\">knife plugins<\/a> in Chef, <a href=\"https:\/\/puppet.com\/docs\/guides\/custom_functions.html\" target=\"_blank\" rel=\"noopener noreferrer\">custom functions<\/a> in Puppet, and <a href=\"https:\/\/www.terraform.io\/plugin\" target=\"_blank\" rel=\"noopener noreferrer\">terraform plugins<\/a>. Being a complex tool, BOSH also provides out-of-the-box utilities for the purpose. The best option for extending BOSH functionality are plugins for a command-line interface (CLI). In fact, major part of the BOSH command-line utilities are implemented as BOSH plugins: the standard BOSH <a href=\"https:\/\/github.com\/cloudfoundry\/bosh\/tree\/master\/bosh_cli\/lib\/cli\/commands\" target=\"_blank\" rel=\"noopener noreferrer\">commands<\/a>, <a href=\"https:\/\/github.com\/cloudfoundry\/bosh\/tree\/master\/bosh_cli_plugin_micro\" target=\"_blank\" rel=\"noopener noreferrer\">MicroBOSH<\/a>, BOSH <a href=\"https:\/\/github.com\/cloudfoundry\/bosh\/tree\/master\/bosh_cli_plugin_aws\" target=\"_blank\" rel=\"noopener noreferrer\">AWS plugin<\/a>, etc.<\/p>\n<p>Unfortunately, there is no official documentation available on how to create a custom BOSH plugin by yourself, so I decided to compile such a tutorial.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#Where_to_start\" >Where to start?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#Plugin_structure\" >Plugin structure<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#DSL_to_create_a_BOSH_command\" >DSL to create a BOSH command<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#Examples\" >Examples<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#Further_reading\" >Further reading<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Where_to_start\"><\/span>Where to start?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Creating custom plugins for BOSH CLI is pretty easy. Usually, a plugin is a gem with specific class structure. To skip the first steps and avoid creating the whole file structure manually, we wrote the <a href=\"https:\/\/github.com\/Altoros\/bosh-plugin-generator\" target=\"_blank\" rel=\"noopener noreferrer\">BOSH CLI plugin<\/a> to generate a simple plugin for you. You are welcome to take advantage of it.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Plugin_structure\"><\/span>Plugin structure<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>There is no specific naming conventions for BOSH plugins. The main BOSH repository has plugin names built in the following way: <em>bosh_cli_plugin_&lt;plugin-name&gt;<\/em>. Still, you are not forced to do it.<\/p>\n<p>Let\u2019s imagine we want to create a BOSH plugin to perform some \u201cmagic\u201d action. The best gem name for this case I came to was <em>\u201cbosh-magic.\u201d<\/em>\u00a0 This gem is expected to have a special folder structure:<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-45640 aligncenter\" alt=\"cf-bosh-cli-custom-plugin\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/07\/cf-bosh-cli-custom-plugin.png\" width=\"375\" height=\"290\" \/><\/p>\n<p>The <em>.\/lib\/bosh\/cli\/commands\/magic.rb<\/em> file is expected to declare the <em>Bosh::Cli::Command::Magic<\/em> class that is inherited from <em>Bosh::Cli::Command::Base<\/em>. BOSH has a discovery mechanism that loads such classes every time the\u00a0<em>bosh<\/em> binary is executed. You can set up instance methods from <em>Bosh::Cli::Command::Magic<\/em> to be called, when specific command line parameters are passed to the <em>bosh<\/em> binary.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"DSL_to_create_a_BOSH_command\"><\/span>DSL to create a BOSH command<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>To create a BOSH CLI plugin, you can take advantage of a simple DSL (domain specific language) that goes with the <em>bosh_cli<\/em> module. The sample below declares a method that will be called after executing the following command:<\/p>\n<p><pre dir=\"ltr\">bosh say hello \u201cJohn Doe\u201d<\/pre>\n<\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" class=\"size-full wp-image-45641 aligncenter\" alt=\"cf-bosh-cli-plugin\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2019\/07\/cf-bosh-cli-plugin.png\" width=\"640\" \/><\/p>\n<p>The main keyword for this case is <em>&#8220;usage.&#8221;<\/em>\u00a0 The <em>&#8220;usage&#8221;<\/em>\u00a0method describes the way BOSH expects the command to be used. The method that follows this declaration is going to be invoked after a specified command is passed to BOSH. It is a mandatory keyword to create a new command for BOSH. If you try to register an already existing command, BOSH will raise exception. To avoid collision between BOSH commands, it is recommended to use a namespace with a plugin name before your commands.<\/p>\n<p>The next keyword is<em>\u00a0&#8220;desc.&#8221;\u00a0<\/em> It sets a text that will be shown as a help notice. A help message will contain data gathered from the <em>&#8220;option&#8221;\u00a0<\/em>\u00a0field, too. The <em>&#8220;option&#8221;\u00a0<\/em>adds a possible option to your command. The first argument shows how this option can be used. It is parsed with <a href=\"https:\/\/ruby-doc.org\/stdlib-2.2.0\/libdoc\/optparse\/rdoc\/OptionParser.html\" target=\"_blank\" rel=\"noopener noreferrer\">Ruby OptionParser<\/a> and it means you can use all it\u2019s features.<\/p>\n<p>If it has no separators (space or equals sign), it is treated as a boolean flag. Options that have value are passed in the following way: <em>&#8220;&#8211;switch=MANDATORY&#8221;<\/em> or <em>&#8220;&#8211;switch MANDATORY.&#8221;<\/em>\u00a0 If you need to make your parameter optional, put bracket braces around value as it is done here: <em>&#8220;&#8211;switch[=OPTIONAL].&#8221;<\/em>\u00a0 The last argument of the <em>&#8220;option&#8221;\u00a0<\/em>method is a string that appears in a help notice. After the options are parsed, they are stored in the options hash.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Examples\"><\/span>Examples<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>You can find plenty of examples in the BOSH repository, such as implementations of <a href=\"https:\/\/github.com\/cloudfoundry-attic\/oss-docs\/blob\/master\/bosh\/documentation\/bosh_installation.md\" target=\"_blank\" rel=\"noopener noreferrer\">MicroBOSH<\/a>\u00a0or other commands. This example also uses the <a href=\"https:\/\/commerce.boschsecurity.com\/xf\/en\/AMC2-Input-Output-Extension-Boards\/p\/1354705675\/\" target=\"_blank\" rel=\"noopener noreferrer\">BOSH output extension<\/a>. There are a lot of useful methods for output in the core ext: <em>say<\/em>, <em>with_indent<\/em>, <em>header<\/em>, <em>nl<\/em>, <em>err<\/em>, <em>quit<\/em>, <em>pretty_size<\/em>, <em>format_time<\/em>, <em>make_green<\/em>, etc.<\/p>\n<p>Surely, there is nothing better than a good example to learn (except for two good examples):<\/p>\n<ol>\n<li dir=\"ltr\">\n<p dir=\"ltr\"><a href=\"https:\/\/github.com\/cloudfoundry\/bosh\/tree\/master\/bosh_cli_plugin_micro\">MicroBOSH<\/a>, implemented as a BOSH plugin<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\"><a href=\"https:\/\/github.com\/cloudfoundry-attic\/bosh-workspace\">bosh-workspaces<\/a>, a plugin for creating reproducible and upgradable deployments<\/p>\n<\/li>\n<li dir=\"ltr\">\n<p dir=\"ltr\"><a href=\"https:\/\/github.com\/Altoros\/bosh-plugin-generator\">bosh-plugin-generator<\/a>, a simple BOSH plugin to generate other BOSH plugins<\/p>\n<\/li>\n<\/ol>\n<p dir=\"ltr\">The third plugin on the list, <a href=\"https:\/\/github.com\/Altoros\/bosh-plugin-generator\">bosh-plugin-generator<\/a>, was built by us to simplify BOSH CLI plugin development. It generates the base structure for the BOSH CLI plugin. You can install it as a gem:<\/p>\n<p><pre dir=\"ltr\">gem install bosh-plugin-generator<\/pre>\n<\/p>\n<p>After that, you will be able to run <em>\u201cbosh generate plugin example\u201d<\/em>\u00a0 to generate a simple plugin. Hope, you will find my guidelines helpful to create a new useful plugin. Feel free to ask any questions in comments.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/creating-a-bosh-release-for-admin-ui-a-monitoring-tool-for-cloud-foundry\/\">Creating a BOSH Release for Admin UI, a Monitoring Tool for Cloud Foundry<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p dir=\"ltr\">An ability to easily extend core functionality is a key for any system\u2019s evolution. Every popular config management or cloud orchestration tool offers a handy and effective way to do so. For instance, knife plugins in Chef, custom functions in Puppet, and terraform plugins. Being a complex tool, BOSH [&#8230;]<\/p>\n","protected":false},"author":35,"featured_media":45646,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[214],"tags":[873,206],"class_list":["post-45639","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-cloud-native","tag-oss-cloud-foundry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Cloud Foundry Internals: How to Create Custom BOSH CLI Plugins | Altoros<\/title>\n<meta name=\"description\" content=\"This blog post provides guidelines on how to create a custom plugin for BOSH CLI to push the boundaries of the BOSH functionality and significantly boost resolution of application tasks.\" \/>\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.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cloud Foundry Internals: How to Create Custom BOSH CLI Plugins | Altoros\" \/>\n<meta property=\"og:description\" content=\"An ability to easily extend core functionality is a key for any system\u2019s evolution. Every popular config management or cloud orchestration tool offers a handy and effective way to do so. For instance, knife plugins in Chef, custom functions in Puppet, and terraform plugins. Being a complex tool, BOSH [...]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2015-01-16T16:28:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-12-17T15:15:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/01\/Cloud-Foundry-Internals-How-to-Create-Custom-BOSH-CLI-Plugins.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"253\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Alexander Lomov\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Alexander Lomov\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/\",\"name\":\"Cloud Foundry Internals: How to Create Custom BOSH CLI Plugins | Altoros\",\"isPartOf\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/01\/Cloud-Foundry-Internals-How-to-Create-Custom-BOSH-CLI-Plugins.gif\",\"datePublished\":\"2015-01-16T16:28:28+00:00\",\"dateModified\":\"2021-12-17T15:15:39+00:00\",\"author\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/32bad30d8a66fbba345c09f5ce9503a6\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#primaryimage\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/01\/Cloud-Foundry-Internals-How-to-Create-Custom-BOSH-CLI-Plugins.gif\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/01\/Cloud-Foundry-Internals-How-to-Create-Custom-BOSH-CLI-Plugins.gif\",\"width\":640,\"height\":253},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.altoros.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cloud Foundry Internals: How to Create Custom BOSH CLI Plugins\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\",\"url\":\"https:\/\/www.altoros.com\/blog\/\",\"name\":\"Altoros\",\"description\":\"Insight\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.altoros.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/32bad30d8a66fbba345c09f5ce9503a6\",\"name\":\"Alexander Lomov\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Alexander-Lomov-150x150.jpg\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Alexander-Lomov-150x150.jpg\",\"caption\":\"Alexander Lomov\"},\"description\":\"Alexander Lomov is a Cloud Foundry Engineer at Altoros. With extensive experience in Ruby, Go, and Python, he was involved in development of BOSH CPIs and other Cloud Foundry-related projects for Canonical, IBM, and other companies. Alexander is a frequent speaker at various events\/meetups, mostly sharing his experience with Cloud Foundry. You may also know him as the author of several blog posts about Cloud Foundry internals.\",\"sameAs\":[\"http:\/\/altoros.com\"],\"url\":\"https:\/\/www.altoros.com\/blog\/author\/alexander-lomov\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cloud Foundry Internals: How to Create Custom BOSH CLI Plugins | Altoros","description":"This blog post provides guidelines on how to create a custom plugin for BOSH CLI to push the boundaries of the BOSH functionality and significantly boost resolution of application tasks.","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.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/","og_locale":"en_US","og_type":"article","og_title":"Cloud Foundry Internals: How to Create Custom BOSH CLI Plugins | Altoros","og_description":"An ability to easily extend core functionality is a key for any system\u2019s evolution. Every popular config management or cloud orchestration tool offers a handy and effective way to do so. For instance, knife plugins in Chef, custom functions in Puppet, and terraform plugins. Being a complex tool, BOSH [...]","og_url":"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/","og_site_name":"Altoros","article_published_time":"2015-01-16T16:28:28+00:00","article_modified_time":"2021-12-17T15:15:39+00:00","og_image":[{"width":640,"height":253,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/01\/Cloud-Foundry-Internals-How-to-Create-Custom-BOSH-CLI-Plugins.gif","type":"image\/gif"}],"author":"Alexander Lomov","twitter_misc":{"Written by":"Alexander Lomov","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/","url":"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/","name":"Cloud Foundry Internals: How to Create Custom BOSH CLI Plugins | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/01\/Cloud-Foundry-Internals-How-to-Create-Custom-BOSH-CLI-Plugins.gif","datePublished":"2015-01-16T16:28:28+00:00","dateModified":"2021-12-17T15:15:39+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/32bad30d8a66fbba345c09f5ce9503a6"},"breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/01\/Cloud-Foundry-Internals-How-to-Create-Custom-BOSH-CLI-Plugins.gif","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2015\/01\/Cloud-Foundry-Internals-How-to-Create-Custom-BOSH-CLI-Plugins.gif","width":640,"height":253},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/cloud-foundry-internals-how-to-create-custom-bosh-cli-plugins\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Cloud Foundry Internals: How to Create Custom BOSH CLI Plugins"}]},{"@type":"WebSite","@id":"https:\/\/www.altoros.com\/blog\/#website","url":"https:\/\/www.altoros.com\/blog\/","name":"Altoros","description":"Insight","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.altoros.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/32bad30d8a66fbba345c09f5ce9503a6","name":"Alexander Lomov","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Alexander-Lomov-150x150.jpg","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2016\/12\/Alexander-Lomov-150x150.jpg","caption":"Alexander Lomov"},"description":"Alexander Lomov is a Cloud Foundry Engineer at Altoros. With extensive experience in Ruby, Go, and Python, he was involved in development of BOSH CPIs and other Cloud Foundry-related projects for Canonical, IBM, and other companies. Alexander is a frequent speaker at various events\/meetups, mostly sharing his experience with Cloud Foundry. You may also know him as the author of several blog posts about Cloud Foundry internals.","sameAs":["http:\/\/altoros.com"],"url":"https:\/\/www.altoros.com\/blog\/author\/alexander-lomov\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/45639","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=45639"}],"version-history":[{"count":9,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/45639\/revisions"}],"predecessor-version":[{"id":65758,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/45639\/revisions\/65758"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/45646"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=45639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=45639"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=45639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}