Esempio n. 1
0
class TestEsx(TestBase):
    def setUp(self):
        config_values = {
            'type': 'esx',
            'server': 'localhost',
            'username': '******',
            'password': '******',
            'owner': 'owner',
        }
        config = EsxConfigSection('test', None)
        config.update(**config_values)
        config.validate()
        self.esx = Esx(self.logger, config, None,
                       interval=DefaultInterval)  # No dest given here

    def run_once(self, datastore=None):
        ''' Run ESX in oneshot mode '''
        self.esx._oneshot = True
        if datastore is None:
            datastore = Mock(spec=Datastore())

        self.esx.dest = datastore
        self.esx._terminate_event = Event()
        self.esx._oneshot = True
        self.esx._interval = 0
        self.esx._run()

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_connect(self, mock_client):
        mock_client.return_value.service.WaitForUpdatesEx.return_value = None
        self.run_once()

        self.assertTrue(mock_client.called)
        mock_client.assert_called_with(ANY,
                                       location="https://localhost/sdk",
                                       cache=None,
                                       transport=ANY)
        mock_client.return_value.service.RetrieveServiceContent.assert_called_once_with(
            _this=ANY)
        mock_client.return_value.service.Login.assert_called_once_with(
            _this=ANY, userName='******', password='******')

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_connect_utf_password(self, mock_client):
        mock_client.return_value.service.WaitForUpdatesEx.return_value = None
        # Change password to include some UTF character
        self.esx.password = '******'
        self.run_once()

        self.assertTrue(mock_client.called)
        mock_client.assert_called_with(ANY,
                                       location="https://localhost/sdk",
                                       cache=None,
                                       transport=ANY)
        mock_client.return_value.service.RetrieveServiceContent.assert_called_once_with(
            _this=ANY)
        mock_client.return_value.service.Login.assert_called_once_with(
            _this=ANY, userName='******', password=u'Žluťoučký_kůň')

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_connection_timeout(self, mock_client):
        mock_client.side_effect = requests.Timeout('timed out')
        self.assertRaises(VirtError, self.run_once)

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_invalid_login(self, mock_client):
        mock_client.return_value.service.Login.side_effect = virtwho.virt.esx.suds.WebFault(
            'Permission to perform this operation was denied.', '')
        self.assertRaises(VirtError, self.run_once)

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_disable_simplified_vim(self, mock_client):
        self.esx.config.simplified_vim = False
        mock_client.return_value.service.RetrievePropertiesEx.return_value = None
        mock_client.return_value.service.WaitForUpdatesEx.return_value.truncated = False
        self.run_once()

        self.assertTrue(mock_client.called)
        mock_client.assert_called_with(ANY,
                                       location="https://localhost/sdk",
                                       transport=ANY,
                                       cache=None)
        mock_client.return_value.service.RetrieveServiceContent.assert_called_once_with(
            _this=ANY)
        mock_client.return_value.service.Login.assert_called_once_with(
            _this=ANY, userName='******', password='******')

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_getHostGuestMapping(self, mock_client):
        expected_hostname = 'hostname.domainname'
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'
        expected_guest_state = Guest.STATE_RUNNING

        fake_parent = MagicMock()
        fake_parent.value = 'fake_parent_id'
        fake_parent._type = 'ClusterComputeResource'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {
            'guest1': {
                'runtime.powerState': 'poweredOn',
                'config.uuid': expected_guestId
            }
        }
        self.esx.vms = fake_vms

        fake_host = {
            'hardware.systemInfo.uuid': expected_hypervisorId,
            'config.network.dnsConfig.hostName': 'hostname',
            'config.network.dnsConfig.domainName': 'domainname',
            'config.product.version': '1.2.3',
            'hardware.cpuInfo.numCpuPackages': '1',
            'name': expected_hostname,
            'parent': fake_parent,
            'vm': fake_vm,
        }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        fake_cluster = {'name': 'Fake_cluster_name'}
        self.esx.clusters = {'fake_parent_id': fake_cluster}

        expected_result = Hypervisor(hypervisorId=expected_hypervisorId,
                                     name=expected_hostname,
                                     guestIds=[
                                         Guest(
                                             expected_guestId,
                                             self.esx.CONFIG_TYPE,
                                             expected_guest_state,
                                         )
                                     ],
                                     facts={
                                         Hypervisor.CPU_SOCKET_FACT:
                                         '1',
                                         Hypervisor.HYPERVISOR_TYPE_FACT:
                                         'vmware',
                                         Hypervisor.HYPERVISOR_VERSION_FACT:
                                         '1.2.3',
                                         Hypervisor.HYPERVISOR_CLUSTER:
                                         'Fake_cluster_name',
                                         Hypervisor.SYSTEM_UUID_FACT:
                                         expected_hypervisorId
                                     })
        result = self.esx.getHostGuestMapping()['hypervisors'][0]
        self.assertEqual(expected_result.toDict(), result.toDict())

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_status(self, mock_client):
        mock_client.return_value.service.WaitForUpdatesEx.return_value = None
        self.esx.status = True
        self.esx._send_data = Mock()
        self.run_once()

        self.esx._send_data.assert_called_once_with(data_to_send=ANY)
        self.assertTrue(
            isinstance(
                self.esx._send_data.mock_calls[0].kwargs['data_to_send'],
                StatusReport))
        self.assertEqual(
            self.esx._send_data.mock_calls[0].kwargs['data_to_send'].
            data['source']['server'], self.esx.config['server'])

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_getHostGuestMappingVersionUUID(self, mock_client):
        expected_hostname = 'hostname.domainname'
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'c11e2342-82e4-b206-a798-a51ff68f0d4b'
        expected_guest_state = Guest.STATE_RUNNING

        reported_guest_id = '42231ec1-e482-06b2-a798-a51ff68f0d4b'

        fake_parent = MagicMock()
        fake_parent.value = 'fake_parent_id'
        fake_parent._type = 'ClusterComputeResource'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {
            'guest1': {
                'runtime.powerState': 'poweredOn',
                'config.uuid': reported_guest_id,
                'config.version': 'vmx-13'
            }
        }
        self.esx.vms = fake_vms

        fake_host = {
            'hardware.systemInfo.uuid': expected_hypervisorId,
            'config.network.dnsConfig.hostName': 'hostname',
            'config.network.dnsConfig.domainName': 'domainname',
            'config.product.version': '1.2.3',
            'hardware.cpuInfo.numCpuPackages': '1',
            'name': expected_hostname,
            'parent': fake_parent,
            'vm': fake_vm,
        }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        fake_cluster = {'name': 'Fake_cluster_name'}
        self.esx.clusters = {'fake_parent_id': fake_cluster}

        expected_result = Hypervisor(hypervisorId=expected_hypervisorId,
                                     name=expected_hostname,
                                     guestIds=[
                                         Guest(
                                             expected_guestId,
                                             self.esx.CONFIG_TYPE,
                                             expected_guest_state,
                                         )
                                     ],
                                     facts={
                                         Hypervisor.CPU_SOCKET_FACT:
                                         '1',
                                         Hypervisor.HYPERVISOR_TYPE_FACT:
                                         'vmware',
                                         Hypervisor.HYPERVISOR_VERSION_FACT:
                                         '1.2.3',
                                         Hypervisor.HYPERVISOR_CLUSTER:
                                         'Fake_cluster_name',
                                         Hypervisor.SYSTEM_UUID_FACT:
                                         expected_hypervisorId
                                     })
        result = self.esx.getHostGuestMapping()['hypervisors'][0]
        self.assertEqual(expected_result.toDict(), result.toDict())

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_getHostGuestMappingNoHostName(self, mock_client):
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'

        fake_parent = MagicMock()
        fake_parent.value = 'fake_parent_id'
        fake_parent._type = 'ClusterComputeResource'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {
            'guest1': {
                'runtime.powerState': 'poweredOn',
                'config.uuid': expected_guestId
            }
        }
        self.esx.vms = fake_vms

        fake_host = {
            'hardware.systemInfo.uuid': expected_hypervisorId,
            'config.network.dnsConfig.domainName': 'domainname',
            'config.product.version': '1.2.3',
            'hardware.cpuInfo.numCpuPackages': '1',
            'parent': fake_parent,
            'vm': fake_vm,
        }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        fake_cluster = {'name': 'Fake_cluster_name'}
        self.esx.clusters = {'fake_parent_id': fake_cluster}

        assert (len(self.esx.getHostGuestMapping()['hypervisors']) == 0)

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_getHostGuestMapping_incomplete_data(self, mock_client):
        expected_hostname = 'hostname.domainname'
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'
        expected_guest_state = Guest.STATE_UNKNOWN

        fake_parent = MagicMock()
        fake_parent.value = 'fake_parent_id'
        fake_parent._type = 'ClusterComputeResource'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {
            'guest1': {
                'runtime.powerState': 'BOGUS_STATE',
                'config.uuid': expected_guestId
            }
        }
        self.esx.vms = fake_vms

        fake_host = {
            'hardware.systemInfo.uuid': expected_hypervisorId,
            'config.network.dnsConfig.hostName': 'hostname',
            'config.network.dnsConfig.domainName': 'domainname',
            'config.product.version': '1.2.3',
            'hardware.cpuInfo.numCpuPackages': '1',
            'parent': fake_parent,
            'vm': fake_vm
        }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        fake_cluster = {'name': 'Fake_cluster_name'}
        self.esx.clusters = {'fake_parent_id': fake_cluster}

        expected_result = Hypervisor(hypervisorId=expected_hypervisorId,
                                     name=expected_hostname,
                                     guestIds=[
                                         Guest(
                                             expected_guestId,
                                             self.esx.CONFIG_TYPE,
                                             expected_guest_state,
                                         )
                                     ],
                                     facts={
                                         Hypervisor.CPU_SOCKET_FACT:
                                         '1',
                                         Hypervisor.HYPERVISOR_TYPE_FACT:
                                         'vmware',
                                         Hypervisor.HYPERVISOR_VERSION_FACT:
                                         '1.2.3',
                                         Hypervisor.HYPERVISOR_CLUSTER:
                                         'Fake_cluster_name',
                                         Hypervisor.SYSTEM_UUID_FACT:
                                         expected_hypervisorId
                                     })
        result = self.esx.getHostGuestMapping()['hypervisors'][0]
        self.assertEqual(expected_result.toDict(), result.toDict())

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_getHostGuestMapping_cluster_slash(self, mock_client):
        expected_hostname = 'hostname.domainname'
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'
        expected_guest_state = Guest.STATE_RUNNING

        fake_parent = MagicMock()
        fake_parent.value = 'fake_parent_id'
        fake_parent._type = 'ClusterComputeResource'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {
            'guest1': {
                'runtime.powerState': 'poweredOn',
                'config.uuid': expected_guestId
            }
        }
        self.esx.vms = fake_vms

        fake_host = {
            'hardware.systemInfo.uuid': expected_hypervisorId,
            'config.network.dnsConfig.hostName': 'hostname',
            'config.network.dnsConfig.domainName': 'domainname',
            'config.product.version': '1.2.3',
            'hardware.cpuInfo.numCpuPackages': '1',
            'name': expected_hostname,
            'parent': fake_parent,
            'vm': fake_vm,
        }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        fake_cluster = {'name': 'FOO-BAR Dev%2fTest Cluster'}
        self.esx.clusters = {'fake_parent_id': fake_cluster}

        expected_result = Hypervisor(hypervisorId=expected_hypervisorId,
                                     name=expected_hostname,
                                     guestIds=[
                                         Guest(
                                             expected_guestId,
                                             self.esx.CONFIG_TYPE,
                                             expected_guest_state,
                                         )
                                     ],
                                     facts={
                                         Hypervisor.CPU_SOCKET_FACT:
                                         '1',
                                         Hypervisor.HYPERVISOR_TYPE_FACT:
                                         'vmware',
                                         Hypervisor.HYPERVISOR_VERSION_FACT:
                                         '1.2.3',
                                         Hypervisor.HYPERVISOR_CLUSTER:
                                         'FOO-BAR Dev/Test Cluster',
                                         Hypervisor.SYSTEM_UUID_FACT:
                                         expected_hypervisorId
                                     })
        result = self.esx.getHostGuestMapping()['hypervisors'][0]
        self.assertEqual(expected_result.toDict(), result.toDict())

    @patch('virtwho.virt.esx.suds.client.Client')
    def test_oneshot(self, mock_client):
        expected_assoc = '"well formed HostGuestMapping"'
        expected_report = HostGuestAssociationReport(self.esx.config,
                                                     expected_assoc)
        updateSet = Mock()
        updateSet.version = 'some_new_version_string'
        updateSet.truncated = False
        mock_client.return_value.service.WaitForUpdatesEx.return_value = updateSet
        datastore = Datastore()
        self.esx.applyUpdates = Mock()
        getHostGuestMappingMock = Mock()
        getHostGuestMappingMock.return_value = expected_assoc
        self.esx.getHostGuestMapping = getHostGuestMappingMock
        self.run_once(datastore)
        result_report = datastore.get(self.esx.config.name)
        self.assertEqual(expected_report.config.name,
                         result_report.config.name)
        self.assertEqual(expected_report.config._values,
                         result_report.config._values)
        self.assertEqual(expected_report._assoc, result_report._assoc)

    def test_proxy(self):
        self.esx.config['simplified_vim'] = True
        proxy = Proxy()
        self.addCleanup(proxy.terminate)
        proxy.start()
        oldenv = os.environ.copy()
        self.addCleanup(lambda: setattr(os, 'environ', oldenv))
        os.environ['https_proxy'] = proxy.address

        self.assertRaises(VirtError, self.run_once)
        self.assertIsNotNone(proxy.last_path, "Proxy was not called")
        self.assertEqual(proxy.last_path, 'localhost:443')

    def test_applyHostSystemUpdate_AttributeError(self):
        change = Mock(spec=['op', 'name'])
        change.op = 'assign'
        change.name = 'test.guest.name'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.hosts = dict()
        self.esx.hosts[objectSet.obj.value] = dict()

        try:
            self.esx.applyHostSystemUpdate(objectSet)
        except AttributeError:
            self.fail(
                'applyHostSystemUpdate raised AttributeError unexpectedly')
        self.assertDictEqual(self.esx.hosts[objectSet.obj.value], dict())

    def test_applyHostSystemUpdate_leave(self):
        objectSet = Mock()
        objectSet.kind = 'leave'
        objectSet.obj.value = 'test.host.name'

        self.esx.hosts = dict()
        self.esx.hosts[objectSet.obj.value] = dict()

        self.esx.applyHostSystemUpdate(objectSet)
        self.assertDictEqual(self.esx.hosts, dict())

    def test_applyHostSystemUpdate_modify(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'assign'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.hosts = dict()
        self.esx.hosts[objectSet.obj.value] = dict()

        self.esx.applyHostSystemUpdate(objectSet)

        expected = dict()
        expected[change.name] = change.val
        self.assertDictEqual(self.esx.hosts[objectSet.obj.value], expected)

    def test_applyVirtualMachineUpdate_AttributeError(self):
        change = Mock(spec=['op', 'name'])
        change.op = 'assign'
        change.name = 'test.guest.name'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()

        try:
            self.esx.applyVirtualMachineUpdate(objectSet)
        except AttributeError:
            self.fail(
                'applyHostSystemUpdate raised AttributeError unexpectedly')
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], dict())

    def test_applyVirtualMachineUpdate_leave(self):
        objectSet = Mock()
        objectSet.kind = 'leave'
        objectSet.obj.value = 'test.host.name'

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()

        self.esx.applyVirtualMachineUpdate(objectSet)
        self.assertDictEqual(self.esx.vms, dict())

    def test_applyVirtualMachineUpdate_modify(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'assign'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()

        self.esx.applyVirtualMachineUpdate(objectSet)

        expected = dict()
        expected[change.name] = change.val
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], expected)

    def test_applyVirtualMachineUpdate_add(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'add'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()
        self.esx.vms[objectSet.obj.value][change.name] = []

        self.esx.applyVirtualMachineUpdate(objectSet)

        expected = dict()
        expected[change.name] = [change.val]
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], expected)

    def test_applyVirtualMachineUpdate_remove(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'remove'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()
        self.esx.vms[objectSet.obj.value][change.name] = 'test'

        self.esx.applyVirtualMachineUpdate(objectSet)

        expected = dict()
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], expected)

    def test_host_parent_filter(self):
        host = {}
        test_parent = MagicMock()
        test_parent.value = "theParent"
        test_parent._type = "ClusterComputeResource"
        host['parent'] = test_parent
        # exact match
        self.esx.config['filter_host_parents'] = ["theParent"]
        self.assertFalse(self.esx.skip_for_parent("test", host))
        # wildcard match
        self.esx.config['filter_host_parents'] = ["*Parent"]
        self.assertFalse(self.esx.skip_for_parent("test", host))
        # no match
        self.esx.config['filter_host_parents'] = ["notThisOne"]
        self.assertTrue(self.esx.skip_for_parent("test", host))
        # multi-list match
        self.esx.config['filter_host_parents'] = ["*Parent", "notThisOne"]
        self.assertFalse(self.esx.skip_for_parent("test", host))
        # multi-list no match
        self.esx.config['filter_host_parents'] = ["wrongParent", "notThisOne"]
        self.assertTrue(self.esx.skip_for_parent("test", host))

        self.esx.config['filter_host_parents'] = None

        # exact match
        self.esx.config['exclude_host_parents'] = ["theParent"]
        self.assertTrue(self.esx.skip_for_parent("test", host))
        # wildcard match
        self.esx.config['exclude_host_parents'] = ["the*"]
        self.assertTrue(self.esx.skip_for_parent("test", host))
        # no match
        self.esx.config['exclude_host_parents'] = ["notThisOne"]
        self.assertFalse(self.esx.skip_for_parent("test", host))
        # multi-list match
        self.esx.config['exclude_host_parents'] = ["the*", "notThisOne"]
        self.assertTrue(self.esx.skip_for_parent("test", host))
        # multi-list no match
        self.esx.config['exclude_host_parents'] = ["wrongParent", "notThisOne"]
        self.assertFalse(self.esx.skip_for_parent("test", host))
