Commit 36c66e04 authored by Łukasz Nowak's avatar Łukasz Nowak

proxy: Support slave removal

/reviewed-on nexedi/slapos.core!179
parent 27ec7d06
...@@ -758,20 +758,28 @@ def requestSlave(software_release, software_type, partition_reference, partition ...@@ -758,20 +758,28 @@ def requestSlave(software_release, software_type, partition_reference, partition
# Add slave to partition slave_list if not present else replace information # Add slave to partition slave_list if not present else replace information
slave_updated_or_added = False slave_updated_or_added = False
slave_instance_list = partition['slave_instance_list'] slave_instance_list = partition['slave_instance_list']
if slave_instance_list: if requested_state == 'destroyed':
slave_instance_list = loads(slave_instance_list.encode('utf-8')) if slave_instance_list:
for i, x in enumerate(slave_instance_list): slave_instance_list = loads(slave_instance_list.encode('utf-8'))
if x['slave_reference'] == slave_reference: before_count = len(slave_instance_list)
if slave_instance_list[i] != new_slave: slave_instance_list = [x for x in slave_instance_list if x['slave_reference'] != slave_reference]
slave_instance_list[i] = new_slave if before_count != len(slave_instance_list):
slave_updated_or_added = True
break
else:
slave_instance_list.append(new_slave)
slave_updated_or_added = True slave_updated_or_added = True
else: else:
slave_instance_list = [new_slave] if slave_instance_list:
slave_updated_or_added = True slave_instance_list = loads(slave_instance_list.encode('utf-8'))
for i, x in enumerate(slave_instance_list):
if x['slave_reference'] == slave_reference:
if slave_instance_list[i] != new_slave:
slave_instance_list[i] = new_slave
slave_updated_or_added = True
break
else:
slave_instance_list.append(new_slave)
slave_updated_or_added = True
else:
slave_instance_list = [new_slave]
slave_updated_or_added = True
q += ' WHERE reference=? AND computer_reference=?' q += ' WHERE reference=? AND computer_reference=?'
a(partition['reference']) a(partition['reference'])
......
...@@ -916,6 +916,29 @@ class TestSlaveRequest(MasterMixin): ...@@ -916,6 +916,29 @@ class TestSlaveRequest(MasterMixin):
self.assertEqual(len(after._parameter_dict['slave_instance_list']), 2) self.assertEqual(len(after._parameter_dict['slave_instance_list']), 2)
self.assertEqual(before_timestamp, after_timestamp, 'No-op change of the slave shall not change the timestamp') self.assertEqual(before_timestamp, after_timestamp, 'No-op change of the slave shall not change the timestamp')
def test_slave_request_destroyed(self):
self.format_for_number_of_partitions(1)
# Provide partition
master_partition = self.request('http://sr//', None, 'MyMasterInstance', 'slappart4')
def getPartition():
return self.getFullComputerInformation()._computer_partition_list[0]
def getTimestamp(partition):
return float(partition._parameter_dict['timestamp'])
self.request('http://sr//', None, 'MyFirstSlave', shared=True)
self.request('http://sr//', None, 'MySecondSlave', shared=True)
after = getPartition()
self.assertEqual(len(after._parameter_dict['slave_instance_list']), 2)
before_timestamp = getTimestamp(after)
time.sleep(.1)
self.request('http://sr//', None, 'MyFirstSlave', shared=True, state='destroyed')
after = getPartition()
after_timestamp = getTimestamp(after)
self.assertEqual(len(after._parameter_dict['slave_instance_list']), 1)
self.assertLess(before_timestamp, after_timestamp, 'Slave destroy shall result with timestamp update')
self.assertEqual(after._parameter_dict['slave_instance_list'][0]['slave_reference'], '_MySecondSlave')
def test_slave_request_set_parameters_are_updated(self): def test_slave_request_set_parameters_are_updated(self):
""" """
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment