Example #1
0
 def test_scrub_status_cancelled(self):
     """
     Test to see if scrub_status correctly identifies cancelled status
     :return:
     """
     pool = Pool(raid='raid0', name='test-pool')
     out = [
         'scrub status for 8adf7f0b-65ec-4e00-83cc-7f5855201185',
         '\tscrub started at Mon Aug  7 15:29:52 2017 and was aborted after 00:04:56',  # noqa E501
         '\tdata_extents_scrubbed: 1292470',
         '\ttree_extents_scrubbed: 9299',
         '\tdata_bytes_scrubbed: 83593609216',
         '\ttree_bytes_scrubbed: 152354816',
         '\tread_errors: 0',
         '\tcsum_errors: 0',
         '\tverify_errors: 0',
         '\tno_csum: 5632',
         '\tcsum_discards: 0',
         '\tsuper_errors: 0',
         '\tmalloc_errors: 0',
         '\tuncorrectable_errors: 0',
         '\tunverified_errors: 0',
         '\tcorrected_errors: 0',
         '\tlast_physical: 103077314560',
         ''
     ]
     err = ['']
     rc = 0
     expected_results = {
         'status': 'cancelled',
         'csum_discards': 0,
         'super_errors': 0,
         'data_extents_scrubbed': 1292470,
         'last_physical': 103077314560,
         'tree_bytes_scrubbed': 152354816,
         'no_csum': 5632,
         'read_errors': 0,
         'verify_errors': 0,
         'uncorrectable_errors': 0,
         'malloc_errors': 0,
         'unverified_errors': 0,
         'tree_extents_scrubbed': 9299,
         'duration': 296,
         'kb_scrubbed': 81634384,
         'csum_errors': 0,
         'corrected_errors': 0
     }
     self.mock_run_command.return_value = (out, err, rc)
     self.mock_mount_root.return_value = '/mnt2/test-mount'
     self.assertEqual(scrub_status(pool),
                      expected_results,
                      msg=("Failed to identify cancelled state."))
Example #2
0
 def test_scrub_status_halted(self):
     """
     Test to see if scrub_status correctly identifies interrupted status
     """
     pool = Pool(raid='raid0', name='test-pool')
     out = [
         'scrub status for 8adf7f0b-65ec-4e00-83cc-7f5855201185',
         '\tscrub started at Sun Aug  6 12:18:39 2017, interrupted after 00:00:09, not running',  # noqa E501
         '\tdata_extents_scrubbed: 49335',
         '\ttree_extents_scrubbed: 9262',
         '\tdata_bytes_scrubbed: 2286493696',
         '\ttree_bytes_scrubbed: 151748608',
         '\tread_errors: 0',
         '\tcsum_errors: 0',
         '\tverify_errors: 0',
         '\tno_csum: 2816',
         '\tcsum_discards: 0',
         '\tsuper_errors: 0',
         '\tmalloc_errors: 0',
         '\tuncorrectable_errors: 0',
         '\tunverified_errors: 0',
         '\tcorrected_errors: 0',
         '\tlast_physical: 16706174976',
         ''
     ]
     err = ['']
     rc = 0
     expected_results = {
         'status': 'halted',
         'csum_discards': 0,
         'super_errors': 0,
         'data_extents_scrubbed': 49335,
         'last_physical': 16706174976,
         'tree_bytes_scrubbed': 151748608,
         'no_csum': 2816,
         'read_errors': 0,
         'verify_errors': 0,
         'uncorrectable_errors': 0,
         'malloc_errors': 0,
         'unverified_errors': 0,
         'tree_extents_scrubbed': 9262,
         'duration': 9,
         'kb_scrubbed': 2232904,
         'csum_errors': 0,
         'corrected_errors': 0
     }
     self.mock_run_command.return_value = (out, err, rc)
     self.mock_mount_root.return_value = '/mnt2/test-mount'
     self.assertEqual(scrub_status(pool),
                      expected_results,
                      msg=("Failed to identify scrub halted state."))
