Merge "Make OS::Nova::Server networks property updatable"
This commit is contained in:
commit
f18bb8b5af
|
@ -218,7 +218,8 @@ class Server(stack_user.StackUser):
|
||||||
'server.')
|
'server.')
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
)
|
),
|
||||||
|
update_allowed=True
|
||||||
),
|
),
|
||||||
SCHEDULER_HINTS: properties.Schema(
|
SCHEDULER_HINTS: properties.Schema(
|
||||||
properties.Schema.MAP,
|
properties.Schema.MAP,
|
||||||
|
@ -636,6 +637,52 @@ class Server(stack_user.StackUser):
|
||||||
if name == 'show':
|
if name == 'show':
|
||||||
return server._info
|
return server._info
|
||||||
|
|
||||||
|
def _get_network_matches(self, old_networks, new_networks):
|
||||||
|
# make new_networks similar on old_networks
|
||||||
|
for net in new_networks:
|
||||||
|
for key in ('port', 'network', 'fixed_ip'):
|
||||||
|
net.setdefault(key)
|
||||||
|
# find matches and remove them from old and new networks
|
||||||
|
not_updated_networks = []
|
||||||
|
for net in old_networks:
|
||||||
|
net.pop('uuid', None)
|
||||||
|
if net in new_networks:
|
||||||
|
new_networks.remove(net)
|
||||||
|
not_updated_networks.append(net)
|
||||||
|
for net in not_updated_networks:
|
||||||
|
old_networks.remove(net)
|
||||||
|
return not_updated_networks
|
||||||
|
|
||||||
|
def update_networks_matching_iface_port(self, nets, interfaces):
|
||||||
|
|
||||||
|
def find_equal(port, net_id, ip, nets):
|
||||||
|
for net in nets:
|
||||||
|
if (net.get('port') == port or
|
||||||
|
(net.get('fixed_ip') == ip and
|
||||||
|
net.get('network') == net_id)):
|
||||||
|
return net
|
||||||
|
|
||||||
|
def find_poor_net(net_id, nets):
|
||||||
|
for net in nets:
|
||||||
|
if net == {'port': None, 'network': net_id, 'fixed_ip': None}:
|
||||||
|
return net
|
||||||
|
|
||||||
|
for iface in interfaces:
|
||||||
|
# get interface properties
|
||||||
|
props = {'port': iface.port_id,
|
||||||
|
'net_id': iface.net_id,
|
||||||
|
'ip': iface.fixed_ips[0]['ip_address'],
|
||||||
|
'nets': nets}
|
||||||
|
# try to match by port or network_id with fixed_ip
|
||||||
|
net = find_equal(**props)
|
||||||
|
if net is not None:
|
||||||
|
net['port'] = props['port']
|
||||||
|
continue
|
||||||
|
# find poor net that has only network_id
|
||||||
|
net = find_poor_net(props['net_id'], nets)
|
||||||
|
if net is not None:
|
||||||
|
net['port'] = props['port']
|
||||||
|
|
||||||
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
|
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
|
||||||
if 'Metadata' in tmpl_diff:
|
if 'Metadata' in tmpl_diff:
|
||||||
self.metadata = tmpl_diff['Metadata']
|
self.metadata = tmpl_diff['Metadata']
|
||||||
|
@ -687,6 +734,69 @@ class Server(stack_user.StackUser):
|
||||||
if not server:
|
if not server:
|
||||||
server = self.nova().servers.get(self.resource_id)
|
server = self.nova().servers.get(self.resource_id)
|
||||||
nova_utils.rename(server, prop_diff[self.NAME])
|
nova_utils.rename(server, prop_diff[self.NAME])
|
||||||
|
|
||||||
|
if self.NETWORKS in prop_diff:
|
||||||
|
new_networks = prop_diff.get(self.NETWORKS)
|
||||||
|
attach_first_free_port = False
|
||||||
|
if not new_networks:
|
||||||
|
new_networks = []
|
||||||
|
attach_first_free_port = True
|
||||||
|
old_networks = self.properties.get(self.NETWORKS)
|
||||||
|
|
||||||
|
if not server:
|
||||||
|
server = self.nova().servers.get(self.resource_id)
|
||||||
|
interfaces = server.interface_list()
|
||||||
|
|
||||||
|
# if old networks is None, it means that the server got first
|
||||||
|
# free port. so we should detach this interface.
|
||||||
|
if old_networks is None:
|
||||||
|
for iface in interfaces:
|
||||||
|
checker = scheduler.TaskRunner(server.interface_detach,
|
||||||
|
iface.port_id)
|
||||||
|
checkers.append(checker)
|
||||||
|
# if we have any information in networks field, we should:
|
||||||
|
# 1. find similar networks, if they exist
|
||||||
|
# 2. remove these networks from new_networks and old_networks
|
||||||
|
# lists
|
||||||
|
# 3. detach unmatched networks, which were present in old_networks
|
||||||
|
# 4. attach unmatched networks, which were present in new_networks
|
||||||
|
else:
|
||||||
|
# remove not updated networks from old and new networks lists,
|
||||||
|
# also get list these networks
|
||||||
|
not_updated_networks = \
|
||||||
|
self._get_network_matches(old_networks, new_networks)
|
||||||
|
|
||||||
|
self.update_networks_matching_iface_port(
|
||||||
|
old_networks + not_updated_networks, interfaces)
|
||||||
|
|
||||||
|
# according to nova interface-detach command detached port
|
||||||
|
# will be deleted
|
||||||
|
for net in old_networks:
|
||||||
|
checker = scheduler.TaskRunner(server.interface_detach,
|
||||||
|
net.get('port'))
|
||||||
|
checkers.append(checker)
|
||||||
|
|
||||||
|
# attach section similar for both variants that
|
||||||
|
# were mentioned above
|
||||||
|
|
||||||
|
for net in new_networks:
|
||||||
|
if net.get('port'):
|
||||||
|
checker = scheduler.TaskRunner(server.interface_attach,
|
||||||
|
net['port'], None, None)
|
||||||
|
checkers.append(checker)
|
||||||
|
elif net.get('network'):
|
||||||
|
checker = scheduler.TaskRunner(server.interface_attach,
|
||||||
|
None, net['network'],
|
||||||
|
net.get('fixed_ip'))
|
||||||
|
checkers.append(checker)
|
||||||
|
|
||||||
|
# if new_networks is None, we should attach first free port,
|
||||||
|
# according to similar behavior during instance creation
|
||||||
|
if attach_first_free_port:
|
||||||
|
checker = scheduler.TaskRunner(server.interface_attach,
|
||||||
|
None, None, None)
|
||||||
|
checkers.append(checker)
|
||||||
|
|
||||||
# Optimization: make sure the first task is started before
|
# Optimization: make sure the first task is started before
|
||||||
# check_update_complete.
|
# check_update_complete.
|
||||||
if checkers:
|
if checkers:
|
||||||
|
|
|
@ -1954,6 +1954,398 @@ class ServersTest(HeatTestCase):
|
||||||
scheduler.TaskRunner(server.create)()
|
scheduler.TaskRunner(server.create)()
|
||||||
self.m.VerifyAll()
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def create_old_net(self, port=None, net=None, ip=None):
|
||||||
|
return {'port': port, 'network': net, 'fixed_ip': ip, 'uuid': None}
|
||||||
|
|
||||||
|
def create_fake_iface(self, port, net, ip):
|
||||||
|
class fake_interface():
|
||||||
|
def __init__(self, port_id, net_id, fixed_ip):
|
||||||
|
self.port_id = port_id
|
||||||
|
self.net_id = net_id
|
||||||
|
self.fixed_ips = [{'ip_address': fixed_ip}]
|
||||||
|
|
||||||
|
return fake_interface(port, net, ip)
|
||||||
|
|
||||||
|
def test_get_network_matches_no_matching(self):
|
||||||
|
return_server = self.fc.servers.list()[3]
|
||||||
|
server = self._create_test_server(return_server, 'networks_update')
|
||||||
|
|
||||||
|
for new_nets in ([],
|
||||||
|
[{'port': '952fd4ae-53b9-4b39-9e5f-8929c553b5ae'}]):
|
||||||
|
|
||||||
|
old_nets = [
|
||||||
|
self.create_old_net(
|
||||||
|
port='2a60cbaa-3d33-4af6-a9ce-83594ac546fc'),
|
||||||
|
self.create_old_net(
|
||||||
|
net='f3ef5d2f-d7ba-4b27-af66-58ca0b81e032', ip='1.2.3.4'),
|
||||||
|
self.create_old_net(
|
||||||
|
net='0da8adbf-a7e2-4c59-a511-96b03d2da0d7')]
|
||||||
|
|
||||||
|
new_nets_copy = copy.deepcopy(new_nets)
|
||||||
|
old_nets_copy = copy.deepcopy(old_nets)
|
||||||
|
for net in old_nets_copy:
|
||||||
|
net.pop('uuid')
|
||||||
|
for net in new_nets_copy:
|
||||||
|
for key in ('port', 'network', 'fixed_ip'):
|
||||||
|
net[key] = net.get(key)
|
||||||
|
|
||||||
|
matched_nets = server._get_network_matches(old_nets, new_nets)
|
||||||
|
self.assertEqual([], matched_nets)
|
||||||
|
self.assertEqual(old_nets_copy, old_nets)
|
||||||
|
self.assertEqual(new_nets_copy, new_nets)
|
||||||
|
|
||||||
|
def test_get_network_matches_success(self):
|
||||||
|
return_server = self.fc.servers.list()[3]
|
||||||
|
server = self._create_test_server(return_server, 'networks_update')
|
||||||
|
|
||||||
|
old_nets = [
|
||||||
|
self.create_old_net(
|
||||||
|
port='2a60cbaa-3d33-4af6-a9ce-83594ac546fc'),
|
||||||
|
self.create_old_net(
|
||||||
|
net='f3ef5d2f-d7ba-4b27-af66-58ca0b81e032',
|
||||||
|
ip='1.2.3.4'),
|
||||||
|
self.create_old_net(
|
||||||
|
net='0da8adbf-a7e2-4c59-a511-96b03d2da0d7')]
|
||||||
|
new_nets = [
|
||||||
|
{'port': '2a60cbaa-3d33-4af6-a9ce-83594ac546fc'},
|
||||||
|
{'network': 'f3ef5d2f-d7ba-4b27-af66-58ca0b81e032',
|
||||||
|
'fixed_ip': '1.2.3.4'},
|
||||||
|
{'port': '952fd4ae-53b9-4b39-9e5f-8929c553b5ae'}]
|
||||||
|
|
||||||
|
new_nets_copy = copy.deepcopy(new_nets)
|
||||||
|
old_nets_copy = copy.deepcopy(old_nets)
|
||||||
|
for net in old_nets_copy:
|
||||||
|
net.pop('uuid')
|
||||||
|
for net in new_nets_copy:
|
||||||
|
for key in ('port', 'network', 'fixed_ip'):
|
||||||
|
net[key] = net.get(key)
|
||||||
|
|
||||||
|
matched_nets = server._get_network_matches(old_nets, new_nets)
|
||||||
|
self.assertEqual(old_nets_copy[:-1], matched_nets)
|
||||||
|
self.assertEqual([old_nets_copy[2]], old_nets)
|
||||||
|
self.assertEqual([new_nets_copy[2]], new_nets)
|
||||||
|
|
||||||
|
def test_update_networks_matching_iface_port(self):
|
||||||
|
return_server = self.fc.servers.list()[3]
|
||||||
|
server = self._create_test_server(return_server, 'networks_update')
|
||||||
|
|
||||||
|
# old order 0 1 2 3 4 5
|
||||||
|
nets = [
|
||||||
|
{'port': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'network': None, 'fixed_ip': None},
|
||||||
|
{'port': None, 'network': 'gggggggg-1111-1111-1111-gggggggggggg',
|
||||||
|
'fixed_ip': '1.2.3.4', },
|
||||||
|
{'port': None, 'network': 'f3ef5d2f-d7ba-4b27-af66-58ca0b81e032',
|
||||||
|
'fixed_ip': None},
|
||||||
|
{'port': 'dddddddd-dddd-dddd-dddd-dddddddddddd',
|
||||||
|
'network': None, 'fixed_ip': None},
|
||||||
|
{'port': None, 'network': 'gggggggg-1111-1111-1111-gggggggggggg',
|
||||||
|
'fixed_ip': '5.6.7.8'},
|
||||||
|
{'port': None, 'network': '0da8adbf-a7e2-4c59-a511-96b03d2da0d7',
|
||||||
|
'fixed_ip': None}]
|
||||||
|
# new order 5 2 3 0 1 4
|
||||||
|
interfaces = [
|
||||||
|
self.create_fake_iface('ffffffff-ffff-ffff-ffff-ffffffffffff',
|
||||||
|
nets[5]['network'], '10.0.0.10'),
|
||||||
|
self.create_fake_iface('cccccccc-cccc-cccc-cccc-cccccccccccc',
|
||||||
|
nets[2]['network'], '10.0.0.11'),
|
||||||
|
self.create_fake_iface(nets[3]['port'],
|
||||||
|
'f3ef5d2f-d7ba-4b27-af66-58ca0b81e032',
|
||||||
|
'10.0.0.12'),
|
||||||
|
self.create_fake_iface(nets[0]['port'],
|
||||||
|
'gggggggg-1111-1111-1111-gggggggggggg',
|
||||||
|
'10.0.0.13'),
|
||||||
|
self.create_fake_iface('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb',
|
||||||
|
nets[1]['network'], nets[1]['fixed_ip']),
|
||||||
|
self.create_fake_iface('eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee',
|
||||||
|
nets[4]['network'], nets[4]['fixed_ip'])]
|
||||||
|
# all networks should get port id
|
||||||
|
expected = [
|
||||||
|
{'port': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'network': None, 'fixed_ip': None},
|
||||||
|
{'port': 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb',
|
||||||
|
'network': 'gggggggg-1111-1111-1111-gggggggggggg',
|
||||||
|
'fixed_ip': '1.2.3.4'},
|
||||||
|
{'port': 'cccccccc-cccc-cccc-cccc-cccccccccccc',
|
||||||
|
'network': 'f3ef5d2f-d7ba-4b27-af66-58ca0b81e032',
|
||||||
|
'fixed_ip': None},
|
||||||
|
{'port': 'dddddddd-dddd-dddd-dddd-dddddddddddd',
|
||||||
|
'network': None, 'fixed_ip': None},
|
||||||
|
{'port': 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee',
|
||||||
|
'network': 'gggggggg-1111-1111-1111-gggggggggggg',
|
||||||
|
'fixed_ip': '5.6.7.8'},
|
||||||
|
{'port': 'ffffffff-ffff-ffff-ffff-ffffffffffff',
|
||||||
|
'network': '0da8adbf-a7e2-4c59-a511-96b03d2da0d7',
|
||||||
|
'fixed_ip': None}]
|
||||||
|
|
||||||
|
server.update_networks_matching_iface_port(nets, interfaces)
|
||||||
|
self.assertEqual(expected, nets)
|
||||||
|
|
||||||
|
def test_server_update_None_networks_with_port(self):
|
||||||
|
return_server = self.fc.servers.list()[3]
|
||||||
|
return_server.id = 9102
|
||||||
|
server = self._create_test_server(return_server, 'networks_update')
|
||||||
|
|
||||||
|
new_networks = [{'port': '2a60cbaa-3d33-4af6-a9ce-83594ac546fc'}]
|
||||||
|
update_template = copy.deepcopy(server.t)
|
||||||
|
update_template['Properties']['networks'] = new_networks
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(self.fc.servers, 'get')
|
||||||
|
self.fc.servers.get(9102).MultipleTimes().AndReturn(return_server)
|
||||||
|
# to make sure, that old_networks will be None
|
||||||
|
self.assertFalse(hasattr(server.t['Properties'], 'networks'))
|
||||||
|
|
||||||
|
iface = self.create_fake_iface('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'450abbc9-9b6d-4d6f-8c3a-c47ac34100ef',
|
||||||
|
'1.2.3.4')
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_list')
|
||||||
|
return_server.interface_list().AndReturn([iface])
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_detach')
|
||||||
|
return_server.interface_detach(
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa').AndReturn(None)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_attach')
|
||||||
|
return_server.interface_attach(new_networks[0]['port'],
|
||||||
|
None, None).AndReturn(None)
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
scheduler.TaskRunner(server.update, update_template)()
|
||||||
|
self.assertEqual((server.UPDATE, server.COMPLETE), server.state)
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def test_server_update_None_networks_with_network_id(self):
|
||||||
|
return_server = self.fc.servers.list()[3]
|
||||||
|
return_server.id = 9102
|
||||||
|
server = self._create_test_server(return_server, 'networks_update')
|
||||||
|
|
||||||
|
new_networks = [{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'fixed_ip': '1.2.3.4'}]
|
||||||
|
update_template = copy.deepcopy(server.t)
|
||||||
|
update_template['Properties']['networks'] = new_networks
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(self.fc.servers, 'get')
|
||||||
|
self.fc.servers.get(9102).MultipleTimes().AndReturn(return_server)
|
||||||
|
# to make sure, that old_networks will be None
|
||||||
|
self.assertFalse(hasattr(server.t['Properties'], 'networks'))
|
||||||
|
|
||||||
|
iface = self.create_fake_iface('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'450abbc9-9b6d-4d6f-8c3a-c47ac34100ef',
|
||||||
|
'1.2.3.4')
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_list')
|
||||||
|
return_server.interface_list().AndReturn([iface])
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_detach')
|
||||||
|
return_server.interface_detach(
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa').AndReturn(None)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_attach')
|
||||||
|
return_server.interface_attach(None, new_networks[0]['network'],
|
||||||
|
new_networks[0]['fixed_ip']).AndReturn(
|
||||||
|
None)
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
scheduler.TaskRunner(server.update, update_template)()
|
||||||
|
self.assertEqual((server.UPDATE, server.COMPLETE), server.state)
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def test_server_update_empty_networks_with_complex_parameters(self):
|
||||||
|
return_server = self.fc.servers.list()[3]
|
||||||
|
return_server.id = 9102
|
||||||
|
server = self._create_test_server(return_server, 'networks_update')
|
||||||
|
|
||||||
|
new_networks = [{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'fixed_ip': '1.2.3.4',
|
||||||
|
'port': '2a60cbaa-3d33-4af6-a9ce-83594ac546fc'}]
|
||||||
|
update_template = copy.deepcopy(server.t)
|
||||||
|
update_template['Properties']['networks'] = new_networks
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(self.fc.servers, 'get')
|
||||||
|
self.fc.servers.get(9102).MultipleTimes().AndReturn(return_server)
|
||||||
|
# to make sure, that old_networks will be None
|
||||||
|
self.assertFalse(hasattr(server.t['Properties'], 'networks'))
|
||||||
|
|
||||||
|
iface = self.create_fake_iface('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'450abbc9-9b6d-4d6f-8c3a-c47ac34100ef',
|
||||||
|
'1.2.3.4')
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_list')
|
||||||
|
return_server.interface_list().AndReturn([iface])
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_detach')
|
||||||
|
return_server.interface_detach(
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa').AndReturn(None)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_attach')
|
||||||
|
return_server.interface_attach(
|
||||||
|
new_networks[0]['port'], None, None).AndReturn(None)
|
||||||
|
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
scheduler.TaskRunner(server.update, update_template)()
|
||||||
|
self.assertEqual((server.UPDATE, server.COMPLETE), server.state)
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def test_server_update_networks_with_complex_parameters(self):
|
||||||
|
return_server = self.fc.servers.list()[1]
|
||||||
|
return_server.id = 5678
|
||||||
|
server = self._create_test_server(return_server, 'networks_update')
|
||||||
|
|
||||||
|
old_networks = [
|
||||||
|
{'port': '95e25541-d26a-478d-8f36-ae1c8f6b74dc'},
|
||||||
|
{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'fixed_ip': '1.2.3.4'},
|
||||||
|
{'port': '4121f61a-1b2e-4ab0-901e-eade9b1cb09d'},
|
||||||
|
{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'fixed_ip': '31.32.33.34'}]
|
||||||
|
|
||||||
|
new_networks = [
|
||||||
|
{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'fixed_ip': '1.2.3.4'},
|
||||||
|
{'port': '2a60cbaa-3d33-4af6-a9ce-83594ac546fc'}]
|
||||||
|
|
||||||
|
server.t['Properties']['networks'] = old_networks
|
||||||
|
update_template = copy.deepcopy(server.t)
|
||||||
|
update_template['Properties']['networks'] = new_networks
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(self.fc.servers, 'get')
|
||||||
|
self.fc.servers.get(5678).MultipleTimes().AndReturn(return_server)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_list')
|
||||||
|
|
||||||
|
poor_interfaces = [
|
||||||
|
self.create_fake_iface('95e25541-d26a-478d-8f36-ae1c8f6b74dc',
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'11.12.13.14'),
|
||||||
|
self.create_fake_iface('450abbc9-9b6d-4d6f-8c3a-c47ac34100ef',
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'1.2.3.4'),
|
||||||
|
self.create_fake_iface('4121f61a-1b2e-4ab0-901e-eade9b1cb09d',
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'21.22.23.24'),
|
||||||
|
self.create_fake_iface('0907fa82-a024-43c2-9fc5-efa1bccaa74a',
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'31.32.33.34')
|
||||||
|
]
|
||||||
|
|
||||||
|
return_server.interface_list().AndReturn(poor_interfaces)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_detach')
|
||||||
|
return_server.interface_detach(
|
||||||
|
poor_interfaces[0].port_id).InAnyOrder().AndReturn(None)
|
||||||
|
return_server.interface_detach(
|
||||||
|
poor_interfaces[2].port_id).InAnyOrder().AndReturn(None)
|
||||||
|
return_server.interface_detach(
|
||||||
|
poor_interfaces[3].port_id).InAnyOrder().AndReturn(None)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_attach')
|
||||||
|
return_server.interface_attach(
|
||||||
|
new_networks[1]['port'], None, None).AndReturn(None)
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
scheduler.TaskRunner(server.update, update_template)()
|
||||||
|
self.assertEqual((server.UPDATE, server.COMPLETE), server.state)
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def test_server_update_networks_with_None(self):
|
||||||
|
return_server = self.fc.servers.list()[1]
|
||||||
|
return_server.id = 5678
|
||||||
|
server = self._create_test_server(return_server, 'networks_update')
|
||||||
|
|
||||||
|
old_networks = [
|
||||||
|
{'port': '95e25541-d26a-478d-8f36-ae1c8f6b74dc'},
|
||||||
|
{'port': '4121f61a-1b2e-4ab0-901e-eade9b1cb09d'},
|
||||||
|
{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'fixed_ip': '31.32.33.34'}]
|
||||||
|
|
||||||
|
server.t['Properties']['networks'] = old_networks
|
||||||
|
update_template = copy.deepcopy(server.t)
|
||||||
|
update_template['Properties']['networks'] = None
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(self.fc.servers, 'get')
|
||||||
|
self.fc.servers.get(5678).MultipleTimes().AndReturn(return_server)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_list')
|
||||||
|
|
||||||
|
poor_interfaces = [
|
||||||
|
self.create_fake_iface('95e25541-d26a-478d-8f36-ae1c8f6b74dc',
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'11.12.13.14'),
|
||||||
|
self.create_fake_iface('4121f61a-1b2e-4ab0-901e-eade9b1cb09d',
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'21.22.23.24'),
|
||||||
|
self.create_fake_iface('0907fa82-a024-43c2-9fc5-efa1bccaa74a',
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'31.32.33.34')
|
||||||
|
]
|
||||||
|
|
||||||
|
return_server.interface_list().AndReturn(poor_interfaces)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_detach')
|
||||||
|
return_server.interface_detach(
|
||||||
|
poor_interfaces[0].port_id).InAnyOrder().AndReturn(None)
|
||||||
|
return_server.interface_detach(
|
||||||
|
poor_interfaces[1].port_id).InAnyOrder().AndReturn(None)
|
||||||
|
return_server.interface_detach(
|
||||||
|
poor_interfaces[2].port_id).InAnyOrder().AndReturn(None)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_attach')
|
||||||
|
return_server.interface_attach(None, None, None).AndReturn(None)
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
scheduler.TaskRunner(server.update, update_template)()
|
||||||
|
self.assertEqual((server.UPDATE, server.COMPLETE), server.state)
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
def test_server_update_networks_with_empty_list(self):
|
||||||
|
return_server = self.fc.servers.list()[1]
|
||||||
|
return_server.id = 5678
|
||||||
|
server = self._create_test_server(return_server, 'networks_update')
|
||||||
|
|
||||||
|
old_networks = [
|
||||||
|
{'port': '95e25541-d26a-478d-8f36-ae1c8f6b74dc'},
|
||||||
|
{'port': '4121f61a-1b2e-4ab0-901e-eade9b1cb09d'},
|
||||||
|
{'network': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'fixed_ip': '31.32.33.34'}]
|
||||||
|
|
||||||
|
server.t['Properties']['networks'] = old_networks
|
||||||
|
update_template = copy.deepcopy(server.t)
|
||||||
|
update_template['Properties']['networks'] = []
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(self.fc.servers, 'get')
|
||||||
|
self.fc.servers.get(5678).MultipleTimes().AndReturn(return_server)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_list')
|
||||||
|
|
||||||
|
poor_interfaces = [
|
||||||
|
self.create_fake_iface('95e25541-d26a-478d-8f36-ae1c8f6b74dc',
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'11.12.13.14'),
|
||||||
|
self.create_fake_iface('4121f61a-1b2e-4ab0-901e-eade9b1cb09d',
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'21.22.23.24'),
|
||||||
|
self.create_fake_iface('0907fa82-a024-43c2-9fc5-efa1bccaa74a',
|
||||||
|
'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
|
||||||
|
'31.32.33.34')
|
||||||
|
]
|
||||||
|
|
||||||
|
return_server.interface_list().AndReturn(poor_interfaces)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_detach')
|
||||||
|
return_server.interface_detach(
|
||||||
|
poor_interfaces[0].port_id).InAnyOrder().AndReturn(None)
|
||||||
|
return_server.interface_detach(
|
||||||
|
poor_interfaces[1].port_id).InAnyOrder().AndReturn(None)
|
||||||
|
return_server.interface_detach(
|
||||||
|
poor_interfaces[2].port_id).InAnyOrder().AndReturn(None)
|
||||||
|
|
||||||
|
self.m.StubOutWithMock(return_server, 'interface_attach')
|
||||||
|
return_server.interface_attach(None, None, None).AndReturn(None)
|
||||||
|
self.m.ReplayAll()
|
||||||
|
|
||||||
|
scheduler.TaskRunner(server.update, update_template)()
|
||||||
|
self.assertEqual((server.UPDATE, server.COMPLETE), server.state)
|
||||||
|
self.m.VerifyAll()
|
||||||
|
|
||||||
|
|
||||||
class FlavorConstraintTest(HeatTestCase):
|
class FlavorConstraintTest(HeatTestCase):
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue