Allow openstack provider labels to configure networks
We have a use case where we have a single pool, due to quota reasons, but need the ability to selectively choose which network a label will use. Now a nodepool operator will be able to define which networks are attached to labels (in our case network appliances). Change-Id: I3bfa32473c76b9fd59deee7d05b492e7cf67f69d Signed-off-by: Paul Belanger <pabelanger@redhat.com>
This commit is contained in:
@@ -841,6 +841,11 @@ Selecting the OpenStack driver adds the following options to the
|
|||||||
min-ram: 8192
|
min-ram: 8192
|
||||||
flavor-name: 'something to match'
|
flavor-name: 'something to match'
|
||||||
console-log: True
|
console-log: True
|
||||||
|
- name: trusty
|
||||||
|
min-ram: 8192
|
||||||
|
networks:
|
||||||
|
- public
|
||||||
|
- private
|
||||||
|
|
||||||
Each entry is a dictionary with the following keys
|
Each entry is a dictionary with the following keys
|
||||||
|
|
||||||
@@ -904,6 +909,15 @@ Selecting the OpenStack driver adds the following options to the
|
|||||||
If given, the label for use in this pool will create a
|
If given, the label for use in this pool will create a
|
||||||
volume from the image and boot the node from it.
|
volume from the image and boot the node from it.
|
||||||
|
|
||||||
|
.. attr:: networks
|
||||||
|
:type: list
|
||||||
|
|
||||||
|
Specify custom Neutron networks that get attached to each
|
||||||
|
node. Specify the name or id of the network as a string.
|
||||||
|
|
||||||
|
.. note:: This value will override the value for
|
||||||
|
:attr:`providers.[openstack].pools.networks`.
|
||||||
|
|
||||||
.. attr:: key-name
|
.. attr:: key-name
|
||||||
:type: string
|
:type: string
|
||||||
|
|
||||||
|
@@ -88,6 +88,7 @@ class ProviderLabel(ConfigValue):
|
|||||||
self.volume_size = None
|
self.volume_size = None
|
||||||
self.instance_properties = None
|
self.instance_properties = None
|
||||||
self.userdata = None
|
self.userdata = None
|
||||||
|
self.networks = []
|
||||||
# The ProviderPool object that owns this label.
|
# The ProviderPool object that owns this label.
|
||||||
self.pool = None
|
self.pool = None
|
||||||
|
|
||||||
@@ -105,7 +106,8 @@ class ProviderLabel(ConfigValue):
|
|||||||
other.boot_from_volume == self.boot_from_volume and
|
other.boot_from_volume == self.boot_from_volume and
|
||||||
other.volume_size == self.volume_size and
|
other.volume_size == self.volume_size and
|
||||||
other.instance_properties == self.instance_properties and
|
other.instance_properties == self.instance_properties and
|
||||||
other.userdata == self.userdata)
|
other.userdata == self.userdata and
|
||||||
|
other.networks == self.networks)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@@ -206,6 +208,7 @@ class ProviderPool(ConfigPool):
|
|||||||
pl.instance_properties = label.get('instance-properties',
|
pl.instance_properties = label.get('instance-properties',
|
||||||
None)
|
None)
|
||||||
pl.userdata = label.get('userdata', None)
|
pl.userdata = label.get('userdata', None)
|
||||||
|
pl.networks = label.get('networks', self.networks)
|
||||||
|
|
||||||
top_label = full_config.labels[pl.name]
|
top_label = full_config.labels[pl.name]
|
||||||
top_label.pools.append(self)
|
top_label.pools.append(self)
|
||||||
@@ -359,6 +362,7 @@ class OpenStackProviderConfig(ProviderConfig):
|
|||||||
'volume-size': int,
|
'volume-size': int,
|
||||||
'instance-properties': dict,
|
'instance-properties': dict,
|
||||||
'userdata': str,
|
'userdata': str,
|
||||||
|
'networks': [str],
|
||||||
}
|
}
|
||||||
|
|
||||||
label_min_ram = v.Schema({v.Required('min-ram'): int}, extra=True)
|
label_min_ram = v.Schema({v.Required('min-ram'): int}, extra=True)
|
||||||
|
@@ -135,7 +135,7 @@ class OpenStackNodeLauncher(NodeLauncher):
|
|||||||
nodepool_node_id=self.node.id,
|
nodepool_node_id=self.node.id,
|
||||||
nodepool_node_label=self.node.type[0],
|
nodepool_node_label=self.node.type[0],
|
||||||
nodepool_image_name=image_name,
|
nodepool_image_name=image_name,
|
||||||
networks=self.pool.networks,
|
networks=self.label.networks,
|
||||||
security_groups=self.pool.security_groups,
|
security_groups=self.pool.security_groups,
|
||||||
boot_from_volume=self.label.boot_from_volume,
|
boot_from_volume=self.label.boot_from_volume,
|
||||||
volume_size=self.label.volume_size,
|
volume_size=self.label.volume_size,
|
||||||
|
@@ -44,11 +44,16 @@ providers:
|
|||||||
node-attributes:
|
node-attributes:
|
||||||
key1: value1
|
key1: value1
|
||||||
key2: value2
|
key2: value2
|
||||||
|
networks:
|
||||||
|
- public
|
||||||
|
- private
|
||||||
labels:
|
labels:
|
||||||
- name: trusty
|
- name: trusty
|
||||||
diskimage: trusty
|
diskimage: trusty
|
||||||
min-ram: 8192
|
min-ram: 8192
|
||||||
console-log: True
|
console-log: True
|
||||||
|
networks:
|
||||||
|
- public
|
||||||
- name: trusty-2-node
|
- name: trusty-2-node
|
||||||
diskimage: trusty
|
diskimage: trusty
|
||||||
min-ram: 8192
|
min-ram: 8192
|
||||||
@@ -93,6 +98,9 @@ providers:
|
|||||||
- name: trusty
|
- name: trusty
|
||||||
diskimage: trusty
|
diskimage: trusty
|
||||||
min-ram: 8192
|
min-ram: 8192
|
||||||
|
networks:
|
||||||
|
- public
|
||||||
|
- private
|
||||||
- name: trusty-2-node
|
- name: trusty-2-node
|
||||||
diskimage: trusty
|
diskimage: trusty
|
||||||
min-ram: 8192
|
min-ram: 8192
|
||||||
|
13
nodepool/tests/fixtures/node_net_name.yaml
vendored
13
nodepool/tests/fixtures/node_net_name.yaml
vendored
@@ -8,7 +8,9 @@ zookeeper-servers:
|
|||||||
chroot: {zookeeper_chroot}
|
chroot: {zookeeper_chroot}
|
||||||
|
|
||||||
labels:
|
labels:
|
||||||
- name: fake-label
|
- name: fake-label1
|
||||||
|
min-ready: 1
|
||||||
|
- name: fake-label2
|
||||||
min-ready: 1
|
min-ready: 1
|
||||||
|
|
||||||
providers:
|
providers:
|
||||||
@@ -26,9 +28,16 @@ providers:
|
|||||||
- 'fake-public-network-name'
|
- 'fake-public-network-name'
|
||||||
- 'fake-private-network-name'
|
- 'fake-private-network-name'
|
||||||
labels:
|
labels:
|
||||||
- name: fake-label
|
- name: fake-label1
|
||||||
diskimage: fake-image
|
diskimage: fake-image
|
||||||
min-ram: 8192
|
min-ram: 8192
|
||||||
|
- name: fake-label2
|
||||||
|
diskimage: fake-image
|
||||||
|
min-ram: 8192
|
||||||
|
networks:
|
||||||
|
# This activates a flag in fakeprovider to give us an ipv6
|
||||||
|
# network
|
||||||
|
- 'fake-ipv6-network-name'
|
||||||
|
|
||||||
diskimages:
|
diskimages:
|
||||||
- name: fake-image
|
- name: fake-image
|
||||||
|
@@ -636,17 +636,31 @@ class TestLauncher(tests.DBTestCase):
|
|||||||
self.assertEqual([], self.zk.getNodes())
|
self.assertEqual([], self.zk.getNodes())
|
||||||
|
|
||||||
def test_node_net_name(self):
|
def test_node_net_name(self):
|
||||||
"""Test that a node is created with a net name"""
|
"""Test that a node is created with proper net name"""
|
||||||
configfile = self.setup_config('node_net_name.yaml')
|
configfile = self.setup_config('node_net_name.yaml')
|
||||||
pool = self.useNodepool(configfile, watermark_sleep=1)
|
pool = self.useNodepool(configfile, watermark_sleep=1)
|
||||||
self.useBuilder(configfile)
|
self.useBuilder(configfile)
|
||||||
pool.start()
|
pool.start()
|
||||||
self.waitForImage('fake-provider', 'fake-image')
|
self.waitForImage('fake-provider', 'fake-image')
|
||||||
nodes = self.waitForNodes('fake-label')
|
label1_nodes = self.waitForNodes('fake-label1')
|
||||||
self.assertEqual(len(nodes), 1)
|
label2_nodes = self.waitForNodes('fake-label2')
|
||||||
self.assertEqual(nodes[0].provider, 'fake-provider')
|
|
||||||
self.assertEqual(nodes[0].type, ['fake-label'])
|
self.assertEqual(len(label1_nodes), 1)
|
||||||
self.assertEqual(nodes[0].username, 'zuul')
|
self.assertEqual(len(label2_nodes), 1)
|
||||||
|
|
||||||
|
# ipv6 address unavailable
|
||||||
|
self.assertEqual(label1_nodes[0].provider, 'fake-provider')
|
||||||
|
self.assertEqual(label1_nodes[0].public_ipv4, 'fake')
|
||||||
|
self.assertEqual(label1_nodes[0].public_ipv6, '')
|
||||||
|
self.assertEqual(label1_nodes[0].interface_ip, 'fake')
|
||||||
|
self.assertEqual(label1_nodes[0].host_id, 'fake')
|
||||||
|
|
||||||
|
# ipv6 address available
|
||||||
|
self.assertEqual(label2_nodes[0].provider, 'fake-provider')
|
||||||
|
self.assertEqual(label2_nodes[0].public_ipv4, 'fake')
|
||||||
|
self.assertEqual(label2_nodes[0].public_ipv6, 'fake_v6')
|
||||||
|
self.assertEqual(label2_nodes[0].interface_ip, 'fake_v6')
|
||||||
|
self.assertEqual(label2_nodes[0].host_id, 'fake_host_id')
|
||||||
|
|
||||||
def test_node_security_group(self):
|
def test_node_security_group(self):
|
||||||
"""Test that an image and node are created with sec_group specified"""
|
"""Test that an image and node are created with sec_group specified"""
|
||||||
|
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Provider labels for the OpenStack driver are now able to select which
|
||||||
|
networks to be attached to. This overrides any networks defined by
|
||||||
|
:attr:`providers.[openstack].pools.networks`.
|
Reference in New Issue
Block a user