{"id":11694,"date":"2017-12-04T14:47:00","date_gmt":"2017-12-04T12:47:00","guid":{"rendered":"https:\/\/blog.zhaw.ch\/icclab\/?p=11694"},"modified":"2018-03-01T12:06:06","modified_gmt":"2018-03-01T10:06:06","slug":"enhancing-openstack-swift-to-support-edge-computing-context","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/","title":{"rendered":"Enhancing OpenStack Swift to support edge computing context"},"content":{"rendered":"<p>As the trend continues to move towards Serverless Computing, Edge Computing and Functions as a Service (FaaS), the need for a storage system that can adapt to these architectures grows ever bigger. In a scenario where smart cars have to make decisions on a whim, there is no chance for that car to ask a data center what to do in this scenario. These scenarios constitute a driver for new storage solutions in more distributed architectures. In our work, we have been considering a scenario in which there is a distributed storage solution which exposes different local endpoints to applications distributed over a mix of cloud and local resources; such applications can give the storage infrastructure and indicator of the nature of the data which can then be used to determine where it should be stored. For example, data could be considered to be either latency-sensitive (in which case the storage system should try to store it as locally as possible) or loss sensitive (in which case the storage system should ensure it is on reliable storage).<!--more--><\/p>\n<p>Because Object Storage is very fitting for the idea of FaaS (<a href=\"https:\/\/blog.zhaw.ch\/icclab\/on-storage-computation-for-a-serverless-environment\/\">see here<\/a>) we decided to use OpenStack Swift &#8211; with which we had some experience &#8211; and make some modifications to support an edge computing context. The way we envisioned Swift to work in this scenario is that there are two Swift instances, one being the local or edge deployment and the other being the remote or data center deployment, each of which offers a local endpoint to a distributed application: functionality running on the edge can communicate with the edge Swift instance; functionality running in the cloud can access the cloud Swift instance. When data is latency-sensitive it is usually stored on the edge and when it is to be more persistently saved it will be pushed to the data center where there are more resources and storage space to appropriately save of the data.<\/p>\n<h1>Approach 1: modifying the proxy server<\/h1>\n<p>The first Approach we considered was to modify the Swift Proxy Server in a way that can&nbsp; distinguish between the different types of data. The path to an object in Swift is&nbsp;<code>http:\/\/localhost:8080\/v1\/AUTH_test\/container\/object<\/code>, we used this to make the data distinguishable. At first we thought about adding metadata to an object when uploading it to identify where the object should be stored. This didn&#8217;t work for us as we had trouble parsing the metadata at the point where we implemented the distinction if the object is to be stored remote or local. So the approach was designed with the idea that if the container name contained an indicator that the object is to be pushed remote from the current Swift storage. This indicator was added as a prefix for the container name called <code>'remote_'<\/code> This was implemented in the proxy-server by parsing the path of the object and looking for the indicator. So a call to the remote Swift would look something like this: <code>http:\/\/localhost:8080\/v1\/AUTH_test\/remote_container\/object<\/code><\/p>\n<p>The changes in code have been made in <code>\/swift\/swift\/proxy\/server.py<\/code> which is the entry point to the whole Swift environment. The <code>get_controller<\/code> method was the method where we implemented our changes, as there the controllers for the account, container and the object get instantiated and this is where the code needs to make the distinction before it pushes the object locally.<\/p>\n<h3>Results<\/h3>\n<p>The test environment consists of three VMs, all of them are running:<\/p>\n<ul>\n<li>Ubuntu 16.04<\/li>\n<li>4GB RAM<\/li>\n<li>2 VCPU<\/li>\n<li>40GB disk space<\/li>\n<\/ul>\n<p>The VMs are meant to simulate three different setups:<\/p>\n<ul>\n<li>A device that accesses the Swift storage<\/li>\n<li>An edge &#8220;micro data center&#8221; that&nbsp; should represent limited storage capacity, but low latency<\/li>\n<li>And the cloud, which is to represent higher storage capacity, redundancy but a higher latency<\/li>\n<\/ul>\n<p>With tc qdisc we added the latency between the VMs to have some similar results as what we expect to be the round trip delay between these machines.<\/p>\n<p><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11708\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png\" alt=\"\" width=\"462\" height=\"71\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png 462w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch-300x46.png 300w\" sizes=\"auto, (max-width: 462px) 100vw, 462px\" \/><\/a><\/p>\n<p>The way the tests were done is that from the device VM a HTTP request has been made with curl to first upload files of sizes from 10kb up to 100mb.<\/p>\n<p>First the uploads &#8211; using a HTTP PUT with curl &#8211; were done without the remote indicator so that all the files are stored on the edge (blue line). Afterwards the uploads with the remote indicator were done, so that swift automatically pushes the file on to the cloud (red line).<a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/pr_put.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11705 size-full\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/pr_put.png\" alt=\"\" width=\"588\" height=\"334\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/pr_put.png 588w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/pr_put-300x170.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/pr_put-500x284.png 500w\" sizes=\"auto, (max-width: 588px) 100vw, 588px\" \/><\/a><\/p>\n<p>The object was retrieved using HTTP GET with curl to get each file from the edge and from the cloud alike.<\/p>\n<p><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/pr_get.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11704\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/pr_get.png\" alt=\"\" width=\"587\" height=\"329\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/pr_get.png 587w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/pr_get-300x168.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/pr_get-500x280.png 500w\" sizes=\"auto, (max-width: 587px) 100vw, 587px\" \/><\/a><\/p>\n<p>As the graphs can quite clearly show this approach is slow and absolutely not imaginable in a production deployment. The scaling is very bad and nowhere near useful in a daily use. Both the put and the get are very slow, but the way the get scaled is so much worse than the upload that we had to scrape this idea, because we didn&#8217;t believe that optimizing our code would help much.<\/p>\n<h1>Approach 2: write a middleware<\/h1>\n<p>As the results from the modified proxy server show that this is an approach that is not viable we decided to try something more normal in the Swift universe, which is to write a middleware for Swift to handle the redirects. Middlewares in Swift are compareable to Lego pieces that can be plugged into the pipeline, which defines the codeflow of Swift. and can be used to add extra functionalities such as access controls, authentications, logging etc. The default pipeline of swift looks like this (it can be found in the configuration file of the proxy server)<\/p>\n<pre><code>[pipeline:main]\r\n# This sample pipeline uses tempauth and is used for SAIO dev work and\r\n# testing.\r\npipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk tempurl ratelimit crossdomain authtoken keystoneauth tempauth  formpost staticweb copy container-quotas account-quotas slo dlo versioned_writes proxy-logging  proxy-serve<\/code><\/pre>\n<p>When writing your own middleware you have to add your middleware in the pipeline and add the configurations for it. We advise you to add your <code>.py<\/code> file which is the middleware in to the <code>\/swift\/swift\/common\/middleware<\/code> directory. By doing this and adding the entrypoint of your middleware to the following file: <code>\/swift\/swift.egg-info\/entry-points.txt<\/code> like this:<\/p>\n<pre><code>redirectmiddleware = swift.common.middleware.redirectmiddleware:redirect_factory<\/code><\/pre>\n<div class=\"smsInfoHolder\">After adding all the files of your middleware and adding the configurations restart Swift and your middleware should be running in the Swift middleware. For more info on how to write a Swift middleware the following two links are recommended: <a href=\"https:\/\/julien.danjou.info\/blog\/2013\/extending-swift-with-a-middleware-clamav\">Example with ClamAV<\/a> and <a href=\"https:\/\/docs.openstack.org\/swift\/latest\/development_middleware.html\">OS documentation on Swift Middleware<\/a>.<\/div>\n<div>&nbsp;<\/div>\n<div>The way our redirect middleware works is that it will, similar to the first approach, look for the remote indicator, but this time everything happens inside the new middleware and there is no need to go change the working Swift code. The purpose of middlewares is exactly that, introducing something into the Swift codeflow without having to get into code that already exists. When there is a remote indicator the middleware will then return a 307 HTTP response with the URL to the remote Swift installation.<\/div>\n<div>&nbsp;<\/div>\n<div>The biggest issue with running a middleware like this is authentication. The problem we ran into is the authentication on the remote machine. The redirect will work but it will try to use the same auth_token that it used on the local Swift. The workaround we use at the moment is that the authentication token is hard coded to be the same in both Swift environments, not a very good solution, but it makes performance tests a whole lot easier.<\/div>\n<div>&nbsp;<\/div>\n<h3>Results<\/h3>\n<p>The test setup was the same with the only difference being that the middleware is added to this Swift instead of having the proxy server modified. As graphs show the performance is significantly better than the previous approach.<\/p>\n<p>The results for remote uploads scale more parallel to the local uploads than with the first approach which makes this approach more realistic to imagine being used in a daily scenario. Of course the performance could improve and the issue with authentication is not yet solved for this scenario, but we believe it to be the better solution, especially compared to the first approach.<\/p>\n<p><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/mw_put.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11700\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/mw_put.png\" alt=\"\" width=\"586\" height=\"326\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/mw_put.png 586w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/mw_put-300x167.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/mw_put-500x278.png 500w\" sizes=\"auto, (max-width: 586px) 100vw, 586px\" \/><\/a><\/p>\n<p>The HTTP GET doesn&#8217;t scale as well as the PUT, the time gap between the remote and the local downloads gets bigger by the size of the objects. The download time for bigger files is significantly longer for remote files than for local files, yet still a lot better than the previous approach.<\/p>\n<p><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/mw_get.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11699\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/mw_get.png\" alt=\"\" width=\"586\" height=\"325\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/mw_get.png 586w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/mw_get-300x166.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/mw_get-500x277.png 500w\" sizes=\"auto, (max-width: 586px) 100vw, 586px\" \/><\/a><\/p>\n<h1>&nbsp;<\/h1>\n<h1>Lessons learnt<\/h1>\n<p>After spending quite some time looking into the inner workings of Swift, I can say we learnt a lot about Swift and how it works and handles requests. Also I believe we can say that the code of Swift should not be touched or changed in a deployed or even a test environment as it&#8217;s very intricate and has a lot of components. If you want to try to change some code in Swift we advise you to create a simple VM to test your changes and get comfortable with how Swift works (a tutorial to creating a Swift VM can be found on this blog very soon). As for functionality that you want to introduce in to the Swift code writing a Swift Middleware is highly advised. It will make your life a lot easier and it&#8217;s intended to be used in that way.<\/p>\n<h1>Future direction<\/h1>\n<p>One thing that could be looked inot is a solution where Swift could take data and independently decide if the object is to be stored locally or remote without the user input or indicator. Another thing that would be good to look into, is the possibility to use metadata to label the objects instead of using indicators in the container names. The last issue that would need to be resolved is the authentication issue that at the moment doesn&#8217;t allow the redirect.<\/p>\n<div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/cloud\/\">cloud<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/edge\/\">edge<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/faas\/\">faas<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/object-storage\/\">object storage<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/openstack\/\">openstack<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/storage\/\">storage<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/swift\/\">swift<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>As the trend continues to move towards Serverless Computing, Edge Computing and Functions as a Service (FaaS), the need for a storage system that can adapt to these architectures grows ever bigger. In a scenario where smart cars have to make decisions on a whim, there is no chance for that car to ask a [&hellip;]<\/p>\n","protected":false},"author":151,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1],"tags":[79,889,820,888,240,314,453],"features":[],"class_list":["post-11694","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cloud","tag-edge","tag-faas","tag-object-storage","tag-openstack","tag-storage","tag-swift"],"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>Enhancing OpenStack Swift to support edge computing context - 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\/enhancing-openstack-swift-to-support-edge-computing-context\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Enhancing OpenStack Swift to support edge computing context\" \/>\n<meta property=\"og:description\" content=\"As the trend continues to move towards Serverless Computing, Edge Computing and Functions as a Service (FaaS), the need for a storage system that can adapt to these architectures grows ever bigger. In a scenario where smart cars have to make decisions on a whim, there is no chance for that car to ask a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Engineering (ICCLab &amp; SPLab)\" \/>\n<meta property=\"article:published_time\" content=\"2017-12-04T12:47:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-03-01T10:06:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png\" \/>\n<meta name=\"author\" content=\"anke\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"anke\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/\"},\"author\":{\"name\":\"anke\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/5273d3e0c0aa9893554dde8b6a3ba991\"},\"headline\":\"Enhancing OpenStack Swift to support edge computing context\",\"datePublished\":\"2017-12-04T12:47:00+00:00\",\"dateModified\":\"2018-03-01T10:06:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/\"},\"wordCount\":1592,\"commentCount\":1,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png\",\"keywords\":[\"cloud\",\"edge\",\"faas\",\"object storage\",\"openstack\",\"storage\",\"swift\"],\"articleSection\":[\"*.*\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/\",\"name\":\"Enhancing OpenStack Swift to support edge computing context - Service Engineering (ICCLab &amp; SPLab)\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png\",\"datePublished\":\"2017-12-04T12:47:00+00:00\",\"dateModified\":\"2018-03-01T10:06:06+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/5273d3e0c0aa9893554dde8b6a3ba991\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#primaryimage\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png\",\"contentUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/icclab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Enhancing OpenStack Swift to support edge computing context\"}]},{\"@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\/5273d3e0c0aa9893554dde8b6a3ba991\",\"name\":\"anke\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/ab37351cc12863d0db77de05c086213ce89e2a19a688bf41ad56ef1a61ff365c?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ab37351cc12863d0db77de05c086213ce89e2a19a688bf41ad56ef1a61ff365c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ab37351cc12863d0db77de05c086213ce89e2a19a688bf41ad56ef1a61ff365c?s=96&d=mm&r=g\",\"caption\":\"anke\"},\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/author\/anke\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Enhancing OpenStack Swift to support edge computing context - 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\/enhancing-openstack-swift-to-support-edge-computing-context\/","og_locale":"en_US","og_type":"article","og_title":"Enhancing OpenStack Swift to support edge computing context","og_description":"As the trend continues to move towards Serverless Computing, Edge Computing and Functions as a Service (FaaS), the need for a storage system that can adapt to these architectures grows ever bigger. In a scenario where smart cars have to make decisions on a whim, there is no chance for that car to ask a [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/","og_site_name":"Service Engineering (ICCLab &amp; SPLab)","article_published_time":"2017-12-04T12:47:00+00:00","article_modified_time":"2018-03-01T10:06:06+00:00","og_image":[{"url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png","type":"","width":"","height":""}],"author":"anke","twitter_card":"summary_large_image","twitter_misc":{"Written by":"anke","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/"},"author":{"name":"anke","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/5273d3e0c0aa9893554dde8b6a3ba991"},"headline":"Enhancing OpenStack Swift to support edge computing context","datePublished":"2017-12-04T12:47:00+00:00","dateModified":"2018-03-01T10:06:06+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/"},"wordCount":1592,"commentCount":1,"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png","keywords":["cloud","edge","faas","object storage","openstack","storage","swift"],"articleSection":["*.*"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/","url":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/","name":"Enhancing OpenStack Swift to support edge computing context - Service Engineering (ICCLab &amp; SPLab)","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png","datePublished":"2017-12-04T12:47:00+00:00","dateModified":"2018-03-01T10:06:06+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/5273d3e0c0aa9893554dde8b6a3ba991"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#primaryimage","url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png","contentUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/11\/redirect-vm_arch.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/icclab\/enhancing-openstack-swift-to-support-edge-computing-context\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/icclab\/"},{"@type":"ListItem","position":2,"name":"Enhancing OpenStack Swift to support edge computing context"}]},{"@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\/5273d3e0c0aa9893554dde8b6a3ba991","name":"anke","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ab37351cc12863d0db77de05c086213ce89e2a19a688bf41ad56ef1a61ff365c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ab37351cc12863d0db77de05c086213ce89e2a19a688bf41ad56ef1a61ff365c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ab37351cc12863d0db77de05c086213ce89e2a19a688bf41ad56ef1a61ff365c?s=96&d=mm&r=g","caption":"anke"},"url":"https:\/\/blog.zhaw.ch\/icclab\/author\/anke\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/11694","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\/151"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/comments?post=11694"}],"version-history":[{"count":12,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/11694\/revisions"}],"predecessor-version":[{"id":11891,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/11694\/revisions\/11891"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/media?parent=11694"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/categories?post=11694"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/tags?post=11694"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/features?post=11694"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}