<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">
<font class="Apple-style-span" face="Courier">As one of the last steps in bringing up a multi node OpenStack testbed, I'm trying to integrate a Swift backend with Glance, all of which is using Keystone for authorization. Unfortunately, when trying to upload
 images using glance I receive and authorization error.  Background, Glance/Keystone are running on node addressed 173.23.181.1.  Swift proxy is running on 173.23.181.2.</font>
<div><font class="Apple-style-span" face="Courier">When configured with file backend, glance works fine, using Keystone authentication.</font></div>
<div><font class="Apple-style-span" face="Courier"><br>
</font></div>
<div><font class="Apple-style-span" face="Courier">Glance storage backend is configured as follows (from glance-api.conf)</font></div>
<div><font class="Apple-style-span" face="Courier"><br>
</font></div>
<div><font class="Apple-style-span" face="Courier">
<div># Address where the Swift authentication service lives</div>
<div>swift_store_auth_address = <a href="http://173.23.181.2:8080/v1.0">http://173.23.181.2:8080/v1.0</a></div>
<div><br>
</div>
<div># User to authenticate against the Swift authentication service</div>
<div>swift_store_user = glance:glance</div>
<div><br>
</div>
<div># Auth key for the user authenticating against the</div>
<div># Swift authentication service</div>
<div>swift_store_key = glance111213141516171819</div>
<div><br>
</div>
<div># Container within the account that the account should use</div>
<div># for storing images in Swift</div>
<div>swift_store_container = images</div>
</font></div>
<div><font class="Apple-style-span" face="Courier"><br>
</font></div>
<div><font class="Apple-style-span" face="Courier">For debugging, I've verified that my swift installation is working with Keystone.  For example</font></div>
<div><font class="Apple-style-span" face="Courier"><br>
</font></div>
<div>
<div><font class="Apple-style-span" face="Courier">root@nova:~/images/ubuntu-11.10# swift -V 2 -A
<a href="http://173.23.181.1:5000/v2.0">http://173.23.181.1:5000/v2.0</a> -U glance:glance -K glance stat -v</font></div>
<div><font class="Apple-style-span" face="Courier">StorageURL: <a href="http://173.23.181.2:8080/v1/AUTH_4">
http://173.23.181.2:8080/v1/AUTH_4</a></font></div>
<div><font class="Apple-style-span" face="Courier">Auth Token: glance111213141516171819</font></div>
<div><font class="Apple-style-span" face="Courier">   Account: AUTH_4</font></div>
<div><font class="Apple-style-span" face="Courier">Containers: 1</font></div>
<div><font class="Apple-style-span" face="Courier">   Objects: 0</font></div>
<div><font class="Apple-style-span" face="Courier">     Bytes: 0</font></div>
<div><font class="Apple-style-span" face="Courier">Accept-Ranges: bytes</font></div>
<div><font class="Apple-style-span" face="Courier">X-Trans-Id: tx0f4a557d0e3046f1a4f8d10180d55e0b</font></div>
</div>
<div><font class="Apple-style-span" face="Courier"><br>
</font></div>
<div><font class="Apple-style-span" face="Courier">and I'm able to create/delete buckets and files with no problems.  However, when attempting to upload and image file using glance, I receive the following error</font></div>
<div><font class="Apple-style-span" face="Courier"><br>
</font></div>
<div><font class="Apple-style-span" face="Courier">
<div>root@nova:~/images/ubuntu-11.10# glance -A glance111213141516171819 add name="Ubuntu 11.10 ramdisk" disk_format=ari container_format=ari is_public=true < initrd.img-3.0.0-12-server </div>
<div>Failed to add image. Got error:</div>
<div>400 Bad Request</div>
<div><br>
</div>
<div>The server could not comply with the request since it is either malformed or otherwise incorrect.</div>
<div><br>
</div>
<div> Error uploading image: (ClientException): Auth GET failed: <a href="http://173.23.181.2:8080/v1.0">
http://173.23.181.2:8080/v1.0</a> 401 Unauthorized  </div>
<div>Note: Your image metadata may still be in the registry, but the image's status will likely be 'killed'.</div>
<div><br>
</div>
<div>and the output from the log files is shown below:</div>
<div><br>
</div>
<div>
<div>root@nova:~/images/ubuntu-11.10# more /var/log/glance/api.log </div>
<div>2012-02-13 15:46:55    DEBUG [glance.api.middleware.version_negotiation] Processing request: POST /v1/images Accept: </div>
<div>2012-02-13 15:46:55    DEBUG [glance.api.middleware.version_negotiation] Matched versioned URI. Version: 1.0</div>
<div>2012-02-13 15:46:55    DEBUG [root] HTTP PERF: 0.02184 seconds to GET 173.23.181.1:35357 /v2.0/tokens/glance111213141516171819)</div>
<div>2012-02-13 15:46:55    DEBUG [root] HTTP PERF: 0.01876 seconds to GET 173.23.181.1:35357 /v2.0/tokens/glance111213141516171819)</div>
<div>2012-02-13 15:46:55    DEBUG [routes.middleware] Matched POST /images</div>
<div>2012-02-13 15:46:55    DEBUG [routes.middleware] Route path: '/images', defaults: {'action': u'create', 'controller': <glance.common.wsgi.Resource object at 0x1d9ce50>}</div>
<div>2012-02-13 15:46:55    DEBUG [routes.middleware] Match dict: {'action': u'create', 'controller': <glance.common.wsgi.Resource object at 0x1d9ce50>}</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry] Adding image metadata...</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]      container_format: ari</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]           disk_format: ari</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]             is_public: True</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]              min_disk: 0</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]               min_ram: 0</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                  name: Ubuntu 11.10 ramdisk</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                  size: 13638383</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                status: queued</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry] Returned image metadata from call to RegistryClient.add_image():</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]              checksum: None</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]      container_format: ari</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]            created_at: 2012-02-13T21:46:55</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]               deleted: False</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]            deleted_at: None</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]           disk_format: ari</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                    id: 28</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]             is_public: True</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]              location: None</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]              min_disk: 0</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]               min_ram: 0</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                  name: Ubuntu 11.10 ramdisk</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                 owner: 4</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                  size: 13638383</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                status: queued</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]            updated_at: None</div>
<div>2012-02-13 15:46:55    DEBUG [glance.api.v1.images] Setting image 28 to status 'saving'</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry] Updating image metadata for image 28...</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                status: saving</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry] Returned image metadata from call to RegistryClient.update_image():</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]              checksum: None</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]      container_format: ari</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]            created_at: 2012-02-13T21:46:55</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]               deleted: False</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]            deleted_at: None</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]           disk_format: ari</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                    id: 28</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]             is_public: True</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]              location: None</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]              min_disk: 0</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]               min_ram: 0</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                  name: Ubuntu 11.10 ramdisk</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                 owner: 4</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                  size: 13638383</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]                status: saving</div>
<div>2012-02-13 15:46:55    DEBUG [glance.registry]            updated_at: 2012-02-13T21:46:55</div>
<div>2012-02-13 15:46:55    DEBUG [glance.api.v1.images] Uploading image data for image 28 to swift store</div>
<div>2012-02-13 15:46:55    DEBUG [glance.store.swift] Creating Swift connection with (auth_address=<a href="http://173.23.181.2:8080/v1.0">http://173.23.181.2:8080/v1.0</a>, user=glance:glance, snet=False)</div>
<div>2012-02-13 15:46:55    DEBUG [root] HTTP PERF: 0.00160 seconds to GET 173.23.181.2:8080 /v1.0)</div>
<div>2012-02-13 15:46:56    DEBUG [root] HTTP PERF: 0.00198 seconds to GET 173.23.181.2:8080 /v1.0)</div>
<div>2012-02-13 15:46:56    ERROR [glance.api.v1.images] Traceback (most recent call last):</div>
<div>  File "/usr/lib/python2.7/dist-packages/glance/api/v1/images.py", line 372, in _upload</div>
<div>    image_size)</div>
<div>  File "/usr/lib/python2.7/dist-packages/glance/store/swift.py", line 321, in add</div>
<div>    create_container_if_missing(self.container, swift_conn, self.options)</div>
<div>  File "/usr/lib/python2.7/dist-packages/glance/store/swift.py", line 478, in create_container_if_missing</div>
<div>    swift_conn.head_container(container)</div>
<div>  File "/usr/lib/python2.7/dist-packages/swift/common/client.py", line 822, in head_container</div>
<div>    return self._retry(None, head_container, container)</div>
<div>  File "/usr/lib/python2.7/dist-packages/swift/common/client.py", line 774, in _retry</div>
<div>    self.url, self.token = self.get_auth()</div>
<div>  File "/usr/lib/python2.7/dist-packages/swift/common/client.py", line 762, in get_auth</div>
<div>    return get_auth(self.authurl, self.user, self.key, snet=self.snet)</div>
<div>  File "/usr/lib/python2.7/dist-packages/swift/common/client.py", line 190, in get_auth</div>
<div>    http_reason=resp.reason)</div>
<div>ClientException: Auth GET failed: <a href="http://173.23.181.2:8080/v1.0">http://173.23.181.2:8080/v1.0</a> 401 Unauthorized</div>
<div><br>
</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry] Updating image metadata for image 28...</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]                status: killed</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry] Returned image metadata from call to RegistryClient.update_image():</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]              checksum: None</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]      container_format: ari</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]            created_at: 2012-02-13T21:46:55</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]               deleted: False</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]            deleted_at: None</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]           disk_format: ari</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]                    id: 28</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]             is_public: True</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]              location: None</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]              min_disk: 0</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]               min_ram: 0</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]                  name: Ubuntu 11.10 ramdisk</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]                 owner: 4</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]                  size: 13638383</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]                status: killed</div>
<div>2012-02-13 15:46:56    DEBUG [glance.registry]            updated_at: 2012-02-13T21:46:56</div>
<div>2012-02-13 15:46:56    DEBUG [eventlet.wsgi.server] 127.0.0.1 - - [13/Feb/2012 15:46:56] "POST /v1/images HTTP/1.1" 400 351 1.515732</div>
</div>
<div><br>
</div>
<div>As always, I'm sure this is just a subtle config error on my part.  Note that in my setup, I've created a separate tenant and user (glance) to be used for image storage.  My keystone auth setups use a separate long lived admin token for authentication.
  If needed, I can post my configuration files.</div>
<div><br>
</div>
<div>Any insight will be appreciated.  Thanks in advance and regards,</div>
<div><br>
</div>
<div>Ross</div>
<div><br>
</div>
<div><br>
</div>
</font></div>
<div><br>
</div>
</body>
</html>