Merge "[Ironic] generate bootstrap"

This commit is contained in:
Jenkins 2015-10-26 09:45:54 +00:00 committed by Gerrit Code Review
commit 7830a7a3a9
5 changed files with 201 additions and 2 deletions

View File

@ -347,6 +347,8 @@ def get_serializer_for_cluster(cluster):
serializers_map = {
'5': ProvisioningSerializer,
'6.0': ProvisioningSerializer,
'6.1': ProvisioningSerializer61,
'7.0': ProvisioningSerializer70
}
for version, serializer in six.iteritems(serializers_map):
@ -354,7 +356,7 @@ def get_serializer_for_cluster(cluster):
return serializer
# by default, we should return latest serializer
return ProvisioningSerializer61
return ProvisioningSerializer80
def serialize(cluster, nodes, ignore_customized=False):
@ -364,3 +366,31 @@ def serialize(cluster, nodes, ignore_customized=False):
return serializer.serialize(
cluster, nodes, ignore_customized=ignore_customized)
class ProvisioningSerializer70(ProvisioningSerializer61):
pass
class ProvisioningSerializer80(ProvisioningSerializer70):
@classmethod
def serialize_pre_provision_tasks(cls, cluster):
tasks = super(ProvisioningSerializer80,
cls).serialize_pre_provision_tasks(cluster)
attrs = objects.Attributes.merged_attrs_values(cluster.attributes)
if attrs['ironic']['enabled']:
tasks.append(
tasks_templates.generate_ironic_bootstrap_keys_task(
[consts.MASTER_ROLE],
cluster.id))
tasks.append(
tasks_templates.make_ironic_bootstrap_task(
[consts.MASTER_ROLE],
cluster.id))
PriorityStrategy().one_by_one(tasks)
return tasks

View File

@ -269,6 +269,22 @@ class CopyHaproxyKeys(CopyKeys):
identity = 'copy_haproxy_keys'
class IronicUploadImages(GenericRolesHook):
identity = 'ironic_upload_images'
def serialize(self):
uids = self.get_uids()
self.task['parameters']['cmd'] = self.task['parameters']['cmd'].format(
CLUSTER_ID=self.cluster.id)
yield templates.make_shell_task(uids, self.task)
class IronicCopyBootstrapKey(CopyKeys):
identity = 'ironic_copy_bootstrap_key'
class RestartRadosGW(GenericRolesHook):
identity = 'restart_radosgw'
@ -359,7 +375,8 @@ class TaskSerializers(object):
stage_serializers = [UploadMOSRepo, RsyncPuppet, CopyKeys, RestartRadosGW,
UploadNodesInfo, UpdateHosts, GenerateKeys,
GenerateHaproxyKeys, CopyHaproxyKeys,
GenerateCephKeys, CopyCephKeys]
GenerateCephKeys, CopyCephKeys, IronicUploadImages,
IronicCopyBootstrapKey]
deploy_serializers = [PuppetHook, CreateVMsOnCompute]
def __init__(self, stage_serializers=None, deploy_serializers=None):

View File

@ -221,6 +221,41 @@ def make_provisioning_images_task(uids, repos, provision_data, cid):
'retries': 1}})
def generate_ironic_bootstrap_keys_task(uids, cid):
cmd = "/etc/puppet/modules/osnailyfacter/modular/astute/generate_keys.sh"
return make_shell_task(uids, {
'parameters': {
'cmd': (
"sh {cmd} "
"-i {cid} "
"-s 'ironic' "
"-p /var/lib/fuel/keys/ ").format(
cid=cid,
cmd=cmd),
'timeout': 180,
'retries': 1}})
def make_ironic_bootstrap_task(uids, cid):
extra_conf_files = "/usr/share/ironic-fa-bootstrap-configs/"
ssh_keys = "/var/lib/fuel/keys/{0}/ironic/ironic.pub".format(cid)
return make_shell_task(uids, {
'parameters': {
'cmd': (
"BOOTSTRAP_FUEL_PKGS='openssh-server ntp fuel-agent' "
"EXTRA_CONF_FILES='{extra_conf_files}' "
"DESTDIR='/var/www/nailgun/bootstrap/ironic/{cid}' "
"BOOTSTRAP_SSH_KEYS='{bootstrap_ssh_keys}' "
'fuel-bootstrap-image ').format(
cid=cid,
extra_conf_files=extra_conf_files,
bootstrap_ssh_keys=ssh_keys),
'timeout': settings.PROVISIONING_IMAGES_BUILD_TIMEOUT,
'retries': 1}})
def make_download_debian_installer_task(
uids, repos, installer_kernel, installer_initrd):
# NOTE(kozhukalov): This task is going to go away by 7.0

View File

