{"id":171,"date":"2014-08-25T22:10:02","date_gmt":"2014-08-25T22:10:02","guid":{"rendered":"http:\/\/outworx.com\/blog\/?p=171"},"modified":"2014-08-29T00:27:23","modified_gmt":"2014-08-29T00:27:23","slug":"widows-azure-packswift-integration","status":"publish","type":"post","link":"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/","title":{"rendered":"Widows Azure Pack\/Swift Integration"},"content":{"rendered":"<p>Windows Azure Pack (WAP) is Microsoft&#8217;s private cloud offering.\u00a0 It offers a subset of the features found in Azure, Microsoft&#8217;s public cloud.\u00a0 What makes WAP nice for the user is that the portal and APIs are the same in both clouds.\u00a0 If you know how to use Azure, you&#8217;ll know how to use WAP, and vice versa.<\/p>\n<p>Microsoft has also done a very nice on their control portal. \u00a0 Tenants can use it to subscribe to resources and monitor them.\u00a0 It has a clean look and is very easy to use.<\/p>\n<p>At one major bank, their user community loved the simplicity of Azure and WAP, but they also wanted blob storage.\u00a0 Since blob storage is offered in Azure, but not WAP, OutworX undertook a project to provide blob storage in WAP.<\/p>\n<p>WAP provides access points for writing a Custom Resource Provider (CRP).\u00a0 By writing . NET code that follows the CRP specification, you can hook any kind of resource into the the WAP portal.\u00a0 We decided to write a CRP for Swift, OpenStack&#8217;s blob storage.<\/p>\n<p>Swift is an enterprise-ready open source blob storage system.\u00a0 It handles HA issues automatically, and can be set-up in Disaster Recovery configurations.\u00a0 Its RESTful API is fairly straightforward to use.<\/p>\n<p>We integrated Swift into WAP&#8217;s Management and Tenant Portals.\u00a0 In the Management Portal, IT administrators can now integrate a Swift cluster by supplying the administrative credentials for Swift&#8217;s Keystone server.\u00a0 (Keystone is the standard identity server in OpenStack.)\u00a0 The credentials are stored in a database.\u00a0 When a tenant sings up for a storage account on that cluster, we transparently use these admin credentials to create a new Swift storage account behind the scenes on behalf of the tenant.<\/p>\n<p>Both WAP and Keystone support federated identity configurations.\u00a0 We may implement these in the future in our integration.\u00a0 However, for simplicity, we chose to simply store the Keystone admin credentials in plain text in our database.\u00a0 This is consistent with the default configuration for OpenStack, which often lists passwords in plaintext in configuration files.\u00a0 Obviously production environments would require more robust security.\u00a0 OpenStack would need to be hardened, and our database could be protected with some form of\u00a0 <a title=\"Transparent Data Encryption\" href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/bb934049.aspx\" target=\"_blank\">TDE<\/a>.<\/p>\n<p>When a WAP user signs up for a storage account, we create a corresponding Keystone user in the OpenStack cluster.\u00a0\u00a0 We give that Keystone user admin privileges for the Swift account, but not for Keystone.\u00a0 We also create a second Keystone user called <em>Swift-Storage-Account-Name<\/em>-api-user.\u00a0 For example, if the Azure tenant created an account called &#8216;mypictures&#8217;, the second user would be called &#8216;mypictures-api-user&#8217;.<\/p>\n<p>This second *-api-user account has only normal CRUD privileges for the Swift storage account.\u00a0 In particular, the user cannot add or delete other users.\u00a0 The idea behind this second account is that its credentials can be given to programmers who need to access the storage.\u00a0 This lets the Azure tenant retain administrative control over the account while giving non-admin access to the programmer.<\/p>\n<p>It should be noted that programmers still have to use the Swift API.\u00a0 While the Azure API and Swift API have large overlaps in their functionality, there are differences.\u00a0 One of the most significant is that Azure blob storage offers <em>strong consistency<\/em>, while Swift offers <em>eventual consistency<\/em>.\u00a0 In Azure, if you update an existing blob and then immediately read that blob, you&#8217;ll get the updated data.\u00a0 In OpenStack, sometimes you&#8217;ll get the old data since it takes a while to update things\u00b9.<\/p>\n<p>We modeled the user experience in the WAP portal on the Azure portal.\u00a0 As the screenshot below shows, our storage screen looks very similar to what Azure users expect.<\/p>\n<figure id=\"attachment_177\" aria-describedby=\"caption-attachment-177\" style=\"width: 959px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure.png\"><img loading=\"lazy\" class=\"size-full wp-image-177\" src=\"http:\/\/outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure.png\" alt=\"The blob storage screen in OutworX's integration looks very similar to the Azure public portal.\" width=\"959\" height=\"696\" srcset=\"https:\/\/www.outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure.png 959w, https:\/\/www.outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure-300x217.png 300w, https:\/\/www.outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure-413x300.png 413w\" sizes=\"(max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" \/><\/a><figcaption id=\"caption-attachment-177\" class=\"wp-caption-text\">The blob storage screen in OutworX&#8217;s integration looks very similar to the Azure public portal.<\/figcaption><\/figure>\n<p>The end result is that WAP users can sign up and manage Swift storage accounts without ever leaving the WAP portal.\u00a0 This gives them a familiar and easy to use environment.<\/p>\n<p>Other WAP\/OpenStack integrations are also possible.\u00a0 For example, we could use the techniques learned on this project to integrate in <a title=\"Cepth Storage\" href=\"http:\/\/ceph.com\" target=\"_blank\">Ceph<\/a> to give a blob storage that has strong consistency, as well as an advanced filesystem.<\/p>\n<p>____________<\/p>\n<p>\u00b9Swift actually does offer a form of strong consistency, but it is not efficient.\u00a0 If you set the X-Newest flag in the HTML header, it will return data from the newest replica.\u00a0 Because of the expense, the OpenStack documentation warns that this should only be used when absolutely necessary.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Windows Azure Pack (WAP) is Microsoft&#8217;s private cloud offering.\u00a0 It offers a subset of the features found in Azure, Microsoft&#8217;s public cloud.\u00a0 What makes WAP nice for the user is that the portal and APIs are the same in both clouds.\u00a0 If you know how to use Azure, you&#8217;ll know how to use WAP, and &hellip; <a href=\"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Widows Azure Pack\/Swift Integration&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"xn-wppe-expiration":[],"xn-wppe-expiration-action":[],"xn-wppe-expiration-prefix":[],"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0},"categories":[18,16],"tags":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v17.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Widows Azure Pack\/Swift Integration | OutworX<\/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.outworx.com\/blog\/widows-azure-packswift-integration\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Widows Azure Pack\/Swift Integration | OutworX\" \/>\n<meta property=\"og:description\" content=\"Windows Azure Pack (WAP) is Microsoft&#8217;s private cloud offering.\u00a0 It offers a subset of the features found in Azure, Microsoft&#8217;s public cloud.\u00a0 What makes WAP nice for the user is that the portal and APIs are the same in both clouds.\u00a0 If you know how to use Azure, you&#8217;ll know how to use WAP, and &hellip; Continue reading &quot;Widows Azure Pack\/Swift Integration&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/\" \/>\n<meta property=\"og:site_name\" content=\"OutworX\" \/>\n<meta property=\"article:published_time\" content=\"2014-08-25T22:10:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2014-08-29T00:27:23+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\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\":\"WebSite\",\"@id\":\"https:\/\/www.outworx.com\/blog\/#website\",\"url\":\"https:\/\/www.outworx.com\/blog\/\",\"name\":\"OutworX\",\"description\":\"Blogs, News and Updates of IT Industry | OutworX\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.outworx.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"http:\/\/outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure.png\",\"contentUrl\":\"http:\/\/outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure.png\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/#webpage\",\"url\":\"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/\",\"name\":\"Widows Azure Pack\/Swift Integration | OutworX\",\"isPartOf\":{\"@id\":\"https:\/\/www.outworx.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/#primaryimage\"},\"datePublished\":\"2014-08-25T22:10:02+00:00\",\"dateModified\":\"2014-08-29T00:27:23+00:00\",\"author\":{\"@id\":\"https:\/\/www.outworx.com\/blog\/#\/schema\/person\/4a222258173fdc00e104b30c5fc10632\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.outworx.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Widows Azure Pack\/Swift Integration\"}]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.outworx.com\/blog\/#\/schema\/person\/4a222258173fdc00e104b30c5fc10632\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/www.outworx.com\/blog\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/91f39a5ea2f90d0d957945f581465a21?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/91f39a5ea2f90d0d957945f581465a21?s=96&d=mm&r=g\",\"caption\":\"admin\"},\"description\":\"Outworx@Admin\",\"url\":\"https:\/\/www.outworx.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Widows Azure Pack\/Swift Integration | OutworX","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.outworx.com\/blog\/widows-azure-packswift-integration\/","og_locale":"en_US","og_type":"article","og_title":"Widows Azure Pack\/Swift Integration | OutworX","og_description":"Windows Azure Pack (WAP) is Microsoft&#8217;s private cloud offering.\u00a0 It offers a subset of the features found in Azure, Microsoft&#8217;s public cloud.\u00a0 What makes WAP nice for the user is that the portal and APIs are the same in both clouds.\u00a0 If you know how to use Azure, you&#8217;ll know how to use WAP, and &hellip; Continue reading \"Widows Azure Pack\/Swift Integration\"","og_url":"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/","og_site_name":"OutworX","article_published_time":"2014-08-25T22:10:02+00:00","article_modified_time":"2014-08-29T00:27:23+00:00","og_image":[{"url":"http:\/\/outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure.png"}],"twitter_misc":{"Written by":"admin","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"https:\/\/www.outworx.com\/blog\/#website","url":"https:\/\/www.outworx.com\/blog\/","name":"OutworX","description":"Blogs, News and Updates of IT Industry | OutworX","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.outworx.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"ImageObject","@id":"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/#primaryimage","inLanguage":"en-US","url":"http:\/\/outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure.png","contentUrl":"http:\/\/outworx.com\/blog\/wp-content\/uploads\/2014\/08\/TenantPort4SwiftAzure.png"},{"@type":"WebPage","@id":"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/#webpage","url":"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/","name":"Widows Azure Pack\/Swift Integration | OutworX","isPartOf":{"@id":"https:\/\/www.outworx.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/#primaryimage"},"datePublished":"2014-08-25T22:10:02+00:00","dateModified":"2014-08-29T00:27:23+00:00","author":{"@id":"https:\/\/www.outworx.com\/blog\/#\/schema\/person\/4a222258173fdc00e104b30c5fc10632"},"breadcrumb":{"@id":"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.outworx.com\/blog\/widows-azure-packswift-integration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.outworx.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Widows Azure Pack\/Swift Integration"}]},{"@type":"Person","@id":"https:\/\/www.outworx.com\/blog\/#\/schema\/person\/4a222258173fdc00e104b30c5fc10632","name":"admin","image":{"@type":"ImageObject","@id":"https:\/\/www.outworx.com\/blog\/#personlogo","inLanguage":"en-US","url":"https:\/\/secure.gravatar.com\/avatar\/91f39a5ea2f90d0d957945f581465a21?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/91f39a5ea2f90d0d957945f581465a21?s=96&d=mm&r=g","caption":"admin"},"description":"Outworx@Admin","url":"https:\/\/www.outworx.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.outworx.com\/blog\/wp-json\/wp\/v2\/posts\/171"}],"collection":[{"href":"https:\/\/www.outworx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.outworx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.outworx.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.outworx.com\/blog\/wp-json\/wp\/v2\/comments?post=171"}],"version-history":[{"count":8,"href":"https:\/\/www.outworx.com\/blog\/wp-json\/wp\/v2\/posts\/171\/revisions"}],"predecessor-version":[{"id":192,"href":"https:\/\/www.outworx.com\/blog\/wp-json\/wp\/v2\/posts\/171\/revisions\/192"}],"wp:attachment":[{"href":"https:\/\/www.outworx.com\/blog\/wp-json\/wp\/v2\/media?parent=171"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.outworx.com\/blog\/wp-json\/wp\/v2\/categories?post=171"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.outworx.com\/blog\/wp-json\/wp\/v2\/tags?post=171"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}