Esempio n. 2
0
class TestEsx(TestBase):
    def setUp(self):
        config_values = {
            'type': 'esx',
            'server': 'localhost',
            'username': '******',
            'password': '******',
            'owner': 'owner',
        }
        config = EsxConfigSection('test', None)
        config.update(**config_values)
        config.validate()
        self.esx = Esx(self.logger, config, None, interval=DefaultInterval)  #  No dest given here

    def run_once(self, datastore=None):
        ''' Run ESX in oneshot mode '''
        self.esx._oneshot = True
        if datastore is None:
            datastore = Mock(spec=Datastore())

        self.esx.dest = datastore
        self.esx._terminate_event = Event()
        self.esx._oneshot = True
        self.esx._interval = 0
        self.esx._run()

    @patch('suds.client.Client')
    def test_connect(self, mock_client):
        mock_client.return_value.service.WaitForUpdatesEx.return_value = None
        self.run_once()

        self.assertTrue(mock_client.called)
        mock_client.assert_called_with(ANY, location="https://localhost/sdk", cache=None, transport=ANY)
        mock_client.return_value.service.RetrieveServiceContent.assert_called_once_with(_this=ANY)
        mock_client.return_value.service.Login.assert_called_once_with(_this=ANY, userName='******', password='******')

    @patch('suds.client.Client')
    def test_connect_utf_password(self, mock_client):
        mock_client.return_value.service.WaitForUpdatesEx.return_value = None
        # Change password to include some UTF character
        self.esx.password = '******'
        self.run_once()

        self.assertTrue(mock_client.called)
        mock_client.assert_called_with(ANY, location="https://localhost/sdk", cache=None, transport=ANY)
        mock_client.return_value.service.RetrieveServiceContent.assert_called_once_with(_this=ANY)
        mock_client.return_value.service.Login.assert_called_once_with(
            _this=ANY, userName='******', password=u'Žluťoučký_kůň'
        )

    @patch('suds.client.Client')
    def test_connection_timeout(self, mock_client):
        mock_client.side_effect = requests.Timeout('timed out')
        self.assertRaises(VirtError, self.run_once)

    @patch('suds.client.Client')
    def test_invalid_login(self, mock_client):
        mock_client.return_value.service.Login.side_effect = suds.WebFault('Permission to perform this operation was denied.', '')
        self.assertRaises(VirtError, self.run_once)

    @patch('suds.client.Client')
    def test_disable_simplified_vim(self, mock_client):
        self.esx.config.simplified_vim = False
        mock_client.return_value.service.RetrievePropertiesEx.return_value = None
        mock_client.return_value.service.WaitForUpdatesEx.return_value.truncated = False
        self.run_once()

        self.assertTrue(mock_client.called)
        mock_client.assert_called_with(ANY, location="https://localhost/sdk", transport=ANY,
                                       cache=None)
        mock_client.return_value.service.RetrieveServiceContent.assert_called_once_with(_this=ANY)
        mock_client.return_value.service.Login.assert_called_once_with(_this=ANY, userName='******', password='******')

    @patch('suds.client.Client')
    def test_getHostGuestMapping(self, mock_client):
        expected_hostname = 'hostname.domainname'
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'
        expected_guest_state = Guest.STATE_RUNNING

        fake_parent = MagicMock()
        fake_parent.value = 'fake_parent_id'
        fake_parent._type = 'ClusterComputeResource'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {'guest1': {'runtime.powerState': 'poweredOn',
                               'config.uuid': expected_guestId}}
        self.esx.vms = fake_vms

        fake_host = {'hardware.systemInfo.uuid': expected_hypervisorId,
                     'config.network.dnsConfig.hostName': 'hostname',
                     'config.network.dnsConfig.domainName': 'domainname',
                     'config.product.version': '1.2.3',
                     'hardware.cpuInfo.numCpuPackages': '1',
                     'name': expected_hostname,
                     'parent': fake_parent,
                     'vm': fake_vm,
                     }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        fake_cluster = {'name': 'Fake_cluster_name'}
        self.esx.clusters = {'fake_parent_id': fake_cluster}

        expected_result = Hypervisor(
            hypervisorId=expected_hypervisorId,
            name=expected_hostname,
            guestIds=[
                Guest(
                    expected_guestId,
                    self.esx.CONFIG_TYPE,
                    expected_guest_state,
                )
            ],
            facts={
                Hypervisor.CPU_SOCKET_FACT: '1',
                Hypervisor.HYPERVISOR_TYPE_FACT: 'vmware',
                Hypervisor.HYPERVISOR_VERSION_FACT: '1.2.3',
                Hypervisor.HYPERVISOR_CLUSTER: 'Fake_cluster_name',
                Hypervisor.SYSTEM_UUID_FACT: expected_hypervisorId
            }
        )
        result = self.esx.getHostGuestMapping()['hypervisors'][0]
        self.assertEqual(expected_result.toDict(), result.toDict())

    @patch('suds.client.Client')
    def test_getHostGuestMappingNoHostName(self, mock_client):
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'
        expected_guest_state = Guest.STATE_RUNNING

        fake_parent = MagicMock()
        fake_parent.value = 'fake_parent_id'
        fake_parent._type = 'ClusterComputeResource'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {'guest1': {'runtime.powerState': 'poweredOn',
                               'config.uuid': expected_guestId}}
        self.esx.vms = fake_vms

        fake_host = {'hardware.systemInfo.uuid': expected_hypervisorId,
                     'config.network.dnsConfig.domainName': 'domainname',
                     'config.product.version': '1.2.3',
                     'hardware.cpuInfo.numCpuPackages': '1',
                     'parent': fake_parent,
                     'vm': fake_vm,
                     }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        fake_cluster = {'name': 'Fake_cluster_name'}
        self.esx.clusters = {'fake_parent_id': fake_cluster}

        assert (len(self.esx.getHostGuestMapping()['hypervisors']) == 0)


    @patch('suds.client.Client')
    def test_getHostGuestMapping_incomplete_data(self, mock_client):
        expected_hostname = 'hostname.domainname'
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'
        expected_guest_state = Guest.STATE_UNKNOWN

        fake_parent = MagicMock()
        fake_parent.value = 'fake_parent_id'
        fake_parent._type = 'ClusterComputeResource'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {'guest1': {'runtime.powerState': 'BOGUS_STATE',
                               'config.uuid': expected_guestId}}
        self.esx.vms = fake_vms

        fake_host = {'hardware.systemInfo.uuid': expected_hypervisorId,
                     'config.network.dnsConfig.hostName': 'hostname',
                     'config.network.dnsConfig.domainName': 'domainname',
                     'config.product.version': '1.2.3',
                     'hardware.cpuInfo.numCpuPackages': '1',
                     'parent': fake_parent,
                     'vm': fake_vm
                     }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        fake_cluster = {'name': 'Fake_cluster_name'}
        self.esx.clusters = {'fake_parent_id': fake_cluster}

        expected_result = Hypervisor(
            hypervisorId=expected_hypervisorId,
            name=expected_hostname,
            guestIds=[
                Guest(
                    expected_guestId,
                    self.esx.CONFIG_TYPE,
                    expected_guest_state,
                )
            ],
            facts={
                Hypervisor.CPU_SOCKET_FACT: '1',
                Hypervisor.HYPERVISOR_TYPE_FACT: 'vmware',
                Hypervisor.HYPERVISOR_VERSION_FACT: '1.2.3',
                Hypervisor.HYPERVISOR_CLUSTER: 'Fake_cluster_name',
                Hypervisor.SYSTEM_UUID_FACT: expected_hypervisorId
            }
        )
        result = self.esx.getHostGuestMapping()['hypervisors'][0]
        self.assertEqual(expected_result.toDict(), result.toDict())

    @patch('suds.client.Client')
    def test_oneshot(self, mock_client):
        expected_assoc = '"well formed HostGuestMapping"'
        expected_report = HostGuestAssociationReport(self.esx.config, expected_assoc)
        updateSet = Mock()
        updateSet.version = 'some_new_version_string'
        updateSet.truncated = False
        mock_client.return_value.service.WaitForUpdatesEx.return_value = updateSet
        datastore = Datastore()
        self.esx.applyUpdates = Mock()
        getHostGuestMappingMock = Mock()
        getHostGuestMappingMock.return_value = expected_assoc
        self.esx.getHostGuestMapping = getHostGuestMappingMock
        self.run_once(datastore)
        result_report = datastore.get(self.esx.config.name)
        self.assertEqual(expected_report.config.name, result_report.config.name)
        self.assertEqual(expected_report.config._values, result_report.config._values)
        self.assertEqual(expected_report._assoc, result_report._assoc)

    def test_proxy(self):
        self.esx.config['simplified_vim'] = True
        proxy = Proxy()
        self.addCleanup(proxy.terminate)
        proxy.start()
        oldenv = os.environ.copy()
        self.addCleanup(lambda: setattr(os, 'environ', oldenv))
        os.environ['https_proxy'] = proxy.address

        self.assertRaises(VirtError, self.run_once)
        self.assertIsNotNone(proxy.last_path, "Proxy was not called")
        self.assertEqual(proxy.last_path, 'localhost:443')

    def test_applyHostSystemUpdate_AttributeError(self):
        change = Mock(spec=['op', 'name'])
        change.op = 'assign'
        change.name = 'test.guest.name'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.hosts = dict()
        self.esx.hosts[objectSet.obj.value] = dict()

        try:
            self.esx.applyHostSystemUpdate(objectSet)
        except AttributeError:
            self.fail('applyHostSystemUpdate raised AttributeError unexpectedly')
        self.assertDictEqual(self.esx.hosts[objectSet.obj.value], dict())


    def test_applyHostSystemUpdate_leave(self):
        objectSet = Mock()
        objectSet.kind = 'leave'
        objectSet.obj.value = 'test.host.name'

        self.esx.hosts = dict()
        self.esx.hosts[objectSet.obj.value] = dict()

        self.esx.applyHostSystemUpdate(objectSet)
        self.assertDictEqual(self.esx.hosts, dict())

    def test_applyHostSystemUpdate_modify(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'assign'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.hosts = dict()
        self.esx.hosts[objectSet.obj.value] = dict()

        self.esx.applyHostSystemUpdate(objectSet)

        expected = dict()
        expected[change.name] = change.val
        self.assertDictEqual(self.esx.hosts[objectSet.obj.value], expected)

    def test_applyVirtualMachineUpdate_AttributeError(self):
        change = Mock(spec=['op', 'name'])
        change.op = 'assign'
        change.name = 'test.guest.name'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()

        try:
            self.esx.applyVirtualMachineUpdate(objectSet)
        except AttributeError:
            self.fail('applyHostSystemUpdate raised AttributeError unexpectedly')
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], dict())

    def test_applyVirtualMachineUpdate_leave(self):
        objectSet = Mock()
        objectSet.kind = 'leave'
        objectSet.obj.value = 'test.host.name'

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()

        self.esx.applyVirtualMachineUpdate(objectSet)
        self.assertDictEqual(self.esx.vms, dict())

    def test_applyVirtualMachineUpdate_modify(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'assign'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()

        self.esx.applyVirtualMachineUpdate(objectSet)

        expected = dict()
        expected[change.name] = change.val
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], expected)

    def test_applyVirtualMachineUpdate_add(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'add'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()
        self.esx.vms[objectSet.obj.value][change.name] = []

        self.esx.applyVirtualMachineUpdate(objectSet)

        expected = dict()
        expected[change.name] = [change.val]
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], expected)

    def test_applyVirtualMachineUpdate_remove(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'remove'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()
        self.esx.vms[objectSet.obj.value][change.name] = 'test'

        self.esx.applyVirtualMachineUpdate(objectSet)

        expected = dict()
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], expected)
Esempio n. 3
0
class TestEsx(TestBase):
    def setUp(self):
        config = Config('test',
                        'esx',
                        server='localhost',
                        username='******',
                        password='******',
                        owner='owner',
                        env='env')
        self.esx = Esx(self.logger, config, None)  #  No dest given here

    def run_once(self, datastore=None):
        ''' Run ESX in oneshot mode '''
        self.esx._oneshot = True
        if datastore is None:
            datastore = Mock(spec=Datastore())

        self.esx.dest = datastore
        self.esx._terminate_event = Event()
        self.esx._oneshot = True
        self.esx._interval = 0
        self.esx._run()

    @patch('suds.client.Client')
    def test_connect(self, mock_client):
        mock_client.return_value.service.WaitForUpdatesEx.return_value = None
        self.run_once()

        self.assertTrue(mock_client.called)
        mock_client.assert_called_with(ANY,
                                       location="https://localhost/sdk",
                                       cache=None,
                                       transport=ANY)
        mock_client.return_value.service.RetrieveServiceContent.assert_called_once_with(
            _this=ANY)
        mock_client.return_value.service.Login.assert_called_once_with(
            _this=ANY, userName='******', password='******')

    @patch('suds.client.Client')
    def test_connection_timeout(self, mock_client):
        mock_client.side_effect = requests.Timeout('timed out')
        self.assertRaises(VirtError, self.run_once)

    @patch('suds.client.Client')
    def test_invalid_login(self, mock_client):
        mock_client.return_value.service.Login.side_effect = suds.WebFault(
            'Permission to perform this operation was denied.', '')
        self.assertRaises(VirtError, self.run_once)

    @patch('suds.client.Client')
    def test_disable_simplified_vim(self, mock_client):
        self.esx.config.simplified_vim = False
        mock_client.return_value.service.RetrievePropertiesEx.return_value = None
        mock_client.return_value.service.WaitForUpdatesEx.return_value.truncated = False
        self.run_once()

        self.assertTrue(mock_client.called)
        mock_client.assert_called_with(ANY,
                                       location="https://localhost/sdk",
                                       transport=ANY)
        mock_client.return_value.service.RetrieveServiceContent.assert_called_once_with(
            _this=ANY)
        mock_client.return_value.service.Login.assert_called_once_with(
            _this=ANY, userName='******', password='******')

    @patch('suds.client.Client')
    def test_getHostGuestMapping(self, mock_client):
        expected_hostname = 'hostname.domainname'
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'
        expected_guest_state = Guest.STATE_RUNNING

        fake_parent = MagicMock()
        fake_parent.value = 'Fake_parent'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {
            'guest1': {
                'runtime.powerState': 'poweredOn',
                'config.uuid': expected_guestId
            }
        }
        self.esx.vms = fake_vms

        fake_host = {
            'hardware.systemInfo.uuid': expected_hypervisorId,
            'config.network.dnsConfig.hostName': 'hostname',
            'config.network.dnsConfig.domainName': 'domainname',
            'config.product.version': '1.2.3',
            'hardware.cpuInfo.numCpuPackages': '1',
            'name': expected_hostname,
            'parent': fake_parent,
            'vm': fake_vm
        }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        expected_result = Hypervisor(hypervisorId=expected_hypervisorId,
                                     name=expected_hostname,
                                     guestIds=[
                                         Guest(
                                             expected_guestId,
                                             self.esx,
                                             expected_guest_state,
                                         )
                                     ],
                                     facts={
                                         Hypervisor.CPU_SOCKET_FACT:
                                         '1',
                                         Hypervisor.HYPERVISOR_TYPE_FACT:
                                         'vmware',
                                         Hypervisor.HYPERVISOR_VERSION_FACT:
                                         '1.2.3',
                                     })
        result = self.esx.getHostGuestMapping()['hypervisors'][0]
        self.assertEqual(expected_result.toDict(), result.toDict())

    @patch('suds.client.Client')
    def test_getHostGuestMapping_incomplete_data(self, mock_client):
        expected_hostname = 'hostname.domainname'
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'
        expected_guest_state = Guest.STATE_UNKNOWN

        fake_parent = MagicMock()
        fake_parent.value = 'Fake_parent'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {
            'guest1': {
                'runtime.powerState': 'BOGUS_STATE',
                'config.uuid': expected_guestId
            }
        }
        self.esx.vms = fake_vms

        fake_host = {
            'hardware.systemInfo.uuid': expected_hypervisorId,
            'config.network.dnsConfig.hostName': 'hostname',
            'config.network.dnsConfig.domainName': 'domainname',
            'config.product.version': '1.2.3',
            'hardware.cpuInfo.numCpuPackages': '1',
            'parent': fake_parent,
            'vm': fake_vm
        }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        expected_result = Hypervisor(hypervisorId=expected_hypervisorId,
                                     name=expected_hostname,
                                     guestIds=[
                                         Guest(
                                             expected_guestId,
                                             self.esx,
                                             expected_guest_state,
                                         )
                                     ],
                                     facts={
                                         Hypervisor.CPU_SOCKET_FACT:
                                         '1',
                                         Hypervisor.HYPERVISOR_TYPE_FACT:
                                         'vmware',
                                         Hypervisor.HYPERVISOR_VERSION_FACT:
                                         '1.2.3',
                                     })
        result = self.esx.getHostGuestMapping()['hypervisors'][0]
        self.assertEqual(expected_result.toDict(), result.toDict())

    @patch('suds.client.Client')
    def test_oneshot(self, mock_client):
        expected_assoc = '"well formed HostGuestMapping"'
        expected_report = HostGuestAssociationReport(self.esx.config,
                                                     expected_assoc)
        updateSet = Mock()
        updateSet.version = 'some_new_version_string'
        updateSet.truncated = False
        mock_client.return_value.service.WaitForUpdatesEx.return_value = updateSet
        datastore = Datastore()
        self.esx.applyUpdates = Mock()
        getHostGuestMappingMock = Mock()
        getHostGuestMappingMock.return_value = expected_assoc
        self.esx.getHostGuestMapping = getHostGuestMappingMock
        self.run_once(datastore)
        result_report = datastore.get(self.esx.config.name)
        self.assertEqual(expected_report.config.hash,
                         result_report.config.hash)
        self.assertEqual(expected_report._assoc, result_report._assoc)

    def test_proxy(self):
        self.esx.config.simplified_vim = True
        proxy = Proxy()
        self.addCleanup(proxy.terminate)
        proxy.start()
        oldenv = os.environ.copy()
        self.addCleanup(lambda: setattr(os, 'environ', oldenv))
        os.environ['https_proxy'] = proxy.address

        self.assertRaises(VirtError, self.run_once)
        self.assertIsNotNone(proxy.last_path, "Proxy was not called")
        self.assertEqual(proxy.last_path, 'localhost:443')

    def test_applyHostSystemUpdate_AttributeError(self):
        change = Mock(spec=['op', 'name'])
        change.op = 'assign'
        change.name = 'test.guest.name'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.hosts = dict()
        self.esx.hosts[objectSet.obj.value] = dict()

        try:
            self.esx.applyHostSystemUpdate(objectSet)
        except AttributeError:
            self.fail(
                'applyHostSystemUpdate raised AttributeError unexpectedly')
        self.assertDictEqual(self.esx.hosts[objectSet.obj.value], dict())

    def test_applyHostSystemUpdate_leave(self):
        objectSet = Mock()
        objectSet.kind = 'leave'
        objectSet.obj.value = 'test.host.name'

        self.esx.hosts = dict()
        self.esx.hosts[objectSet.obj.value] = dict()

        self.esx.applyHostSystemUpdate(objectSet)
        self.assertDictEqual(self.esx.hosts, dict())

    def test_applyHostSystemUpdate_modify(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'assign'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.hosts = dict()
        self.esx.hosts[objectSet.obj.value] = dict()

        self.esx.applyHostSystemUpdate(objectSet)

        expected = dict()
        expected[change.name] = change.val
        self.assertDictEqual(self.esx.hosts[objectSet.obj.value], expected)

    def test_applyVirtualMachineUpdate_AttributeError(self):
        change = Mock(spec=['op', 'name'])
        change.op = 'assign'
        change.name = 'test.guest.name'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()

        try:
            self.esx.applyVirtualMachineUpdate(objectSet)
        except AttributeError:
            self.fail(
                'applyHostSystemUpdate raised AttributeError unexpectedly')
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], dict())

    def test_applyVirtualMachineUpdate_leave(self):
        objectSet = Mock()
        objectSet.kind = 'leave'
        objectSet.obj.value = 'test.host.name'

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()

        self.esx.applyVirtualMachineUpdate(objectSet)
        self.assertDictEqual(self.esx.vms, dict())

    def test_applyVirtualMachineUpdate_modify(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'assign'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()

        self.esx.applyVirtualMachineUpdate(objectSet)

        expected = dict()
        expected[change.name] = change.val
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], expected)

    def test_applyVirtualMachineUpdate_add(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'add'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()
        self.esx.vms[objectSet.obj.value][change.name] = []

        self.esx.applyVirtualMachineUpdate(objectSet)

        expected = dict()
        expected[change.name] = [change.val]
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], expected)

    def test_applyVirtualMachineUpdate_remove(self):
        change = Mock(spec=['op', 'name', 'val'])
        change.op = 'remove'
        change.name = 'test.guest.name'
        change.val = 'test'

        objectSet = Mock()
        objectSet.kind = 'modify'
        objectSet.obj.value = 'test.host.name'
        objectSet.changeSet = [change]

        self.esx.vms = dict()
        self.esx.vms[objectSet.obj.value] = dict()
        self.esx.vms[objectSet.obj.value][change.name] = 'test'

        self.esx.applyVirtualMachineUpdate(objectSet)

        expected = dict()
        self.assertDictEqual(self.esx.vms[objectSet.obj.value], expected)