@ -74,6 +74,18 @@ class TestGetSerializerForCluster(BaseIntegrationTest):
self.assertIs(serializer, ps.ProvisioningSerializer61)
def test_env_7_0(self):
cluster = self._get_cluster('2015.1-7.0')
serializer = ps.get_serializer_for_cluster(cluster)
self.assertIs(serializer, ps.ProvisioningSerializer70)
def test_env_8_0(self):
cluster = self._get_cluster('2015.1-8.0')
serializer = ps.get_serializer_for_cluster(cluster)
self.assertIs(serializer, ps.ProvisioningSerializer80)
class TestProvisioningSerializer(BaseIntegrationTest):
@ -331,3 +343,60 @@ class TestProvisioningSerializer61(BaseIntegrationTest):
node_info = serialized_info['nodes'][0]
self.assertIn('kernel_lt', node_info['ks_meta'])
self.assertEqual(1, node_info['ks_meta']['kernel_lt'])
class TestProvisioningSerializer80(BaseIntegrationTest):
serializer = ps.ProvisioningSerializer80
def test_generate_ironic_bootstrap_keys_task(self):
release = self.env.create_release(
api=False,
operating_system=consts.RELEASE_OS.ubuntu)
self.cluster = self.env.create_cluster(
api=False, release_id=release.id)
editable = self.cluster.attributes.editable
editable['additional_components']['ironic']['value'] = True
serialized_info = self.serializer.serialize(self.cluster, [])
self.assertIn('pre_provision', serialized_info)
self.assertTrue(filter(
lambda task: all([
task['uids'] == ['master'],
task['type'] == 'shell',
task['parameters']['cmd'].startswith(
'sh /etc/puppet/modules/osnailyfacter/modular/'
'astute/generate_keys.sh')
]),
serialized_info['pre_provision']))
self.assertTrue(filter(
lambda task: all([
'fuel-bootstrap-image' in task['parameters']['cmd'],
'ironic.pub' in task['parameters']['cmd']]),
serialized_info['pre_provision']))
def test_do_not_generate_ironic_bootstrap_keys_task(self):
release = self.env.create_release(
api=False,
operating_system=consts.RELEASE_OS.ubuntu)
self.cluster = self.env.create_cluster(
api=False, release_id=release.id)
editable = self.cluster.attributes.editable
editable['additional_components']['ironic']['value'] = False
serialized_info = self.serializer.serialize(self.cluster, [])
self.assertIn('pre_provision', serialized_info)
self.assertFalse(filter(
lambda task: task['parameters']['cmd'].startswith(
'sh /etc/puppet/modules/osnailyfacter/modular/'
'astute/generate_keys.sh'),
serialized_info['pre_provision']))
self.assertFalse(filter(
lambda task: all([
'fuel-bootstrap-image' in task['parameters']['cmd'],
'ironic.pub' in task['parameters']['cmd']]),
serialized_info['pre_provision']))

View File

@ -168,6 +168,54 @@ class TestMakeTask(base.BaseTestCase):
"--data_driver nailgun_build_image --input_data '").rstrip("'")
self.assertEqual(jsonutils.loads(cmd), fuel_image_conf)
def test_generate_ironic_bootstrap_keys_task(self):
result = tasks_templates.generate_ironic_bootstrap_keys_task(
[1, 2, 3],
cid=123)
cmd_path = "/etc/puppet/modules/osnailyfacter/modular/astute/"
self.assertEqual(result, {
'type': 'shell',
'uids': [1, 2, 3],
'parameters': {
'cmd': (
"sh {cmd_path}generate_keys.sh "
"-i 123 "
"-s 'ironic' "
"-p /var/lib/fuel/keys/ ").format(
cmd_path=cmd_path),
'timeout': 180,
'retries': 1,
'interval': 1,
'cwd': '/'}})
def test_make_ironic_bootstrap_task(self):
cid = 123
result = tasks_templates.make_ironic_bootstrap_task(
[1, 2, 3],
cid=cid)
extra_conf_files = "/usr/share/ironic-fa-bootstrap-configs/"
ssh_keys = "/var/lib/fuel/keys/{0}/ironic/ironic.pub".format(cid)
self.assertEqual(result, {
'type': 'shell',
'uids': [1, 2, 3],
'parameters': {
'cmd': (
"BOOTSTRAP_FUEL_PKGS='openssh-server ntp fuel-agent' "
"EXTRA_CONF_FILES='{extra_conf_files}' "
"DESTDIR='/var/www/nailgun/bootstrap/ironic/{cid}' "
"BOOTSTRAP_SSH_KEYS='{bootstrap_ssh_keys}' "
'fuel-bootstrap-image ').format(
cid=cid,
extra_conf_files=extra_conf_files,
bootstrap_ssh_keys=ssh_keys),
'timeout': settings.PROVISIONING_IMAGES_BUILD_TIMEOUT,
'retries': 1,
'interval': 1,
'cwd': '/'}})
def test_make_download_debian_installer_task(self):
remote_kernel = ('http://some/a/dists/trusty/main/'
'installer-amd64/current/images/'