Example #3
0
 def test_scrub_status_finished(self):
     """
     Test to see if scrub_status correctly identifies finished status
     """
     pool = Pool(raid='raid0', name='test-pool')
     out = [
         'scrub status for 030baa1c-faab-4599-baa4-6077f7f6451b',
         '\tscrub started at Sun Aug  6 16:39:43 2017 and finished after 00:00:16',  # noqa E501
         '\tdata_extents_scrubbed: 81795',
         '\ttree_extents_scrubbed: 5264',
         '\tdata_bytes_scrubbed: 2881429504',
         '\ttree_bytes_scrubbed: 86245376',
         '\tread_errors: 0',
         '\tcsum_errors: 0',
         '\tverify_errors: 0',
         '\tno_csum: 272',
         '\tcsum_discards: 0',
         '\tsuper_errors: 0',
         '\tmalloc_errors: 0',
         '\tuncorrectable_errors: 0',
         '\tunverified_errors: 0',
         '\tcorrected_errors: 0',
         '\tlast_physical: 5993660416',
         ''
     ]
     err = ['']
     rc = 0
     expected_results = {
         'status': 'finished',
         'csum_discards': 0,
         'super_errors': 0,
         'data_extents_scrubbed': 81795,
         'last_physical': 5993660416,
         'tree_bytes_scrubbed': 86245376,
         'no_csum': 272,
         'read_errors': 0,
         'verify_errors': 0,
         'uncorrectable_errors': 0,
         'malloc_errors': 0,
         'unverified_errors': 0,
         'tree_extents_scrubbed': 5264,
         'duration': 16,
         'kb_scrubbed': 2813896,
         'csum_errors': 0,
         'corrected_errors': 0
     }
     self.mock_run_command.return_value = (out, err, rc)
     self.mock_mount_root.return_value = '/mnt2/test-mount'
     self.assertEqual(scrub_status(pool),
                      expected_results,
                      msg=("Failed to identify scrub finished state."))
Example #4
0
 def _scrub_status(self, pool):
     try:
         ps = PoolScrub.objects.filter(pool=pool).order_by('-id')[0]
     except:
         return Response()
     if (ps.status == 'started' or ps.status == 'running'):
         cur_status = scrub_status(pool)
         if (cur_status['status'] == 'finished'):
             duration = int(cur_status['duration'])
             cur_status['end_time'] = (ps.start_time +
                                       timedelta(seconds=duration))
             del(cur_status['duration'])
         PoolScrub.objects.filter(id=ps.id).update(**cur_status)
     return ps
Example #5
0
 def _scrub_status(self, pool, disk):
     try:
         ps = PoolScrub.objects.filter(pool=pool).order_by('-id')[0]
     except:
         return Response()
     if (ps.status == 'started' or ps.status == 'running'):
         cur_status = scrub_status(pool, disk.name)
         if (cur_status['status'] == 'finished'):
             duration = int(cur_status['duration'])
             cur_status['end_time'] = (ps.start_time +
                                       timedelta(seconds=duration))
             del (cur_status['duration'])
         PoolScrub.objects.filter(id=ps.id).update(**cur_status)
     return ps
Example #6
0
 def test_scrub_status_running(self):
     """
     Test to see if scrub_status correctly identifies running status
     """
     pool = Pool(raid='raid0', name='test-pool')
     out = [
         'scrub status for 030baa1c-faab-4599-baa4-6077f7f6451b',
         '\tscrub started at Sun Aug  6 15:08:37 2017, running for 00:00:05',  # noqa E501
         '\tdata_extents_scrubbed: 26409',
         '\ttree_extents_scrubbed: 4495',
         '\tdata_bytes_scrubbed: 832385024',
         '\ttree_bytes_scrubbed: 73646080',
         '\tread_errors: 0',
         '\tcsum_errors: 0',
         '\tverify_errors: 0',
         '\tno_csum: 272',
         '\tcsum_discards: 0',
         '\tsuper_errors: 0',
         '\tmalloc_errors: 0',
         '\tuncorrectable_errors: 0',
         '\tunverified_errors: 0',
         '\tcorrected_errors: 0',
         '\tlast_physical: 1392836608',
         ''
     ]
     err = ['']
     rc = 0
     expected_results = {
         'status': 'running',
         'csum_discards': 0,
         'super_errors': 0,
         'data_extents_scrubbed': 26409,
         'last_physical': 1392836608,
         'tree_bytes_scrubbed': 73646080,
         'no_csum': 272,
         'read_errors': 0,
         'verify_errors': 0,
         'uncorrectable_errors': 0,
         'malloc_errors': 0,
         'unverified_errors': 0,
         'tree_extents_scrubbed': 4495,
         'kb_scrubbed': 812876,
         'csum_errors': 0,
         'corrected_errors': 0
     }
     self.mock_run_command.return_value = (out, err, rc)
     self.mock_mount_root.return_value = '/mnt2/test-mount'
     self.assertEqual(scrub_status(pool),
                      expected_results,
                      msg=("Failed to identify scrub running state."))
