{"action":"created","comment":{"url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/comments/38441901","id":38441901,"diff_hunk":"@@ -0,0 +1,180 @@\n+---\n+layout: post\n+title: OpenStack SDK 0.6 Released\n+date: 2015-09-01 12:00\n+comments: true\n+author: Brian Curtin\n+published: true\n+categories:\n+    - OpenStack\n+    - SDKs\n+\n+---\n+\n+The developers behind the OpenStack SDK are proud to announce the 0.6 release of the project, aimed at creating a better experience for application developers who use OpenStack clouds via the Python language. If you're a Rackspace customer, this means *you*. With OpenStack SDK 0.6 also comes the 0.3 release of the Rackspace plugin for the SDK.\n+\n+<!-- more -->\n+\n+### Getting Started, Quickly\n+\n+If you just want to dive in, the following will get you going. Check out the [docs](http://python-openstacksdk.readthedocs.org/en/latest/) for the full set of supported services and their APIs, otherwise read on below for more info. If you're not using Rackspace, see the SDK's [usage](http://python-openstacksdk.readthedocs.org/en/latest/users/guides/usage.html) guide for more information how to connect `openstacksdk` to your cloud.\n+\n+1. `pip install rackspacesdk` (this package depends on `openstacksdk`)\n+\n+2. Run `python` (we test with 2.7 and 3.4)\n+\n+3. Create a Connection and work with some services!\n+\n+```\n+Python 3.4.1+ (3.4:d23cea976f46, Jun  7 2014, 13:06:42) \n+>>> from rackspace import connection\n+>>> conn = connection.Connection(username=\"brian\", api_key=\"123\", region=\"IAD\")\n+>>> for server in conn.compute.servers():\n+...     print(server.name, server.flavor.id, server.image.id)\n+... \n+myserver-iad1 performance1-1 cfa476b1-9e14-46ba-99c8-862d1b94ef7a\n+```\n+\n+### What is this?\n+\n+The OpenStack SDK is a project that aims to improve the experience that Python users have when interacting with OpenStack clouds via their REST APIs. It's a fresh look at providing a single package with a set of consistent interfaces to the many services OpenStack provides, and its focus is on users.\n+\n+For Rackspace, this project is the Python SDK that we're putting all of our effort behind. We will have an announcement on Pyrax coming soon.\n+\n+### What does it do?\n+\n+It allows you to import one package, connect to a cloud, and work with each of its services in the same way.\n+\n+The 0.6 release of the SDK brings some amount of support for thirteen of OpenStack's services. Some of these are complete, some are just scratching the surface, but we'll be completing them all over the upcoming releases. After we've put the project into state where we trust it in the hands of production users -- which at this point means a few key bugs are fixed, documentation is bulked up, and functional testing is completed -- we'll open up the process of adding new services. The following will be the services we're releasing between now and 1.0:\n+\n+* Block Store (Cinder)\n+* Cluster (Senlin)\n+* Compute (Nova)\n+* Database (Trove)\n+* Identity (Keystone)\n+* Image (Glance)\n+* Key Management (Barbican)\n+* Message (Zaqar)\n+* Metric (Gnocchi)\n+* Network (Neutron)\n+* Object Store (Swift)\n+* Orchestration (Heat)\n+* Telemetry (Ceilometer)\n+\n+#### How does it do it?\n+\n+The REST API for each of the above services exposes a number of resources, and each of those resources has a corresponding class within that service's namespace. For example, the Compute service's `/servers` resource resides in `openstack.compute.v2.server`. Each of those resource classes support the HTTP requests that the REST API accepts, and is able to convert HTTP responses into easy to work with instances of the resource class.\n+\n+One of the goals of the SDK is to smooth over the differences between the many services through these resource classes, so if you're able to work with one service in OpenStack SDK, you can work with them all.\n+\n+### What's new in 0.6?\n+\n+The project began as a series of discussions starting in November 2013, and the code started to take shape towards what we know it as now in the middle of 2014. Throughout that time we've built out services and bulked up the lower layers of the project that have gotten us to where we are now. While there were plenty of bugs fixed since 0.5, the biggest piece of the 0.6 release is support for plugins.\n+\n+#### Plugins\n+\n+The OpenStack SDK is a StackForge project within the OpenStack ecosystem, and as such, its focus is on providing libraries for OpenStack services. The Rackspace Public Cloud offers ten OpenStack services and additionally offers several non-OpenStack products, e.g., Cloud Monitoring. Even in the case of Rackspace's OpenStack services, we have some extensions on top of the base OpenStack service, such as the bulk delete functionality in Cloud Files, our deployment of OpenStack Swift. Through this new plugin feature, Rackspace is able to leverage OpenStack SDK's support of the services we've deployed and also extend the SDK to cover the entire suite of services we offer. One library, one set of APIs, consistency all around. That's what we wanted when we started the project, and that's what we've got.\n+\n+Plugins are supported via setuptools' entry points, allowing an plugin to offer both brand new services and override base services offered by OpenStack SDK itself. Additionally, authentication plugins are also specified in the same manner. In the case of version 0.3 of `rackspacesdk`, we provide both an authentication plugin as well as support for two services in one convenient package.\n+\n+##### Authentication\n+\n+While you can authenticate to the Rackspace Public Cloud in OpenStack SDK if you know all of the arguments, such as the appropriate `auth_url`, our auth plugin takes care of everything, leaving you to provide only your credentials. It'll take `username` + `password` values as well as `username` + `api_key`. Authentication via API key is something we've extended in our Keystone-compatible authentication system, and it's the method we prefer for our users, so it's something we have to provide on top of the SDK in this plugin.\n+\n+If you use the `rackspace.connection` module provided by the plugin, you don't need to directly worry about any of this, as our `Connection` subclass takes care of setting up the auth plugin and loading the service extensions. The following example will send the arguments through to our plugin:\n+\n+```\n+>>> from rackspace import connection\n+>>> conn = connection.Connection(username=\"me\", api_key=\"123\", region=\"IAD\")\n+```\n+\n+##### Services\n+\n+The aforementioned bulk delete functionality in Cloud Files is a feature we've exposed via our plugin. The `object_store` package that gets loaded when you've created a connection with the Rackspace extension enabled is from the `rackspace.object_store` package, which includes a Proxy class that inherits from `openstack.object_store` in order to extend it. It gives you everything OpenStack Swift offers, plus our `bulk_delete` method.\n+\n+```\n+conn.object_store.bulk_delete(\"container_filled_with_stuff\")\n+```\n+\n+Also included in the plugin is support for Cloud Queues -- our deployment of the OpenStack message service, Zaqar -- as the Rackspace deployment uses a different internal name for it than OpenStack does. The `conn.message` namespace can talk to Cloud Queues, such as `conn.message.create_queue(name=\"my_queue\")`.\n+\n+### How to use it?\n+\n+The first step to using the OpenStack SDK is creating a connection with your credentials. After that, it's a matter of calling methods to create, update, get, list, and find resources in any of your OpenStack cloud's services.\n+\n+These examples assume a `conn` object from one of the `Connection` snippets from above, created with your credentials.\n+\n+#### Create a Server\n+\n+All it takes to create a server is an image, a flavor, and a name. The compute service, aka OpenStack Nova or Rackspace Cloud Servers, resides in the `compute` namespace on your `conn` object.\n+\n+You can find all of the images and flavors by calling `conn.compute.images()` and `.flavors()` respectively, each returning a generator of all available items. However, if you already know the names of what you want to use, you can find them like so:\n+\n+```\n+>>> image = conn.compute.find_image(\"Ubuntu 14.04 LTS (Trusty Tahr) (PVHVM)\")\n+>>> flavor = conn.compute.find_flavor(\"performance1-1\")\n+>>> server = conn.compute.create_server(name=\"my server\", image=image, flavor=flavor)\n+```\n+\n+The `server` object you get back isn't immediately created. You get back some information that is immediately available, such as the ID and information about the image and flavor, but it may take some time for the server to be available. If you want to wait for it to be up and running, try the `wait_for_server` method:\n+\n+```\n+>>> server = conn.compute.wait_for_server(server)\n+```\n+\n+Now the server is ready to be accessed, such as by SSH. You can find its public IPs by inspecting the `server` object.\n+\n+```\n+>>> print(server.addresses[\"public\"])\n+[{'addr': '104.130.4.108', 'version': 4}, {'addr': '2001:4802:7802:104:be76:4eff:fe20:b33', 'version': 6}]\n+```\n+\n+#### Upload a directory to object storage\n+\n+Given an OpenStack connection, a directory, and a file pattern, you can upload all files matching the pattern from that directory into a container named after the directory containing the files.\n+\n+The object store service, aka OpenStack Swift or Rackspace Cloud Files, resides in the `object_store` namespace on your `conn` object.\n+\n+```\n+import glob, os, sys\n+def upload_directory(conn, directory, pattern):\n+    container_name = os.path.basename(os.path.realpath(directory))\n+    container = conn.object_store.create_container(name=container_name)\n+    for root, dirs, files in os.walk(directory):\n+        for file_name in glob.iglob(os.path.join(root, pattern)):\n+            with open(file_name, \"rb\") as f:\n+                ob = conn.object_store.create_object(data=f.read(),\n+                                                     name=os.path.split(file_name)[1],\n+                                                     container=container)\n+                print(\"Uploaded {0.name}\".format(ob))\n+```\n+\n+Now just call it with a directory containing some files you want to upload.\n+\n+```\n+upload_directory(conn, \"/Users/brian/dogs\", \"*.gif\")\n+```\n+\n+Cool, now they're uploaded. You can retrieve the objects in a container via the `objects()` method. All resources within OpenStack SDK that correspond to retrieving multiple resources are named as the plural of the particular resource. You'll see `servers`, `networks`, `databases`, and more throughout the SDK, and they all return a generator that handles pagination for you.\n+ \n+```\n+>>> for ob in conn.object_store.objects(\"dogs\"):\n+...     print(ob.name)\n+dog1.gif\n+dog2.gif\n+... <pagination handled for you because there are so many dog gifs in this container>\n+dog1000000.gif\n+```\n+\n+### What's next?\n+\n+We're currently working on bulking up our documentation and functional testing as well as fixing any bugs we find. While we think we've discovered a great set of conventions to build our APIs around, we're not totally locked into everything yet. In fact, an upcoming release is going to bring some extra consistency to methods that upload and download data, with `upload_` and `download_` being prefixes we'll work with. That'll mean the above example with `create_object` is going to become `upload_object`, among other similar methods around the library.\n+\n+Other than that, we're aiming to make a great experience for people building applications for OpenStack, so we'd love it if you check out the SDK and let us know what you think!\n+\n+* PyPI: [pypi.python.org/pypi/openstacksdk](https://pypi.python.org/pypi/openstacksdk)\n+* Documentation: [python-openstacksdk.readthedocs.org/en/latest/](http://python-openstacksdk.readthedocs.org/en/latest/)\n+* Bug Tracker: [bugs.launchpad.net/python-openstacksdk](https://bugs.launchpad.net/python-openstacksdk)\n+* Source code: [git.openstack.org/cgit/stackforge/python-openstacksdk/](http://git.openstack.org/cgit/stackforge/python-openstacksdk/) (Github mirror: [github.com/stackforge/python-openstacksdk](https://github.com/stackforge/python-openstacksdk)\n+* IRC: #openstack-sdks on Freenode\n+* Email: openstack-dev@openstack.org (prefix your subject with `[python-openstacksdk]`)","path":"_posts/2015-09-01-OpenStack-SDK-0_6-Released.md","position":180,"original_position":180,"commit_id":"00393b0f466ffdde176e931a4dfafe7e624fe359","original_commit_id":"00393b0f466ffdde176e931a4dfafe7e624fe359","user":{"login":"everett-toews","id":634901,"avatar_url":"https://avatars.githubusercontent.com/u/634901?v=3","gravatar_id":"","url":"https://api.github.com/users/everett-toews","html_url":"https://github.com/everett-toews","followers_url":"https://api.github.com/users/everett-toews/followers","following_url":"https://api.github.com/users/everett-toews/following{/other_user}","gists_url":"https://api.github.com/users/everett-toews/gists{/gist_id}","starred_url":"https://api.github.com/users/everett-toews/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/everett-toews/subscriptions","organizations_url":"https://api.github.com/users/everett-toews/orgs","repos_url":"https://api.github.com/users/everett-toews/repos","events_url":"https://api.github.com/users/everett-toews/events{/privacy}","received_events_url":"https://api.github.com/users/everett-toews/received_events","type":"User","site_admin":false},"body":"Hmmmm...openstack-dev is explicitly \"[not for usage questions](http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev)\" so it isn't appropriate for all audiences of this post.\r\n\r\nFor a contributor audience it would be fine.\r\n\r\nIf we're talking about supporting OpenStack users, we should probably point them at https://ask.openstack.org and tag their question with python-sdk (or something).\r\n\r\nIf we're talking about supporting Rackspace users, we should point them at https://developer.rackspace.com\r\n","created_at":"2015-09-01T16:48:13Z","updated_at":"2015-09-01T16:48:13Z","html_url":"https://github.com/rackerlabs/docs-developer-blog/pull/84#discussion_r38441901","pull_request_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/84","_links":{"self":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/comments/38441901"},"html":{"href":"https://github.com/rackerlabs/docs-developer-blog/pull/84#discussion_r38441901"},"pull_request":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/84"}}},"pull_request":{"url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/84","id":43883705,"html_url":"https://github.com/rackerlabs/docs-developer-blog/pull/84","diff_url":"https://github.com/rackerlabs/docs-developer-blog/pull/84.diff","patch_url":"https://github.com/rackerlabs/docs-developer-blog/pull/84.patch","issue_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/issues/84","number":84,"state":"open","locked":false,"title":"OpenStack SDK 0.6 post","user":{"login":"briancurtin","id":390955,"avatar_url":"https://avatars.githubusercontent.com/u/390955?v=3","gravatar_id":"","url":"https://api.github.com/users/briancurtin","html_url":"https://github.com/briancurtin","followers_url":"https://api.github.com/users/briancurtin/followers","following_url":"https://api.github.com/users/briancurtin/following{/other_user}","gists_url":"https://api.github.com/users/briancurtin/gists{/gist_id}","starred_url":"https://api.github.com/users/briancurtin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/briancurtin/subscriptions","organizations_url":"https://api.github.com/users/briancurtin/orgs","repos_url":"https://api.github.com/users/briancurtin/repos","events_url":"https://api.github.com/users/briancurtin/events{/privacy}","received_events_url":"https://api.github.com/users/briancurtin/received_events","type":"User","site_admin":false},"body":"This post introduces the 0.6 release and covers some of what the SDK is and does, and shows some example code.\r\n\r\n- bio: I work on the OpenStack SDK for Rackspace's Developer Experience Team\r\n- no social media\r\n- decline editing\r\n- publish today\r\n\r\nPlease hold until Everett Toews approves.","created_at":"2015-09-01T14:42:02Z","updated_at":"2015-09-01T16:48:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5d74975c23dae6ef471948e30cbd3f2fb7145908","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/84/commits","review_comments_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/84/comments","review_comment_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/issues/84/comments","statuses_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/statuses/00393b0f466ffdde176e931a4dfafe7e624fe359","head":{"label":"briancurtin:sdk-post","ref":"sdk-post","sha":"00393b0f466ffdde176e931a4dfafe7e624fe359","user":{"login":"briancurtin","id":390955,"avatar_url":"https://avatars.githubusercontent.com/u/390955?v=3","gravatar_id":"","url":"https://api.github.com/users/briancurtin","html_url":"https://github.com/briancurtin","followers_url":"https://api.github.com/users/briancurtin/followers","following_url":"https://api.github.com/users/briancurtin/following{/other_user}","gists_url":"https://api.github.com/users/briancurtin/gists{/gist_id}","starred_url":"https://api.github.com/users/briancurtin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/briancurtin/subscriptions","organizations_url":"https://api.github.com/users/briancurtin/orgs","repos_url":"https://api.github.com/users/briancurtin/repos","events_url":"https://api.github.com/users/briancurtin/events{/privacy}","received_events_url":"https://api.github.com/users/briancurtin/received_events","type":"User","site_admin":false},"repo":{"id":39146966,"name":"docs-developer-blog","full_name":"briancurtin/docs-developer-blog","owner":{"login":"briancurtin","id":390955,"avatar_url":"https://avatars.githubusercontent.com/u/390955?v=3","gravatar_id":"","url":"https://api.github.com/users/briancurtin","html_url":"https://github.com/briancurtin","followers_url":"https://api.github.com/users/briancurtin/followers","following_url":"https://api.github.com/users/briancurtin/following{/other_user}","gists_url":"https://api.github.com/users/briancurtin/gists{/gist_id}","starred_url":"https://api.github.com/users/briancurtin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/briancurtin/subscriptions","organizations_url":"https://api.github.com/users/briancurtin/orgs","repos_url":"https://api.github.com/users/briancurtin/repos","events_url":"https://api.github.com/users/briancurtin/events{/privacy}","received_events_url":"https://api.github.com/users/briancurtin/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/briancurtin/docs-developer-blog","description":"The developer.rackspace.com blog.","fork":true,"url":"https://api.github.com/repos/briancurtin/docs-developer-blog","forks_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/forks","keys_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/teams","hooks_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/hooks","issue_events_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/issues/events{/number}","events_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/events","assignees_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/assignees{/user}","branches_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/branches{/branch}","tags_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/tags","blobs_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/git/refs{/sha}","trees_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/statuses/{sha}","languages_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/languages","stargazers_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/stargazers","contributors_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/contributors","subscribers_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/subscribers","subscription_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/subscription","commits_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/commits{/sha}","git_commits_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/git/commits{/sha}","comments_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/comments{/number}","issue_comment_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/issues/comments{/number}","contents_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/contents/{+path}","compare_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/merges","archive_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/downloads","issues_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/issues{/number}","pulls_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/pulls{/number}","milestones_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/milestones{/number}","notifications_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/labels{/name}","releases_url":"https://api.github.com/repos/briancurtin/docs-developer-blog/releases{/id}","created_at":"2015-07-15T16:09:03Z","updated_at":"2015-07-15T16:09:05Z","pushed_at":"2015-09-01T14:39:23Z","git_url":"git://github.com/briancurtin/docs-developer-blog.git","ssh_url":"git@github.com:briancurtin/docs-developer-blog.git","clone_url":"https://github.com/briancurtin/docs-developer-blog.git","svn_url":"https://github.com/briancurtin/docs-developer-blog","homepage":null,"size":57897,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"rackerlabs:master","ref":"master","sha":"6bbc52ddb0bd1fe85868d25c925de72110ac0a2e","user":{"login":"rackerlabs","id":84293,"avatar_url":"https://avatars.githubusercontent.com/u/84293?v=3","gravatar_id":"","url":"https://api.github.com/users/rackerlabs","html_url":"https://github.com/rackerlabs","followers_url":"https://api.github.com/users/rackerlabs/followers","following_url":"https://api.github.com/users/rackerlabs/following{/other_user}","gists_url":"https://api.github.com/users/rackerlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/rackerlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rackerlabs/subscriptions","organizations_url":"https://api.github.com/users/rackerlabs/orgs","repos_url":"https://api.github.com/users/rackerlabs/repos","events_url":"https://api.github.com/users/rackerlabs/events{/privacy}","received_events_url":"https://api.github.com/users/rackerlabs/received_events","type":"Organization","site_admin":false},"repo":{"id":36315867,"name":"docs-developer-blog","full_name":"rackerlabs/docs-developer-blog","owner":{"login":"rackerlabs","id":84293,"avatar_url":"https://avatars.githubusercontent.com/u/84293?v=3","gravatar_id":"","url":"https://api.github.com/users/rackerlabs","html_url":"https://github.com/rackerlabs","followers_url":"https://api.github.com/users/rackerlabs/followers","following_url":"https://api.github.com/users/rackerlabs/following{/other_user}","gists_url":"https://api.github.com/users/rackerlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/rackerlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rackerlabs/subscriptions","organizations_url":"https://api.github.com/users/rackerlabs/orgs","repos_url":"https://api.github.com/users/rackerlabs/repos","events_url":"https://api.github.com/users/rackerlabs/events{/privacy}","received_events_url":"https://api.github.com/users/rackerlabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rackerlabs/docs-developer-blog","description":"The developer.rackspace.com blog.","fork":false,"url":"https://api.github.com/repos/rackerlabs/docs-developer-blog","forks_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/forks","keys_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/teams","hooks_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/hooks","issue_events_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/issues/events{/number}","events_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/events","assignees_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/assignees{/user}","branches_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/branches{/branch}","tags_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/tags","blobs_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/git/refs{/sha}","trees_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/statuses/{sha}","languages_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/languages","stargazers_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/stargazers","contributors_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/contributors","subscribers_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/subscribers","subscription_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/subscription","commits_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/commits{/sha}","git_commits_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/git/commits{/sha}","comments_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/comments{/number}","issue_comment_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/issues/comments{/number}","contents_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/contents/{+path}","compare_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/merges","archive_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/downloads","issues_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/issues{/number}","pulls_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls{/number}","milestones_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/milestones{/number}","notifications_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/labels{/name}","releases_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/releases{/id}","created_at":"2015-05-26T18:34:01Z","updated_at":"2015-07-14T20:57:56Z","pushed_at":"2015-09-01T14:42:03Z","git_url":"git://github.com/rackerlabs/docs-developer-blog.git","ssh_url":"git@github.com:rackerlabs/docs-developer-blog.git","clone_url":"https://github.com/rackerlabs/docs-developer-blog.git","svn_url":"https://github.com/rackerlabs/docs-developer-blog","homepage":null,"size":59715,"stargazers_count":6,"watchers_count":6,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":20,"mirror_url":null,"open_issues_count":9,"forks":20,"open_issues":9,"watchers":6,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/84"},"html":{"href":"https://github.com/rackerlabs/docs-developer-blog/pull/84"},"issue":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/issues/84"},"comments":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/issues/84/comments"},"review_comments":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/84/comments"},"review_comment":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/84/commits"},"statuses":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/statuses/00393b0f466ffdde176e931a4dfafe7e624fe359"}}}}