Add boot-from-volume support for nodes

For example, a cloud may get better preformance from a cinder volume
then the local compute drive. As a result, give nodepool to option to
choose if the server should boot from volume or not.

Change-Id: I3faefe99096fef1fe28816ac0a4b28c05ff7f0ec
Depends-On: If58cd96b0b9ce4569120d60fbceb2c23b2f7641d
Signed-off-by: Paul Belanger <pabelanger@redhat.com>
This commit is contained in:
Paul Belanger 2017-05-12 21:57:58 -04:00
parent 1a804c7859
commit 1d0990a1c1
No known key found for this signature in database
GPG Key ID: 611A80832067AF38
9 changed files with 88 additions and 3 deletions

View File

@ -509,6 +509,12 @@ Example configuration::
**optional** **optional**
``boot-from-volume`` (bool)
If given, the label for use in this pool will create a volume from the
image and boot the node from it.
Default: False
``key-name`` ``key-name``
If given, is the name of a keypair that will be used when booting each If given, is the name of a keypair that will be used when booting each
server. server.
@ -516,3 +522,8 @@ Example configuration::
``console-log`` (default: False) ``console-log`` (default: False)
On the failure of the ssh ready check, download the server console log to On the failure of the ssh ready check, download the server console log to
aid in debuging the problem. aid in debuging the problem.
``volume-size``
When booting an image from volume, how big should the created volume be.
In gigabytes. Default 50.

View File

@ -41,6 +41,8 @@ class ConfigValidator:
'flavor-name': str, 'flavor-name': str,
'key-name': str, 'key-name': str,
'console-log': bool, 'console-log': bool,
'boot-from-volume': bool,
'volume-size': int,
} }
pool_label = v.All(pool_label_main, pool_label = v.All(pool_label_main,

View File

@ -271,6 +271,9 @@ def loadConfig(config_path):
pl.flavor_name = label.get('flavor-name', None) pl.flavor_name = label.get('flavor-name', None)
pl.key_name = label.get('key-name') pl.key_name = label.get('key-name')
pl.console_log = label.get('console-log', False) pl.console_log = label.get('console-log', False)
pl.boot_from_volume = bool(label.get('boot-from-volume',
False))
pl.volume_size = label.get('volume-size', 50)
top_label = newconfig.labels[pl.name] top_label = newconfig.labels[pl.name]
top_label.pools.append(pp) top_label.pools.append(pp)

View File

@ -316,7 +316,9 @@ class NodeLauncher(threading.Thread, StatsReporter):
config_drive=config_drive, config_drive=config_drive,
nodepool_node_id=self._node.id, nodepool_node_id=self._node.id,
nodepool_image_name=image_name, nodepool_image_name=image_name,
networks=self._pool.networks) networks=self._pool.networks,
boot_from_volume=self._label.boot_from_volume,
volume_size=self._label.volume_size)
self._node.external_id = server.id self._node.external_id = server.id
self._node.hostname = hostname self._node.hostname = hostname

View File

@ -189,7 +189,7 @@ class ProviderManager(object):
flavor_name=None, min_ram=None, flavor_name=None, min_ram=None,
az=None, key_name=None, config_drive=True, az=None, key_name=None, config_drive=True,
nodepool_node_id=None, nodepool_image_name=None, nodepool_node_id=None, nodepool_image_name=None,
networks=None): networks=None, boot_from_volume=False, volume_size=50):
if not networks: if not networks:
networks = [] networks = []
if image_name: if image_name:
@ -201,6 +201,11 @@ class ProviderManager(object):
image=image, image=image,
flavor=flavor, flavor=flavor,
config_drive=config_drive) config_drive=config_drive)
if boot_from_volume:
create_args['boot_from_volume'] = boot_from_volume
create_args['volume_size'] = volume_size
# NOTE(pabelanger): Always cleanup volumes when we delete a server.
create_args['terminate_volume'] = True
if key_name: if key_name:
create_args['key_name'] = key_name create_args['key_name'] = key_name
if az: if az:

View File

@ -36,6 +36,8 @@ providers:
- name: trusty-2-node - name: trusty-2-node
diskimage: trusty diskimage: trusty
min-ram: 8192 min-ram: 8192
boot-from-volume: True
volume-size: 100
- name: cloud2 - name: cloud2
cloud: chocolate-cloud cloud: chocolate-cloud

View File

@ -0,0 +1,47 @@
elements-dir: .
images-dir: '{images_dir}'
zookeeper-servers:
- host: {zookeeper_host}
port: {zookeeper_port}
chroot: {zookeeper_chroot}
labels:
- name: fake-label
min-ready: 1
providers:
- name: fake-provider
cloud: fake
region-name: fake-region
rate: 0.0001
diskimages:
- name: fake-image
meta:
key: value
key2: value
pools:
- name: main
max-servers: 96
availability-zones:
- az1
networks:
- net-name
labels:
- name: fake-label
diskimage: fake-image
min-ram: 8192
flavor-name: 'Fake'
boot-from-volume: True
diskimages:
- name: fake-image
elements:
- fedora
- vm
release: 21
env-vars:
TMPDIR: /opt/dib_tmp
DIB_IMAGE_CACHE: /opt/dib_cache
DIB_CLOUD_IMAGES: http://download.fedoraproject.org/pub/fedora/linux/releases/test/21-Beta/Cloud/Images/x86_64/
BASE_IMAGE_FILE: Fedora-Cloud-Base-20141029-21_Beta.x86_64.qcow2

View File

@ -225,6 +225,19 @@ class TestLauncher(tests.DBTestCase):
self.assertEqual(nodes[0].type, 'fake-label') self.assertEqual(nodes[0].type, 'fake-label')
self.assertNotEqual(nodes[0].host_keys, []) self.assertNotEqual(nodes[0].host_keys, [])
def test_node_boot_from_volume(self):
"""Test that an image and node are created from a volume"""
configfile = self.setup_config('node_boot_from_volume.yaml')
pool = self.useNodepool(configfile, watermark_sleep=1)
self._useBuilder(configfile)
pool.start()
self.waitForImage('fake-provider', 'fake-image')
nodes = self.waitForNodes('fake-label')
self.assertEqual(len(nodes), 1)
self.assertEqual(nodes[0].provider, 'fake-provider')
self.assertEqual(nodes[0].type, 'fake-label')
def test_disabled_label(self): def test_disabled_label(self):
"""Test that a node is not created with min-ready=0""" """Test that a node is not created with min-ready=0"""
configfile = self.setup_config('node_disabled_label.yaml') configfile = self.setup_config('node_disabled_label.yaml')

View File

@ -10,7 +10,7 @@ PrettyTable>=0.6,<0.8
# shade has a looser requirement on six than nodepool, so install six first # shade has a looser requirement on six than nodepool, so install six first
six>=1.7.0 six>=1.7.0
os-client-config>=1.2.0 os-client-config>=1.2.0
shade>=1.18.1 shade>=1.21.0
diskimage-builder>=2.0.0 diskimage-builder>=2.0.0
voluptuous voluptuous
kazoo kazoo