Example #7
0
 def _scrub_status(self, pool):
     try:
         ps = PoolScrub.objects.filter(pool=pool).order_by("-id")[0]
     except:
         return Response()
     if ps.status == "started" or ps.status == "running":
         cur_status = scrub_status(pool)
         if (cur_status["status"] == "finished"
                 or cur_status["status"] == "halted"
                 or cur_status["status"] == "cancelled"):
             duration = int(cur_status["duration"])
             cur_status["end_time"] = ps.start_time + timedelta(
                 seconds=duration)
             del cur_status["duration"]
         PoolScrub.objects.filter(id=ps.id).update(**cur_status)
     return ps
Example #8
0
    def post(self, request, pname, command=None):
        pool = self._validate_pool(pname, request)
        if (command is not None and command != 'status'):
            e_msg = ('Unknown scrub command: %s' % command)
            handle_exception(Exception(e_msg), request)

        try:
            disk = Disk.objects.filter(pool=pool)[0]
            if (command == 'status'):
                try:
                    ps = PoolScrub.objects.filter(pool=pool).order_by('-id')[0]
                except:
                    return Response()
                if (ps.status == 'started' or ps.status == 'running'):
                    cur_status = scrub_status(pname, disk.name)
                    ps.status = cur_status['status']
                    if (cur_status['status'] == 'finished'):
                        duration = int(cur_status['duration'])
                        ps.end_time = (ps.start_time +
                                       timedelta(seconds=duration))
                        ps.kb_scrubbed = cur_status['kb_scrubbed']
                        ps.errors = cur_status['errors']
                        ps.save()
                return Response(PoolScrubSerializer(ps).data)

            if ((PoolScrub.objects.filter(pool=pool,
                                          status__regex=r'(started|running)')
                 .exists())):
                e_msg = ('Active scrub exists for the pool: %s' % pname)
                handle_exception(Exception(e_msg), request)

            scrub_pid = scrub_start(pname, disk.name)
            ps = PoolScrub(pool=pool, pid=scrub_pid)
            ps.save()
            return Response(PoolScrubSerializer(ps).data)
        except RockStorAPIException:
            raise
        except Exception, e:
            handle_exception(e, request)
Example #9
0
 def test_scrub_status_conn_reset(self):
     """
     Test to see if scrub_status correctly identifies 'no stats available'
     :return:
     """
     pool = Pool(raid='raid0', name='test-pool')
     out = [
         'scrub status for 8adf7f0b-65ec-4e00-83cc-7f5855201185',
         '\tno stats available', '\tdata_extents_scrubbed: 0',
         '\ttree_extents_scrubbed: 0', '\tdata_bytes_scrubbed: 0',
         '\ttree_bytes_scrubbed: 0', '\tread_errors: 0', '\tcsum_errors: 0',
         '\tverify_errors: 0', '\tno_csum: 0', '\tcsum_discards: 0',
         '\tsuper_errors: 0', '\tmalloc_errors: 0',
         '\tuncorrectable_errors: 0', '\tunverified_errors: 0',
         '\tcorrected_errors: 0', '\tlast_physical: 0', ''
     ]
     err = ['WARNING: failed to read status: Connection reset by peer', '']
     rc = 0
     expected_results = {'status': 'conn-reset'}
     self.mock_run_command.return_value = (out, err, rc)
     self.mock_mount_root.return_value = '/mnt2/test-mount'
     self.assertEqual(scrub_status(pool),
                      expected_results,
                      msg=("Failed to identify conn-reset state."))