def test_init(self):
        """``PerfCollector`` the init parameters have not changed"""
        counter = 'some_vmware_stat'
        perfc = vsphere_collectors.PerfCollector(self.vcenter, self.entity,
                                                 counter)

        self.assertTrue(perfc.vcenter is self.vcenter)
        self.assertTrue(perfc.entity is self.entity)
        self.assertTrue(perfc.counter_name is counter)
    def test_perf_manager(self):
        """``PerfCollector`` the 'perf_manager' object is obtained form the vcenter content"""
        fake_perf_mgr = MagicMock()
        self.vcenter.content.perfManager = fake_perf_mgr
        perfc = vsphere_collectors.PerfCollector(self.vcenter, self.entity,
                                                 'some_vmware_stat')

        perf_mgr = perfc.perf_manager

        self.assertTrue(perf_mgr is fake_perf_mgr)
    def test_repr(self):
        """``PerfCollector`` the __repr__ contains metric context"""
        self.entity.name = 'someStat'
        perfc = vsphere_collectors.PerfCollector(self.vcenter, self.entity,
                                                 'some_vmware_stat')
        time_val = perfc.last_collected.strftime('%Y/%m/%d %H:%M:%S')

        repr = '{}'.format(perfc)
        expected = 'PerfCollector(name=someStat, stat=some_vmware_stat, last={})'.format(
            time_val)

        self.assertEqual(repr, expected)
    def test_query_no_data(self, fake_QuerySpec):
        """``PerfCollector`` the 'query' method returns an empty dictionary if no data is available"""
        fake_perf_mgr = MagicMock()
        fake_perf_mgr.QueryPerf.return_value = []
        self.vcenter.content.perfManager = fake_perf_mgr
        perfc = vsphere_collectors.PerfCollector(
            self.vcenter, self.entity, 'someGrp.someStat.someCategory')
        perfc._metric_id = ['someGrp.someStat.someCategory']

        stats = perfc.query()
        expected = {}

        self.assertEqual(stats, expected)
    def test_metric_id(self, fake_MetricId):
        """``PerfCollector`` the 'metric_id' property is only generated once"""
        fake_counter = MagicMock()
        fake_counter.key = 42
        fake_counter.groupInfo.key = 'someGrp'
        fake_counter.nameInfo.key = 'someStat'
        fake_counter.rollupType = 'someCategory'
        self.vcenter.content.perfManager.perfCounter = [fake_counter]
        perfc = vsphere_collectors.PerfCollector(
            self.vcenter, self.entity, 'someGrp.someStat.someCategory')

        perfc.metric_id
        perfc.metric_id

        self.assertEqual(fake_MetricId.call_count, 1)
    def test_counters(self):
        """``PerfCollector`` the 'counters' property returns a dictionary"""
        fake_counter = MagicMock()
        fake_counter.key = 42
        fake_counter.groupInfo.key = 'someGrp'
        fake_counter.nameInfo.key = 'someStat'
        fake_counter.rollupType = 'someCategory'
        self.vcenter.content.perfManager.perfCounter = [fake_counter]
        perfc = vsphere_collectors.PerfCollector(self.vcenter, self.entity,
                                                 'some_vmware_stat')

        counters = perfc.counters
        expected = {'someGrp.someStat.someCategory': 42}

        self.assertEqual(counters, expected)
    def test_query(self, fake_QuerySpec):
        """``PerfCollector`` the 'query' method returns a sane datastructure"""
        fake_data_value = MagicMock()
        fake_data_value.value = [42]
        fake_data_time = MagicMock()
        fake_data_time.timestamp = datetime.datetime.now()
        fake_data = MagicMock()
        fake_data.sampleInfo = [fake_data_time]
        fake_data.value = [fake_data_value]
        fake_perf_mgr = MagicMock()
        fake_perf_mgr.QueryPerf.return_value = [fake_data]
        self.vcenter.content.perfManager = fake_perf_mgr
        perfc = vsphere_collectors.PerfCollector(
            self.vcenter, self.entity, 'someGrp.someStat.someCategory')
        perfc._metric_id = ['someGrp.someStat.someCategory']

        stats = perfc.query()
        time_in_seconds = int(fake_data_time.timestamp.strftime('%s'))
        epoch = time_in_seconds - time.timezone
        expected = {epoch: 42}

        self.assertEqual(stats, expected)
    def test_query_index_error(self, fake_QuerySpec):
        """``PerfCollector`` the 'query' handles the shit partial response from pyVmomi"""
        fake_data_value = MagicMock()
        fake_data_value.value = [42]  # one value, but two time stamps...
        fake_data_time = MagicMock()
        fake_data_time.timestamp = datetime.datetime.now()
        fake_data = MagicMock()
        fake_data.sampleInfo = [fake_data_time, fake_data_time
                                ]  # two time stamps, but only 1 value...
        fake_data.value = [fake_data_value]
        fake_perf_mgr = MagicMock()
        fake_perf_mgr.QueryPerf.return_value = [fake_data]
        self.vcenter.content.perfManager = fake_perf_mgr
        perfc = vsphere_collectors.PerfCollector(
            self.vcenter, self.entity, 'someGrp.someStat.someCategory')
        perfc._metric_id = ['someGrp.someStat.someCategory']

        stats = perfc.query()
        time_in_seconds = int(fake_data_time.timestamp.strftime('%s'))
        epoch = time_in_seconds - time.timezone
        expected = {epoch: 42}

        self.assertEqual(stats, expected)