# Copyright 2016 OpenStack Foundation # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import testtools from glareclient.exc import HTTPBadRequest from glareclient.tests.unit.v1 import fixtures from glareclient.tests import utils from glareclient.v1 import artifacts class TestController(testtools.TestCase): def setUp(self): super(TestController, self).setUp() self.api = utils.FakeAPI(fixtures.data_fixtures) self.controller = artifacts.Controller(self.api) def test_list_artifacts(self): artifacts = list(self.controller.list(type_name='images')) self.assertEqual('3a4560a1-e585-443e-9b39-553b46ec92d1', artifacts[0]['id']) self.assertEqual('art1', artifacts[0]['name']) self.assertEqual('db721fb0-5b85-4738-9401-f161d541de5e', artifacts[1]['id']) self.assertEqual('art2', artifacts[1]['name']) self.assertEqual('e4f027d2-bff3-4084-a2ba-f31cb5e3067f', artifacts[2]['id']) self.assertEqual('art3', artifacts[2]['name']) exp_headers = {} expect_body = None expect = [('GET', '/artifacts/images?limit=20', exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_list_with_paginate(self): artifacts = list(self.controller.list(type_name='images', page_size=2)) self.assertEqual('3a4560a1-e585-443e-9b39-553b46ec92d1', artifacts[0]['id']) self.assertEqual('art1', artifacts[0]['name']) self.assertEqual('art2', artifacts[1]['name']) self.assertEqual('db721fb0-5b85-4738-9401-f161d541de5e', artifacts[1]['id']) exp_headers = {} expect_body = None expect = [('GET', '/artifacts/images?limit=2', exp_headers, expect_body), ('GET', '/artifacts/images?limit=2' '&marker=e1090471-1d12-4935-a8d8-a9351266ece8', exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_list_artifacts_limit(self): artifacts = list(self.controller.list(type_name='images', limit=2)) self.assertEqual('3a4560a1-e585-443e-9b39-553b46ec92d1', artifacts[0]['id']) self.assertEqual('art1', artifacts[0]['name']) self.assertEqual('art2', artifacts[1]['name']) self.assertEqual('db721fb0-5b85-4738-9401-f161d541de5e', artifacts[1]['id']) exp_headers = {} expect_body = None expect = [('GET', '/artifacts/images?limit=2', exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_list_artifact_sort_name(self): artifacts = list(self.controller.list(type_name='images', sort='name:desc')) self.assertEqual('e4f027d2-bff3-4084-a2ba-f31cb5e3067f', artifacts[0]['id']) self.assertEqual('art2', artifacts[0]['name']) self.assertEqual('art1', artifacts[1]['name']) self.assertEqual('3a4560a1-e585-443e-9b39-553b46ec92d1', artifacts[1]['id']) exp_headers = {} expect_body = None expect = [('GET', '/artifacts/images?limit=20' '&sort=name%3Adesc', exp_headers, expect_body), ('GET', '/artifacts/images?limit=20' '&marker=3a4560a1-e585-443e-9b39-553b46ec92d1', exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_list_artifact_sort_badrequest(self): with testtools.ExpectedException(HTTPBadRequest): list(self.controller.list(type_name='images', sort='name:KAK')) def test_create_artifact(self): properties = { 'name': 'art_1', 'type_name': 'images' } art = self.controller.create(**properties) self.assertEqual('art_1', art['images'][0]['name']) self.assertEqual('0.0.0', art['images'][0]['version']) self.assertIsNotNone(art['images'][0]['id']) exp_headers = {} expect_body = [('name', 'art_1'), ('version', '0.0.0')] expect = [('POST', '/artifacts/images', exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_create_artifact_bad_prop(self): properties = { 'name': 'art_1', 'type_name': 'bad_type_name', } with testtools.ExpectedException(KeyError): self.controller.create(**properties) def test_delete_artifact(self): self.controller.delete( artifact_id='3a4560a1-e585-443e-9b39-553b46ec92a3', type_name='images') expect = [('DELETE', '/artifacts/images/' '3a4560a1-e585-443e-9b39-553b46ec92a3', {}, None)] self.assertEqual(expect, self.api.calls) def test_update_prop(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a3' param = {'type_name': 'images', 'name': 'new_name'} self.controller.update(artifact_id=art_id, **param) exp_headers = { 'Content-Type': 'application/json-patch+json' } expect_body = [{'path': '/name', 'value': 'new_name', 'op': 'add'}] expect = [('PATCH', '/artifacts/images/%s' % art_id, exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_remove_prop(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a3' self.controller.update(artifact_id=art_id, remove_props=['name'], type_name='images') exp_headers = { 'Content-Type': 'application/json-patch+json' } expect_body = [{'path': '/name', 'op': 'replace', 'value': None}] expect = [('PATCH', '/artifacts/images/%s' % art_id, exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) self.api.calls = [] self.controller.update(artifact_id=art_id, remove_props=['metadata/key1'], type_name='images') expect_body = [{'path': '/metadata/key1', 'op': 'remove'}] expect = [('PATCH', '/artifacts/images/%s' % art_id, exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) self.api.calls = [] self.controller.update(artifact_id=art_id, remove_props=['releases/1'], type_name='images') expect_body = [{'path': '/releases/1', 'op': 'remove'}] expect = [('PATCH', '/artifacts/images/%s' % art_id, exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_nontype_type_name(self): with testtools.ExpectedException(HTTPBadRequest): self.controller.create(name='art') def test_active_artifact(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a3' self.controller.activate(artifact_id=art_id, type_name='images') exp_headers = { 'Content-Type': 'application/json-patch+json' } expect_body = [{'path': '/status', 'value': 'active', 'op': 'add'}] expect = [('PATCH', '/artifacts/images/%s' % art_id, exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_deactivate_artifact(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a3' self.controller.deactivate(artifact_id=art_id, type_name='images') exp_headers = { 'Content-Type': 'application/json-patch+json' } expect_body = [{'path': '/status', 'value': 'deactivated', 'op': 'add'}] expect = [('PATCH', '/artifacts/images/%s' % art_id, exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_reactivate_artifact(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a3' self.controller.reactivate(artifact_id=art_id, type_name='images') exp_headers = { 'Content-Type': 'application/json-patch+json' } expect_body = [{'path': '/status', 'value': 'active', 'op': 'add'}] expect = [('PATCH', '/artifacts/images/%s' % art_id, exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_publish_artifact(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a3' self.controller.publish(artifact_id=art_id, type_name='images') exp_headers = { 'Content-Type': 'application/json-patch+json' } expect_body = [{'path': '/visibility', 'value': 'public', 'op': 'add'}] expect = [('PATCH', '/artifacts/images/%s' % art_id, exp_headers, expect_body)] self.assertEqual(expect, self.api.calls) def test_upload_blob(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a3' self.controller.upload_blob(artifact_id=art_id, type_name='images', blob_property='image', data='data') exp_headers = { 'Content-Type': 'application/octet-stream' } expect = [('PUT', '/artifacts/images/%s/image' % art_id, exp_headers, 'data')] self.assertEqual(expect, self.api.calls) def test_upload_blob_custom_content_type(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a3' self.controller.upload_blob(artifact_id=art_id, type_name='images', blob_property='image', data='{"a":"b"}', content_type='application/json',) exp_headers = { 'Content-Type': 'application/json' } expect = [('PUT', '/artifacts/images/%s/image' % art_id, exp_headers, {"a": "b"})] self.assertEqual(expect, self.api.calls) def test_download_blob(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a3' self.controller.download_blob(artifact_id=art_id, type_name='images', blob_property='image') exp_headers = {} expect = [('GET', '/artifacts/images/%s/image' % art_id, exp_headers, None)] self.assertEqual(expect, self.api.calls) def test_download_blob_with_checksum(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a2' data = self.controller.download_blob(artifact_id=art_id, type_name='images', blob_property='image') self.assertIsNotNone(data.iterable) expect = [('GET', '/artifacts/images/%s/image' % art_id, {}, None)] self.assertEqual(expect, self.api.calls) def test_download_blob_without_checksum(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a2' data = self.controller.download_blob(artifact_id=art_id, type_name='images', blob_property='image', do_checksum=False) self.assertIsNotNone(data.iterable) expect = [('GET', '/artifacts/images/%s/image' % art_id, {}, None)] self.assertEqual(expect, self.api.calls) def test_get_artifact(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a3' art = self.controller.get(artifact_id=art_id, type_name='images') self.assertEqual(art_id, art['images'][0]['id']) self.assertEqual('art_1', art['images'][0]['name']) def test_get_by_name(self): art_name = 'name1' art = self.controller.get_by_name(name=art_name, type_name='images') self.assertEqual(art_name, art['name']) self.assertEqual('3.0.0', art['version']) def test_get_by_name_with_version(self): art_name = 'name1' art = self.controller.get_by_name(name=art_name, version='1.0.0', type_name='images') self.assertEqual(art_name, art['name']) self.assertEqual('1.0.0', art['version']) def test_type_list(self): data = self.controller.get_type_list() expect_data = [('images', '1.0'), ('heat_environments', '1.0')] expect_call = [('GET', '/schemas', {}, None)] self.assertEqual(expect_call, self.api.calls) self.assertEqual(expect_data, data) def test_get_schema(self): data = self.controller.get_type_schema(type_name='images') expect_data = {'name': 'images', 'version': '1.0', 'properties': {'foo': 'bar'}} expect_call = [('GET', '/schemas/images', {}, None)] self.assertEqual(expect_call, self.api.calls) self.assertEqual(expect_data, data) def test_add_external_location(self): art_id = '3a4560a1-e585-443e-9b39-553b46ec92a8' data = self.controller.add_external_location(art_id, 'image', 'http://fake_url', type_name='images') expect_call = [ ('PUT', '/artifacts/images/3a4560a1-e585-443e-9b39-553b46ec92a8/image', {'Content-Type': 'application/vnd+openstack.' 'glare-custom-location+json'}, 'http://fake_url')] self.assertEqual(expect_call, self.api.calls) self.assertIsNone(data) def test_add_tag(self): art_id = '07a679d8-d0a8-45ff-8d6e-2f32f2097b7c' data = self.controller.add_tag( art_id, tag_value="123", type_name='images') expect_call = [ ('GET', '/artifacts/images/07a679d8-d0a8-45ff-8d6e-2f32f2097b7c', {}, None), ('PATCH', '/artifacts/images/07a679d8-d0a8-45ff-8d6e-2f32f2097b7c', {'Content-Type': 'application/json-patch+json'}, [{'op': 'add', 'path': '/tags', 'value': ['a', 'b', 'c', '123']}])] self.assertEqual(expect_call, self.api.calls) self.assertIsNotNone(data) def test_add_existing_tag(self): art_id = '07a679d8-d0a8-45ff-8d6e-2f32f2097b7c' data = self.controller.add_tag( art_id, tag_value="a", type_name='images') expect_call = [ ('GET', '/artifacts/images/07a679d8-d0a8-45ff-8d6e-2f32f2097b7c', {}, None)] self.assertEqual(expect_call, self.api.calls) self.assertIsNotNone(data) def test_remove_tag(self): art_id = '07a679d8-d0a8-45ff-8d6e-2f32f2097b7c' data = self.controller.remove_tag( art_id, tag_value="a", type_name='images') expect_call = [ ('GET', '/artifacts/images/07a679d8-d0a8-45ff-8d6e-2f32f2097b7c', {}, None), ('PATCH', '/artifacts/images/07a679d8-d0a8-45ff-8d6e-2f32f2097b7c', {'Content-Type': 'application/json-patch+json'}, [{'op': 'add', 'path': '/tags', 'value': ['b', 'c']}])] self.assertEqual(expect_call, self.api.calls) self.assertIsNotNone(data) def test_remove_nonexisting_tag(self): art_id = '07a679d8-d0a8-45ff-8d6e-2f32f2097b7c' data = self.controller.remove_tag( art_id, tag_value="123", type_name='images') expect_call = [ ('GET', '/artifacts/images/07a679d8-d0a8-45ff-8d6e-2f32f2097b7c', {}, None)] self.assertEqual(expect_call, self.api.calls) self.assertIsNotNone(data)