{"action":"created","comment":{"url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/comments/37526356","id":37526356,"diff_hunk":"@@ -0,0 +1,410 @@\n+---\n+layout: post\n+date: 2015-08-20 23:59\n+title: Install OpenStack from source Part 6\n+comments: true\n+author: Phil Hopkins\n+published: true\n+categories:\n+    - OpenStack\n+    - OSAD\n+---\n+\n+This is the sixth and final installment in a series demonstrating how to install OpenStack from source. The five previous articles:\n+\n+* [Install Keystone,](https://developer.rackspace.com/blog/install-openstack-from-source/)\n+* [Install Glance and Neutron](https://developer.rackspace.com/blog/install-openstack-from-source2/)\n+* [Install Nova](https://developer.rackspace.com/blog/install-openstack-from-source3/)\n+* [Install Neutron on the Network node](https://developer.rackspace.com/blog/install-openstack-from-source4/)\n+* [Install the Compute node](https://developer.rackspace.com/blog/install-openstack-from-source5/)\n+\n+Previously we installed the Identity service (keystone), Image service (glance), Networking service (neutron) and the Compute service (nova) onto the controller node as well as neutron onto the network node and nova and neutron onto the compute node. In this section we turn our attention to finishing up by installing the Volume service (cinder) and dashboard (horizon) onto the controller node.\n+<!-- more -->\n+\n+As we finish up our OpenStack intallation, we turn our attention to both cinder and horizon. First we start with cinder and like we have done before we create the cinder user and the directories that the cinder user needs:\n+\n+    mkdir /var/cache/cinder\n+    chown cinder:cinder /var/cache/cinder/\n+    chmod 700 /var/cache/cinder\n+    \n+Now clone the cinder repo and install cinder: \n+    \n+    git clone https://github.com/openstack/cinder.git -b stable/kilo\n+    cd cinder\n+    pip install --requirement requirements.txt\n+    python setup.py install\n+    cd ~\n+ \n+Copy the cinder configuration files to the `etc` directory:\n+ \n+    cp -R cinder/etc/cinder/* /etc/cinder\n+    mv /etc/cinder/cinder.conf.sample /etc/cinder/cinder.conf\n+    \n+Set up sudo access for the newly created cinder user, again using the rootwrap sudo wrapper help to control sudo access:\n+    \n+    cat > /etc/sudoers.d/cinder_sudoers << EOF\n+    Defaults:cinder !requiretty\n+    \n+    cinder ALL = (root) NOPASSWD: /usr/local/bin/cinder-rootwrap  /etc/cinder/rootwrap.conf *\n+    EOF\n+    \n+    chmod 440 /etc/sudoers.d/cinder_sudoers\n+    \n+Create the cinder configuration file\n+    \n+    cat > /etc/cinder/cinder.conf << EOF\n+    [DEFAULT]\n+    rpc_backend=rabbit\n+    osapi_volume_listen=$MY_PRIVATE_IP\n+    api_paste_config = /etc/cinder/api-paste.ini\n+    rootwrap_config=/etc/cinder/rootwrap.conf/rootwrap.conf\n+    auth_strategy = keystone\n+    \n+    [DATABASE]\n+    connection = mysql://cinder:cinder@$MY_PRIVATE_IP/cinder?charset=utf8\n+    \n+    [keystone_authtoken]\n+    auth_uri = http://$MY_PRIVATE_IP:5000/v2.0\n+    identity_uri = http://$MY_PRIVATE_IP:35357/\n+    admin_user = cinder\n+    admin_password = cinder\n+    admin_tenant_name = service\n+    signing_dir = /var/cache/cinder\n+    \n+    [oslo_messaging_rabbit]\n+    rabbit_host=$MY_PRIVATE_IP\n+    \n+    EOF\n+    \n+Set proper ownership for the cinder configuration files:\n+    \n+    chown cinder:cinder /etc/cinder/*.{conf,json,ini}\n+    \n+Create the database that cinder uses:\n+    \n+    mysql -u root -pmysql -e 'CREATE DATABASE cinder;'\n+    mysql -u root -pmysql -e \"GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder';\"\n+    mysql -u root -pmysql -e \"GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder';\"\n+    \n+Create the cinder database structure:\n+    \n+    cinder-manage db sync\n+    \n+The sample data script that we used to populate data into keystone does not insert data for the cinder user, so we do that here. Create the cinder service user in keystone:\n+\n+    keystone user-create --tenant service --name cinder --pass cinder\n+    \n+Grant the 'admin' role to the cinder service user:\n+\n+    keystone user-role-add --user cinder --tenant service --role admin\n+    \n+Add a cinder v2 service and endpoint in horizon:\n+\n+    openstack service create --type volumev2 \\\n+      --description \"OpenStack Block Storage\" cinderv2\n+    \n+    openstack endpoint create \\\n+      --publicurl http://10.0.1.4:8776/v2/%\\(tenant_id\\)s \\\n+      --internalurl http://10.0.1.4:8776/v2/%\\(tenant_id\\)s \\\n+      --adminurl http://10.0.1.4:8776/v2/%\\(tenant_id\\)s \\\n+      --region RegionOne \\\n+      volumev2\n+    \n+iSCSI is used as the back end store for cinder. This installation assumes that the iSCSI has a volume group named cinder-volumes created on the controller node to use as actual store for cinder. Cinder then creates logical volumes for the various cinder volumes that are created. Install the open-iscsi and tgt packages:\n+\n+    \n+    apt-get install -y open-iscsi tgt\n+    \n+Configure tgt so that cinder can add volumes when they are requested to be created:\n+    \n+    cat >> /etc/tgt/conf.d/cinder_tgt.conf << EOF\n+    include /var/lib/cinder/volumes/*\n+    EOF\n+\n+Restart the open-iscsi and tgt service so that they see the configuration file changes:\n+    \n+    service tgt restart\n+    service open-iscsi restart\n+    \n+Create the cinder Upstart scripts. First for the API service:\n+\n+    cat > /etc/init/cinder-api.conf << EOF\n+    description \"Cinder API\"\n+    \n+    start on runlevel [2345]\n+    stop on runlevel [!2345]\n+    \n+    \n+    chdir /var/run\n+    \n+    pre-start script\n+            mkdir -p /var/run/cinder\n+            chown nova:root /var/run/cinder/\n+    \n+            mkdir -p /var/lock/cinder\n+            chown nova:root /var/lock/cinder/\n+    \n+    end script\n+    \n+    exec start-stop-daemon --start --chuid cinder --exec /usr/local/bin/cinder-api -- --config-file=/etc/cinder/cinder.conf --log-file=/var/log/cinder/api.log\n+    EOF\n+    \n+Next for the cinder scheduler service:\n+    \n+    cat > /etc/init/cinder-scheduler.conf << EOF\n+    description \"Cinder Scheduler\"\n+    \n+    start on runlevel [2345]\n+    stop on runlevel [!2345]\n+    \n+    \n+    chdir /var/run\n+    \n+    pre-start script\n+            mkdir -p /var/run/cinder\n+            chown nova:root /var/run/cinder/\n+    \n+            mkdir -p /var/lock/cinder\n+            chown nova:root /var/lock/cinder/\n+    \n+    end script\n+    \n+    exec start-stop-daemon --start --chuid cinder --exec /usr/local/bin/cinder-scheduler -- --config-file=/etc/cinder/cinder.conf --log-file=/var/log/cinder/scheduler.log\n+    EOF\n+    \n+And lastly for the cinder volume service:\n+    \n+    cat > /etc/init/cinder-volume.conf << EOF\n+    description \"Cinder Volume\"\n+    \n+    start on runlevel [2345]\n+    stop on runlevel [!2345]\n+    \n+    \n+    chdir /var/run\n+    \n+    pre-start script\n+            mkdir -p /var/run/cinder\n+            chown nova:root /var/run/cinder/\n+    \n+            mkdir -p /var/lock/cinder\n+            chown nova:root /var/lock/cinder/\n+    \n+    end script\n+    \n+    exec start-stop-daemon --start --chuid cinder --exec /usr/local/bin/cinder-volume -- --config-file=/etc/cinder/cinder.conf --log-file=/var/log/cinder/volume.log\n+    EOF\n+    \n+At this point we can start all the cinder services:\n+    \n+    start cinder-api\n+    start cinder-volume\n+    start cinder-scheduler\n+\n+Wait 20 to 30 seconds and verify that everything started:\n+    \n+    ps aux|grep cinder\n+\n+You should see something like:\n+\n+    root@controller:~# ps aux|grep cinder\n+    cinder   14633  0.5  2.6 243092 55244 ?        Ss   May05 823:42 /usr/bin/python /usr/local/bin/cinder-api --config-file=/etc/cinder/cinder.conf --log-file=/var/log/cinder/api.log\n+    cinder   14652  0.0  3.3 256064 69176 ?        S    May05   0:10 /usr/bin/python /usr/local/bin/cinder-api --config-file=/etc/cinder/cinder.conf --log-file=/var/log/cinder/api.log\n+    cinder   14664  0.5  2.4 216680 49456 ?        Ss   May05 835:51 /usr/bin/python /usr/local/bin/cinder-volume --config-file=/etc/cinder/cinder.conf --log-file=/var/log/cinder/volume.log\n+    cinder   14671  0.1  2.5 219392 52968 ?        S    May05 165:47 /usr/bin/python /usr/local/bin/cinder-volume --config-file=/etc/cinder/cinder.conf --log-file=/var/log/cinder/volume.log\n+    cinder   14684  0.1  2.7 225120 56544 ?        Ss   May05 151:50 /usr/bin/python /usr/local/bin/cinder-scheduler --config-file=/etc/cinder/cinder.conf --log-file=/var/log/cinder/scheduler.log\n+    \n+If not and one or more of the cinder services didn't start, use the following to test why those that didn't start.","path":"_posts/2015-08-20-install-openstack-from-source6.md","position":217,"original_position":217,"commit_id":"5650d24a0582e7d4ca86c416e3a6e96cff5c2368","original_commit_id":"5650d24a0582e7d4ca86c416e3a6e96cff5c2368","user":{"login":"annegentle","id":501981,"avatar_url":"https://avatars.githubusercontent.com/u/501981?v=3","gravatar_id":"","url":"https://api.github.com/users/annegentle","html_url":"https://github.com/annegentle","followers_url":"https://api.github.com/users/annegentle/followers","following_url":"https://api.github.com/users/annegentle/following{/other_user}","gists_url":"https://api.github.com/users/annegentle/gists{/gist_id}","starred_url":"https://api.github.com/users/annegentle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/annegentle/subscriptions","organizations_url":"https://api.github.com/users/annegentle/orgs","repos_url":"https://api.github.com/users/annegentle/repos","events_url":"https://api.github.com/users/annegentle/events{/privacy}","received_events_url":"https://api.github.com/users/annegentle/received_events","type":"User","site_admin":false},"body":"If you don't see all the services started, use the following commands to determine why it didn't start.","created_at":"2015-08-20T13:09:12Z","updated_at":"2015-08-20T13:09:12Z","html_url":"https://github.com/rackerlabs/docs-developer-blog/pull/68#discussion_r37526356","pull_request_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/68","_links":{"self":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/comments/37526356"},"html":{"href":"https://github.com/rackerlabs/docs-developer-blog/pull/68#discussion_r37526356"},"pull_request":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/68"}}},"pull_request":{"url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/68","id":42921669,"html_url":"https://github.com/rackerlabs/docs-developer-blog/pull/68","diff_url":"https://github.com/rackerlabs/docs-developer-blog/pull/68.diff","patch_url":"https://github.com/rackerlabs/docs-developer-blog/pull/68.patch","issue_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/issues/68","number":68,"state":"open","locked":false,"title":"Install source6","user":{"login":"phil-hopkins-a","id":2472574,"avatar_url":"https://avatars.githubusercontent.com/u/2472574?v=3","gravatar_id":"","url":"https://api.github.com/users/phil-hopkins-a","html_url":"https://github.com/phil-hopkins-a","followers_url":"https://api.github.com/users/phil-hopkins-a/followers","following_url":"https://api.github.com/users/phil-hopkins-a/following{/other_user}","gists_url":"https://api.github.com/users/phil-hopkins-a/gists{/gist_id}","starred_url":"https://api.github.com/users/phil-hopkins-a/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/phil-hopkins-a/subscriptions","organizations_url":"https://api.github.com/users/phil-hopkins-a/orgs","repos_url":"https://api.github.com/users/phil-hopkins-a/repos","events_url":"https://api.github.com/users/phil-hopkins-a/events{/privacy}","received_events_url":"https://api.github.com/users/phil-hopkins-a/received_events","type":"User","site_admin":false},"body":"Bio:\r\nPhil Hopkins, Principal Engineer at Rackspace. He has an Electrical Engineering Degree from the University of South Florida and has been working on Linux systems for over 15 years. He is active teaching and writing about Openstack software defined networks (SDN). He has written and currently gives an advanced class teaching OpenStack Networking.\r\n\r\n\r\nEditing Preference:\r\nFeel free to edit as needed.\r\n\r\nPosting Preference:\r\nDesired date to publish: August 20th, 2015","created_at":"2015-08-20T12:06:00Z","updated_at":"2015-08-20T13:09:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ac479743c41a5376212e5db24edc565f99a13cb4","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/68/commits","review_comments_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/68/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/68/comments","statuses_url":"https://api.github.com/repos/rackerlabs/docs-developer-blog/statuses/5650d24a0582e7d4ca86c416e3a6e96cff5c2368","head":{"label":"phil-hopkins-a:install-source6","ref":"install-source6","sha":"5650d24a0582e7d4ca86c416e3a6e96cff5c2368","user":{"login":"phil-hopkins-a","id":2472574,"avatar_url":"https://avatars.githubusercontent.com/u/2472574?v=3","gravatar_id":"","url":"https://api.github.com/users/phil-hopkins-a","html_url":"https://github.com/phil-hopkins-a","followers_url":"https://api.github.com/users/phil-hopkins-a/followers","following_url":"https://api.github.com/users/phil-hopkins-a/following{/other_user}","gists_url":"https://api.github.com/users/phil-hopkins-a/gists{/gist_id}","starred_url":"https://api.github.com/users/phil-hopkins-a/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/phil-hopkins-a/subscriptions","organizations_url":"https://api.github.com/users/phil-hopkins-a/orgs","repos_url":"https://api.github.com/users/phil-hopkins-a/repos","events_url":"https://api.github.com/users/phil-hopkins-a/events{/privacy}","received_events_url":"https://api.github.com/users/phil-hopkins-a/received_events","type":"User","site_admin":false},"repo":{"id":39773053,"name":"docs-developer-blog","full_name":"phil-hopkins-a/docs-developer-blog","owner":{"login":"phil-hopkins-a","id":2472574,"avatar_url":"https://avatars.githubusercontent.com/u/2472574?v=3","gravatar_id":"","url":"https://api.github.com/users/phil-hopkins-a","html_url":"https://github.com/phil-hopkins-a","followers_url":"https://api.github.com/users/phil-hopkins-a/followers","following_url":"https://api.github.com/users/phil-hopkins-a/following{/other_user}","gists_url":"https://api.github.com/users/phil-hopkins-a/gists{/gist_id}","starred_url":"https://api.github.com/users/phil-hopkins-a/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/phil-hopkins-a/subscriptions","organizations_url":"https://api.github.com/users/phil-hopkins-a/orgs","repos_url":"https://api.github.com/users/phil-hopkins-a/repos","events_url":"https://api.github.com/users/phil-hopkins-a/events{/privacy}","received_events_url":"https://api.github.com/users/phil-hopkins-a/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/phil-hopkins-a/docs-developer-blog","description":"The developer.rackspace.com blog.","fork":true,"url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog","forks_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/forks","keys_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/keys{/key_id}","collaborators_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/teams","hooks_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/hooks","issue_events_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/issues/events{/number}","events_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/events","assignees_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/assignees{/user}","branches_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/branches{/branch}","tags_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/tags","blobs_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/git/refs{/sha}","trees_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/git/trees{/sha}","statuses_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/statuses/{sha}","languages_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/languages","stargazers_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/stargazers","contributors_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/contributors","subscribers_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/subscribers","subscription_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/subscription","commits_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/commits{/sha}","git_commits_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/git/commits{/sha}","comments_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/comments{/number}","issue_comment_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/issues/comments{/number}","contents_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/contents/{+path}","compare_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/compare/{base}...{head}","merges_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/merges","archive_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/downloads","issues_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/issues{/number}","pulls_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/pulls{/number}","milestones_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/milestones{/number}","notifications_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/labels{/name}","releases_url":"https://api.github.com/repos/phil-hopkins-a/docs-developer-blog/releases{/id}","created_at":"2015-07-27T12:23:29Z","updated_at":"2015-07-27T12:23:32Z","pushed_at":"2015-08-20T12:11:25Z","git_url":"git://github.com/phil-hopkins-a/docs-developer-blog.git","ssh_url":"git@github.com:phil-hopkins-a/docs-developer-blog.git","clone_url":"https://github.com/phil-hopkins-a/docs-developer-blog.git","svn_url":"https://github.com/phil-hopkins-a/docs-developer-blog","homepage":null,"size":57949,"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":"3bb526d562b71f225eff4787a1d8971dcd222257","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-08-20T12:55:54Z","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":58780,"stargazers_count":6,"watchers_count":6,"language":"HTML","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":17,"mirror_url":null,"open_issues_count":6,"forks":17,"open_issues":6,"watchers":6,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/68"},"html":{"href":"https://github.com/rackerlabs/docs-developer-blog/pull/68"},"issue":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/issues/68"},"comments":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/issues/68/comments"},"review_comments":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/pulls/68/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/68/commits"},"statuses":{"href":"https://api.github.com/repos/rackerlabs/docs-developer-blog/statuses/5650d24a0582e7d4ca86c416e3a6e96cff5c2368"}}}}