)]}'
{
  "log": [
    {
      "commit": "4c11721051d516cf999666f30bfc7837ce4990d4",
      "tree": "202bc82bf82ab077d058d93d26201ee81d28cdb0",
      "parents": [
        "841204d289c81f16426cc7ba4727d85924c5fe98"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:23:42 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:23:42 2013 -0700"
      },
      "message": "Fix accidental code block syntax\n"
    },
    {
      "commit": "841204d289c81f16426cc7ba4727d85924c5fe98",
      "tree": "22e1ea3ba5b28338cc85209d570e37e5396aa4f2",
      "parents": [
        "7b830c970d2a1011093f95a0a1f6df39fa2b9cd0"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:20:29 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:20:29 2013 -0700"
      },
      "message": "Change filename to match new format\n"
    },
    {
      "commit": "7b830c970d2a1011093f95a0a1f6df39fa2b9cd0",
      "tree": "80e2591679c0e129efa65d7ec7d272b2cb30f438",
      "parents": [
        "07552815c87658057cfee56cfae9e50a9cfee889"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:20:14 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Fri Jun 28 11:20:14 2013 -0700"
      },
      "message": "Translate from markdown to asciidoc\n"
    },
    {
      "commit": "07552815c87658057cfee56cfae9e50a9cfee889",
      "tree": "4f2495bb9915030652a9cbd8b572ab44d5536926",
      "parents": [
        "43fa244bacff5277b68739b3c50586110196532c"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Thu Jun 27 15:02:13 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Thu Jun 27 15:02:13 2013 -0700"
      },
      "message": "Update README.md with typo fixes and Getting Started\n"
    },
    {
      "commit": "43fa244bacff5277b68739b3c50586110196532c",
      "tree": "f416308c2716b9cd2839199a65b532f3a6b5c1ed",
      "parents": [
        "a9b147cbd6be27c58777dbd447022fb4a7578a67",
        "4e89518cd94761fba4f9449d02530d1317f53681"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "kc5tja@arrl.net",
        "time": "Thu Jun 27 11:08:16 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "kc5tja@arrl.net",
        "time": "Thu Jun 27 11:08:16 2013 -0700"
      },
      "message": "Merge pull request #9 from rackspace/authentication\n\nAdd Authentication functionality.\r\n\r\nNow that I have the time to write this up, here\u0027s the description that should have gone into the git commit message.\r\n\r\ngophercloud needs to authenticate against a provider. However, gorax\u0027s API isn\u0027t ideal from a multi-provider perspective. Thus, instead of requiring the user to instantiate Identity objects, configuring them, and then authenticating in a 3-step process, I create a single public function, Authenticate(), which performs (essentially) these tasks.\r\n\r\nI cannot predict the future, and cannot guarantee Identity V3 compatibility in its current form. However, in an attempt to anticipate the future, the Authenticate function is designed to automatically guess which Identity API you intend on using based on which set of credentials you provide it. The underlying assumption is that a V3 token is compatible with a V2 token; once we have the token, it should be usable with other V2 and V3 APIs as appropriate.\r\n\r\nUnlike Ruby or Python, Go lacks support for keyword arguments. There are two ways to overcome this deficiency: (1) Make a function that accepts one or more interface{} types, and rely on type-checks to disambiguate meaning from supplied parameters; and, (2) use a structure and rely upon Go\u0027s automatic initialization of unspecified fields to well-known \"zero\" values. Here\u0027s a comparison of the two approaches from the point of view of the caller:\r\n\r\n// option 1 -- use list of interface{} types\r\nacc, err :\u003d gophercloud.Authenticate(\"rackspace-us\", gophercloud.Username(\"sfalvo\"), gophercloud.Password(\"my-pass-here\"), gophercloud.TenantId(\"blah\"))\r\n\r\n// option 2 -- use of a dedicated options structure\r\naccRackspace, err :\u003d gophercloud.Authenticate(\"rackspace-us\", gophercloud.AuthOptions{\r\n    Username: \"sfalvo\",\r\n    Password: \"my-pass-here\",\r\n    TenantId: \"blah\",\r\n})\r\nAs can be seen, the latter requires much less physical typing (assuming one doesn\u0027t rename the gophercloud package to just \u0027g\u0027 in the import statement), and thus less chance for error. That\u0027s why I decided to use an options structure instead. It also impacts the design of the callee as well; with option (1), I\u0027d have to manually loop through all the parameters, using a type-case statement to decode the supplied parameters and fill in variables as they\u0027re discovered, while in (2) I just inspect the options structure directly. Less code means fewer bugs.\r\n\r\nSince the method of authentication remains the same across all providers, assuming universal use of V2 APIs, I associate an AuthEndpoint field with each Provider instance. That\u0027s the only per-provider piece of information defined at the moment.\r\n\r\nMost other SDKs hard-wire their providers; however, this is grossly inconvenient for unit-testing purposes. Therefore, I wrap what would otherwise be global state into a Context structure. TestContext exists to create a blank context, which can be used by unit tests at will. You\u0027ll notice that the init() function (in the api.go file) uses it to create the one, true, global context, and pre-populates it with the otherwise statically defined list of providers. Through this mechanism, users of the library needn\u0027t concern themselves with contexts and their proper initialization. Instead, they can just use the package-global functions, and they should \"just work.\"\r\n\r\nNote that the result of Authenticate() is a structure instance, allowing the client access to the service catalog, tenant ID information, and user information. As we flesh out additional APIs for the Go SDK, we will add methods to this Access structure, allowing more convenient access to various APIs. For example, one hypothetical approach to working with Cloud Compute services would involve using Access as a factory:\r\n\r\ncompute, err :\u003d accRackspace.CloudComputeApi()\r\nThis conforms to the first two levels of the desired \u003corganization.service.entity.method\u003e SDK organization, and provides the appropriate propegation of state that allows for token re-auth in a fully transparent manner, if necessary."
    },
    {
      "commit": "4e89518cd94761fba4f9449d02530d1317f53681",
      "tree": "f416308c2716b9cd2839199a65b532f3a6b5c1ed",
      "parents": [
        "d1ee7987fd4c036272d39d80bc3b89b6d22a518c"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Wed Jun 26 15:44:18 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Wed Jun 26 15:44:18 2013 -0700"
      },
      "message": "Add global Authenticate() function.\n\nAlso finishes work started in last commit.\n"
    },
    {
      "commit": "d1ee7987fd4c036272d39d80bc3b89b6d22a518c",
      "tree": "8d6fd2780e0b05e3000cceee0c5f80a92b8cbc52",
      "parents": [
        "839428e0c2bc7006b922bfec7f1fdb04c4c749e6"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Wed Jun 26 14:32:45 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Wed Jun 26 14:32:45 2013 -0700"
      },
      "message": "Parse out auth response and fill in access object\n"
    },
    {
      "commit": "839428e0c2bc7006b922bfec7f1fdb04c4c749e6",
      "tree": "4cab775ad5a75c81c2f484ab0ef0816a66fb3176",
      "parents": [
        "00a233d1e1a75d630ee886000642f41de4c969e2"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 18:02:24 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 18:02:24 2013 -0700"
      },
      "message": "go fmt\n"
    },
    {
      "commit": "00a233d1e1a75d630ee886000642f41de4c969e2",
      "tree": "94980c6a5e4b9e92972d58fa4db3429f3597b8b3",
      "parents": [
        "978fed843429bf8a6e3c20c0f28e5f58eb2cfc09"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 18:00:53 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 18:00:53 2013 -0700"
      },
      "message": "code cleanup\n"
    },
    {
      "commit": "978fed843429bf8a6e3c20c0f28e5f58eb2cfc09",
      "tree": "010c2124a715ae2734dc02f42a455b96d5fb3e6a",
      "parents": [
        "5d0d74ce130097c44e1c6290a607c74ec58a59ee"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 17:59:19 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 17:59:19 2013 -0700"
      },
      "message": "Verify proper Tenant ID encoding behavior\n"
    },
    {
      "commit": "5d0d74ce130097c44e1c6290a607c74ec58a59ee",
      "tree": "0bc7a6766c8a3cf2acb56d6cf7533816ce511902",
      "parents": [
        "fd78c30473c2f64b2c0ef3263b0f1e1f963c36a8"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 17:23:18 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 17:23:18 2013 -0700"
      },
      "message": "Make Authenticate issue an HTTP request\n"
    },
    {
      "commit": "fd78c30473c2f64b2c0ef3263b0f1e1f963c36a8",
      "tree": "212a485ebff4a28e1c9e9e1f9a10b7a07088923c",
      "parents": [
        "1d3fa667c76ec6dabb67a0b13ce07c3022768f4c"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 16:35:32 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 16:35:32 2013 -0700"
      },
      "message": "Add provider registry support.\n"
    },
    {
      "commit": "1d3fa667c76ec6dabb67a0b13ce07c3022768f4c",
      "tree": "ab8cc3e95e3080b9a8526668661d58eec190cc28",
      "parents": [
        "d6092adfb69759791c3f3fdd99e5642066e3e642"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 15:29:32 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 15:29:32 2013 -0700"
      },
      "message": "Add authentication acceptance test.\n\nBefore coding on the Authentication functionality of gophercloud, we\nneeded the acceptance test to know when we were finished.\n\nSince the authentication test is written in Go, I had to adjust the\nscripts/test-all.sh file to invoke Go programs directly.\n"
    },
    {
      "commit": "d6092adfb69759791c3f3fdd99e5642066e3e642",
      "tree": "721a3677d2efe67040252c11c5fc0356307fafeb",
      "parents": [
        "a9b147cbd6be27c58777dbd447022fb4a7578a67"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 14:07:25 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Tue Jun 25 14:07:25 2013 -0700"
      },
      "message": "Add script to launch acceptance tests\n"
    },
    {
      "commit": "a9b147cbd6be27c58777dbd447022fb4a7578a67",
      "tree": "f33df8f533b31fee167616d7e5558dd22aea83cd",
      "parents": [
        "a1f6f222ec7bc16423aa1c6ed74c36c5f191c9f2",
        "563bf05417e6d210a4b4a4b89674b05d4bac5675"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "kc5tja@arrl.net",
        "time": "Tue Jun 25 13:46:49 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "kc5tja@arrl.net",
        "time": "Tue Jun 25 13:46:49 2013 -0700"
      },
      "message": "Merge pull request #3 from rackspace/script-environment-setup\n\nScript to automate environment creation"
    },
    {
      "commit": "563bf05417e6d210a4b4a4b89674b05d4bac5675",
      "tree": "f33df8f533b31fee167616d7e5558dd22aea83cd",
      "parents": [
        "ff3f09dc53e2911fe4dac14d3d22564c4d60f0f8"
      ],
      "author": {
        "name": "stackedsax",
        "email": "alex@alexscammon.com",
        "time": "Tue Jun 25 13:21:00 2013 -0700"
      },
      "committer": {
        "name": "stackedsax",
        "email": "alex@alexscammon.com",
        "time": "Tue Jun 25 13:21:00 2013 -0700"
      },
      "message": "Making some changes to make the temporary installation steps even more explicit\n"
    },
    {
      "commit": "ff3f09dc53e2911fe4dac14d3d22564c4d60f0f8",
      "tree": "096a969d725de50b180849ce1bb373f75c3a25e1",
      "parents": [
        "f614c937c01213cb695b89b6ecd02c581a8432b4"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Thu Jun 20 17:54:26 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Thu Jun 20 17:54:26 2013 -0700"
      },
      "message": "README updated\n"
    },
    {
      "commit": "f614c937c01213cb695b89b6ecd02c581a8432b4",
      "tree": "1c43b828c8c8e15aac65a57628f3b25eb020ef9a",
      "parents": [
        "a1f6f222ec7bc16423aa1c6ed74c36c5f191c9f2"
      ],
      "author": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Thu Jun 20 15:18:43 2013 -0700"
      },
      "committer": {
        "name": "Samuel A. Falvo II",
        "email": "sam.falvo@rackspace.com",
        "time": "Thu Jun 20 15:18:43 2013 -0700"
      },
      "message": "Script to automate environment creation\n"
    },
    {
      "commit": "a1f6f222ec7bc16423aa1c6ed74c36c5f191c9f2",
      "tree": "e521c99b28b4f33b139808b939e2fd9f99007387",
      "parents": [],
      "author": {
        "name": "Glen Campbell",
        "email": "glen@broadpool.com",
        "time": "Thu Jun 20 11:10:46 2013 -0700"
      },
      "committer": {
        "name": "Glen Campbell",
        "email": "glen@broadpool.com",
        "time": "Thu Jun 20 11:10:46 2013 -0700"
      },
      "message": "Initial commit\n"
    }
  ]
}
