Blame tests/nvme_format_test.py

Packit Service b7b338
# Copyright (c) 2015-2016 Western Digital Corporation or its affiliates.
Packit Service b7b338
#
Packit Service b7b338
# This program is free software; you can redistribute it and/or
Packit Service b7b338
# modify it under the terms of the GNU General Public License
Packit Service b7b338
# as published by the Free Software Foundation; either version 2
Packit Service b7b338
# of the License, or (at your option) any later version.
Packit Service b7b338
#
Packit Service b7b338
# This program is distributed in the hope that it will be useful,
Packit Service b7b338
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service b7b338
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service b7b338
# GNU General Public License for more details.
Packit Service b7b338
#
Packit Service b7b338
# You should have received a copy of the GNU General Public License
Packit Service b7b338
# along with this program; if not, write to the Free Software
Packit Service b7b338
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
Packit Service b7b338
# MA  02110-1301, USA.
Packit Service b7b338
#
Packit Service b7b338
#   Author: Chaitanya Kulkarni <chaitanya.kulkarni@hgst.com>
Packit Service b7b338
#
Packit Service b7b338
"""
Packit Service b7b338
Namespace Format testcase :-
Packit Service b7b338
Packit Service b7b338
    1. Create, attach, detach, delete primary namespace and
Packit Service b7b338
       extract the supported format information from default namespace:-
Packit Service b7b338
           - List of the supported format.
Packit Service b7b338
           - List of Metadata Size per format. Based on this we calculate
Packit Service b7b338
             data protection parameter at the time of namespace.
Packit Service b7b338
           - List of LBA Data Size per format.
Packit Service b7b338
    2. Use the collected information and iterate through each supported
Packit Service b7b338
       format:-
Packit Service b7b338
           - Create namespace.
Packit Service b7b338
           - Attach namespace.
Packit Service b7b338
           - Run IOs on the namespace under test.
Packit Service b7b338
           - Detach namespace
Packit Service b7b338
           - Delete Namespace.
Packit Service b7b338
"""
Packit Service b7b338
Packit Service b7b338
import time
Packit Service b7b338
import subprocess
Packit Service b7b338
from nose.tools import assert_equal
Packit Service b7b338
from nvme_test import TestNVMe
Packit Service b7b338
Packit Service b7b338
Packit Service b7b338
class TestNVMeFormatCmd(TestNVMe):
Packit Service b7b338
Packit Service b7b338
    """
Packit Service b7b338
    Represents Format testcase.
Packit Service b7b338
Packit Service b7b338
        - Attributes:
Packit Service b7b338
              - dps : data protection information.
Packit Service b7b338
              - flabs : LBA format information.
Packit Service b7b338
              - nsze : namespace size.
Packit Service b7b338
              - ncap : namespace capacity.
Packit Service b7b338
              - ctrl_id : controller id.
Packit Service b7b338
              - lba_format_list : lis of supported format.
Packit Service b7b338
              - ms_list : list of metadat size per format.
Packit Service b7b338
              - lbads_list : list of LBA data size per format.
Packit Service b7b338
              - test_log_dir : directory for logs, temp files.
Packit Service b7b338
    """
Packit Service b7b338
Packit Service b7b338
    def __init__(self):
Packit Service b7b338
        """ Pre Section for TestNVMeFormatCmd """
Packit Service b7b338
        TestNVMe.__init__(self)
Packit Service b7b338
        self.dps = 0                 # ns data protection settings
Packit Service b7b338
        self.flbas = 0               # ns formattes logical block settings
Packit Service b7b338
        self.nsze = 0x1400000        # ns size
Packit Service b7b338
        self.ncap = 0x1400000        # ns capacity
Packit Service b7b338
        self.ctrl_id = self.get_ctrl_id()
Packit Service b7b338
        self.lba_format_list = []
Packit Service b7b338
        self.ms_list = []
Packit Service b7b338
        self.lbads_list = []
Packit Service b7b338
        self.test_log_dir = self.log_dir + "/" + self.__class__.__name__
Packit Service b7b338
        self.setup_log_dir(self.__class__.__name__)
Packit Service b7b338
        self.delete_all_ns()
Packit Service b7b338
        time.sleep(1)
Packit Service b7b338
Packit Service b7b338
    def __del__(self):
Packit Service b7b338
        """
Packit Service b7b338
        Post Section for TestNVMeFormatCmd
Packit Service b7b338
Packit Service b7b338
            - Create primary namespace.
Packit Service b7b338
            - Atttach it to controller.
Packit Service b7b338
            - Call super class's destructor.
Packit Service b7b338
        """
