usr/src/cmd/auto-install/test/test_target_selection_sparc.py
author Harold N Shaw- Oracle <Harold.Shaw@oracle.COM>
Fri, 18 May 2012 08:18:06 -0700
changeset 1681 c1f54cfadbac
parent 1623 cb56a2fb4925
child 1695 7e11a6b0de11
permissions -rw-r--r--
7147174 Target selection doesn't work correctly when multiple disks specified via disk_props

#!/usr/bin/python
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#

#
# Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
#

import difflib
import os
import platform
import re
import unittest

import osol_install.errsvc as errsvc
from lxml import etree
from solaris_install.auto_install.checkpoints.target_selection \
    import TargetSelection
from solaris_install.data_object import ObjectNotFoundError
from solaris_install.engine import InstallEngine
from solaris_install.engine.test.engine_test_utils import \
    get_new_engine_instance, reset_engine
from solaris_install.target import Target, logical
from solaris_install.target.physical import Disk, Slice


class TestTargetSelectionTestCase(unittest.TestCase):
    DISCOVERED_TARGETS_XML = '''
    <root>
      <target name="discovered">

        <disk whole_disk="false">
          <disk_name name="c99t2d0" name_type="ctd"/>
          <disk_prop dev_type="FIXED" dev_vendor="Lenovo"
          dev_size="625141760secs"/>
          <slice name="1" action="preserve" force="false" is_swap="false"
             in_zpool="rpool_test" in_vdev="rpool_test-none">
            <size val="1060290secs" start_sector="512"/>
          </slice>
        </disk>

        <disk whole_disk="false">
          <disk_name name="c99t0d0" name_type="ctd"/>
          <disk_prop dev_type="scsi" dev_vendor="HITACHI"
           dev_size="143349312secs"/>
          <disk_keyword key="boot_disk"/>
          <slice name="0" action="preserve" force="false" is_swap="false"
           in_zpool="rpool_test" in_vdev="rpool_test-none">
            <size val="16770048secs" start_sector="10176"/>
          </slice>
          <slice name="2" action="preserve" force="false" tag="5"
           is_swap="false">
            <size val="143349312secs" start_sector="0"/>
          </slice>
        </disk>
        <disk whole_disk="false">
          <disk_name name="c99t1d0" name_type="ctd"/>
          <disk_prop dev_type="scsi" dev_vendor="HITACHI"
           dev_size="143349312secs"/>
          <slice name="0" action="preserve" force="false" is_swap="false">
            <size val="41945472secs" start_sector="0"/>
          </slice>
          <slice name="1" action="preserve" force="false" is_swap="false">
            <size val="4202688secs" start_sector="41945472"/>
          </slice>
          <slice name="2" action="preserve" force="false" tag="5"
           is_swap="false">
            <size val="143349312secs" start_sector="0"/>
          </slice>
        </disk>
        <disk whole_disk="false">
          <disk_name name="206000c0ff0080c4" name_type="wwn"/>
          <disk_prop dev_type="scsi" dev_vendor="HITACHI"
           dev_size="143349312secs"/>
          <slice name="0" action="preserve" force="false" is_swap="false">
            <size val="41945472secs" start_sector="0"/>
          </slice>
          <slice name="1" action="preserve" force="false" is_swap="false">
            <size val="4202688secs" start_sector="41945472"/>
          </slice>
          <slice name="2" action="preserve" force="false" tag="5"
           is_swap="false">
            <size val="143349312secs" start_sector="0"/>
          </slice>
        </disk>
        <logical noswap="false" nodump="false">
          <zpool name="rpool_test" action="preserve" is_root="false"
           mountpoint="/rpool_test">
            <vdev name="rpool_test-none" redundancy="none"/>
            <filesystem name="ROOT" action="preserve" mountpoint="legacy"
             in_be="false"/>
            <filesystem name="ROOT/solaris" action="preserve" mountpoint="/"
             in_be="false"/>
            <filesystem name="ROOT/solaris/testing" action="preserve"
             mountpoint="/testing" in_be="false"/>
            <zvol name="dump" action="preserve" use="dump">
              <size val="1.03gb"/>
            </zvol>
            <zvol name="swap" action="preserve" use="swap">
              <size val="2.06gb"/>
            </zvol>
            <be name="solaris"/>
          </zpool>
        </logical>
      </target>
    </root>
    '''

    def __gendiff_str(self, a, b):
        a_lines = a.splitlines()
        b_lines = b.splitlines()
        return "\n".join(list(difflib.ndiff(a_lines, b_lines)))

    def __run_simple_test(self, input_xml, expected_xml, fail_ex_str=None,
        dry_run=True):
        '''Run a simple test where given specific xml in the manifest, we
        validate that the generated DESIRED tree is as expected.

        'expected_xml' should have the values indented using '.' instead of
        spaces to ensure that perfect match is made.
        '''
        errsvc.clear_error_list()

        # Different processor to what these tests were written for.
        if platform.processor() != 'sparc':
            print "Skipping test on wrong arch"
            return

        if input_xml is not None:
            manifest_dom = etree.fromstring(input_xml)
            self.doc.import_from_manifest_xml(manifest_dom, volatile=True)
            self.doc.logger.debug("DOC AFTER IMPORT TEST XML:\n%s\n\n" %
                                  (str(self.doc)))
            if len(errsvc._ERRORS) > 0:
                self.fail(errsvc._ERRORS[0])

        # Define expected string, compensate for indent. Using '.' in expected
        # string to remove conflict with indent replacement.
        indentation = '''\
        '''
        expected_xml = expected_xml.replace(indentation, "").replace(".", " ")

        try:
            self.target_selection.select_targets(
                self.doc.volatile.get_descendants(class_type=Target,
                                                  max_depth=2),
                self.doc.persistent.get_first_child(Target.DISCOVERED),
                dry_run=dry_run)
            if (fail_ex_str is not None):
                self.fail("Expected failure but test succeeded.")
        except Exception, ex:
            if (fail_ex_str is not None):
                self.assertEquals(str(ex), fail_ex_str)
            else:
                import traceback
                traceback.print_exc()
                raise ex

        try:
            desired = \
                self.doc.get_descendants(
                    name=Target.DESIRED, class_type=Target, max_depth=2,
                    not_found_is_err=True)[0]

            xml_str = desired.get_xml_tree_str()

            expected_re = re.compile(expected_xml)
            if not expected_re.match(xml_str):
                self.fail("Resulting XML doesn't match "
                          "expected:\nDIFF:\n%s\n" %
                          self.__gendiff_str(expected_xml, xml_str))

            desired.final_validation()
        except ObjectNotFoundError:
            self.fail("Unable to find DESIRED tree!")
        except Exception, e:
            import traceback
            traceback.print_exc()
            self.fail(e)

        if len(errsvc._ERRORS) > 0:
            self.fail(errsvc._ERRORS[0])

    def setUp(self):
        logical.DEFAULT_BE_NAME = "ai_test_solaris"
        self.engine = get_new_engine_instance()
        self.target_selection = TargetSelection("Test Checkpoint")
        self.doc = InstallEngine.get_instance().data_object_cache
        discovered_dom = etree.fromstring(self.DISCOVERED_TARGETS_XML)
        self.doc.import_from_manifest_xml(discovered_dom, volatile=False)

        # Ensure backup slices have tag = 5 (V_BACKUP)
        slices = self.doc.get_descendants("2", Slice)
        for s in slices:
            s.tag = 5

        # As we are not really discovering disks, label will be set to "None"
        # Ensure they set to VTOC
        discovered = self.doc.persistent.get_first_child(Target.DISCOVERED)
        self.disks = discovered.get_descendants(class_type=Disk)
        for disk in self.disks:
            if disk.label is None:
                disk.label = "VTOC"

            # to test a different identification types (devid, wwn, etc.), set
            # a ctd string for any disk without one.  Target Discovery will
            # always set as many attributes (ctd, volid, devpath, devid,
            # receptacle, wwn) as libdiskmgt returns but the XML only allows a
            # single identification type.
            if disk.ctd is None:
                disk.ctd = "c89t0d0"

    def tearDown(self):
        if self.engine is not None:
            reset_engine(self.engine)

        self.doc = None
        self.target_selection = None

    def test_target_selection_no_target(self):
        '''Test Success if no target in manifest'''

        expected_xml = '''\
        <target name="desired">
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<logical noswap="false" nodump="false">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ....</zpool>
        ..</logical>
        </target>
        '''

        self.__run_simple_test(None, expected_xml)

    def test_target_selection_no_disk_target_with_logical(self):
        '''Test Success if no disk targets, but with a logical section'''

        test_manifest_xml = '''
        <auto_install>
           <ai_instance name="orig_default">
             <target>
               <logical>
                 <zpool name="ai_test_rpool" is_root="true">
                   <filesystem name="/export"/>
                   <filesystem name="/export/home"/>
                   <be name="ai_test_solaris"/>
                 </zpool>
               </logical>
             </target>
          </ai_instance>
        </auto_install>
        '''
        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<filesystem name="/export" action="create" in_be="false"/>
        ......<filesystem name="/export/home" action="create" in_be="false"/>
        ......<be name="ai_test_solaris"/>
        ......<vdev name="vdev" redundancy="none"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_single_whole_disk_target(self):
        '''Test Success if single whole target in manifest'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="True">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_boot_disk_target(self):
        '''Test Success if boot_disk target in manifest'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true" in_zpool="ai_test_rpool" in_vdev="vdev">
                <disk_keyword key="boot_disk" />
              </disk>
              <logical>
                <zpool name="ai_test_rpool" is_root="true">
                  <vdev name="vdev" redundancy="none" />
                </zpool>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_multiple_whole_disk_targets(self):
        '''Test Success if multiple disk targets, no zpool, in manifest'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="True">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <disk whole_disk="True">
                <disk_name name="c99t1d0" name_type="ctd"/>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="mirror"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_multiple_whole_disk_false_no_slices(self):
        '''Test Success if whole disk false, no slices, in manifest.
        '''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="false">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <disk whole_disk="false">
                <disk_name name="c99t1d0" name_type="ctd"/>
                <size val="390714880secs" start_sector="512"/>
                <slice name="0" action="create" force="false"
                 is_swap="false">
                  <size val="390714880secs" start_sector="512"/>
                </slice>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml,
            fail_ex_str="If whole_disk is False, you need to "
                        "provide information for"
                        " gpt_partitions or slices")

    def test_target_selection_multiple_whole_disk_mixed_no_logicals(self):
        '''Test Success if 1 whole & 1 partitioned disk, no logicals'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <disk whole_disk="false">
                <disk_name name="c99t1d0" name_type="ctd"/>
                <slice name="1" action="delete"/>
                <slice name="0" action="create" force="false"
                 is_swap="false">
                  <size val="143348736secs" start_sector="512"/>
                </slice>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="mirror"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<slice name="2" action="preserve" force="false" is_swap="false">
        ......<size val="143349312secs" start_sector="0"/>
        ....</slice>
        ....<slice name="1" action="delete" force="false" is_swap="false">
        ......<size val="4202688secs" start_sector="41945472"/>
        ....</slice>
        ....<slice name="0" action="create" force="false" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_2_disks_whole_disk_true_and_rpool(self):
        '''Test Success if 2 disks, whole_disk=True & root pool'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true" in_zpool="ai_test_rpool">
                <disk_name name="c99t0d0" name_type="ctd" />
              </disk>
              <disk whole_disk="true" in_zpool="ai_test_rpool">
                <disk_name name="c99t1d0" name_type="ctd" />
              </disk>
              <logical>
                <zpool name="ai_test_rpool" is_root="true"/>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="mirror"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_2_disks_whole_disk_false_and_rpool(self):
        '''Test Success If 2 Disks w/Whole-Disks = False & Root Pool Specified
        '''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="false">
                <disk_name name="c99t0d0" name_type="ctd"/>
                  <slice name="1" action="delete"/>
                  <slice name="0" action="create" force="false"
                      is_swap="false" in_zpool="ai_test_rpool">
                    <size val="143349312secs" start_sector="512"/>
                  </slice>
              </disk>
              <disk whole_disk="false">
                <disk_name name="c99t1d0" name_type="ctd"/>
                  <slice name="1" action="delete"/>
                  <slice name="0" action="create" force="false"
                    is_swap="false" in_zpool="ai_test_rpool">
                    <size val="143349312secs" start_sector="512"/>
                  </slice>
              </disk>
              <logical>
                <zpool name="ai_test_rpool" is_root="true"/>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="mirror"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="2" action="preserve" force="false" is_swap="false">
        ......<size val="143349312secs" start_sector="0"/>
        ....</slice>
        ....<slice name="0" action="create" force="false" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143349248secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<slice name="2" action="preserve" force="false" is_swap="false">
        ......<size val="143349312secs" start_sector="0"/>
        ....</slice>
        ....<slice name="1" action="delete" force="false" is_swap="false">
        ......<size val="4202688secs" start_sector="41945472"/>
        ....</slice>
        ....<slice name="0" action="create" force="false" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143349248secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_2_disks_mixed_whole_disk_and_rpool(self):
        '''Test Success If 2 Disks, Mixed Whole-Disk Values & Root Pool
        '''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true" in_zpool="ai_test_rpool">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <disk whole_disk="false">
                <disk_name name="c99t1d0" name_type="ctd"/>
                <slice name="1" action="delete"/>
                <slice name="0" action="create" force="false" is_swap="false"
                 in_zpool="ai_test_rpool">
                  <size val="143349312secs" start_sector="512"/>
                </slice>
              </disk>
              <logical>
                <zpool name="ai_test_rpool" is_root="true">
                  <zvol name="swap" action="create" use="swap">
                    <size val="747m"/>
                  </zvol>
                  <zvol name="dump" action="create" use="dump">
                    <size val="747m"/>
                  </zvol>
                </zpool>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="747m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="747m"/>
        ......</zvol>
        ......<vdev name="vdev" redundancy="mirror"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<slice name="2" action="preserve" force="false" is_swap="false">
        ......<size val="143349312secs" start_sector="0"/>
        ....</slice>
        ....<slice name="1" action="delete" force="false" is_swap="false">
        ......<size val="4202688secs" start_sector="41945472"/>
        ....</slice>
        ....<slice name="0" action="create" force="false" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143349248secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_2_disks_whole_disk_true_and_rpool_w_vdev(self):
        '''Test Success If 2 Disks w/Whole-Disk = True & Root Vdev Specified
        '''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true" in_vdev="ai_test_vdev">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <disk whole_disk="true" in_vdev="ai_test_vdev">
                <disk_name name="c99t1d0" name_type="ctd"/>
              </disk>
              <logical>
                <zpool name="ai_test_rpool" is_root="true">
                  <vdev name="ai_test_vdev" redundancy="mirror"/>
                </zpool>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<vdev name="ai_test_vdev" redundancy="mirror"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="ai_test_vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="ai_test_vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_if_root_pool_non_be_datasets(self):
        '''Test Success If Root Pool Non-BE Datasets Specified
        '''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true" in_zpool="ai_test_rpool">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <logical>
                <zpool name="ai_test_rpool" is_root="true">
                  <filesystem name="to_share" mountpoint="/share"/>
                  <filesystem name="export2"/>
                </zpool>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<filesystem name="to_share" action="create" mountpoint="/share" \
        in_be="false"/>
        ......<filesystem name="export2" action="create" in_be="false"/>
        ......<vdev name="vdev" redundancy="none"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_if_root_pool_with_be_datasets(self):
        '''Test Success If Root Pool with BE Datasets Specified
        '''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true" in_zpool="ai_test_rpool">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <logical>
                <zpool name="ai_test_rpool" is_root="true">
                  <filesystem name="to_share" mountpoint="/share"/>
                  <filesystem name="export2"/>
                  <filesystem name="opt" in_be="true"/>
                </zpool>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<filesystem name="to_share" action="create" mountpoint="/share" \
        in_be="false"/>
        ......<filesystem name="export2" action="create" in_be="false"/>
        ......<filesystem name="opt" action="create" in_be="true"/>
        ......<vdev name="vdev" redundancy="none"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_if_pool_and_datasets_options(self):
        '''Test Success If Pool and Datasets Options Specified
        '''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true" in_zpool="ai_test_rpool">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <logical>
                <zpool name="ai_test_rpool" is_root="true">
                  <pool_options>
                    <option name="listsnaps" value="on"/>
                  </pool_options>
                  <dataset_options>
                    <option name="compression" value="on"/>
                  </dataset_options>
                  <filesystem name="to_share" mountpoint="/share">
                    <options>
                      <option name="compression" value="off"/>
                    </options>
                  </filesystem>
                  <filesystem name="export2"/>
                  <be name="ai_test_solaris_be">
                    <options>
                      <option name="test:ai_test_option" value="1"/>
                    </options>
                  </be>
                </zpool>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<pool_options>
        ........<option name="listsnaps" value="on"/>
        ......</pool_options>
        ......<dataset_options>
        ........<option name="compression" value="on"/>
        ......</dataset_options>
        ......<filesystem name="to_share" action="create" mountpoint="/share" \
        in_be="false">
        ........<options>
        ..........<option name="compression" value="off"/>
        ........</options>
        ......</filesystem>
        ......<filesystem name="export2" action="create" in_be="false"/>
        ......<be name="ai_test_solaris_be">
        ........<options>
        ..........<option name="test:ai_test_option" value="1"/>
        ........</options>
        ......</be>
        ......<vdev name="vdev" redundancy="none"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_if_root_pool_with_be_specified(self):
        '''Test Success If Root Pool With BE Specified
        '''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true" in_zpool="ai_test_rpool">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <logical>
                <zpool name="ai_test_rpool" is_root="true">
                  <be name="ai_test_solaris_be"/>
                </zpool>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<be name="ai_test_solaris_be"/>
        ......<vdev name="vdev" redundancy="none"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_if_disk_with_slice_no_size(self):
        '''Test Success If Have a Disk, containing 1 slice without size
        '''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="false">
                <disk_name name="c99t0d0" name_type="ctd"/>
                <slice name="0" action="create" force="false"
                 is_swap="false"/>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="2" action="preserve" force="false" is_swap="false">
        ......<size val="143349312secs" start_sector="0"/>
        ....</slice>
        ....<slice name="0" action="create" force="false" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_if_disk_with_slice_no_start_sector(self):
        '''Test Success If Have a Disk, containing 1 slice without start_sector
        '''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="false">
                <disk_name name="c99t0d0" name_type="ctd"/>
                <slice name="0" action="create" force="false"
                 is_swap="false">
                  <size val="30G"/>
                </slice>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="2" action="preserve" force="false" is_swap="false">
        ......<size val="143349312secs" start_sector="0"/>
        ....</slice>
        ....<slice name="0" action="create" force="false" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="62914560secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_slice_too_large(self):
        '''Test Fail if slice is specified with a value too large'''

        test_manifest_xml = '''
        <auto_install>
           <ai_instance name="orig_default">
            <target>
             <disk>
                <disk_name name_type="ctd" name="c99t0d0"/>
                <slice name="0" action="create" is_swap="false"
                 in_zpool="rpool" in_vdev="vdev">
                  <size val="20000001mb"/>
                </slice>
              </disk>
              <logical>
                <zpool name="rpool" is_root="true">
                  <vdev name="vdev" redundancy="none"/>
                </zpool>
              </logical>
             </target>
          </ai_instance>
        </auto_install>
        '''
        expected_xml = ""

        self.__run_simple_test(test_manifest_xml, expected_xml,
            fail_ex_str="Slice 0 has a size larger than the disk c99t0d0")

    def test_target_selection_swap_and_dump_size(self):
        '''Test Success In Calc of Swap and Dump Size'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="false">
                <disk_name name_type="ctd" name="c99t0d0"/>
                <slice name="0" action="create" is_swap="false"
                 in_zpool="ai_test_rpool" in_vdev="vdev">
                  <size val="10GB"/>
                </slice>
              </disk>
              <logical>
                <zpool name="ai_test_rpool" is_root="true">
                  <vdev name="vdev" redundancy="none"/>
                </zpool>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="false" nodump="false">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<zvol name="swap" action="create" use="swap">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<zvol name="dump" action="create" use="dump">
        ........<size val="\d+m"/>
        ......</zvol>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="2" action="preserve" force="false" is_swap="false">
        ......<size val="143349312secs" start_sector="0"/>
        ....</slice>
        ....<slice name="0" action="create" force="false" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="20971520secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_use_slice_on_existing_zpool(self):
        '''Test Success using slices on existing zpools'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
            <disk whole_disk="false">
              <disk_name name="c99t2d0" name_type="ctd"/>
              <slice name="1" action="create" is_swap="false"
                 in_zpool="ai_test_rpool" in_vdev="rpool-none">
                 <size val="276976665secs"/>
              </slice>
            </disk>

            <logical noswap="true" nodump="true">
              <zpool name="ai_test_rpool" action="create" is_root="true">
                <vdev name="rpool-none" redundancy="none"/>
              </zpool>
            </logical>
          </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="true" nodump="true">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<vdev name="rpool-none" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t2d0" name_type="ctd"/>
        ....<disk_prop dev_type="FIXED" dev_vendor="Lenovo" \
        dev_size="625141760secs"/>
        ....<slice name="1" action="create" force="false" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="rpool-none">
        ......<size val="276976128secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_create_swap_and_ufs_slices(self):
        '''Test Success using creating swap and ufs slices'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
            <disk whole_disk="false">
              <disk_name name="c99t2d0" name_type="ctd"/>
              <slice name="1" action="create" is_swap="false"
                 in_zpool="ai_test_rpool" in_vdev="rpool-none">
                 <size val="276976665secs"/>
              </slice>
              <slice name="3" action="create" is_swap="true">
                 <size val="1gb"/>
              </slice>
              <slice name="5" action="create" is_swap="false">
                 <size val="1gb"/>
              </slice>
              <slice name="7" action="create" is_swap="true">
                 <size val="1gb"/>
              </slice>
            </disk>

            <logical noswap="true" nodump="true">
              <zpool name="ai_test_rpool" action="create" is_root="true">
                <vdev name="rpool-none" redundancy="none"/>
              </zpool>
            </logical>
          </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="true" nodump="true">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<vdev name="rpool-none" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t2d0" name_type="ctd"/>
        ....<disk_prop dev_type="FIXED" dev_vendor="Lenovo" \
        dev_size="625141760secs"/>
        ....<slice name="1" action="create" force="false" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="rpool-none">
        ......<size val="276976640secs" start_sector="512"/>
        ....</slice>
        ....<slice name="3" action="create" force="false" is_swap="true">
        ......<size val="2097152secs" start_sector="276977152"/>
        ....</slice>
        ....<slice name="5" action="create" force="false" is_swap="false">
        ......<size val="2097152secs" start_sector="279074304"/>
        ....</slice>
        ....<slice name="7" action="create" force="false" is_swap="true">
        ......<size val="2097152secs" start_sector="281171456"/>
        ....</slice>
        ..</disk>
        </target>
        '''

    def test_target_selection_whole_disk_true_with_kids_and_rpool(self):
        '''Test Success if whole_disk=True, one disk with kids & root pool'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true">
                <disk_name name="c99t2d0" name_type="ctd"/>
                  <slice name="1" action="create" is_swap="false"
                  in_zpool="ai_test_rpool"/>
              </disk>
              <logical noswap="true" nodump="true">
                <zpool name="ai_test_rpool" is_root="true"/>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="true" nodump="true">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t2d0" name_type="ctd"/>
        ....<disk_prop dev_type="FIXED" dev_vendor="Lenovo" \
        dev_size="625141760secs"/>
        ....<slice name="1" action="create" force="false" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="625141248secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_whole_disk_true_partition_create(self):
        '''Test Success if whole_disk=True, partition with create'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true">
                <disk_name name="c99t1d0" name_type="ctd"/>
                <slice action="create" name="1" in_zpool="ai_test_rpool"/>
              </disk>
              <logical noswap="true" nodump="true">
                <zpool name="ai_test_rpool" is_root="true"/>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="true" nodump="true">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<slice name="1" action="create" force="false" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_default_small_slice_size(self):
        '''Test Success if creating a default small sized slice'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="true">
                <disk_name name="c99t1d0" name_type="ctd"/>
                <slice name="0" action="create"
                  is_swap="false" in_zpool="ai_test_rpool">
                  <size val="68gb"/>
                </slice>
                <slice name="1" action="create"
                  is_swap="false"/>
              </disk>
              <logical noswap="true" nodump="true">
                <zpool name="ai_test_rpool" is_root="true"/>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="true" nodump="true">
        ....<zpool name="ai_test_rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<slice name="0" action="create" force="false" is_swap="false" \
        in_zpool="ai_test_rpool" in_vdev="vdev">
        ......<size val="142605824secs" start_sector="512"/>
        ....</slice>
        ....<slice name="1" action="create" force="false" is_swap="false">
        ......<size val="742400secs" start_sector="142606848"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_wwn(self):
        ''' Test success if user specifies wwn as the disk_name'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="True">
                <disk_name name="206000c0ff0080c4" name_type="wwn"/>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<disk whole_disk="false">
        ....<disk_name name="c89t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_props_1(self):
        ''' Test success if user specifies a disk property'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="True">
                <disk_prop dev_type="FIXED"/>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<disk whole_disk="false">
        ....<disk_name name="c99t2d0" name_type="ctd"/>
        ....<disk_prop dev_type="FIXED" dev_vendor="Lenovo" \
        dev_size="\d+secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="\d+secs" start_sector="\d+"/>
        ....</slice>
        ..</disk>
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="none"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_props_2_1(self):
        ''' Test success if user specifies a disk property and a disk name'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="True">
                <disk_name name="c99t1d0" name_type="ctd"/>
              </disk>
              <disk whole_disk="True">
                <disk_prop dev_vendor="Lenovo"/>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="\d+secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="\d+secs" start_sector="\d+"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t2d0" name_type="ctd"/>
        ....<disk_prop dev_type="FIXED" dev_vendor="Lenovo" \
        dev_size="\d+secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="\d+secs" start_sector="\d+"/>
        ....</slice>
        ..</disk>
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="mirror"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_props_2_1_err(self):
        ''' Test Fail if a disk property and disk name point to same disk'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="True">
                <disk_name name="c99t2d0" name_type="ctd"/>
              </disk>
              <disk whole_disk="True">
                <disk_prop dev_type="FIXED"/>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml, 
            fail_ex_str="Unable to locate the disk '[dev_type='FIXED']'" + 
                        " on the system.")

    def test_target_selection_props_2_2(self):
        ''' Test success if user specifies 2 disk properties'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="True">
                <disk_prop dev_size="143349312secs"/>
              </disk>
              <disk whole_disk="True">
                <disk_prop dev_vendor="Lenovo"/>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<disk whole_disk="false">
        ....<disk_name name="c99t2d0" name_type="ctd"/>
        ....<disk_prop dev_type="FIXED" dev_vendor="Lenovo" \
        dev_size="\d+secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="\d+secs" start_sector="\d+"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="mirror"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_props_2_with_pools(self):
        ''' Test success if user specifies 2 disk props and pools specified'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk in_zpool="rpool" whole_disk="True">
                <disk_prop dev_size="143349312secs"/>
              </disk>
              <disk in_zpool="data" whole_disk="True">
                <disk_prop dev_vendor="Lenovo"/>
              </disk>
              <logical noswap="true" nodump="true">
                <zpool name="rpool" is_root="true">
                    <filesystem name="export" mountpoint="/export"/>
                    <filesystem name="export/home"/>
                    <be name="solaris"/>
                </zpool>
                <zpool name="data"/>
              </logical>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<filesystem name="export" action="create" \
        mountpoint="/export" in_be="false"/>
        ......<filesystem name="export/home" action="create" \
        mountpoint="/export/home/" in_be="false"/>
        ......<be name="solaris"/>
        ......<vdev name="vdev" redundancy="none"/>
        ....</zpool>
        ....<zpool name="data" action="create" is_root="false">
        ......<vdev name="vdev" redundancy="none"/>
        ....</zpool>
        ..</logical>
        ..<disk in_zpool="data" in_vdev="vdev" whole_disk="true">
        ....<disk_name name="c99t2d0" name_type="ctd"/>
        ....<disk_prop dev_type="FIXED" dev_vendor="Lenovo" \
        dev_size="\d+secs"/>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_props_3_2(self):
        ''' Test success if user specifies 2 disk properties and 1 disk name'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="True">
                <disk_prop dev_size="143349312secs"/>
              </disk>
              <disk whole_disk="True">
                <disk_name name="c99t0d0" name_type="ctd"/>
              </disk>
              <disk whole_disk="True">
                <disk_prop dev_vendor="Lenovo"/>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="\d+secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="\d+secs" start_sector="\d+"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t2d0" name_type="ctd"/>
        ....<disk_prop dev_type="FIXED" dev_vendor="Lenovo" \
        dev_size="\d+secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="\d+secs" start_sector="\d+"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="mirror"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)

    def test_target_selection_props_3_3(self):
        ''' Test success if user specifies 3 disk properties'''
        test_manifest_xml = '''
        <auto_install>
          <ai_instance auto_reboot="false">
            <target>
              <disk whole_disk="True">
                <disk_prop dev_size="143349312secs"/>
              </disk>
              <disk whole_disk="True">
                <disk_prop dev_vendor="Hitachi"/>
              </disk>
              <disk whole_disk="True">
                <disk_prop dev_type="scsi"/>
              </disk>
              <logical noswap="true" nodump="true"/>
            </target>
          </ai_instance>
        </auto_install>
        '''

        expected_xml = '''\
        <target name="desired">
        ..<disk whole_disk="false">
        ....<disk_name name="c99t0d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="143349312secs"/>
        ....<disk_keyword key="boot_disk"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="143348736secs" start_sector="512"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t1d0" name_type="ctd"/>
        ....<disk_prop dev_type="scsi" dev_vendor="HITACHI" \
        dev_size="\d+secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="\d+secs" start_sector="\d+"/>
        ....</slice>
        ..</disk>
        ..<disk whole_disk="false">
        ....<disk_name name="c99t2d0" name_type="ctd"/>
        ....<disk_prop dev_type="FIXED" dev_vendor="Lenovo" \
        dev_size="\d+secs"/>
        ....<slice name="0" action="create" force="true" is_swap="false" \
        in_zpool="rpool" in_vdev="vdev">
        ......<size val="\d+secs" start_sector="\d+"/>
        ....</slice>
        ..</disk>
        ..<logical noswap="true" nodump="true">
        ....<zpool name="rpool" action="create" is_root="true">
        ......<vdev name="vdev" redundancy="mirror"/>
        ......<be name="ai_test_solaris"/>
        ....</zpool>
        ..</logical>
        </target>
        '''

        self.__run_simple_test(test_manifest_xml, expected_xml)


if __name__ == '__main__':
    unittest.main()