mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-02 10:52:22 +00:00
Carry over OCI variables changed in Proxmox and keep the LXC update badge on old checks
This commit is contained in:
@@ -155,5 +155,66 @@ class ProposalTests(unittest.TestCase):
|
||||
self.assertEqual(json.loads(history[0].read_text())['deployment']['mounts'], [])
|
||||
|
||||
|
||||
class EnvironmentAdoptionTests(unittest.TestCase):
|
||||
marker = '11111111-1111-1111-1111-111111111111'
|
||||
|
||||
def record(self, env):
|
||||
config = f'description: proxmenux-instance={self.marker}\nenv: {env}\n'.encode()
|
||||
return {
|
||||
'vmid': 200, 'status': 'installed', 'installation_id': self.marker,
|
||||
'deployment': {'mounts': [], 'devices': [], 'environment': [
|
||||
{'name': 'APP_PASSWORD', 'value': 'first-secret', 'sensitive': True}]},
|
||||
'observed': {'config': config.decode(), 'config_sha256': sha(config),
|
||||
'archive_path': '/unused.tar', 'resolved_registry_digest': 'sha256:test',
|
||||
'image': {'manifest_digest': 'sha256:test', 'defaults': {'Env': ['PATH=/bin']}}},
|
||||
}
|
||||
|
||||
def propose(self, record, env):
|
||||
config = f'description: proxmenux-instance={self.marker}\nenv: {env}\n'.encode()
|
||||
with (patch.object(reconcile.instances, 'ROOT', Path('/inert')),
|
||||
patch.object(reconcile.instances, 'identity', return_value=self.marker),
|
||||
patch.object(reconcile.instances, 'location', return_value=Path(__file__)),
|
||||
patch.object(reconcile.gpu_devices, 'capture', return_value={}),
|
||||
patch.object(reconcile.host_mounts, 'capture_sources', return_value={}),
|
||||
patch.object(reconcile.transaction, 'preflight')):
|
||||
return reconcile.propose(record, config)
|
||||
|
||||
def test_a_password_changed_in_proxmox_is_adopted_without_showing_it(self):
|
||||
record = self.record('PATH=/bin\0APP_PASSWORD=first-secret')
|
||||
proposal = self.propose(record, 'PATH=/bin\0APP_PASSWORD=my-own-secret\0TZ=Europe/Madrid')
|
||||
environment = proposal['candidate']['deployment']['environment']
|
||||
self.assertEqual(environment, [
|
||||
{'name': 'APP_PASSWORD', 'value': 'my-own-secret', 'sensitive': True},
|
||||
{'name': 'TZ', 'value': 'Europe/Madrid', 'sensitive': True}])
|
||||
self.assertEqual(proposal['details'], ['env APP_PASSWORD: value changed in Proxmox',
|
||||
'env TZ: added in Proxmox'])
|
||||
self.assertNotIn('my-own-secret', str(proposal['details']))
|
||||
self.assertEqual(record['deployment']['environment'][0]['value'], 'first-secret')
|
||||
|
||||
def test_reordered_variables_need_no_decision(self):
|
||||
record = self.record('PATH=/bin\0APP_PASSWORD=first-secret')
|
||||
proposal = self.propose(record, 'APP_PASSWORD=first-secret\0PATH=/bin')
|
||||
self.assertEqual(proposal['details'], [])
|
||||
|
||||
def test_removing_an_image_default_is_refused(self):
|
||||
record = self.record('PATH=/bin\0APP_PASSWORD=first-secret')
|
||||
with self.assertRaisesRegex(ValueError, 'env'):
|
||||
self.propose(record, 'APP_PASSWORD=first-secret')
|
||||
|
||||
def test_removing_a_saved_variable_removes_it_from_the_contract(self):
|
||||
record = self.record('PATH=/bin\0APP_PASSWORD=first-secret')
|
||||
proposal = self.propose(record, 'PATH=/bin')
|
||||
self.assertEqual(proposal['candidate']['deployment']['environment'], [])
|
||||
self.assertEqual(proposal['details'], ['env APP_PASSWORD: removed in Proxmox'])
|
||||
|
||||
def test_other_changes_next_to_the_variables_are_still_refused(self):
|
||||
record = self.record('PATH=/bin')
|
||||
config = (f'description: proxmenux-instance={self.marker}\nenv: PATH=/bin\0A=1\n'
|
||||
'net0: name=eth0,bridge=vmbr1\n').encode()
|
||||
with (patch.object(reconcile.instances, 'identity', return_value=self.marker),
|
||||
self.assertRaisesRegex(ValueError, 'net0')):
|
||||
reconcile.propose(record, config)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user