Packit Service b7b338
        assert_equal(self.create_and_validate_ns(self.default_nsid,
Packit Service b7b338
                                                 self.nsze,
Packit Service b7b338
                                                 self.ncap,
Packit Service b7b338
                                                 self.flbas,
Packit Service b7b338
                                                 self.dps), 0)
Packit Service b7b338
        self.attach_ns(self.ctrl_id, self.default_nsid)
Packit Service b7b338
        TestNVMe.__del__(self)
Packit Service b7b338
Packit Service b7b338
    def attach_detach_primary_ns(self):
Packit Service b7b338
        """ Extract supported format information using default namespace """
Packit Service b7b338
        assert_equal(self.create_and_validate_ns(self.default_nsid,
Packit Service b7b338
                                                 self.nsze,
Packit Service b7b338
                                                 self.ncap,
Packit Service b7b338
                                                 self.flbas,
Packit Service b7b338
                                                 self.dps), 0)
Packit Service b7b338
        assert_equal(self.attach_ns(self.ctrl_id, self.default_nsid), 0)
Packit Service b7b338
        # read lbaf information
Packit Service b7b338
        id_ns = "nvme id-ns " + self.ctrl + \
Packit Service b7b338
                " -n1 | grep ^lbaf | awk '{print $2}' | tr -s \"\\n\" \" \""
Packit Service b7b338
        proc = subprocess.Popen(id_ns, shell=True, stdout=subprocess.PIPE,
Packit Service b7b338
                                encoding='utf-8')
Packit Service b7b338
        self.lba_format_list = proc.stdout.read().strip().split(" ")
Packit Service b7b338
        if proc.wait() == 0:
Packit Service b7b338
            # read lbads information
Packit Service b7b338
            id_ns = "nvme id-ns " + self.ctrl + \
Packit Service b7b338
                    " -n1 | grep ^lbaf | awk '{print $5}'" + \
Packit Service b7b338
                    " | cut -f 2 -d ':' | tr -s \"\\n\" \" \""
Packit Service b7b338
            proc = subprocess.Popen(id_ns, shell=True, stdout=subprocess.PIPE,
Packit Service b7b338
                                    encoding='utf-8')
Packit Service b7b338
            self.lbads_list = proc.stdout.read().strip().split(" ")
Packit Service b7b338
            # read metadata information
Packit Service b7b338
            id_ns = "nvme id-ns " + self.ctrl + \
Packit Service b7b338
                    " -n1 | grep ^lbaf | awk '{print $4}'" + \
Packit Service b7b338
                    " | cut -f 2 -d ':' | tr -s \"\\n\" \" \""
Packit Service b7b338
            proc = subprocess.Popen(id_ns, shell=True, stdout=subprocess.PIPE,
Packit Service b7b338
                                    encoding='utf-8')
Packit Service b7b338
            self.ms_list = proc.stdout.read().strip().split(" ")
Packit Service b7b338
            assert_equal(self.detach_ns(self.ctrl_id, self.default_nsid), 0)
Packit Service b7b338
            assert_equal(self.delete_and_validate_ns(self.default_nsid), 0)
Packit Service b7b338
            self.nvme_reset_ctrl()
Packit Service b7b338
Packit Service b7b338
    def test_format_ns(self):
Packit Service b7b338
        """ Testcase main """
Packit Service b7b338
        # extract the supported format information.
Packit Service b7b338
        self.attach_detach_primary_ns()
Packit Service b7b338
Packit Service b7b338
        # iterate through all supported format
Packit Service b7b338
        for i in range(0, len(self.lba_format_list)):
Packit Service b7b338
            print("\nlba format " + str(self.lba_format_list[i]) + \
Packit Service b7b338
                  " lbad       " + str(self.lbads_list[i]) + \
Packit Service b7b338
                  " ms         " + str(self.ms_list[i]))
Packit Service b7b338
            metadata_size = 1 if self.ms_list[i] == '8' else 0
Packit Service b7b338
            err = self.create_and_validate_ns(self.default_nsid,
Packit Service b7b338
                                              self.nsze,
Packit Service b7b338
                                              self.ncap,
Packit Service b7b338
                                              self.lba_format_list[i],
Packit Service b7b338
                                              metadata_size)
Packit Service b7b338
            assert_equal(err, 0)
Packit Service b7b338
            assert_equal(self.attach_ns(self.ctrl_id, self.default_nsid), 0)
Packit Service b7b338
            self.run_ns_io(self.default_nsid, self.lbads_list[i])
Packit Service b7b338
            time.sleep(5)
Packit Service b7b338
            assert_equal(self.detach_ns(self.ctrl_id, self.default_nsid), 0)
Packit Service b7b338
            assert_equal(self.delete_and_validate_ns(self.default_nsid), 0)
Packit Service b7b338
            self.nvme_reset_ctrl()