Esempio n. 4
0
class TestEsx(TestBase):
    def setUp(self):
        config = Config('test', 'esx', server='localhost', username='******',
                        password='******', owner='owner', env='env')
        self.esx = Esx(self.logger, config)

    def run_once(self, queue=None):
        ''' Run ESX in oneshot mode '''
        self.esx._oneshot = True
        self.esx._queue = queue or Queue()
        self.esx._terminate_event = Event()
        self.esx._oneshot = True
        self.esx._interval = 0
        self.esx._run()

    @patch('suds.client.Client')
    def test_connect(self, mock_client):
        mock_client.return_value.service.WaitForUpdatesEx.return_value = None
        self.run_once()

        self.assertTrue(mock_client.called)
        mock_client.assert_called_with(ANY, location="https://localhost/sdk", cache=None, transport=ANY)
        mock_client.return_value.service.RetrieveServiceContent.assert_called_once_with(_this=ANY)
        mock_client.return_value.service.Login.assert_called_once_with(_this=ANY, userName='******', password='******')

    @patch('suds.client.Client')
    def test_connection_timeout(self, mock_client):
        mock_client.side_effect = requests.Timeout('timed out')
        self.assertRaises(VirtError, self.run_once)

    @patch('suds.client.Client')
    def test_invalid_login(self, mock_client):
        mock_client.return_value.service.Login.side_effect = suds.WebFault('Permission to perform this operation was denied.', '')
        self.assertRaises(VirtError, self.run_once)

    @patch('suds.client.Client')
    def test_disable_simplified_vim(self, mock_client):
        self.esx.config.simplified_vim = False
        mock_client.return_value.service.RetrievePropertiesEx.return_value = None
        mock_client.return_value.service.WaitForUpdatesEx.return_value.truncated = False
        self.run_once()

        self.assertTrue(mock_client.called)
        mock_client.assert_called_with(ANY, location="https://localhost/sdk", transport=ANY)
        mock_client.return_value.service.RetrieveServiceContent.assert_called_once_with(_this=ANY)
        mock_client.return_value.service.Login.assert_called_once_with(_this=ANY, userName='******', password='******')

    @patch('suds.client.Client')
    def test_getHostGuestMapping(self, mock_client):
        expected_hostname = 'hostname.domainname'
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'
        expected_guest_state = Guest.STATE_RUNNING

        fake_parent = MagicMock()
        fake_parent.value = 'Fake_parent'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {'guest1': {'runtime.powerState': 'poweredOn',
                               'config.uuid': expected_guestId}}
        self.esx.vms = fake_vms

        fake_host = {'hardware.systemInfo.uuid': expected_hypervisorId,
                     'config.network.dnsConfig.hostName': 'hostname',
                     'config.network.dnsConfig.domainName': 'domainname',
                     'config.product.version': '1.2.3',
                     'hardware.cpuInfo.numCpuPackages': '1',
                     'name': expected_hostname,
                     'parent': fake_parent,
                     'vm': fake_vm
                     }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        expected_result = Hypervisor(
            hypervisorId=expected_hypervisorId,
            name=expected_hostname,
            guestIds=[
                Guest(
                    expected_guestId,
                    self.esx,
                    expected_guest_state,
                )
            ],
            facts={
                Hypervisor.CPU_SOCKET_FACT: '1',
                Hypervisor.HYPERVISOR_TYPE_FACT: 'vmware',
                Hypervisor.HYPERVISOR_VERSION_FACT: '1.2.3',
            }
        )
        result = self.esx.getHostGuestMapping()['hypervisors'][0]
        self.assertEqual(expected_result.toDict(), result.toDict())

    @patch('suds.client.Client')
    def test_getHostGuestMapping_incomplete_data(self, mock_client):
        expected_hostname = 'hostname.domainname'
        expected_hypervisorId = 'Fake_uuid'
        expected_guestId = 'guest1UUID'
        expected_guest_state = Guest.STATE_UNKNOWN

        fake_parent = MagicMock()
        fake_parent.value = 'Fake_parent'

        fake_vm_id = MagicMock()
        fake_vm_id.value = 'guest1'

        fake_vm = MagicMock()
        fake_vm.ManagedObjectReference = [fake_vm_id]
        fake_vms = {'guest1': {'runtime.powerState': 'BOGUS_STATE',
                               'config.uuid': expected_guestId}}
        self.esx.vms = fake_vms

        fake_host = {'hardware.systemInfo.uuid': expected_hypervisorId,
                     'config.network.dnsConfig.hostName': 'hostname',
                     'config.network.dnsConfig.domainName': 'domainname',
                     'config.product.version': '1.2.3',
                     'hardware.cpuInfo.numCpuPackages': '1',
                     'parent': fake_parent,
                     'vm': fake_vm
                     }
        fake_hosts = {'random-host-id': fake_host}
        self.esx.hosts = fake_hosts

        expected_result = Hypervisor(
            hypervisorId=expected_hypervisorId,
            name=expected_hostname,
            guestIds=[
                Guest(
                    expected_guestId,
                    self.esx,
                    expected_guest_state,
                )
            ],
            facts={
                Hypervisor.CPU_SOCKET_FACT: '1',
                Hypervisor.HYPERVISOR_TYPE_FACT: 'vmware',
                Hypervisor.HYPERVISOR_VERSION_FACT: '1.2.3',
            }
        )
        result = self.esx.getHostGuestMapping()['hypervisors'][0]
        self.assertEqual(expected_result.toDict(), result.toDict())

    @patch('suds.client.Client')
    def test_oneshot(self, mock_client):
        expected_assoc = '"well formed HostGuestMapping"'
        expected_report = HostGuestAssociationReport(self.esx.config, expected_assoc)
        updateSet = Mock()
        updateSet.version = 'some_new_version_string'
        updateSet.truncated = False
        mock_client.return_value.service.WaitForUpdatesEx.return_value = updateSet
        queue = Queue()
        self.esx.applyUpdates = Mock()
        getHostGuestMappingMock = Mock()
        getHostGuestMappingMock.return_value = expected_assoc
        self.esx.getHostGuestMapping = getHostGuestMappingMock
        self.run_once(queue)
        self.assertEqual(queue.qsize(), 1)
        result_report = queue.get(block=True, timeout=1)
        self.assertEqual(expected_report.config.hash, result_report.config.hash)
        self.assertEqual(expected_report._assoc, result_report._assoc)

    def test_proxy(self):
        self.esx.config.simplified_vim = True
        proxy = Proxy()
        self.addCleanup(proxy.terminate)
        proxy.start()
        oldenv = os.environ.copy()
        self.addCleanup(lambda: setattr(os, 'environ', oldenv))
        os.environ['https_proxy'] = proxy.address

        self.assertRaises(VirtError, self.run_once)
        self.assertIsNotNone(proxy.last_path, "Proxy was not called")
        self.assertEqual(proxy.last_path, 'localhost:443')