mirror of
https://github.com/saltstack/salt.git
synced 2025-04-16 09:40:20 +00:00
209 lines
6.8 KiB
Python
209 lines
6.8 KiB
Python
# coding: utf-8
|
|
|
|
# Python libs
|
|
from __future__ import absolute_import
|
|
|
|
# Salt testing libs
|
|
from tests.support.unit import TestCase
|
|
from tests.support.mock import patch, MagicMock
|
|
from tests.support.mixins import LoaderModuleMockMixin
|
|
|
|
# Salt libs
|
|
import salt.beacons.smartos_vmadm as vmadm
|
|
|
|
# Mock Results
|
|
MOCK_CLEAN_STATE = {'first_run': True, 'vms': []}
|
|
MOCK_VM_NONE = {}
|
|
MOCK_VM_ONE = {
|
|
'00000000-0000-0000-0000-000000000001': {
|
|
'state': 'running',
|
|
'alias': 'vm1',
|
|
'hostname': 'vm1',
|
|
'dns_domain': 'example.org',
|
|
},
|
|
}
|
|
MOCK_VM_TWO_STOPPED = {
|
|
'00000000-0000-0000-0000-000000000001': {
|
|
'state': 'running',
|
|
'alias': 'vm1',
|
|
'hostname': 'vm1',
|
|
'dns_domain': 'example.org',
|
|
},
|
|
'00000000-0000-0000-0000-000000000002': {
|
|
'state': 'stopped',
|
|
'alias': 'vm2',
|
|
'hostname': 'vm2',
|
|
'dns_domain': 'example.org',
|
|
},
|
|
}
|
|
MOCK_VM_TWO_STARTED = {
|
|
'00000000-0000-0000-0000-000000000001': {
|
|
'state': 'running',
|
|
'alias': 'vm1',
|
|
'hostname': 'vm1',
|
|
'dns_domain': 'example.org',
|
|
},
|
|
'00000000-0000-0000-0000-000000000002': {
|
|
'state': 'running',
|
|
'alias': 'vm2',
|
|
'hostname': 'vm2',
|
|
'dns_domain': 'example.org',
|
|
},
|
|
}
|
|
|
|
|
|
class SmartOSImgAdmBeaconTestCase(TestCase, LoaderModuleMockMixin):
|
|
'''
|
|
Test case for salt.beacons.vmadm
|
|
'''
|
|
|
|
def setup_loader_modules(self):
|
|
return {
|
|
vmadm: {
|
|
'__context__': {},
|
|
'__salt__': {},
|
|
}
|
|
}
|
|
|
|
def test_non_list_config(self):
|
|
'''
|
|
We only have minimal validation so we test that here
|
|
'''
|
|
config = {}
|
|
|
|
ret = vmadm.validate(config)
|
|
|
|
self.assertEqual(ret, (False, 'Configuration for vmadm beacon must be a list!'))
|
|
|
|
def test_created_startup(self):
|
|
'''
|
|
Test with one vm and startup_create_event
|
|
'''
|
|
# NOTE: this should yield 1 created event + one state event
|
|
with patch.dict(vmadm.VMADM_STATE, MOCK_CLEAN_STATE), \
|
|
patch.dict(vmadm.__salt__, {'vmadm.list': MagicMock(return_value=MOCK_VM_ONE)}):
|
|
|
|
config = [{'startup_create_event': True}]
|
|
|
|
ret = vmadm.validate(config)
|
|
self.assertEqual(ret, (True, 'Valid beacon configuration'))
|
|
|
|
ret = vmadm.beacon(config)
|
|
res = [{'alias': 'vm1',
|
|
'tag': 'created/00000000-0000-0000-0000-000000000001',
|
|
'hostname': 'vm1',
|
|
'dns_domain': 'example.org'},
|
|
{'alias': 'vm1',
|
|
'tag': 'running/00000000-0000-0000-0000-000000000001',
|
|
'hostname': 'vm1',
|
|
'dns_domain': 'example.org'}]
|
|
self.assertEqual(ret, res)
|
|
|
|
def test_created_nostartup(self):
|
|
'''
|
|
Test with one image and startup_import_event unset/false
|
|
'''
|
|
# NOTE: this should yield 0 created event _ one state event
|
|
with patch.dict(vmadm.VMADM_STATE, MOCK_CLEAN_STATE), \
|
|
patch.dict(vmadm.__salt__, {'vmadm.list': MagicMock(return_value=MOCK_VM_ONE)}):
|
|
|
|
config = []
|
|
|
|
ret = vmadm.validate(config)
|
|
self.assertEqual(ret, (True, 'Valid beacon configuration'))
|
|
|
|
ret = vmadm.beacon(config)
|
|
res = [{'alias': 'vm1',
|
|
'tag': 'running/00000000-0000-0000-0000-000000000001',
|
|
'hostname': 'vm1',
|
|
'dns_domain': 'example.org'}]
|
|
|
|
self.assertEqual(ret, res)
|
|
|
|
def test_created(self):
|
|
'''
|
|
Test with one vm, create a 2nd one
|
|
'''
|
|
# NOTE: this should yield 1 created event + state event
|
|
with patch.dict(vmadm.VMADM_STATE, MOCK_CLEAN_STATE), \
|
|
patch.dict(vmadm.__salt__, {'vmadm.list': MagicMock(side_effect=[MOCK_VM_ONE, MOCK_VM_TWO_STARTED])}):
|
|
|
|
config = []
|
|
|
|
ret = vmadm.validate(config)
|
|
self.assertEqual(ret, (True, 'Valid beacon configuration'))
|
|
|
|
# Initial pass (Initialized state and do not yield created events at startup)
|
|
ret = vmadm.beacon(config)
|
|
|
|
# Second pass (After create a new vm)
|
|
ret = vmadm.beacon(config)
|
|
res = [{'alias': 'vm2',
|
|
'tag': 'created/00000000-0000-0000-0000-000000000002',
|
|
'hostname': 'vm2',
|
|
'dns_domain': 'example.org'},
|
|
{'alias': 'vm2',
|
|
'tag': 'running/00000000-0000-0000-0000-000000000002',
|
|
'hostname': 'vm2',
|
|
'dns_domain': 'example.org'}]
|
|
|
|
self.assertEqual(ret, res)
|
|
|
|
def test_deleted(self):
|
|
'''
|
|
Test with two vms and one gets destroyed
|
|
'''
|
|
# NOTE: this should yield 1 destroyed event
|
|
with patch.dict(vmadm.VMADM_STATE, MOCK_CLEAN_STATE), \
|
|
patch.dict(vmadm.__salt__, {'vmadm.list': MagicMock(side_effect=[MOCK_VM_TWO_STOPPED, MOCK_VM_ONE])}):
|
|
|
|
config = []
|
|
|
|
ret = vmadm.validate(config)
|
|
self.assertEqual(ret, (True, 'Valid beacon configuration'))
|
|
|
|
# Initial pass (Initialized state and do not yield created vms at startup)
|
|
ret = vmadm.beacon(config)
|
|
|
|
# Second pass (Destroying one vm)
|
|
ret = vmadm.beacon(config)
|
|
res = [{'alias': 'vm2',
|
|
'tag': 'deleted/00000000-0000-0000-0000-000000000002',
|
|
'hostname': 'vm2',
|
|
'dns_domain': 'example.org'}]
|
|
|
|
self.assertEqual(ret, res)
|
|
|
|
def test_complex(self):
|
|
'''
|
|
Test with two vms, stop one, delete one
|
|
'''
|
|
# NOTE: this should yield 1 delete and 2 import events
|
|
with patch.dict(vmadm.VMADM_STATE, MOCK_CLEAN_STATE), \
|
|
patch.dict(vmadm.__salt__, {'vmadm.list': MagicMock(side_effect=[MOCK_VM_TWO_STARTED, MOCK_VM_TWO_STOPPED, MOCK_VM_ONE])}):
|
|
|
|
config = []
|
|
|
|
ret = vmadm.validate(config)
|
|
self.assertEqual(ret, (True, 'Valid beacon configuration'))
|
|
|
|
# Initial pass (Initialized state and do not yield created events at startup)
|
|
ret = vmadm.beacon(config)
|
|
|
|
# Second pass (Stop one vm)
|
|
ret = vmadm.beacon(config)
|
|
res = [{'alias': 'vm2',
|
|
'tag': 'stopped/00000000-0000-0000-0000-000000000002',
|
|
'hostname': 'vm2',
|
|
'dns_domain': 'example.org'}]
|
|
|
|
self.assertEqual(ret, res)
|
|
|
|
# Third pass (Delete one vm)
|
|
ret = vmadm.beacon(config)
|
|
res = [{'alias': 'vm2',
|
|
'tag': 'deleted/00000000-0000-0000-0000-000000000002',
|
|
'hostname': 'vm2',
|
|
'dns_domain': 'example.org'}]
|
|
|
|
self.assertEqual(ret, res)
|