'We test the following sequential series of actions:
0. GET /images
- Verify no public images
1. GET /images/detail
- Verify no public images
2. POST /images with public image named Image1
and no custom properties
- Verify 201 returned
3. HEAD image
- Verify HTTP headers have correct information we just added
4. GET image
- Verify all information on image we just added is correct
5. GET /images
- Verify the image we just added is returned
6. GET /images/detail
- Verify the image we just added is returned
7. PUT image with custom properties of "distro" and "arch"
- Verify 200 returned
8. PUT image with too many custom properties
- Verify 413 returned
9. GET image
- Verify updated information about image was stored
10. PUT image
- Remove a previously existing property.
11. PUT image
- Add a previously deleted property.
12. PUT image/members/member1
- Add member1 to image
13. PUT image/members/member2
- Add member2 to image
14. GET image/members
- List image members
15. DELETE image/members/member1
- Delete image member1
16. PUT image/members
- Attempt to replace members with an overlimit amount
17. PUT image/members/member11
- Attempt to add a member while at limit
18. POST /images with another public image named Image2
- attribute and three custom properties, "distro", "arch" & "foo"
- Verify a 200 OK is returned
19. HEAD image2
- Verify image2 found now
20. GET /images
- Verify 2 public images
21. GET /images with filter on user-defined property "distro".
- Verify both images are returned
22. GET /images with filter on user-defined property \'distro\' but
- with non-existent value. Verify no images are returned
23. GET /images with filter on non-existent user-defined property
- "boo". Verify no images are returned
24. GET /images with filter \'arch=i386\'
- Verify only image2 is returned
25. GET /images with filter \'arch=x86_64\'
- Verify only image1 is returned
26. GET /images with filter \'foo=bar\'
- Verify only image2 is returned
27. DELETE image1
- Delete image
28. GET image/members
-  List deleted image members
29. PUT image/members/member2
- Update existing member2 of deleted image
30. PUT image/members/member3
- Add member3 to deleted image
31. DELETE image/members/member2
- Delete member2 from deleted image
32. DELETE image2
- Delete image
33. GET /images
- Verify no images are listed'

