deb-python-os-cloud-config/os_cloud_config/tests/test_glance.py
Steve Kowalik 304b4c03d1 Add support to skip either kernel or ramdisk
Currently, glance.create_or_find_kernel_and_ramdisk() will raise an
exception if either the kernel or ramdisk are not found in Glance.
This makes it fairly awkward for others to use the API if they need
to deal with a missing kernel, but an existing ramdisk since the
function will never check, because the exception is raised when the
kernel isn't found.

Change-Id: I872a080846c7a191039e89afaa587cafbd853fe4
2015-02-06 16:07:18 +11:00

101 lines
4.4 KiB
Python

# Copyright (c) 2014 Hewlett-Packard Development Company, L.P.
#
# 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 collections
import tempfile
from glanceclient.openstack.common.apiclient import exceptions
import mock
import testtools
from os_cloud_config import glance
from os_cloud_config.tests import base
class GlanceTest(base.TestCase):
def setUp(self):
super(GlanceTest, self).setUp()
self.image = collections.namedtuple('image', ['id'])
def test_return_existing_kernel_and_ramdisk(self):
client = mock.MagicMock()
expected = {'kernel': 'aaa', 'ramdisk': 'zzz'}
client.images.find.side_effect = (self.image('aaa'), self.image('zzz'))
ids = glance.create_or_find_kernel_and_ramdisk(client, 'bm-kernel',
'bm-ramdisk')
client.images.create.assert_not_called()
self.assertEqual(expected, ids)
def test_raise_exception_kernel(self):
client = mock.MagicMock()
client.images.find.side_effect = exceptions.NotFound
message = "Kernel image not found in Glance, and no path specified."
with testtools.ExpectedException(ValueError, message):
glance.create_or_find_kernel_and_ramdisk(client, 'bm-kernel',
None)
def test_raise_exception_ramdisk(self):
client = mock.MagicMock()
client.images.find.side_effect = (self.image('aaa'),
exceptions.NotFound)
message = "Ramdisk image not found in Glance, and no path specified."
with testtools.ExpectedException(ValueError, message):
glance.create_or_find_kernel_and_ramdisk(client, 'bm-kernel',
'bm-ramdisk')
def test_skip_missing_no_kernel(self):
client = mock.MagicMock()
client.images.find.side_effect = (exceptions.NotFound,
self.image('bbb'))
expected = {'kernel': None, 'ramdisk': 'bbb'}
ids = glance.create_or_find_kernel_and_ramdisk(
client, 'bm-kernel', 'bm-ramdisk', skip_missing=True)
self.assertEqual(ids, expected)
def test_skip_missing_no_ramdisk(self):
client = mock.MagicMock()
client.images.find.side_effect = (self.image('aaa'),
exceptions.NotFound)
expected = {'kernel': 'aaa', 'ramdisk': None}
ids = glance.create_or_find_kernel_and_ramdisk(
client, 'bm-kernel', 'bm-ramdisk', skip_missing=True)
self.assertEqual(ids, expected)
def test_skip_missing_kernel_and_ramdisk(self):
client = mock.MagicMock()
client.images.find.side_effect = exceptions.NotFound
expected = {'kernel': None, 'ramdisk': None}
ids = glance.create_or_find_kernel_and_ramdisk(
client, 'bm-kernel', 'bm-ramdisk', skip_missing=True)
self.assertEqual(ids, expected)
def test_create_kernel_and_ramdisk(self):
client = mock.MagicMock()
client.images.find.side_effect = exceptions.NotFound
client.images.create.side_effect = (self.image('aaa'),
self.image('zzz'))
expected = {'kernel': 'aaa', 'ramdisk': 'zzz'}
with tempfile.NamedTemporaryFile() as imagefile:
ids = glance.create_or_find_kernel_and_ramdisk(
client, 'bm-kernel', 'bm-ramdisk', kernel_path=imagefile.name,
ramdisk_path=imagefile.name)
kernel_create = mock.call(name='bm-kernel', disk_format='aki',
is_public=True, data=mock.ANY)
ramdisk_create = mock.call(name='bm-ramdisk', disk_format='ari',
is_public=True, data=mock.ANY)
client.images.create.assert_has_calls([kernel_create, ramdisk_create])
self.assertEqual(expected, ids)