{"id":3520,"date":"2013-10-06T14:50:46","date_gmt":"2013-10-06T14:50:46","guid":{"rendered":"http:\/\/www.cloudcomp.ch\/?p=3520"},"modified":"2019-08-05T14:00:26","modified_gmt":"2019-08-05T12:00:26","slug":"openstack-development-process","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/","title":{"rendered":"OpenStack Development Process"},"content":{"rendered":"\n<p>by <a href=\"https:\/\/blog.zhaw.ch\/icclab\/josef-spillner\/\">Josef Spillner<\/a><\/p>\n\n\n<p><strong>Preface<\/strong><\/p>\n<p><a title=\"openstack\" href=\"http:\/\/www.openstack.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenStack<\/a> is a cloud computing project to provide an infrastructure as a service (IaaS). It is free open source software released under the terms of the Apache License. The project is managed by the <a title=\"openstack\" href=\"http:\/\/www.openstack.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenStack<\/a>&nbsp;Foundation, a non-profit corporate entity established in September 2012 to promote <a title=\"openstack\" href=\"http:\/\/www.openstack.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenStack<\/a> software and its community. More than 200 companies joined the project.<br>\nHow you can understand that is large project with hundreds of developers, hundreds of thousands lines of code. This topic will make clear development process in <a title=\"openstack\" href=\"http:\/\/www.openstack.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenStack<\/a> and how to push the code into <a title=\"openstack\" href=\"http:\/\/www.openstack.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenStack<\/a>.<\/p>\n<p><strong>Start OpenStack development<\/strong><\/p>\n<p><strong>1. Signing up for accounts:<\/strong><\/p>\n<p>The first thing you should do is signing up for <a title=\"launchpad\" href=\"https:\/\/launchpad.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">LaunchPad<\/a> account. <a title=\"launchpad\" href=\"https:\/\/launchpad.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">LaunchPad<\/a> is a web application and website that allows users to develop and maintain software, particularly open-source software. Launchpad is developed and maintained by Canonical Ltd. The <a title=\"openstack\" href=\"http:\/\/www.openstack.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenStack<\/a> project uses <a title=\"launchpad\" href=\"https:\/\/launchpad.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">LaunchPad<\/a> for mailing list, blueprints, groups, bug tracking. Each <a title=\"openstack\" href=\"http:\/\/www.openstack.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenStack<\/a> project will have a <a title=\"launchpad\" href=\"https:\/\/launchpad.net\/\" target=\"_blank\" rel=\"noopener noreferrer\">LaunchPad<\/a> project. &nbsp;You can create account <a title=\"launchpad\" href=\"https:\/\/login.launchpad.net\/+new_account\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n<p>The next you should signing up in <a title=\"gerrit\" href=\"https:\/\/review.openstack.org\" target=\"_blank\" rel=\"noopener noreferrer\">Gerrit<\/a>. <a title=\"gerrit\" href=\"https:\/\/review.openstack.org\" target=\"_blank\" rel=\"noopener noreferrer\">Gerrit<\/a> is a free, web-based team software code review tool. Software developers in a team can review each other&#8217;s modifications on their source code using a Web browser and approve or reject those changes. It integrates closely with Git, a distributed version control system. To interact with <a title=\"gerrit\" href=\"https:\/\/review.openstack.org\" target=\"_blank\" rel=\"noopener noreferrer\">Gerrit<\/a> you need to set SSH key. Because all <a title=\"gerrit\" href=\"https:\/\/review.openstack.org\" target=\"_blank\" rel=\"noopener noreferrer\">Gerrit<\/a> commands are using&nbsp;SSH&nbsp;protocol and the host port is 29418. A user can access <a title=\"gerrit\" href=\"https:\/\/review.openstack.org\" target=\"_blank\" rel=\"noopener noreferrer\">Gerrit&#8217;s<\/a> Git repositories with SSH&nbsp;or&nbsp;HTTP&nbsp;protocols. The user must have registered in <a title=\"gerrit\" href=\"https:\/\/review.openstack.org\" target=\"_blank\" rel=\"noopener noreferrer\">Gerrit<\/a> and a public&nbsp;SSH&nbsp;key before any command line commands can be used.<\/p>\n<p><strong>2.&nbsp;Communication tools:<\/strong><strong>&nbsp;<\/strong><\/p>\n<p>You should be on <a title=\"openstack\" href=\"http:\/\/www.openstack.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">OpenStack&#8217;s<\/a> mailing list and also on your OpenStack project&#8217;s mailing list. It&#8217;s necessary to take part in discussions about code development, project design etc. You can subscribe to mailing list according this <a title=\"mailing list\" href=\"https:\/\/wiki.openstack.org\/wiki\/Mailing_Lists\" target=\"_blank\" rel=\"noopener noreferrer\">instruction<\/a>.<\/p>\n<p>Also for quick answers you can use the IRC channels. It can be questions about how to work with particular methods or about why tests fail. Every week you should take part on IRC meeting of your project where you can discuss some release detail or your own bugs etc. Information about IRC channels you can find <a title=\"irc\" href=\"https:\/\/wiki.openstack.org\/wiki\/IRC\" target=\"_blank\" rel=\"noopener noreferrer\">here<\/a>.<\/p>\n<p><strong>3. Setting up development environment:<\/strong><\/p>\n<p>You can develop on any system you want but the most used and the most comfortable for this aim is Ubuntu. The first thing you need it is Git. In software development, Git is a distributed revision control and source code management (SCM) system with an emphasis on speed. You need Git to pull and push code into Gerrit.<\/p>\n<p>The next step is DevStack.&nbsp;DevStack&#8217;s mission is to provide and maintain tools used for the installation of the central OpenStack services from source (git repository master, or specific branches) suitable for development and operational testing. It also demonstrates and documents examples of configuring and running services as well as command line client usage.<\/p>\n<p><code>git clone git:\/\/github.com\/openstack-dev\/devstack.git<\/code><br>\n<code>cd devstack; .\/stack.sh<\/code><\/p>\n<p>Now you can get an Openstack project:<\/p>\n<p><code>git clone https:\/\/git.openstack.org\/openstack\/ceilometer<\/code><\/p>\n<p>This topic not about development of ceilometer so let skip it. Let image that you already have a complete code.<br>\nYou need install a pip. Pip is a tool for installing and managing Python packages.<\/p>\n<p><code> sudo apt-get install python pip<\/code><\/p>\n<p>Mostly you need pip for install a tox.<\/p>\n<p><code>sudo pip install tox<\/code><\/p>\n<p><a title=\"OpenStack\" href=\"https:\/\/wiki.openstack.org\/wiki\/OpenStack\">OpenStack<\/a>&nbsp;has a lot of projects. For each project, the&nbsp;<a title=\"OpenStack\" href=\"https:\/\/wiki.openstack.org\/wiki\/OpenStack\">OpenStack<\/a>&nbsp;Jenkins needs to be able to perform a lot of tasks. If each project has a slightly different way to accomplish those tasks, it makes the management of a consistent testing infrastructure very difficult to deal with. Additionally, because of the high volume of development changes and testing, the testing infrastructure has to be able to pre-cache artifacts that are normally fetched over the internet. To that end, each project should support a consistent interface for driving tests and other necessary tasks.<\/p>\n<ul>\n<li><code>tox -epy26<\/code> &#8211;&nbsp;Unit tests for python2.6<\/li>\n<li><code>tox -epy27<\/code> &#8211;&nbsp;Unit tests for python2.7<\/li>\n<li><code>tox -epep8<\/code> &#8211; &nbsp;pep8 checks<\/li>\n<\/ul>\n<p>If all tests are running you can already pull the code into Gerrit.<\/p>\n<p><strong>4.Publication code:<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" alt=\"\" src=\"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png\" width=\"600\" height=\"300\"><\/p>\n<p>Simply running&nbsp;<b>git review<\/b>&nbsp;should be sufficient to push your changes to Gerrit, assuming your repository is set up as described above, you don&#8217;t need to read the rest of this section unless you want to use an alternate workflow.<\/p>\n<p>If you want to push your changes without using git-review, you can push changes to gerrit like you would any other git repository, using the following syntax (assuming &#8220;gerrit&#8221; is configured as a remote repository):<\/p>\n<p><code>git push gerrit HEAD:refs\/for\/$BRANCH[\/$TOPIC]<\/code><\/p>\n<p>Where $BRANCH is the name of the Gerrit branch to push to (usually &#8220;master&#8221;), and you may optionally specify a Gerrit topic by appending it after a slash character.<\/p>\n<p>If you want to commit changes: Git commit messages&nbsp;should start with a short 50 character or less summary in a single paragraph. The following paragraph(s) should explain the change in more detail.<\/p>\n<p>If your changes addresses a blueprint or a bug, be sure to mention them in the commit message using the following syntax:<\/p>\n<p><code>blueprint BLUEPRINT<br>\nCloses-Bug: ####### (Partial-Bug or Related-Bug are options)<\/code><br>\nFor example:<br>\n<code>Adds keystone support<\/code><\/p>\n<p><code>...Long multiline description of the change...<\/code><\/p>\n<p><code>Implements: blueprint authentication<br>\nCloses-Bug: #123456<br>\nChange-Id: I4946a16d27f712ae2adf8441ce78e6c0bb0bb657<\/code><\/p>\n<p><strong>5.Code review:&nbsp;<\/strong><\/p>\n<p>Automatic testing occurs and the results are displayed. Reviewers comment in the comment box or in the code itself.<\/p>\n<p>If someone leaves an in-line comment, you can see it from expanded &#8220;Patch Set.&#8221; &#8220;Comments&#8221; column shows how many comments are in each file. If you click a file name that has comments, the new page shows a diff page with the reviewer&#8217;s name and comments. Click &#8220;Reply&#8221; and write your response. It is saved as a draft if you click &#8220;Save.&#8221; Now, go back to the page that shows a list of patch sets and click &#8220;Review,&#8221; and then, click &#8220;Publish comments.&#8221;<\/p>\n<p>If your code is not ready for review, click &#8220;Work in Progress&#8221; to indicate that a reviewer does not need to review it for now. Note that the button is invisible until you login the site.<\/p>\n<p><strong>&nbsp;<\/strong><\/p>","protected":false},"excerpt":{"rendered":"<p>Preface OpenStack is a cloud computing project to provide an infrastructure as a service (IaaS). It is free open source software released under the terms of the Apache License. The project is managed by the OpenStack&nbsp;Foundation, a non-profit corporate entity established in September 2012 to promote OpenStack software and its community. More than 200 companies [&hellip;]<\/p>\n","protected":false},"author":486,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[5,15],"tags":[],"features":[],"class_list":["post-3520","post","type-post","status-publish","format-standard","hentry","category-articles","category-howtos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>OpenStack Development Process - Service Engineering (ICCLab &amp; SPLab)<\/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:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OpenStack Development Process\" \/>\n<meta property=\"og:description\" content=\"Preface OpenStack is a cloud computing project to provide an infrastructure as a service (IaaS). It is free open source software released under the terms of the Apache License. The project is managed by the OpenStack&nbsp;Foundation, a non-profit corporate entity established in September 2012 to promote OpenStack software and its community. More than 200 companies [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Engineering (ICCLab &amp; SPLab)\" \/>\n<meta property=\"article:published_time\" content=\"2013-10-06T14:50:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-05T12:00:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png\" \/>\n<meta name=\"author\" content=\"icclab\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"icclab\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/\"},\"author\":{\"name\":\"icclab\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\"},\"headline\":\"OpenStack Development Process\",\"datePublished\":\"2013-10-06T14:50:46+00:00\",\"dateModified\":\"2019-08-05T12:00:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/\"},\"wordCount\":989,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png\",\"articleSection\":[\"Articles\",\"HowTos\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/\",\"name\":\"OpenStack Development Process - Service Engineering (ICCLab &amp; SPLab)\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png\",\"datePublished\":\"2013-10-06T14:50:46+00:00\",\"dateModified\":\"2019-08-05T12:00:26+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#primaryimage\",\"url\":\"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png\",\"contentUrl\":\"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/icclab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OpenStack Development Process\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/\",\"name\":\"Service Engineering (ICCLab &amp; SPLab)\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\",\"name\":\"icclab\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"caption\":\"icclab\"},\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/author\/icclab\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"OpenStack Development Process - Service Engineering (ICCLab &amp; SPLab)","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:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/","og_locale":"en_US","og_type":"article","og_title":"OpenStack Development Process","og_description":"Preface OpenStack is a cloud computing project to provide an infrastructure as a service (IaaS). It is free open source software released under the terms of the Apache License. The project is managed by the OpenStack&nbsp;Foundation, a non-profit corporate entity established in September 2012 to promote OpenStack software and its community. More than 200 companies [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/","og_site_name":"Service Engineering (ICCLab &amp; SPLab)","article_published_time":"2013-10-06T14:50:46+00:00","article_modified_time":"2019-08-05T12:00:26+00:00","og_image":[{"url":"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png","type":"","width":"","height":""}],"author":"icclab","twitter_card":"summary_large_image","twitter_misc":{"Written by":"icclab","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/"},"author":{"name":"icclab","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563"},"headline":"OpenStack Development Process","datePublished":"2013-10-06T14:50:46+00:00","dateModified":"2019-08-05T12:00:26+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/"},"wordCount":989,"commentCount":0,"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#primaryimage"},"thumbnailUrl":"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png","articleSection":["Articles","HowTos"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/","url":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/","name":"OpenStack Development Process - Service Engineering (ICCLab &amp; SPLab)","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#primaryimage"},"thumbnailUrl":"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png","datePublished":"2013-10-06T14:50:46+00:00","dateModified":"2019-08-05T12:00:26+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#primaryimage","url":"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png","contentUrl":"https:\/\/wiki.openstack.org\/w\/images\/f\/fe\/Contribution_path.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/icclab\/openstack-development-process\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/icclab\/"},{"@type":"ListItem","position":2,"name":"OpenStack Development Process"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/icclab\/#website","url":"https:\/\/blog.zhaw.ch\/icclab\/","name":"Service Engineering (ICCLab &amp; SPLab)","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563","name":"icclab","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","caption":"icclab"},"url":"https:\/\/blog.zhaw.ch\/icclab\/author\/icclab\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/3520","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/users\/486"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/comments?post=3520"}],"version-history":[{"count":1,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/3520\/revisions"}],"predecessor-version":[{"id":12497,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/3520\/revisions\/12497"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/media?parent=3520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/categories?post=3520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/tags?post=3520"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/features?post=3520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}