7048532 NoneType object exception occurred referecing existing_parent_object
authorMatt Keenan <matt.keenan@oracle.com>
Thu, 26 May 2011 11:36:40 +0100
changeset 1152 67a7b566bd10
parent 1151 95413393ef67
child 1153 cdfbbe758b36
7048532 NoneType object exception occurred referecing existing_parent_object
usr/src/cmd/auto-install/checkpoints/target_selection.py
usr/src/cmd/auto-install/test/test_target_selection_x86.py
usr/src/lib/install_target/instantiation.py
--- a/usr/src/cmd/auto-install/checkpoints/target_selection.py	Wed May 25 21:26:43 2011 +0100
+++ b/usr/src/cmd/auto-install/checkpoints/target_selection.py	Thu May 26 11:36:40 2011 +0100
@@ -2203,8 +2203,11 @@
             self.logger.warning("Skipping orig_slice 2 definition")
             return None
 
-        existing_slice = existing_parent_obj.get_first_child(orig_slice.name,
-                                                    class_type=Slice)
+        if existing_parent_obj is not None:
+            existing_slice = existing_parent_obj.get_first_child(
+                                    orig_slice.name, class_type=Slice)
+        else:
+            existing_slice = None
 
         if orig_slice.action in ["preserve", "delete"]:
             if existing_slice is None:
@@ -2322,7 +2325,8 @@
         '''
         # Specifics in manifest take precedence, so
         # if they exist already, ignore them.
-        if existing_parent_obj is not None:
+        if existing_parent_obj is not None and \
+            new_parent_obj.action == "use_existing_solaris2":
             tmp_slices = list()
             for exist_slice in existing_parent_obj.children:
                 skip_slice = False
@@ -2605,10 +2609,10 @@
                     else:
                         # Copy everything else, unless it's a logical and we're
                         # supposed to be skipping them.
-                        if not (existing_partition.is_logical and 
+                        if not (existing_partition.is_logical and
                                 skip_existing_logicals):
                             partitions.append(copy.copy(existing_partition))
-                            # Also insert to new disk so gaps calculations work.
+                            # Also insert to new disk so gaps calculations work
                             disk_copy.insert_children(
                                 copy.copy(existing_partition))
 
--- a/usr/src/cmd/auto-install/test/test_target_selection_x86.py	Wed May 25 21:26:43 2011 +0100
+++ b/usr/src/cmd/auto-install/test/test_target_selection_x86.py	Thu May 26 11:36:40 2011 +0100
@@ -46,6 +46,14 @@
     <root>
       <target name="discovered">
         <disk whole_disk="false">
+          <disk_name name="c10t3d0" name_type="ctd"/>
+          <disk_prop dev_type="FIXED" dev_vendor="Lenovo"
+           dev_size="625141760secs"/>
+          <partition action="preserve" name="1" part_type="11">
+            <size val="3341520secs" start_sector="0"/>
+          </partition>
+        </disk>
+        <disk whole_disk="false">
           <disk_name name="c10t2d0" name_type="ctd"/>
           <disk_prop dev_type="FIXED" dev_vendor="Lenovo"
            dev_size="625141760secs"/>
@@ -2877,5 +2885,55 @@
 
         self.__run_simple_test(test_manifest_xml, expected_xml)
 
+    def test_target_selection_create_different_partition(self):
+        '''Test Success creating solaris partition beside existing partition'''
+        test_manifest_xml = '''
+        <auto_install>
+          <ai_instance auto_reboot="false">
+            <target>
+              <disk>
+                <disk_name name="c10t3d0" name_type="ctd"/>
+                <partition action="create" name="2" part_type="191">
+                    <size val="10240mb"/>
+                    <slice name="0" action="create"/>
+                </partition>
+            </disk>
+            <logical noswap="true" nodump="true">
+              <zpool name="myrpool" is_root="true">
+                <vdev name="vdev" redundancy="none"/>
+              </zpool>
+            </logical>
+          </target>
+          </ai_instance>
+        </auto_install>
+        '''
+
+        expected_xml = '''\
+        <target name="desired">
+        ..<logical noswap="true" nodump="true">
+        ....<zpool name="myrpool" action="create" is_root="true">
+        ......<vdev name="vdev" redundancy="none"/>
+        ......<be name="solaris"/>
+        ....</zpool>
+        ..</logical>
+        ..<disk whole_disk="false">
+        ....<disk_name name="c10t3d0" name_type="ctd"/>
+        ....<disk_prop dev_type="FIXED" dev_vendor="Lenovo" dev_size="625141760secs"/>
+        ....<partition action="preserve" name="1" part_type="11">
+        ......<size val="3341312secs" start_sector="512"/>
+        ....</partition>
+        ....<partition action="create" name="2" part_type="191">
+        ......<size val="20971520secs" start_sector="3341824"/>
+        ......<slice name="0" action="create" force="false" is_swap="false" \
+        in_zpool="myrpool" in_vdev="vdev">
+        ........<size val="20971520secs" start_sector="512"/>
+        ......</slice>
+        ....</partition>
+        ..</disk>
+        </target>
+        '''
+
+        self.__run_simple_test(test_manifest_xml, expected_xml)
+
 if __name__ == '__main__':
     unittest.main()
--- a/usr/src/lib/install_target/instantiation.py	Wed May 25 21:26:43 2011 +0100
+++ b/usr/src/lib/install_target/instantiation.py	Thu May 26 11:36:40 2011 +0100
@@ -114,10 +114,11 @@
                     # if 'preserve' or 'use_existing' is set on the partition
                     if partition.action == "create":
                         update_partition_table = True
-                    elif partition.action == "destroy":
+                    elif partition.action == "delete":
                         partition_list.pop(partition_list.index(partition))
                         update_partition_table = True
-                    elif partition.action in ["preserve", "use_existing"]:
+                    elif partition.action in \
+                        ["preserve", "use_existing_solaris2"]:
                         label_disk = False
 
             update_vtoc = False
@@ -131,7 +132,7 @@
                     # the slices are being 'preserved'
                     if slc.action == "create":
                         update_vtoc = True
-                    elif slc.action == "destroy":
+                    elif slc.action == "delete":
                         slice_list.pop(slice_list.index(slc))
                         update_vtoc = True
                     elif slc.action == "preserve":