Merge "[Ironic] generate bootstrap"
This commit is contained in:
commit
7830a7a3a9
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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']))
|
||||
|
|
|
@ -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/'
|
||||
|
|
Loading…
Reference in New Issue