@skip_if_disabled
def test_get_head_simple_post(self):

    self.cleanup()
    self.start_servers(**self.__dict__.copy())
    path = ('http://%s:%d/v1/images' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    self.assertEqual('{"images":    []}', content.decode())
    path = ('http://%s:%d/v1/images/detail' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    self.assertEqual('{"images":    []}', content.decode())
    image_data = ('*' * FIVE_KB)
    headers = minimal_headers('Image1')
    path = ('http://%s:%d/v1/images' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'POST', headers=headers, body=image_data)
    self.assertEqual(http_client.CREATED, response.status)
    data = jsonutils.loads(content)
    image_id = data['image']['id']
    self.assertEqual(hashlib.md5(image_data).hexdigest(), data['image']['checksum'])
    self.assertEqual(FIVE_KB, data['image']['size'])
    self.assertEqual('Image1', data['image']['name'])
    self.assertTrue(data['image']['is_public'])
    path = ('http://%s:%d/v1/images/%s' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'HEAD')
    self.assertEqual(http_client.OK, response.status)
    self.assertEqual('Image1', response['x-image-meta-name'])
    path = ('http://%s:%d/v1/images/%s' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    expected_image_headers = {'x-image-meta-id': image_id, 'x-image-meta-name': 'Image1', 'x-image-meta-is_public': 'True', 'x-image-meta-status': 'active', 'x-image-meta-disk_format': 'raw', 'x-image-meta-container_format': 'ovf', 'x-image-meta-size': str(FIVE_KB)}
    expected_std_headers = {'content-length': str(FIVE_KB), 'content-type': 'application/octet-stream'}
    for (expected_key, expected_value) in expected_image_headers.items():
        self.assertEqual(expected_value, response[expected_key], ("For    key    '%s'    expected    header    value    '%s'.    Got    '%s'" % (expected_key, expected_value, response[expected_key])))
    for (expected_key, expected_value) in expected_std_headers.items():
        self.assertEqual(expected_value, response[expected_key], ("For    key    '%s'    expected    header    value    '%s'.    Got    '%s'" % (expected_key, expected_value, response[expected_key])))
    self.assertEqual(image_data, content)
    self.assertEqual(hashlib.md5(image_data).hexdigest(), hashlib.md5(content).hexdigest())
    path = ('http://%s:%d/v1/images' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    expected_result = {'images': [{'container_format': 'ovf', 'disk_format': 'raw', 'id': image_id, 'name': 'Image1', 'checksum': 'c2e5db72bd7fd153f53ede5da5a06de3', 'size': 5120}]}
    self.assertEqual(expected_result, jsonutils.loads(content))
    path = ('http://%s:%d/v1/images/detail' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    expected_image = {'status': 'active', 'name': 'Image1', 'deleted': False, 'container_format': 'ovf', 'disk_format': 'raw', 'id': image_id, 'is_public': True, 'deleted_at': None, 'properties': {}, 'size': 5120}
    image = jsonutils.loads(content)
    for (expected_key, expected_value) in expected_image.items():
        self.assertEqual(expected_value, image['images'][0][expected_key], ("For    key    '%s'    expected    header    value    '%s'.    Got    '%s'" % (expected_key, expected_value, image['images'][0][expected_key])))
    headers = {'X-Image-Meta-Property-Distro': 'Ubuntu', 'X-Image-Meta-Property-Arch': 'x86_64'}
    path = ('http://%s:%d/v1/images/%s' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'PUT', headers=headers)
    self.assertEqual(http_client.OK, response.status)
    data = jsonutils.loads(content)
    self.assertEqual('x86_64', data['image']['properties']['arch'])
    self.assertEqual('Ubuntu', data['image']['properties']['distro'])
    headers = {}
    for i in range(11):
        headers[('X-Image-Meta-Property-foo%d' % i)] = 'bar'
    path = ('http://%s:%d/v1/images/%s' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'PUT', headers=headers)
    self.assertEqual(http_client.REQUEST_ENTITY_TOO_LARGE, response.status)
    path = ('http://%s:%d/v1/images/detail' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    expected_image = {'status': 'active', 'name': 'Image1', 'deleted': False, 'container_format': 'ovf', 'disk_format': 'raw', 'id': image_id, 'is_public': True, 'deleted_at': None, 'properties': {'distro': 'Ubuntu', 'arch': 'x86_64'}, 'size': 5120}
    image = jsonutils.loads(content)
    for (expected_key, expected_value) in expected_image.items():
        self.assertEqual(expected_value, image['images'][0][expected_key], ("For    key    '%s'    expected    header    value    '%s'.    Got    '%s'" % (expected_key, expected_value, image['images'][0][expected_key])))
    headers = {'X-Image-Meta-Property-Arch': 'x86_64'}
    path = ('http://%s:%d/v1/images/%s' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'PUT', headers=headers)
    self.assertEqual(http_client.OK, response.status)
    path = ('http://%s:%d/v1/images/detail' % ('127.0.0.1', self.api_port))
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    data = jsonutils.loads(content)['images'][0]
    self.assertEqual(1, len(data['properties']))
    self.assertEqual('x86_64', data['properties']['arch'])
    headers = {'X-Image-Meta-Property-Distro': 'Ubuntu', 'X-Image-Meta-Property-Arch': 'x86_64'}
    path = ('http://%s:%d/v1/images/%s' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'PUT', headers=headers)
    self.assertEqual(http_client.OK, response.status)
    data = jsonutils.loads(content)
    path = ('http://%s:%d/v1/images/detail' % ('127.0.0.1', self.api_port))
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    data = jsonutils.loads(content)['images'][0]
    self.assertEqual(2, len(data['properties']))
    self.assertEqual('x86_64', data['properties']['arch'])
    self.assertEqual('Ubuntu', data['properties']['distro'])
    self.assertNotEqual(data['created_at'], data['updated_at'])
    path = ('http://%s:%d/v1/images/%s/members/pattieblack' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'PUT')
    self.assertEqual(http_client.NO_CONTENT, response.status)
    path = ('http://%s:%d/v1/images/%s/members/pattiewhite' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'PUT')
    self.assertEqual(http_client.NO_CONTENT, response.status)
    path = ('http://%s:%d/v1/images/%s/members' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    data = jsonutils.loads(content)
    self.assertEqual(2, len(data['members']))
    self.assertEqual('pattieblack', data['members'][0]['member_id'])
    self.assertEqual('pattiewhite', data['members'][1]['member_id'])
    path = ('http://%s:%d/v1/images/%s/members/pattieblack' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'DELETE')
    self.assertEqual(http_client.NO_CONTENT, response.status)
    path = ('http://%s:%d/v1/images/%s/members' % ('127.0.0.1', self.api_port, image_id))
    memberships = []
    for i in range(11):
        member_id = ('foo%d' % i)
        memberships.append(dict(member_id=member_id))
    http = httplib2.Http()
    body = jsonutils.dumps(dict(memberships=memberships))
    (response, content) = http.request(path, 'PUT', body=body)
    self.assertEqual(http_client.REQUEST_ENTITY_TOO_LARGE, response.status)
    path = ('http://%s:%d/v1/images/%s/members' % ('127.0.0.1', self.api_port, image_id))
    memberships = []
    for i in range(10):
        member_id = ('foo%d' % i)
        memberships.append(dict(member_id=member_id))
    http = httplib2.Http()
    body = jsonutils.dumps(dict(memberships=memberships))
    (response, content) = http.request(path, 'PUT', body=body)
    self.assertEqual(http_client.NO_CONTENT, response.status)
    path = ('http://%s:%d/v1/images/%s/members/fail_me' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'PUT')
    self.assertEqual(http_client.REQUEST_ENTITY_TOO_LARGE, response.status)
    image_data = ('*' * FIVE_KB)
    headers = minimal_headers('Image2')
    headers['X-Image-Meta-Property-Distro'] = 'Ubuntu'
    headers['X-Image-Meta-Property-Arch'] = 'i386'
    headers['X-Image-Meta-Property-foo'] = 'bar'
    path = ('http://%s:%d/v1/images' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'POST', headers=headers, body=image_data)
    self.assertEqual(http_client.CREATED, response.status)
    data = jsonutils.loads(content)
    image2_id = data['image']['id']
    self.assertEqual(hashlib.md5(image_data).hexdigest(), data['image']['checksum'])
    self.assertEqual(FIVE_KB, data['image']['size'])
    self.assertEqual('Image2', data['image']['name'])
    self.assertTrue(data['image']['is_public'])
    self.assertEqual('Ubuntu', data['image']['properties']['distro'])
    self.assertEqual('i386', data['image']['properties']['arch'])
    self.assertEqual('bar', data['image']['properties']['foo'])
    path = ('http://%s:%d/v1/images/%s' % ('127.0.0.1', self.api_port, image2_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'HEAD')
    self.assertEqual(http_client.OK, response.status)
    self.assertEqual('Image2', response['x-image-meta-name'])
    path = ('http://%s:%d/v1/images' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    images = jsonutils.loads(content)['images']
    self.assertEqual(2, len(images))
    self.assertEqual(image2_id, images[0]['id'])
    self.assertEqual(image_id, images[1]['id'])
    path = ('http://%s:%d/v1/images?property-distro=Ubuntu' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    images = jsonutils.loads(content)['images']
    self.assertEqual(2, len(images))
    self.assertEqual(image2_id, images[0]['id'])
    self.assertEqual(image_id, images[1]['id'])
    path = ('http://%s:%d/v1/images?property-distro=fedora' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    images = jsonutils.loads(content)['images']
    self.assertEqual(0, len(images))
    path = ('http://%s:%d/v1/images?property-boo=bar' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    images = jsonutils.loads(content)['images']
    self.assertEqual(0, len(images))
    path = ('http://%s:%d/v1/images?property-arch=i386' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    images = jsonutils.loads(content)['images']
    self.assertEqual(1, len(images))
    self.assertEqual(image2_id, images[0]['id'])
    path = ('http://%s:%d/v1/images?property-arch=x86_64' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    images = jsonutils.loads(content)['images']
    self.assertEqual(1, len(images))
    self.assertEqual(image_id, images[0]['id'])
    path = ('http://%s:%d/v1/images?property-foo=bar' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    images = jsonutils.loads(content)['images']
    self.assertEqual(1, len(images))
    self.assertEqual(image2_id, images[0]['id'])
    path = ('http://%s:%d/v1/images/%s' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'DELETE')
    self.assertEqual(http_client.OK, response.status)
    path = ('http://%s:%d/v1/images/%s/members' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.NOT_FOUND, response.status)
    path = ('http://%s:%d/v1/images/%s/members' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    fixture = [{'member_id': 'pattieblack', 'can_share': 'false'}]
    body = jsonutils.dumps(dict(memberships=fixture))
    (response, content) = http.request(path, 'PUT', body=body)
    self.assertEqual(http_client.NOT_FOUND, response.status)
    path = ('http://%s:%d/v1/images/%s/members/chickenpattie' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'PUT')
    self.assertEqual(http_client.NOT_FOUND, response.status)
    path = ('http://%s:%d/v1/images/%s/members/pattieblack' % ('127.0.0.1', self.api_port, image_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'DELETE')
    self.assertEqual(http_client.NOT_FOUND, response.status)
    path = ('http://%s:%d/v1/images/%s' % ('127.0.0.1', self.api_port, image2_id))
    http = httplib2.Http()
    (response, content) = http.request(path, 'DELETE')
    self.assertEqual(http_client.OK, response.status)
    path = ('http://%s:%d/v1/images' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'GET')
    self.assertEqual(http_client.OK, response.status)
    images = jsonutils.loads(content)['images']
    self.assertEqual(0, len(images))
    path = ('http://%s:%d/v1/images/detail' % ('127.0.0.1', self.api_port))
    http = httplib2.Http()
    (response, content) = http.request(path, 'HEAD')
    self.assertEqual(http_client.METHOD_NOT_ALLOWED, response.status)
    self.assertEqual('GET', response.get('allow'))
    self.stop_servers()
